AudioInterface: Use 32029/48043 Hz in more places

In particular, I wanted to do change this in
AudioInterface::Init so that dumped GC audio doesn't need
to have a file split (changing from 32000 Hz to 32029 Hz)
when the emulated software initializes the AI registers.
I've also made the same change to DI's DTK code.
This commit is contained in:
JosJuice 2020-08-29 13:24:39 +02:00
parent 800b2480ec
commit 1a1b89e7e8
3 changed files with 25 additions and 15 deletions

View File

@ -149,8 +149,8 @@ void Init()
s_last_cpu_time = 0;
s_cpu_cycles_per_sample = 0xFFFFFFFFFFFULL;
s_ais_sample_rate = 48000;
s_aid_sample_rate = 32000;
s_ais_sample_rate = Get48KHzSampleRate();
s_aid_sample_rate = Get32KHzSampleRate();
event_type_ai = CoreTiming::RegisterEvent("AICallback", Update);
}
@ -184,10 +184,7 @@ void RegisterMMIO(MMIO::Mapping* mmio, u32 base)
// AISFR rates below are intentionally inverted wrt yagcd
DEBUG_LOG(AUDIO_INTERFACE, "Change AISFR to %s", tmp_ai_ctrl.AISFR ? "48khz" : "32khz");
s_control.AISFR = tmp_ai_ctrl.AISFR;
if (SConfig::GetInstance().bWii)
s_ais_sample_rate = tmp_ai_ctrl.AISFR ? 48000 : 32000;
else
s_ais_sample_rate = tmp_ai_ctrl.AISFR ? 48043 : 32029;
s_ais_sample_rate = tmp_ai_ctrl.AISFR ? Get48KHzSampleRate() : Get32KHzSampleRate();
g_sound_stream->GetMixer()->SetStreamInputSampleRate(s_ais_sample_rate);
s_cpu_cycles_per_sample = SystemTimers::GetTicksPerSecond() / s_ais_sample_rate;
}
@ -196,10 +193,7 @@ void RegisterMMIO(MMIO::Mapping* mmio, u32 base)
{
DEBUG_LOG(AUDIO_INTERFACE, "Change AIDFR to %s", tmp_ai_ctrl.AIDFR ? "32khz" : "48khz");
s_control.AIDFR = tmp_ai_ctrl.AIDFR;
if (SConfig::GetInstance().bWii)
s_aid_sample_rate = tmp_ai_ctrl.AIDFR ? 32000 : 48000;
else
s_aid_sample_rate = tmp_ai_ctrl.AIDFR ? 32029 : 48043;
s_aid_sample_rate = tmp_ai_ctrl.AIDFR ? Get32KHzSampleRate() : Get48KHzSampleRate();
g_sound_stream->GetMixer()->SetDMAInputSampleRate(s_aid_sample_rate);
}
@ -304,6 +298,16 @@ unsigned int GetAIDSampleRate()
return s_aid_sample_rate;
}
u32 Get32KHzSampleRate()
{
return SConfig::GetInstance().bWii ? 32000 : 32029;
}
u32 Get48KHzSampleRate()
{
return SConfig::GetInstance().bWii ? 48000 : 48043;
}
static void Update(u64 userdata, s64 cycles_late)
{
if (s_control.PSTAT)

View File

@ -26,6 +26,9 @@ void RegisterMMIO(MMIO::Mapping* mmio, u32 base);
// Get the audio rates (48000 or 32000 only)
unsigned int GetAIDSampleRate();
u32 Get32KHzSampleRate();
u32 Get48KHzSampleRate();
void GenerateAISInterrupt();
} // namespace AudioInterface

View File

@ -294,8 +294,11 @@ static u32 AdvanceDTK(u32 maximum_samples, u32* samples_to_process)
static void DTKStreamingCallback(DIInterruptType interrupt_type, const std::vector<u8>& audio_data,
s64 cycles_late)
{
// TODO: Should we use the configured AIS sample rate instead of a fixed 48 KHz?
const u32 sample_rate = AudioInterface::Get48KHzSampleRate();
// Determine which audio data to read next.
static const int MAXIMUM_SAMPLES = 48000 / 2000 * 7; // 3.5ms of 48kHz samples
const u32 maximum_samples = sample_rate / 2000 * 7; // 3.5 ms of samples
u64 read_offset = 0;
u32 read_length = 0;
@ -309,22 +312,22 @@ static void DTKStreamingCallback(DIInterruptType interrupt_type, const std::vect
if (s_stream && AudioInterface::IsPlaying())
{
read_offset = s_audio_position;
read_length = AdvanceDTK(MAXIMUM_SAMPLES, &s_pending_samples);
read_length = AdvanceDTK(maximum_samples, &s_pending_samples);
}
else
{
read_length = 0;
s_pending_samples = MAXIMUM_SAMPLES;
s_pending_samples = maximum_samples;
}
}
else
{
read_length = 0;
s_pending_samples = MAXIMUM_SAMPLES;
s_pending_samples = maximum_samples;
}
// Read the next chunk of audio data asynchronously.
s64 ticks_to_dtk = SystemTimers::GetTicksPerSecond() * s64(s_pending_samples) / 48000;
s64 ticks_to_dtk = SystemTimers::GetTicksPerSecond() * s64(s_pending_samples) / sample_rate;
ticks_to_dtk -= cycles_late;
if (read_length > 0)
{