void SingularSampleBuffer::swapBuffers(SampleBuffer& secondaryBuffer) { DEBUG_ASSERT_CLASS_INVARIANT_SingularSampleBuffer; DEBUG_ASSERT(m_primaryBuffer.size() == secondaryBuffer.size()); // SampleUtil::copy() requires that the source and destination // memory regions are disjunct. Double-buffering is necessary // to satisfy this precondition. SampleUtil::copy( secondaryBuffer.data(), m_primaryBuffer.data(m_headOffset), getSize()); m_primaryBuffer.swap(secondaryBuffer); // shift offsets m_tailOffset -= m_headOffset; m_headOffset = 0; DEBUG_ASSERT_CLASS_INVARIANT_SingularSampleBuffer; }
void SampleBuffer::normalizeSampleRate( const sample_rate_t _src_sr, bool _keep_settings ) { // do samplerate-conversion to our default-samplerate if( _src_sr != engine::mixer()->baseSampleRate() ) { SampleBuffer * resampled = resample( this, _src_sr, engine::mixer()->baseSampleRate() ); MM_FREE( m_data ); m_frames = resampled->frames(); m_data = MM_ALLOC( sampleFrame, m_frames ); memcpy( m_data, resampled->data(), m_frames * sizeof( sampleFrame ) ); delete resampled; } if( _keep_settings == false ) { // update frame-variables m_loopStartFrame = m_startFrame = 0; m_loopEndFrame = m_endFrame = m_frames; } }