diff --git a/stepmania/src/RageSoundMixBuffer.cpp b/stepmania/src/RageSoundMixBuffer.cpp index 0763a9fb9d..9d60eaedbf 100644 --- a/stepmania/src/RageSoundMixBuffer.cpp +++ b/stepmania/src/RageSoundMixBuffer.cpp @@ -53,23 +53,27 @@ void RageSoundMixBuffer::Extend( unsigned iSamples ) } } -void RageSoundMixBuffer::write( const int16_t *pBuf, unsigned iSize ) +void RageSoundMixBuffer::write( const int16_t *pBuf, unsigned iSize, int iSourceStride, int iDestStride ) { - Extend( iSize ); + /* iSize = 3, iDestStride = 2 uses 4 frames. Don't allocate the stride of the + * last sample. */ + Extend( iSize * iDestStride - (iDestStride-1) ); /* Scale volume and add. */ int32_t *pDestBuf = m_pMixbuf+m_iOffset; #ifdef USE_VEC - if( g_bVector ) + if( g_bVector && iSourceStride == 1 && iDestStride == 1 ) { Vector::FastSoundWrite( pDestBuf, pBuf, iSize, m_iVolumeFactor ); return; } #endif - for( unsigned pos = 0; pos < iSize; ++pos ) + while( iSize ) { - *pDestBuf += pBuf[pos] * m_iVolumeFactor; - ++pDestBuf; + *pDestBuf += *pBuf * m_iVolumeFactor; + pBuf += iSourceStride; + pDestBuf += iDestStride; + --iSize; } } diff --git a/stepmania/src/RageSoundMixBuffer.h b/stepmania/src/RageSoundMixBuffer.h index 450ea89e34..95f77b2144 100644 --- a/stepmania/src/RageSoundMixBuffer.h +++ b/stepmania/src/RageSoundMixBuffer.h @@ -10,7 +10,7 @@ public: ~RageSoundMixBuffer(); /* Mix the given buffer of samples. */ - void write( const int16_t *buf, unsigned size ); + void write( const int16_t *buf, unsigned size, int iSourceStride = 1, int iDestStride = 1 ); /* Extend the buffer as if write() was called with a buffer of silence. */ void Extend( unsigned iSamples );