summaryrefslogtreecommitdiff
path: root/Source/Core/AudioCommon/Mixer.cpp
diff options
context:
space:
mode:
authorMerryMage <MerryMage@users.noreply.github.com>2017-04-11 12:41:35 +0100
committerMerryMage <MerryMage@users.noreply.github.com>2017-04-12 14:58:19 +0100
commitf5018010d39d4aff030c19b13f18f12c04c4a99b (patch)
treedd53811ac7fd0c8d575d7c49fd83abd2d574d620 /Source/Core/AudioCommon/Mixer.cpp
parentac0df5b2dbd40ac58137f13c09719abe24a95caf (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.cpp35
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;
+}