summaryrefslogtreecommitdiff
path: root/Source/Core/AudioCommon/Mixer.cpp
diff options
context:
space:
mode:
authorJMC47 <JMC4789@gmail.com>2022-01-06 12:11:54 -0500
committerGitHub <noreply@github.com>2022-01-06 12:11:54 -0500
commit193ca92cb8ce97445dc5e2c66e0fc5c55c957c22 (patch)
treea79238598ba8469a59848d31bb4ca1c006c5e648 /Source/Core/AudioCommon/Mixer.cpp
parent5d11dc1926a7c76d8cfcd11d995e24244bdd7e71 (diff)
parenteb5bb2993ef1d11564f1117247ac5106d7a5e78c (diff)
Merge pull request #10349 from AdmiralCurtiss/config-port-core-2
Config: Port remaining Core settings to new config system (part 2).
Diffstat (limited to 'Source/Core/AudioCommon/Mixer.cpp')
-rw-r--r--Source/Core/AudioCommon/Mixer.cpp43
1 files changed, 31 insertions, 12 deletions
diff --git a/Source/Core/AudioCommon/Mixer.cpp b/Source/Core/AudioCommon/Mixer.cpp
index 6888d9520b..f6bebb60cc 100644
--- a/Source/Core/AudioCommon/Mixer.cpp
+++ b/Source/Core/AudioCommon/Mixer.cpp
@@ -35,11 +35,15 @@ Mixer::Mixer(unsigned int BackendSampleRate)
m_surround_decoder(BackendSampleRate,
DPL2QualityToFrameBlockSize(Config::Get(Config::MAIN_DPL2_QUALITY)))
{
+ m_config_changed_callback_id = Config::AddConfigChangedCallback([this] { RefreshConfig(); });
+ RefreshConfig();
+
INFO_LOG_FMT(AUDIO_INTERFACE, "Mixer is initialized");
}
Mixer::~Mixer()
{
+ Config::RemoveConfigChangedCallback(m_config_changed_callback_id);
}
void Mixer::DoState(PointerWrap& p)
@@ -53,7 +57,8 @@ void Mixer::DoState(PointerWrap& p)
// Executed from sound stream thread
unsigned int Mixer::MixerFifo::Mix(short* samples, unsigned int numSamples,
- bool consider_framelimit)
+ bool consider_framelimit, float emulationspeed,
+ int timing_variance)
{
unsigned int currentSample = 0;
@@ -71,13 +76,12 @@ unsigned int Mixer::MixerFifo::Mix(short* samples, unsigned int numSamples,
// advance indexR with sample position
// remember fractional offset
- float emulationspeed = SConfig::GetInstance().m_EmulationSpeed;
float aid_sample_rate = static_cast<float>(m_input_sample_rate);
if (consider_framelimit && emulationspeed > 0.0f)
{
float numLeft = static_cast<float>(((indexW - indexR) & INDEX_MASK) / 2);
- u32 low_waterwark = m_input_sample_rate * SConfig::GetInstance().iTimingVariance / 1000;
+ u32 low_waterwark = m_input_sample_rate * timing_variance / 1000;
low_waterwark = std::min(low_waterwark, MAX_SAMPLES / 2);
m_numLeftI = (numLeft + m_numLeftI * (CONTROL_AVG - 1)) / CONTROL_AVG;
@@ -154,18 +158,26 @@ unsigned int Mixer::Mix(short* samples, unsigned int num_samples)
memset(samples, 0, num_samples * 2 * sizeof(short));
- if (Config::Get(Config::MAIN_AUDIO_STRETCH))
+ const float emulation_speed = m_config_emulation_speed;
+ const int timing_variance = m_config_timing_variance;
+ if (m_config_audio_stretch)
{
unsigned int available_samples =
std::min(m_dma_mixer.AvailableSamples(), m_streaming_mixer.AvailableSamples());
m_scratch_buffer.fill(0);
- m_dma_mixer.Mix(m_scratch_buffer.data(), available_samples, false);
- m_streaming_mixer.Mix(m_scratch_buffer.data(), available_samples, false);
- m_wiimote_speaker_mixer.Mix(m_scratch_buffer.data(), available_samples, false);
+ m_dma_mixer.Mix(m_scratch_buffer.data(), available_samples, false, emulation_speed,
+ timing_variance);
+ m_streaming_mixer.Mix(m_scratch_buffer.data(), available_samples, false, emulation_speed,
+ timing_variance);
+ m_wiimote_speaker_mixer.Mix(m_scratch_buffer.data(), available_samples, false, emulation_speed,
+ timing_variance);
for (auto& mixer : m_gba_mixers)
- mixer.Mix(m_scratch_buffer.data(), available_samples, false);
+ {
+ mixer.Mix(m_scratch_buffer.data(), available_samples, false, emulation_speed,
+ timing_variance);
+ }
if (!m_is_stretching)
{
@@ -177,11 +189,11 @@ unsigned int Mixer::Mix(short* samples, unsigned int num_samples)
}
else
{
- m_dma_mixer.Mix(samples, num_samples, true);
- m_streaming_mixer.Mix(samples, num_samples, true);
- m_wiimote_speaker_mixer.Mix(samples, num_samples, true);
+ m_dma_mixer.Mix(samples, num_samples, true, emulation_speed, timing_variance);
+ m_streaming_mixer.Mix(samples, num_samples, true, emulation_speed, timing_variance);
+ m_wiimote_speaker_mixer.Mix(samples, num_samples, true, emulation_speed, timing_variance);
for (auto& mixer : m_gba_mixers)
- mixer.Mix(samples, num_samples, true);
+ mixer.Mix(samples, num_samples, true, emulation_speed, timing_variance);
m_is_stretching = false;
}
@@ -385,6 +397,13 @@ void Mixer::StopLogDSPAudio()
}
}
+void Mixer::RefreshConfig()
+{
+ m_config_emulation_speed = Config::Get(Config::MAIN_EMULATION_SPEED);
+ m_config_timing_variance = Config::Get(Config::MAIN_TIMING_VARIANCE);
+ m_config_audio_stretch = Config::Get(Config::MAIN_AUDIO_STRETCH);
+}
+
void Mixer::MixerFifo::DoState(PointerWrap& p)
{
p.Do(m_input_sample_rate);