mirror of
				https://git.tardis.systems/mirrors/yuzu
				synced 2025-11-04 04:34:07 +01:00 
			
		
		
		
	Smooth out the DSP callback by adding a 5ms wait time limit
This commit is contained in:
		
							parent
							
								
									f35c14fb73
								
							
						
					
					
						commit
						d75bcdd077
					
				@ -154,6 +154,11 @@ void AudioRenderer::ThreadFunc() {
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        case RenderMessage::AudioRenderer_Render: {
 | 
			
		||||
            if (system.IsShuttingDown()) [[unlikely]] {
 | 
			
		||||
                std::this_thread::sleep_for(std::chrono::milliseconds(5));
 | 
			
		||||
                mailbox->ADSPSendMessage(RenderMessage::AudioRenderer_RenderResponse);
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            std::array<bool, MaxRendererSessions> buffers_reset{};
 | 
			
		||||
            std::array<u64, MaxRendererSessions> render_times_taken{};
 | 
			
		||||
            const auto start_time{system.CoreTiming().GetClockTicks()};
 | 
			
		||||
 | 
			
		||||
@ -27,7 +27,7 @@ bool SystemManager::InitializeUnsafe() {
 | 
			
		||||
    if (!active) {
 | 
			
		||||
        if (adsp.Start()) {
 | 
			
		||||
            active = true;
 | 
			
		||||
            thread = std::jthread([this](std::stop_token stop_token) { ThreadFunc(); });
 | 
			
		||||
            thread = std::jthread([this](std::stop_token stop_token) { ThreadFunc(stop_token); });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -39,8 +39,7 @@ void SystemManager::Stop() {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    active = false;
 | 
			
		||||
    update.store(true);
 | 
			
		||||
    update.notify_all();
 | 
			
		||||
    thread.request_stop();
 | 
			
		||||
    thread.join();
 | 
			
		||||
    adsp.Stop();
 | 
			
		||||
}
 | 
			
		||||
@ -85,12 +84,12 @@ bool SystemManager::Remove(System& system_) {
 | 
			
		||||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void SystemManager::ThreadFunc() {
 | 
			
		||||
void SystemManager::ThreadFunc(std::stop_token stop_token) {
 | 
			
		||||
    static constexpr char name[]{"AudioRenderSystemManager"};
 | 
			
		||||
    MicroProfileOnThreadCreate(name);
 | 
			
		||||
    Common::SetCurrentThreadName(name);
 | 
			
		||||
    Common::SetCurrentThreadPriority(Common::ThreadPriority::High);
 | 
			
		||||
    while (active) {
 | 
			
		||||
    while (active && !stop_token.stop_requested()) {
 | 
			
		||||
        {
 | 
			
		||||
            std::scoped_lock l{mutex1};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -66,13 +66,7 @@ private:
 | 
			
		||||
    /**
 | 
			
		||||
     * Main thread responsible for command generation.
 | 
			
		||||
     */
 | 
			
		||||
    void ThreadFunc();
 | 
			
		||||
 | 
			
		||||
    enum class StreamState {
 | 
			
		||||
        Filling,
 | 
			
		||||
        Steady,
 | 
			
		||||
        Draining,
 | 
			
		||||
    };
 | 
			
		||||
    void ThreadFunc(std::stop_token stop_token);
 | 
			
		||||
 | 
			
		||||
    /// Core system
 | 
			
		||||
    Core::System& core;
 | 
			
		||||
@ -90,8 +84,6 @@ private:
 | 
			
		||||
    ADSP::ADSP& adsp;
 | 
			
		||||
    /// AudioRenderer mailbox for communication
 | 
			
		||||
    ADSP::AudioRenderer_Mailbox* mailbox{};
 | 
			
		||||
    /// Atomic for main thread to wait on
 | 
			
		||||
    std::atomic<bool> update{};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace AudioCore::AudioRenderer
 | 
			
		||||
 | 
			
		||||
@ -271,8 +271,8 @@ u64 SinkStream::GetExpectedPlayedSampleCount() {
 | 
			
		||||
 | 
			
		||||
void SinkStream::WaitFreeSpace() {
 | 
			
		||||
    std::unique_lock lk{release_mutex};
 | 
			
		||||
    release_cv.wait(
 | 
			
		||||
        lk, [this]() { return queued_buffers < max_queue_size || system.IsShuttingDown(); });
 | 
			
		||||
    release_cv.wait_for(lk, std::chrono::milliseconds(5),
 | 
			
		||||
                        [this]() { return queued_buffers < max_queue_size; });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace AudioCore::Sink
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user