mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-04-01 01:20:40 +00:00
Mixer: Calculate actual_samples based on availability in all FIFOs
This commit is contained in:
parent
ac0df5b2db
commit
f5018010d3
@ -130,19 +130,30 @@ unsigned int CMixer::Mix(short* samples, unsigned int num_samples)
|
|||||||
|
|
||||||
memset(samples, 0, num_samples * 2 * sizeof(short));
|
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 = 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);
|
|
||||||
|
|
||||||
if (stretch)
|
|
||||||
{
|
{
|
||||||
if (m_is_stretching != stretch)
|
unsigned int actual_samples = std::min({
|
||||||
|
m_dma_mixer.AvailableSamples(), m_streaming_mixer.AvailableSamples(), num_samples,
|
||||||
|
});
|
||||||
|
|
||||||
|
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 (!m_is_stretching)
|
||||||
|
{
|
||||||
m_sound_touch.clear();
|
m_sound_touch.clear();
|
||||||
|
m_is_stretching = true;
|
||||||
|
}
|
||||||
StretchAudio(samples, actual_samples, num_samples);
|
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;
|
return num_samples;
|
||||||
}
|
}
|
||||||
@ -378,3 +389,11 @@ void CMixer::MixerFifo::SetVolume(unsigned int lvolume, unsigned int rvolume)
|
|||||||
m_LVolume.store(lvolume + (lvolume >> 7));
|
m_LVolume.store(lvolume + (lvolume >> 7));
|
||||||
m_RVolume.store(rvolume + (rvolume >> 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;
|
||||||
|
}
|
||||||
|
@ -60,6 +60,7 @@ private:
|
|||||||
void SetInputSampleRate(unsigned int rate);
|
void SetInputSampleRate(unsigned int rate);
|
||||||
unsigned int GetInputSampleRate() const;
|
unsigned int GetInputSampleRate() const;
|
||||||
void SetVolume(unsigned int lvolume, unsigned int rvolume);
|
void SetVolume(unsigned int lvolume, unsigned int rvolume);
|
||||||
|
unsigned int AvailableSamples() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CMixer* m_mixer;
|
CMixer* m_mixer;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user