Merge pull request #9055 from JosJuice/gc-sample-rate

AudioInterface: Use 32029/48043 Hz in more places
This commit is contained in:
LC 2020-09-07 22:35:00 -04:00 committed by GitHub
commit 8e505ad8d5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 41 additions and 17 deletions

View File

@ -15,6 +15,7 @@
#include "Common/FileUtil.h" #include "Common/FileUtil.h"
#include "Common/Logging/Log.h" #include "Common/Logging/Log.h"
#include "Core/ConfigManager.h" #include "Core/ConfigManager.h"
#include "Core/HW/AudioInterface.h"
// This shouldn't be a global, at least not here. // This shouldn't be a global, at least not here.
std::unique_ptr<SoundStream> g_sound_stream; std::unique_ptr<SoundStream> g_sound_stream;
@ -67,6 +68,12 @@ void InitSoundStream()
g_sound_stream->Init(); g_sound_stream->Init();
} }
// Ideally these two calls would be done in AudioInterface::Init so that we don't
// need to have a dependency on AudioInterface here, but this has to be done
// after creating g_sound_stream (above) and before starting audio dumping (below)
g_sound_stream->GetMixer()->SetDMAInputSampleRate(AudioInterface::GetAIDSampleRate());
g_sound_stream->GetMixer()->SetStreamInputSampleRate(AudioInterface::GetAISSampleRate());
UpdateSoundStream(); UpdateSoundStream();
SetSoundStreamRunning(true); SetSoundStreamRunning(true);

View File

@ -149,8 +149,8 @@ void Init()
s_last_cpu_time = 0; s_last_cpu_time = 0;
s_cpu_cycles_per_sample = 0xFFFFFFFFFFFULL; s_cpu_cycles_per_sample = 0xFFFFFFFFFFFULL;
s_ais_sample_rate = 48000; s_ais_sample_rate = Get48KHzSampleRate();
s_aid_sample_rate = 32000; s_aid_sample_rate = Get32KHzSampleRate();
event_type_ai = CoreTiming::RegisterEvent("AICallback", Update); 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 // AISFR rates below are intentionally inverted wrt yagcd
DEBUG_LOG(AUDIO_INTERFACE, "Change AISFR to %s", tmp_ai_ctrl.AISFR ? "48khz" : "32khz"); DEBUG_LOG(AUDIO_INTERFACE, "Change AISFR to %s", tmp_ai_ctrl.AISFR ? "48khz" : "32khz");
s_control.AISFR = tmp_ai_ctrl.AISFR; s_control.AISFR = tmp_ai_ctrl.AISFR;
if (SConfig::GetInstance().bWii) s_ais_sample_rate = tmp_ai_ctrl.AISFR ? Get48KHzSampleRate() : Get32KHzSampleRate();
s_ais_sample_rate = tmp_ai_ctrl.AISFR ? 48000 : 32000;
else
s_ais_sample_rate = tmp_ai_ctrl.AISFR ? 48043 : 32029;
g_sound_stream->GetMixer()->SetStreamInputSampleRate(s_ais_sample_rate); g_sound_stream->GetMixer()->SetStreamInputSampleRate(s_ais_sample_rate);
s_cpu_cycles_per_sample = SystemTimers::GetTicksPerSecond() / 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"); DEBUG_LOG(AUDIO_INTERFACE, "Change AIDFR to %s", tmp_ai_ctrl.AIDFR ? "32khz" : "48khz");
s_control.AIDFR = tmp_ai_ctrl.AIDFR; s_control.AIDFR = tmp_ai_ctrl.AIDFR;
if (SConfig::GetInstance().bWii) s_aid_sample_rate = tmp_ai_ctrl.AIDFR ? Get32KHzSampleRate() : Get48KHzSampleRate();
s_aid_sample_rate = tmp_ai_ctrl.AIDFR ? 32000 : 48000;
else
s_aid_sample_rate = tmp_ai_ctrl.AIDFR ? 32029 : 48043;
g_sound_stream->GetMixer()->SetDMAInputSampleRate(s_aid_sample_rate); g_sound_stream->GetMixer()->SetDMAInputSampleRate(s_aid_sample_rate);
} }
@ -299,11 +293,26 @@ bool IsPlaying()
return (s_control.PSTAT == 1); return (s_control.PSTAT == 1);
} }
unsigned int GetAIDSampleRate() u32 GetAIDSampleRate()
{ {
return s_aid_sample_rate; return s_aid_sample_rate;
} }
u32 GetAISSampleRate()
{
return s_ais_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) static void Update(u64 userdata, s64 cycles_late)
{ {
if (s_control.PSTAT) if (s_control.PSTAT)

View File

@ -24,7 +24,11 @@ bool IsPlaying();
void RegisterMMIO(MMIO::Mapping* mmio, u32 base); void RegisterMMIO(MMIO::Mapping* mmio, u32 base);
// Get the audio rates (48000 or 32000 only) // Get the audio rates (48000 or 32000 only)
unsigned int GetAIDSampleRate(); u32 GetAIDSampleRate();
u32 GetAISSampleRate();
u32 Get32KHzSampleRate();
u32 Get48KHzSampleRate();
void GenerateAISInterrupt(); void GenerateAISInterrupt();

View File

@ -296,8 +296,12 @@ static u32 AdvanceDTK(u32 maximum_samples, u32* samples_to_process)
static void DTKStreamingCallback(DIInterruptType interrupt_type, const std::vector<u8>& audio_data, static void DTKStreamingCallback(DIInterruptType interrupt_type, const std::vector<u8>& audio_data,
s64 cycles_late) s64 cycles_late)
{ {
// TODO: Should we use GetAISSampleRate instead of a fixed 48 KHz? The audio mixer is using
// GetAISSampleRate. (This doesn't affect any actual games, since they all set it to 48 KHz.)
const u32 sample_rate = AudioInterface::Get48KHzSampleRate();
// Determine which audio data to read next. // 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; u64 read_offset = 0;
u32 read_length = 0; u32 read_length = 0;
@ -311,22 +315,22 @@ static void DTKStreamingCallback(DIInterruptType interrupt_type, const std::vect
if (s_stream && AudioInterface::IsPlaying()) if (s_stream && AudioInterface::IsPlaying())
{ {
read_offset = s_audio_position; read_offset = s_audio_position;
read_length = AdvanceDTK(MAXIMUM_SAMPLES, &s_pending_samples); read_length = AdvanceDTK(maximum_samples, &s_pending_samples);
} }
else else
{ {
read_length = 0; read_length = 0;
s_pending_samples = MAXIMUM_SAMPLES; s_pending_samples = maximum_samples;
} }
} }
else else
{ {
read_length = 0; read_length = 0;
s_pending_samples = MAXIMUM_SAMPLES; s_pending_samples = maximum_samples;
} }
// Read the next chunk of audio data asynchronously. // 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; ticks_to_dtk -= cycles_late;
if (read_length > 0) if (read_length > 0)
{ {