From ca9fd64df916949518fe8dfd3ca9c0432eade388 Mon Sep 17 00:00:00 2001 From: degasus Date: Thu, 6 Feb 2014 13:03:40 +0100 Subject: controll the interpolation frac by the fifo size --- Source/Core/AudioCommon/Mixer.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'Source/Core/AudioCommon/Mixer.cpp') diff --git a/Source/Core/AudioCommon/Mixer.cpp b/Source/Core/AudioCommon/Mixer.cpp index dd1e7ed386..99c5a56176 100644 --- a/Source/Core/AudioCommon/Mixer.cpp +++ b/Source/Core/AudioCommon/Mixer.cpp @@ -44,12 +44,18 @@ unsigned int CMixer::Mix(short* samples, unsigned int numSamples) u32 indexR = Common::AtomicLoad(m_indexR); u32 indexW = Common::AtomicLoad(m_indexW); + float numLeft = ((indexW - indexR) & INDEX_MASK) / 2; + m_numLeftI = (numLeft + m_numLeftI*(CONTROL_AVG-1)) / CONTROL_AVG; + float offset = (m_numLeftI - LOW_WATERMARK) * CONTROL_FACTOR; + if(offset > MAX_FREQ_SHIFT) offset = MAX_FREQ_SHIFT; + if(offset < -MAX_FREQ_SHIFT) offset = -MAX_FREQ_SHIFT; + //render numleft sample pairs to samples[] //advance indexR with sample position //remember fractional offset static u32 frac = 0; - const u32 ratio = (u32)( 65536.0f * (float)AudioInterface::GetAIDSampleRate() / (float)m_sampleRate ); + const u32 ratio = (u32)( 65536.0f * (float)AudioInterface::GetAIDSampleRate() / (float)m_sampleRate + offset ); if(ratio > 0x10000) ERROR_LOG(AUDIO, "ratio out of range"); -- cgit v1.2.3