void Update(u64 userdata, int cyclesLate) { // AUDIO HACK LOGGING static std::FILE *f2 = NULL; if (!f2) { f2 = std::fopen("dolphin_dtklog.txt", "w"); if (f2) std::fprintf(f2, "cpu,cpudelta,arate,enabled\n"); } if (f2) { static u64 lasttime = 0; u64 cputime = CoreTiming::GetTicks(); int audiorate = AudioInterface::g_AISSampleRate; const char *enablec = m_Control.PSTAT ? "TRUE" : "FALSE"; u64 diff = cputime - lasttime; std::fprintf(f2, "%I64u,%I64u,%i,%s\n", cputime, diff, audiorate, enablec); lasttime = cputime; } if (m_Control.PSTAT) { const u64 Diff = CoreTiming::GetTicks() - g_LastCPUTime; if (Diff > g_CPUCyclesPerSample) { const u32 Samples = static_cast<u32>(Diff / g_CPUCyclesPerSample); g_LastCPUTime += Samples * g_CPUCyclesPerSample; IncreaseSampleCount(Samples); } CoreTiming::ScheduleEvent(((int)GetAIPeriod() / 2) - cyclesLate, et_AI); } }
static void Update(u64 userdata, s64 cyclesLate) { if (m_Control.PSTAT) { const u64 Diff = CoreTiming::GetTicks() - g_LastCPUTime; if (Diff > g_CPUCyclesPerSample) { const u32 Samples = static_cast<u32>(Diff / g_CPUCyclesPerSample); g_LastCPUTime += Samples * g_CPUCyclesPerSample; IncreaseSampleCount(Samples); } CoreTiming::ScheduleEvent(GetAIPeriod() - cyclesLate, et_AI); } }
void RegisterMMIO(MMIO::Mapping* mmio, u32 base) { mmio->Register( base | AI_CONTROL_REGISTER, MMIO::DirectRead<u32>(&m_Control.hex), MMIO::ComplexWrite<u32>([](u32, u32 val) { AICR tmpAICtrl(val); if (m_Control.AIINTMSK != tmpAICtrl.AIINTMSK) { DEBUG_LOG(AUDIO_INTERFACE, "Change AIINTMSK to %d", tmpAICtrl.AIINTMSK); m_Control.AIINTMSK = tmpAICtrl.AIINTMSK; } if (m_Control.AIINTVLD != tmpAICtrl.AIINTVLD) { DEBUG_LOG(AUDIO_INTERFACE, "Change AIINTVLD to %d", tmpAICtrl.AIINTVLD); m_Control.AIINTVLD = tmpAICtrl.AIINTVLD; } // Set frequency of streaming audio if (tmpAICtrl.AISFR != m_Control.AISFR) { // AISFR rates below are intentionally inverted wrt yagcd DEBUG_LOG(AUDIO_INTERFACE, "Change AISFR to %s", tmpAICtrl.AISFR ? "48khz" : "32khz"); m_Control.AISFR = tmpAICtrl.AISFR; g_AISSampleRate = tmpAICtrl.AISFR ? 48000 : 32000; g_sound_stream->GetMixer()->SetStreamInputSampleRate(g_AISSampleRate); g_CPUCyclesPerSample = SystemTimers::GetTicksPerSecond() / g_AISSampleRate; } // Set frequency of DMA if (tmpAICtrl.AIDFR != m_Control.AIDFR) { DEBUG_LOG(AUDIO_INTERFACE, "Change AIDFR to %s", tmpAICtrl.AIDFR ? "32khz" : "48khz"); m_Control.AIDFR = tmpAICtrl.AIDFR; g_AIDSampleRate = tmpAICtrl.AIDFR ? 32000 : 48000; g_sound_stream->GetMixer()->SetDMAInputSampleRate(g_AIDSampleRate); } // Streaming counter if (tmpAICtrl.PSTAT != m_Control.PSTAT) { DEBUG_LOG(AUDIO_INTERFACE, "%s streaming audio", tmpAICtrl.PSTAT ? "start" : "stop"); m_Control.PSTAT = tmpAICtrl.PSTAT; g_LastCPUTime = CoreTiming::GetTicks(); CoreTiming::RemoveEvent(et_AI); CoreTiming::ScheduleEvent(GetAIPeriod(), et_AI); } // AI Interrupt if (tmpAICtrl.AIINT) { DEBUG_LOG(AUDIO_INTERFACE, "Clear AIS Interrupt"); m_Control.AIINT = 0; } // Sample Count Reset if (tmpAICtrl.SCRESET) { DEBUG_LOG(AUDIO_INTERFACE, "Reset AIS sample counter"); m_SampleCounter = 0; g_LastCPUTime = CoreTiming::GetTicks(); } UpdateInterrupts(); })); mmio->Register(base | AI_VOLUME_REGISTER, MMIO::DirectRead<u32>(&m_Volume.hex), MMIO::ComplexWrite<u32>([](u32, u32 val) { m_Volume.hex = val; g_sound_stream->GetMixer()->SetStreamingVolume(m_Volume.left, m_Volume.right); })); mmio->Register(base | AI_SAMPLE_COUNTER, MMIO::ComplexRead<u32>([](u32) { return m_SampleCounter + static_cast<u32>((CoreTiming::GetTicks() - g_LastCPUTime) / g_CPUCyclesPerSample); }), 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::DirectRead<u32>(&m_InterruptTiming), MMIO::ComplexWrite<u32>([](u32, u32 val) { DEBUG_LOG(AUDIO_INTERFACE, "AI_INTERRUPT_TIMING=%08x@%08x", val, PowerPC::ppcState.pc); m_InterruptTiming = val; CoreTiming::RemoveEvent(et_AI); CoreTiming::ScheduleEvent(GetAIPeriod(), et_AI); })); }