// Regular thread void DSPLLE::DSPThread(DSPLLE* dsp_lle) { Common::SetCurrentThreadName("DSP thread"); while (dsp_lle->m_bIsRunning.IsSet()) { const int cycles = static_cast<int>(dsp_lle->m_cycle_count.load()); if (cycles > 0) { std::lock_guard<std::mutex> dsp_thread_lock(dsp_lle->m_csDSPThreadActive); if (g_dsp_jit) { DSPCore_RunCycles(cycles); } else { DSPInterpreter::RunCyclesThread(cycles); } dsp_lle->m_cycle_count.store(0); } else { ppcEvent.Set(); dspEvent.Wait(); } } }
// Regular thread void DSPLLE::dsp_thread(DSPLLE *dsp_lle) { Common::SetCurrentThreadName("DSP thread"); while (dsp_lle->m_bIsRunning) { int cycles = (int)dsp_lle->m_cycle_count; if (cycles > 0) { std::lock_guard<std::mutex> lk(dsp_lle->m_csDSPThreadActive); if (dspjit) { DSPCore_RunCycles(cycles); } else { DSPInterpreter::RunCyclesThread(cycles); } Common::AtomicStore(dsp_lle->m_cycle_count, 0); } else { ppcEvent.Set(); dspEvent.Wait(); } } }
void DSPLLE::DSP_Update(int cycles) { int dsp_cycles = cycles / 6; if (dsp_cycles <= 0) return; // Sound stream update job has been handled by AudioDMA routine, which is more efficient /* // This gets called VERY OFTEN. The soundstream update might be expensive so only do it 200 times per second or something. int cycles_between_ss_update; if (g_dspInitialize.bWii) cycles_between_ss_update = 121500000 / 200; else cycles_between_ss_update = 81000000 / 200; m_cycle_count += cycles; if (m_cycle_count > cycles_between_ss_update) { while (m_cycle_count > cycles_between_ss_update) m_cycle_count -= cycles_between_ss_update; soundStream->Update(); } */ if (m_bDSPThread) { if (requestDisableThread || NetPlay::IsNetPlayRunning() || Movie::IsMovieActive() || Core::g_want_determinism) { DSP_StopSoundStream(); m_bDSPThread = false; requestDisableThread = false; SConfig::GetInstance().bDSPThread = false; } } // If we're not on a thread, run cycles here. if (!m_bDSPThread) { // ~1/6th as many cycles as the period PPC-side. DSPCore_RunCycles(dsp_cycles); } else { // Wait for DSP thread to complete its cycle. Note: this logic should be thought through. ppcEvent.Wait(); m_cycle_count.fetch_add(dsp_cycles); dspEvent.Set(); } }
void DSPLLE::DSP_Update(int cycles) { int dsp_cycles = cycles / 6; if (dsp_cycles <= 0) return; // Sound stream update job has been handled by AudioDMA routine, which is more efficient /* // This gets called VERY OFTEN. The soundstream update might be expensive so only do it 200 times per second or something. int cycles_between_ss_update; if (g_dspInitialize.bWii) cycles_between_ss_update = 121500000 / 200; else cycles_between_ss_update = 81000000 / 200; m_cycle_count += cycles; if (m_cycle_count > cycles_between_ss_update) { while (m_cycle_count > cycles_between_ss_update) m_cycle_count -= cycles_between_ss_update; soundStream->Update(); } */ // If we're not on a thread, run cycles here. if (!m_bDSPThread) { // ~1/6th as many cycles as the period PPC-side. DSPCore_RunCycles(dsp_cycles); } else { // Wait for dsp thread to complete its cycle. Note: this logic should be thought through. ppcEvent.Wait(); Common::AtomicStore(m_cycle_count, dsp_cycles); dspEvent.Set(); } }