From 0e0fec3075d58fe0cc8332bd209fcc3256fd30ba Mon Sep 17 00:00:00 2001 From: booto Date: Wed, 16 Sep 2015 03:22:01 +0800 Subject: [PATCH] AI: reduce overhead of sample counter --- Source/Core/Core/HW/AudioInterface.cpp | 27 +++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/Source/Core/Core/HW/AudioInterface.cpp b/Source/Core/Core/HW/AudioInterface.cpp index 9849127e5437..f810a85fc5c0 100644 --- a/Source/Core/Core/HW/AudioInterface.cpp +++ b/Source/Core/Core/HW/AudioInterface.cpp @@ -133,7 +133,7 @@ void DoState(PointerWrap &p) static void GenerateAudioInterrupt(); static void UpdateInterrupts(); static void IncreaseSampleCount(const u32 _uAmount); -static u64 GetAIPeriod(); +static int GetAIPeriod(); static int et_AI; void Init() @@ -205,7 +205,7 @@ void RegisterMMIO(MMIO::Mapping* mmio, u32 base) g_LastCPUTime = CoreTiming::GetTicks(); CoreTiming::RemoveEvent(et_AI); - CoreTiming::ScheduleEvent(((int)GetAIPeriod() / 2), et_AI); + CoreTiming::ScheduleEvent(GetAIPeriod(), et_AI); } // AI Interrupt @@ -238,10 +238,14 @@ void RegisterMMIO(MMIO::Mapping* mmio, u32 base) mmio->Register(base | AI_SAMPLE_COUNTER, MMIO::ComplexRead([](u32) { - Update(0, 0); - return m_SampleCounter; + return m_SampleCounter + static_cast((CoreTiming::GetTicks() - g_LastCPUTime) / g_CPUCyclesPerSample); }), - MMIO::DirectWrite(&m_SampleCounter) + MMIO::ComplexWrite([](u32, u32 val) { + m_SampleCounter = val; + g_LastCPUTime = CoreTiming::GetTicks(); + CoreTiming::RemoveEvent(et_AI); + CoreTiming::ScheduleEvent(GetAIPeriod(), et_AI); + }) ); mmio->Register(base | AI_INTERRUPT_TIMING, @@ -250,7 +254,7 @@ void RegisterMMIO(MMIO::Mapping* mmio, u32 base) DEBUG_LOG(AUDIO_INTERFACE, "AI_INTERRUPT_TIMING=%08x@%08x", val, PowerPC::ppcState.pc); m_InterruptTiming = val; CoreTiming::RemoveEvent(et_AI); - CoreTiming::ScheduleEvent(((int)GetAIPeriod() / 2), et_AI); + CoreTiming::ScheduleEvent(GetAIPeriod(), et_AI); }) ); } @@ -308,16 +312,17 @@ void Update(u64 userdata, int cyclesLate) g_LastCPUTime += Samples * g_CPUCyclesPerSample; IncreaseSampleCount(Samples); } - CoreTiming::ScheduleEvent(((int)GetAIPeriod() / 2) - cyclesLate, et_AI); + CoreTiming::ScheduleEvent(GetAIPeriod() - cyclesLate, et_AI); } } -u64 GetAIPeriod() +int GetAIPeriod() { - u64 period = g_CPUCyclesPerSample * m_InterruptTiming; + u64 period = g_CPUCyclesPerSample * (m_InterruptTiming-m_SampleCounter); + u64 s_period = g_CPUCyclesPerSample * g_AISSampleRate; if (period == 0) - period = 32000 * g_CPUCyclesPerSample; - return period; + return static_cast(s_period); + return static_cast(std::min(period, s_period)); } } // end of namespace AudioInterface