Merge pull request #3042 from booto/audio-timing
AI: reduce overhead of sample counter
This commit is contained in:
commit
a91810ba3b
|
@ -133,7 +133,7 @@ void DoState(PointerWrap &p)
|
||||||
static void GenerateAudioInterrupt();
|
static void GenerateAudioInterrupt();
|
||||||
static void UpdateInterrupts();
|
static void UpdateInterrupts();
|
||||||
static void IncreaseSampleCount(const u32 _uAmount);
|
static void IncreaseSampleCount(const u32 _uAmount);
|
||||||
static u64 GetAIPeriod();
|
static int GetAIPeriod();
|
||||||
static int et_AI;
|
static int et_AI;
|
||||||
|
|
||||||
void Init()
|
void Init()
|
||||||
|
@ -205,7 +205,7 @@ void RegisterMMIO(MMIO::Mapping* mmio, u32 base)
|
||||||
g_LastCPUTime = CoreTiming::GetTicks();
|
g_LastCPUTime = CoreTiming::GetTicks();
|
||||||
|
|
||||||
CoreTiming::RemoveEvent(et_AI);
|
CoreTiming::RemoveEvent(et_AI);
|
||||||
CoreTiming::ScheduleEvent(((int)GetAIPeriod() / 2), et_AI);
|
CoreTiming::ScheduleEvent(GetAIPeriod(), et_AI);
|
||||||
}
|
}
|
||||||
|
|
||||||
// AI Interrupt
|
// AI Interrupt
|
||||||
|
@ -238,10 +238,14 @@ void RegisterMMIO(MMIO::Mapping* mmio, u32 base)
|
||||||
|
|
||||||
mmio->Register(base | AI_SAMPLE_COUNTER,
|
mmio->Register(base | AI_SAMPLE_COUNTER,
|
||||||
MMIO::ComplexRead<u32>([](u32) {
|
MMIO::ComplexRead<u32>([](u32) {
|
||||||
Update(0, 0);
|
return m_SampleCounter + static_cast<u32>((CoreTiming::GetTicks() - g_LastCPUTime) / g_CPUCyclesPerSample);
|
||||||
return m_SampleCounter;
|
|
||||||
}),
|
}),
|
||||||
MMIO::DirectWrite<u32>(&m_SampleCounter)
|
MMIO::ComplexWrite<u32>([](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,
|
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);
|
DEBUG_LOG(AUDIO_INTERFACE, "AI_INTERRUPT_TIMING=%08x@%08x", val, PowerPC::ppcState.pc);
|
||||||
m_InterruptTiming = val;
|
m_InterruptTiming = val;
|
||||||
CoreTiming::RemoveEvent(et_AI);
|
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;
|
g_LastCPUTime += Samples * g_CPUCyclesPerSample;
|
||||||
IncreaseSampleCount(Samples);
|
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)
|
if (period == 0)
|
||||||
period = 32000 * g_CPUCyclesPerSample;
|
return static_cast<int>(s_period);
|
||||||
return period;
|
return static_cast<int>(std::min(period, s_period));
|
||||||
}
|
}
|
||||||
|
|
||||||
} // end of namespace AudioInterface
|
} // end of namespace AudioInterface
|
||||||
|
|
Loading…
Reference in New Issue