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:
parent
800b2480ec
commit
1a1b89e7e8
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue