X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Faudio%2Fstream_sound_source.cpp;h=e51a2e5fd5d9f8b47ef7f9da7e96811afbe4327f;hb=8e52a5b000d732e96b1cc461163c4778b434dc27;hp=fceab8063e722075fc54396c9fbf7e50828e6748;hpb=a8057c3d1726484928a3091fdd5c7a3d810f5f63;p=supertux.git diff --git a/src/audio/stream_sound_source.cpp b/src/audio/stream_sound_source.cpp index fceab8063..e51a2e5fd 100644 --- a/src/audio/stream_sound_source.cpp +++ b/src/audio/stream_sound_source.cpp @@ -21,7 +21,7 @@ #include "util/log.hpp" StreamSoundSource::StreamSoundSource() : - file(0), + file(), fade_state(NoFading), fade_start_time(), fade_time(), @@ -30,24 +30,23 @@ StreamSoundSource::StreamSoundSource() : alGenBuffers(STREAMFRAGMENTS, buffers); SoundManager::check_al_error("Couldn't allocate audio buffers: "); //add me to update list - sound_manager->register_for_update( this ); + SoundManager::current()->register_for_update( this ); } StreamSoundSource::~StreamSoundSource() { //don't update me any longer - sound_manager->remove_from_update( this ); - delete file; + SoundManager::current()->remove_from_update( this ); + file.reset(); stop(); alDeleteBuffers(STREAMFRAGMENTS, buffers); SoundManager::check_al_error("Couldn't delete audio buffers: "); } void -StreamSoundSource::set_sound_file(SoundFile* newfile) +StreamSoundSource::set_sound_file(std::unique_ptr newfile) { - delete file; - file = newfile; + file = std::move(newfile); ALint queued; alGetSourcei(source, AL_BUFFERS_QUEUED, &queued); @@ -80,7 +79,7 @@ StreamSoundSource::update() play(); } - if(fade_state == FadingOn) { + if(fade_state == FadingOn || fade_state == FadingResume) { float time = real_time - fade_start_time; if(time >= fade_time) { set_gain(1.0); @@ -88,10 +87,13 @@ StreamSoundSource::update() } else { set_gain(time / fade_time); } - } else if(fade_state == FadingOff) { + } else if(fade_state == FadingOff || fade_state == FadingPause) { float time = real_time - fade_start_time; if(time >= fade_time) { - stop(); + if(fade_state == FadingOff) + stop(); + else + pause(); fade_state = NoFading; } else { set_gain( (fade_time-time) / fade_time); @@ -100,10 +102,10 @@ StreamSoundSource::update() } void -StreamSoundSource::set_fading(FadeState state, float fade_time) +StreamSoundSource::set_fading(FadeState state, float fade_time_) { this->fade_state = state; - this->fade_time = fade_time; + this->fade_time = fade_time_; this->fade_start_time = real_time; } @@ -111,10 +113,10 @@ bool StreamSoundSource::fillBufferAndQueue(ALuint buffer) { // fill buffer - char* bufferdata = new char[STREAMFRAGMENTSIZE]; + std::unique_ptr bufferdata(new char[STREAMFRAGMENTSIZE]); size_t bytesread = 0; do { - bytesread += file->read(bufferdata + bytesread, + bytesread += file->read(bufferdata.get() + bytesread, STREAMFRAGMENTSIZE - bytesread); // end of sound file if(bytesread < STREAMFRAGMENTSIZE) { @@ -126,14 +128,13 @@ StreamSoundSource::fillBufferAndQueue(ALuint buffer) } while(bytesread < STREAMFRAGMENTSIZE); if(bytesread > 0) { - ALenum format = SoundManager::get_sample_format(file); - alBufferData(buffer, format, bufferdata, bytesread, file->rate); + ALenum format = SoundManager::get_sample_format(*file); + alBufferData(buffer, format, bufferdata.get(), bytesread, file->rate); SoundManager::check_al_error("Couldn't refill audio buffer: "); alSourceQueueBuffers(source, 1, &buffer); SoundManager::check_al_error("Couldn't queue audio buffer: "); } - delete[] bufferdata; // return false if there aren't more buffers to fill return bytesread >= STREAMFRAGMENTSIZE;