diff options
Diffstat (limited to 'Source/Core/AudioCommon/Mixer.cpp')
| -rw-r--r-- | Source/Core/AudioCommon/Mixer.cpp | 43 |
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); |
