From ef4d59a21e4d921ff4a77d0614b46d52cf8def92 Mon Sep 17 00:00:00 2001 From: skidau Date: Fri, 12 Apr 2013 12:08:05 +1000 Subject: [PATCH] Refactored the SystemTimers to allow for per-UCode timing. Fixes issue 6237. --- Source/Core/Core/Src/DSPEmulator.h | 1 + Source/Core/Core/Src/HW/DSPHLE/DSPHLE.cpp | 11 ++++++++++ Source/Core/Core/Src/HW/DSPHLE/DSPHLE.h | 1 + .../Core/Src/HW/DSPHLE/UCodes/UCode_AX.cpp | 5 +++++ .../Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.h | 1 + .../Core/Src/HW/DSPHLE/UCodes/UCode_AXWii.cpp | 5 +++++ .../Core/Src/HW/DSPHLE/UCodes/UCode_AXWii.h | 1 + .../Core/Src/HW/DSPHLE/UCodes/UCode_CARD.cpp | 6 ++++++ .../Core/Src/HW/DSPHLE/UCodes/UCode_CARD.h | 1 + .../Core/Src/HW/DSPHLE/UCodes/UCode_GBA.cpp | 6 ++++++ .../Core/Src/HW/DSPHLE/UCodes/UCode_GBA.h | 1 + .../DSPHLE/UCodes/UCode_InitAudioSystem.cpp | 6 ++++++ .../HW/DSPHLE/UCodes/UCode_InitAudioSystem.h | 1 + .../Core/Src/HW/DSPHLE/UCodes/UCode_ROM.cpp | 6 ++++++ .../Core/Src/HW/DSPHLE/UCodes/UCode_ROM.h | 1 + .../Core/Src/HW/DSPHLE/UCodes/UCode_Zelda.cpp | 5 +++++ .../Core/Src/HW/DSPHLE/UCodes/UCode_Zelda.h | 1 + .../Core/Core/Src/HW/DSPHLE/UCodes/UCodes.h | 1 + Source/Core/Core/Src/HW/DSPLLE/DSPLLE.cpp | 5 +++++ Source/Core/Core/Src/HW/DSPLLE/DSPLLE.h | 1 + Source/Core/Core/Src/HW/SystemTimers.cpp | 20 +++---------------- 21 files changed, 69 insertions(+), 17 deletions(-) diff --git a/Source/Core/Core/Src/DSPEmulator.h b/Source/Core/Core/Src/DSPEmulator.h index 30de180cf3..b5d04e3e2a 100644 --- a/Source/Core/Core/Src/DSPEmulator.h +++ b/Source/Core/Core/Src/DSPEmulator.h @@ -44,6 +44,7 @@ public: virtual void DSP_Update(int cycles) = 0; virtual void DSP_StopSoundStream() = 0; virtual void DSP_ClearAudioBuffer(bool mute) = 0; + virtual u32 DSP_UpdateRate() = 0; protected: SoundStream *soundStream; diff --git a/Source/Core/Core/Src/HW/DSPHLE/DSPHLE.cpp b/Source/Core/Core/Src/HW/DSPHLE/DSPHLE.cpp index 3e73944e44..6d15c8226a 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/DSPHLE.cpp +++ b/Source/Core/Core/Src/HW/DSPHLE/DSPHLE.cpp @@ -28,6 +28,7 @@ #include "../AudioInterface.h" #include "ConfigManager.h" #include "Core.h" +#include "HW/SystemTimers.h" DSPHLE::DSPHLE() { m_InitMixer = false; @@ -87,6 +88,16 @@ void DSPHLE::DSP_Update(int cycles) m_pUCode->Update(cycles / 6); } +u32 DSPHLE::DSP_UpdateRate() +{ + // AX HLE uses 3ms (Wii) or 5ms (GC) timing period + int fields = SConfig::GetInstance().m_LocalCoreStartupParameter.bVBeam ? 2 : 1; + if (m_pUCode != NULL) + return (SystemTimers::GetTicksPerSecond() / 1000) * m_pUCode->GetUpdateMs() / fields; + else + return SystemTimers::GetTicksPerSecond() / 1000; +} + void DSPHLE::SendMailToDSP(u32 _uMail) { if (m_pUCode != NULL) { diff --git a/Source/Core/Core/Src/HW/DSPHLE/DSPHLE.h b/Source/Core/Core/Src/HW/DSPHLE/DSPHLE.h index 6ad20115b4..50d65d5d52 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/DSPHLE.h +++ b/Source/Core/Core/Src/HW/DSPHLE/DSPHLE.h @@ -46,6 +46,7 @@ public: virtual void DSP_Update(int cycles); virtual void DSP_StopSoundStream(); virtual void DSP_ClearAudioBuffer(bool mute); + virtual u32 DSP_UpdateRate(); CMailHandler& AccessMailHandler() { return m_MailHandler; } diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.cpp b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.cpp index 18c7edfd8b..cbe558c878 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.cpp +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.cpp @@ -738,6 +738,11 @@ void CUCode_AX::Update(int cycles) } } +u32 CUCode_AX::GetUpdateMs() +{ + return 5; +} + void CUCode_AX::DoAXState(PointerWrap& p) { p.Do(m_cmdlist); diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.h b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.h index f55d2a1858..8d1cb99c25 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.h +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.h @@ -73,6 +73,7 @@ public: virtual void MixAdd(short* out_buffer, int nsamples); virtual void Update(int cycles); virtual void DoState(PointerWrap& p); + u32 GetUpdateMs(); // Needed because StdThread.h std::thread implem does not support member // pointers. TODO(delroth): obsolete. diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXWii.cpp b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXWii.cpp index 41d782a01a..0c3714ffea 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXWii.cpp +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXWii.cpp @@ -672,6 +672,11 @@ void CUCode_AXWii::OutputWMSamples(u32* addresses) } } +u32 CUCode_AXWii::GetUpdateMs() +{ + return 3; +} + void CUCode_AXWii::DoState(PointerWrap &p) { std::lock_guard lk(m_processing); diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXWii.h b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXWii.h index 6e4eb7ad4e..12cb47a868 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXWii.h +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXWii.h @@ -25,6 +25,7 @@ class CUCode_AXWii : public CUCode_AX public: CUCode_AXWii(DSPHLE *dsp_hle, u32 _CRC); virtual ~CUCode_AXWii(); + u32 GetUpdateMs(); virtual void DoState(PointerWrap &p); diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_CARD.cpp b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_CARD.cpp index c29cf9e536..63316caa21 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_CARD.cpp +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_CARD.cpp @@ -19,6 +19,7 @@ #include "UCodes.h" #include "UCode_CARD.h" #include "../../DSP.h" +#include "ConfigManager.h" CUCode_CARD::CUCode_CARD(DSPHLE *dsp_hle, u32 crc) @@ -44,6 +45,11 @@ void CUCode_CARD::Update(int cycles) } } +u32 CUCode_CARD::GetUpdateMs() +{ + return SConfig::GetInstance().m_LocalCoreStartupParameter.bWii ? 3 : 5; +} + void CUCode_CARD::HandleMail(u32 _uMail) { if (_uMail == 0xFF000000) // unlock card diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_CARD.h b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_CARD.h index a6f90124ad..163dcc3fb0 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_CARD.h +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_CARD.h @@ -25,6 +25,7 @@ class CUCode_CARD : public IUCode public: CUCode_CARD(DSPHLE *dsp_hle, u32 crc); virtual ~CUCode_CARD(); + u32 GetUpdateMs(); void HandleMail(u32 _uMail); void Update(int cycles); diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_GBA.cpp b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_GBA.cpp index 00fef067ff..86d561d395 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_GBA.cpp +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_GBA.cpp @@ -19,6 +19,7 @@ #include "UCode_GBA.h" #include "../../DSP.h" +#include "ConfigManager.h" CUCode_GBA::CUCode_GBA(DSPHLE *dsp_hle, u32 crc) : IUCode(dsp_hle, crc) @@ -40,6 +41,11 @@ void CUCode_GBA::Update(int cycles) } } +u32 CUCode_GBA::GetUpdateMs() +{ + return SConfig::GetInstance().m_LocalCoreStartupParameter.bWii ? 3 : 5; +} + void CUCode_GBA::HandleMail(u32 _uMail) { static bool nextmail_is_mramaddr = false; diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_GBA.h b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_GBA.h index c61917339f..8ab66a22ec 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_GBA.h +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_GBA.h @@ -23,6 +23,7 @@ struct CUCode_GBA : public IUCode { CUCode_GBA(DSPHLE *dsp_hle, u32 crc); virtual ~CUCode_GBA(); + u32 GetUpdateMs(); void HandleMail(u32 _uMail); void Update(int cycles); diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_InitAudioSystem.cpp b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_InitAudioSystem.cpp index ae7716012a..a874bc173d 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_InitAudioSystem.cpp +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_InitAudioSystem.cpp @@ -17,6 +17,7 @@ #include "UCodes.h" #include "UCode_InitAudioSystem.h" +#include "ConfigManager.h" CUCode_InitAudioSystem::CUCode_InitAudioSystem(DSPHLE *dsp_hle, u32 crc) : IUCode(dsp_hle, crc) @@ -42,6 +43,11 @@ void CUCode_InitAudioSystem::Update(int cycles) } } +u32 CUCode_InitAudioSystem::GetUpdateMs() +{ + return SConfig::GetInstance().m_LocalCoreStartupParameter.bWii ? 3 : 5; +} + void CUCode_InitAudioSystem::HandleMail(u32 _uMail) {} diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_InitAudioSystem.h b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_InitAudioSystem.h index 8dc237f1d0..a698df4e4c 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_InitAudioSystem.h +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_InitAudioSystem.h @@ -25,6 +25,7 @@ class CUCode_InitAudioSystem : public IUCode public: CUCode_InitAudioSystem(DSPHLE *dsp_hle, u32 crc); virtual ~CUCode_InitAudioSystem(); + u32 GetUpdateMs(); void HandleMail(u32 _uMail); void Update(int cycles); diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_ROM.cpp b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_ROM.cpp index b94486fe9e..f4ab0ac366 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_ROM.cpp +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_ROM.cpp @@ -19,6 +19,7 @@ #include "UCode_ROM.h" #include "Hash.h" #include "../../Memmap.h" +#include "ConfigManager.h" CUCode_Rom::CUCode_Rom(DSPHLE *dsp_hle, u32 crc) : IUCode(dsp_hle, crc) @@ -117,6 +118,11 @@ void CUCode_Rom::BootUCode() m_DSPHLE->SetUCode(ector_crc); } +u32 CUCode_Rom::GetUpdateMs() +{ + return SConfig::GetInstance().m_LocalCoreStartupParameter.bWii ? 3 : 5; +} + void CUCode_Rom::DoState(PointerWrap &p) { p.Do(m_CurrentUCode); diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_ROM.h b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_ROM.h index f1e7b8ec7a..5dc0ce73c1 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_ROM.h +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_ROM.h @@ -25,6 +25,7 @@ class CUCode_Rom : public IUCode public: CUCode_Rom(DSPHLE *dsp_hle, u32 _crc); virtual ~CUCode_Rom(); + u32 GetUpdateMs(); void HandleMail(u32 _uMail); void Update(int cycles); diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda.cpp b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda.cpp index 9d392cd6b0..681197703d 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda.cpp +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda.cpp @@ -27,6 +27,7 @@ #include "WaveFile.h" #include "../../DSP.h" +#include "ConfigManager.h" CUCode_Zelda::CUCode_Zelda(DSPHLE *dsp_hle, u32 _CRC) @@ -565,6 +566,10 @@ void CUCode_Zelda::ExecuteList() } } +u32 CUCode_Zelda::GetUpdateMs() +{ + return SConfig::GetInstance().m_LocalCoreStartupParameter.bWii ? 3 : 5; +} void CUCode_Zelda::DoState(PointerWrap &p) { diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda.h b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda.h index 94a5bcea3f..19567fd302 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda.h +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda.h @@ -133,6 +133,7 @@ class CUCode_Zelda : public IUCode public: CUCode_Zelda(DSPHLE *dsp_hle, u32 _CRC); virtual ~CUCode_Zelda(); + u32 GetUpdateMs(); void HandleMail(u32 _uMail); void HandleMail_LightVersion(u32 _uMail); diff --git a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCodes.h b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCodes.h index 225ac731c0..1b089228e0 100644 --- a/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCodes.h +++ b/Source/Core/Core/Src/HW/DSPHLE/UCodes/UCodes.h @@ -92,6 +92,7 @@ public: // Cycles are out of the 81/121mhz the DSP runs at. virtual void Update(int cycles) = 0; virtual void MixAdd(short* buffer, int size) {} + virtual u32 GetUpdateMs() = 0; virtual void DoState(PointerWrap &p) { DoStateShared(p); } diff --git a/Source/Core/Core/Src/HW/DSPLLE/DSPLLE.cpp b/Source/Core/Core/Src/HW/DSPLLE/DSPLLE.cpp index fecbf8d702..ded232a9b1 100644 --- a/Source/Core/Core/Src/HW/DSPLLE/DSPLLE.cpp +++ b/Source/Core/Core/Src/HW/DSPLLE/DSPLLE.cpp @@ -326,6 +326,11 @@ void DSPLLE::DSP_Update(int cycles) } } +u32 DSPLLE::DSP_UpdateRate() +{ + return 12600; // TO BE TWEAKED +} + void DSPLLE::DSP_SendAIBuffer(unsigned int address, unsigned int num_samples) { if (!soundStream) diff --git a/Source/Core/Core/Src/HW/DSPLLE/DSPLLE.h b/Source/Core/Core/Src/HW/DSPLLE/DSPLLE.h index 456d038c96..4043c95452 100644 --- a/Source/Core/Core/Src/HW/DSPLLE/DSPLLE.h +++ b/Source/Core/Core/Src/HW/DSPLLE/DSPLLE.h @@ -44,6 +44,7 @@ public: virtual void DSP_Update(int cycles); virtual void DSP_StopSoundStream(); virtual void DSP_ClearAudioBuffer(bool mute); + virtual u32 DSP_UpdateRate(); private: static void dsp_thread(DSPLLE* lpParameter); diff --git a/Source/Core/Core/Src/HW/SystemTimers.cpp b/Source/Core/Core/Src/HW/SystemTimers.cpp index fb8ddb0c26..134d286d78 100644 --- a/Source/Core/Core/Src/HW/SystemTimers.cpp +++ b/Source/Core/Core/Src/HW/SystemTimers.cpp @@ -119,9 +119,6 @@ int et_PatchEngine; // PatchEngine updates every 1/60th of a second by default // These are badly educated guesses // Feel free to experiment. Set these in Init below. int - // These shouldn't be period controlled either, most likely. - DSP_PERIOD, - // This is a fixed value, don't change it AUDIO_DMA_PERIOD, @@ -149,8 +146,8 @@ void DSPCallback(u64 userdata, int cyclesLate) { //splits up the cycle budget in case lle is used //for hle, just gives all of the slice to hle - DSP::UpdateDSPSlice(DSP_PERIOD - cyclesLate); - CoreTiming::ScheduleEvent(DSP_PERIOD - cyclesLate, et_DSP); + DSP::UpdateDSPSlice(DSP::GetDSPEmulator()->DSP_UpdateRate() - cyclesLate); + CoreTiming::ScheduleEvent(DSP::GetDSPEmulator()->DSP_UpdateRate() - cyclesLate, et_DSP); } void AudioDMACallback(u64 userdata, int cyclesLate) @@ -256,17 +253,6 @@ void Init() IPC_HLE_PERIOD = GetTicksPerSecond() / (freq * fields); } - if (DSP::GetDSPEmulator()->IsLLE()) - { - DSP_PERIOD = 12600; // TO BE TWEAKED - } - else - { - // AX HLE uses 3ms (Wii) or 5ms (GC) timing period - int ms_to_process = SConfig::GetInstance().m_LocalCoreStartupParameter.bWii ? 3 : 5; - DSP_PERIOD = (int)(GetTicksPerSecond() / 1000) * ms_to_process / fields; - } - // System internal sample rate is fixed at 32KHz * 4 (16bit Stereo) / 32 bytes DMA AUDIO_DMA_PERIOD = CPU_CORE_CLOCK / (AudioInterface::GetAIDSampleRate() * 4 / 32); @@ -292,7 +278,7 @@ void Init() et_PatchEngine = CoreTiming::RegisterEvent("PatchEngine", PatchEngineCallback); CoreTiming::ScheduleEvent(VideoInterface::GetTicksPerLine(), et_VI); - CoreTiming::ScheduleEvent(DSP_PERIOD, et_DSP); + CoreTiming::ScheduleEvent(0, et_DSP); CoreTiming::ScheduleEvent(VideoInterface::GetTicksPerFrame(), et_SI); CoreTiming::ScheduleEvent(AUDIO_DMA_PERIOD, et_AudioDMA); if (SConfig::GetInstance().m_LocalCoreStartupParameter.bSyncGPU)