void DSP::Filter::Gain::processSamples(SampleBuffer& samples) { for(int i = 0; i < samples.size(); ++i) { auto scaled = static_cast<int64_t>(samples[i]) * m_gain; samples[i] = saturate<int16_t>(scaled >> 16); } }
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 SoundEngine::MusicHook(void* userdata, Uint8* stream, int len) { bool* musicFinishedPtr = reinterpret_cast<bool*>(userdata); if (!*musicFinishedPtr) { SampleBuffer buffer; Uint32 ret = musicDecoder.Decode(buffer, len); if (ret == SOUND_DECODE_COMPLETED) { musicDecoder.Close(); *musicFinishedPtr = true; } else if (ret == SOUND_DECODE_ERROR) { logger->error("Sound: Error during music decoding, stopping playback of current track.\n"); *musicFinishedPtr = true; return; } memcpy(stream, &buffer[0], buffer.size()); } }