diff options
| author | degasus <wickmarkus@web.de> | 2014-02-06 13:03:40 +0100 |
|---|---|---|
| committer | degasus <wickmarkus@web.de> | 2014-02-11 14:35:19 +0100 |
| commit | ca9fd64df916949518fe8dfd3ca9c0432eade388 (patch) | |
| tree | a22a9410ef8fc7652645686e7b0c608c23cc91c8 /Source/Core/AudioCommon/Mixer.cpp | |
| parent | d20dbbc92fe78bd5e5005bb6512c688beb3df681 (diff) | |
controll the interpolation frac by the fifo size
Diffstat (limited to 'Source/Core/AudioCommon/Mixer.cpp')
| -rw-r--r-- | Source/Core/AudioCommon/Mixer.cpp | 8 |
1 files changed, 7 insertions, 1 deletions
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"); |
