summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorskidau <skidau@gmail.com>2013-04-12 12:08:05 +1000
committerskidau <skidau@gmail.com>2013-04-12 12:08:05 +1000
commitef4d59a21e4d921ff4a77d0614b46d52cf8def92 (patch)
tree11513c76fd23ed5c50559819a8ae8a7d83e77bcb /Source/Core
parentaddd3926d91d3759391fe87b9a8430de758b258e (diff)
Refactored the SystemTimers to allow for per-UCode timing. Fixes issue 6237.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/Src/DSPEmulator.h1
-rw-r--r--Source/Core/Core/Src/HW/DSPHLE/DSPHLE.cpp11
-rw-r--r--Source/Core/Core/Src/HW/DSPHLE/DSPHLE.h1
-rw-r--r--Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.cpp5
-rw-r--r--Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AX.h1
-rw-r--r--Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXWii.cpp5
-rw-r--r--Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_AXWii.h1
-rw-r--r--Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_CARD.cpp6
-rw-r--r--Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_CARD.h1
-rw-r--r--Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_GBA.cpp6
-rw-r--r--Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_GBA.h1
-rw-r--r--Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_InitAudioSystem.cpp6
-rw-r--r--Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_InitAudioSystem.h1
-rw-r--r--Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_ROM.cpp6
-rw-r--r--Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_ROM.h1
-rw-r--r--Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda.cpp5
-rw-r--r--Source/Core/Core/Src/HW/DSPHLE/UCodes/UCode_Zelda.h1
-rw-r--r--Source/Core/Core/Src/HW/DSPHLE/UCodes/UCodes.h1
-rw-r--r--Source/Core/Core/Src/HW/DSPLLE/DSPLLE.cpp5
-rw-r--r--Source/Core/Core/Src/HW/DSPLLE/DSPLLE.h1
-rw-r--r--Source/Core/Core/Src/HW/SystemTimers.cpp20
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<std::mutex> 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)