//----------------------------------------------------------------------------- void MusicOggStream::update() { if (m_pausedMusic || m_soundSource == ALuint(-1)) { // nothing todo return; } int processed= 0; bool active= true; alGetSourcei(m_soundSource, AL_BUFFERS_PROCESSED, &processed); while(processed--) { ALuint buffer; alSourceUnqueueBuffers(m_soundSource, 1, &buffer); if(!check("alSourceUnqueueBuffers")) return; active = streamIntoBuffer(buffer); if(!active) { // no more data. Seek to beginning (causes the sound to loop) ov_time_seek(&m_oggStream, 0); active = streamIntoBuffer(buffer);//now there really should be data } alSourceQueueBuffers(m_soundSource, 1, &buffer); if (!check("alSourceQueueBuffers")) return; } if (active) { // For debugging SFXManager::checkError("before source state"); // we have data, so we should be playing... ALenum state; alGetSourcei(m_soundSource, AL_SOURCE_STATE, &state); if (state != AL_PLAYING) { // Prevent flooding static int count = 0; count++; if (count<10) Log::warn("MusicOgg", "Music not playing when it should be. " "Source state: %d", state); alGetSourcei(m_soundSource, AL_BUFFERS_PROCESSED, &processed); alSourcePlay(m_soundSource); } } else { Log::warn("MusicOgg", "Attempt to stream music into buffer failed " "twice in a row."); } } // update
ALuint CreateSource() { auto source = ALuint(0); alGenSources(1, &source); alSourcef(source, AL_PITCH, 1.f); alSourcef(source, AL_GAIN, 1.f); alSource3f(source, AL_POSITION, 0, 0, 0); alSource3f(source, AL_VELOCITY, 0, 0, 0); alSourcei(source, AL_LOOPING, 0); return source; }
bool SoundBuffer::play(ALint source) const { ALint buffer; alGetSourcei(source, AL_BUFFER, &buffer); if (ALuint(buffer) != mBuffers[0]) alSourcei(source, AL_BUFFER, mBuffers[0]); alSourcePlay(source); SoundSystem::checkError(__FUNCTION__); return true; }
//----------------------------------------------------------------------------- void MusicOggStream::update() { if (m_pausedMusic || m_soundSource == ALuint(-1)) { // nothing todo return; } int processed= 0; bool active= true; alGetSourcei(m_soundSource, AL_BUFFERS_PROCESSED, &processed); while(processed--) { ALuint buffer; alSourceUnqueueBuffers(m_soundSource, 1, &buffer); if(!check("alSourceUnqueueBuffers")) return; active = streamIntoBuffer(buffer); if(!active) { // no more data. Seek to beginning (causes the sound to loop) ov_time_seek(&m_oggStream, 0); active = streamIntoBuffer(buffer);//now there really should be data //fprintf(stdout,"Music buffer under-run.\n"); } alSourceQueueBuffers(m_soundSource, 1, &buffer); if (!check("alSourceQueueBuffers")) return; } if (active) { // we have data, so we should be playing... ALenum state; alGetSourcei(m_soundSource, AL_SOURCE_STATE, &state); if (state != AL_PLAYING) { fprintf(stderr,"WARNING: Music not playing when it should be. Source state: %d\n", state); alGetSourcei(m_soundSource, AL_BUFFERS_PROCESSED, &processed); alSourcePlay(m_soundSource); } } else { fprintf(stderr,"WARNING: Attempt to stream music into buffer failed twice in a row.\n"); } } // update
/** * @alsymbols * @alfunref{BufferData} */ void Data( DataFormat format, const ALvoid* data, ALsizei size, ALsizei frequency ) { OALPLUS_ALFUNC(BufferData)( ALuint(this->_name), ALenum(format), data, size, frequency ); OALPLUS_CHECK( BufferData, ObjectError, Object(*this) ); }
ALuint CreateBuffer() { auto buffer = ALuint(0); alGenBuffers(1, &buffer); return buffer; }