diff options
| author | MerryMage <MerryMage@users.noreply.github.com> | 2017-04-11 12:41:35 +0100 |
|---|---|---|
| committer | MerryMage <MerryMage@users.noreply.github.com> | 2017-04-12 14:58:19 +0100 |
| commit | f5018010d39d4aff030c19b13f18f12c04c4a99b (patch) | |
| tree | dd53811ac7fd0c8d575d7c49fd83abd2d574d620 /Source/Core/AudioCommon/Mixer.cpp | |
| parent | ac0df5b2dbd40ac58137f13c09719abe24a95caf (diff) | |
Mixer: Calculate actual_samples based on availability in all FIFOs
Diffstat (limited to 'Source/Core/AudioCommon/Mixer.cpp')
| -rw-r--r-- | Source/Core/AudioCommon/Mixer.cpp | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/Source/Core/AudioCommon/Mixer.cpp b/Source/Core/AudioCommon/Mixer.cpp index 3e64d7f01f..0863dd1d7c 100644 --- a/Source/Core/AudioCommon/Mixer.cpp +++ b/Source/Core/AudioCommon/Mixer.cpp @@ -130,19 +130,30 @@ unsigned int CMixer::Mix(short* samples, unsigned int num_samples) memset(samples, 0, num_samples * 2 * sizeof(short)); - const bool stretch = SConfig::GetInstance().m_audio_stretch; + if (SConfig::GetInstance().m_audio_stretch) + { + unsigned int actual_samples = std::min({ + m_dma_mixer.AvailableSamples(), m_streaming_mixer.AvailableSamples(), num_samples, + }); - unsigned int actual_samples = m_dma_mixer.Mix(samples, num_samples, !stretch); - m_streaming_mixer.Mix(samples, num_samples, !stretch); - m_wiimote_speaker_mixer.Mix(samples, num_samples, !stretch); + m_dma_mixer.Mix(samples, actual_samples, false); + m_streaming_mixer.Mix(samples, actual_samples, false); + m_wiimote_speaker_mixer.Mix(samples, actual_samples, false); - if (stretch) - { - if (m_is_stretching != stretch) + if (!m_is_stretching) + { m_sound_touch.clear(); + m_is_stretching = true; + } StretchAudio(samples, actual_samples, num_samples); } - m_is_stretching = stretch; + 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_is_stretching = false; + } return num_samples; } @@ -378,3 +389,11 @@ void CMixer::MixerFifo::SetVolume(unsigned int lvolume, unsigned int rvolume) m_LVolume.store(lvolume + (lvolume >> 7)); m_RVolume.store(rvolume + (rvolume >> 7)); } + +unsigned int CMixer::MixerFifo::AvailableSamples() const +{ + unsigned int samples_in_fifo = ((m_indexW.load() - m_indexR.load()) & INDEX_MASK) / 2; + if (samples_in_fifo <= 1) + return 0; // CMixer::MixerFifo::Mix always keeps one sample in the buffer. + return (samples_in_fifo - 1) * m_mixer->m_sampleRate / m_input_sample_rate; +} |
