void Sound::play() { if (!m_buffer || m_buffer->getSampleCount() == 0) return; if (getStatus() == Playing) stop(); m_channel = 0; while (m_channel < 24 && ndspChnIsPlaying(m_channel)) m_channel++; if (m_channel == 24) { err() << "Sound::play() failed because all channels are in use." << std::endl; m_channel = -1; return; } setPlayingOffset(m_pauseOffset); if (m_pauseOffset != Time::Zero) m_pauseOffset = Time::Zero; u32 size = sizeof(Int16) * m_buffer->getSampleCount(); ndspChnReset(m_channel); ndspChnSetInterp(m_channel, NDSP_INTERP_POLYPHASE); ndspChnSetRate(m_channel, float(m_buffer->getSampleRate())); ndspChnSetFormat(m_channel, (m_buffer->getChannelCount() == 1) ? NDSP_FORMAT_MONO_PCM16 : NDSP_FORMAT_STEREO_PCM16); DSP_FlushDataCache((u8*)m_buffer->getSamples(), size); ndspChnWaveBufAdd(m_channel, &m_ndspWaveBuf); }
void sfSoundStream_setPlayingOffset(sfSoundStream* soundStream, sfTime timeOffset) { CSFML_CALL(soundStream, setPlayingOffset(sf::microseconds(timeOffset.microseconds))); }