Beispiel #1
0
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);
	}
}
Beispiel #2
0
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);
  }
}
Beispiel #3
0
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);
                 }));
}