X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Faudio%2Fstream_sound_source.cpp;h=e51a2e5fd5d9f8b47ef7f9da7e96811afbe4327f;hb=8e52a5b000d732e96b1cc461163c4778b434dc27;hp=d27856342649ce4023c659639e79adf256973f15;hpb=07ddaed2a657e4d2a3d038fed223fc5827159caf;p=supertux.git diff --git a/src/audio/stream_sound_source.cpp b/src/audio/stream_sound_source.cpp index d27856342..e51a2e5fd 100644 --- a/src/audio/stream_sound_source.cpp +++ b/src/audio/stream_sound_source.cpp @@ -1,12 +1,10 @@ -// $Id$ -// // SuperTux // Copyright (C) 2006 Matthias Braun // -// This program is free software; you can redistribute it and/or -// modify it under the terms of the GNU General Public License -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -14,39 +12,41 @@ // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -#include -#include - -#include - -#include "stream_sound_source.hpp" -#include "sound_manager.hpp" -#include "sound_file.hpp" -#include "log.hpp" - -StreamSoundSource::StreamSoundSource() - : file(0), fade_state(NoFading), looping(false) +// along with this program. If not, see . + +#include "audio/sound_file.hpp" +#include "audio/sound_manager.hpp" +#include "audio/stream_sound_source.hpp" +#include "supertux/timer.hpp" +#include "util/log.hpp" + +StreamSoundSource::StreamSoundSource() : + file(), + fade_state(NoFading), + fade_start_time(), + fade_time(), + looping(false) { alGenBuffers(STREAMFRAGMENTS, buffers); SoundManager::check_al_error("Couldn't allocate audio buffers: "); + //add me to update list + SoundManager::current()->register_for_update( this ); } StreamSoundSource::~StreamSoundSource() { - delete file; + //don't update me any longer + 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); @@ -64,7 +64,7 @@ StreamSoundSource::update() for(ALint i = 0; i < processed; ++i) { ALuint buffer; alSourceUnqueueBuffers(source, 1, &buffer); - SoundManager::check_al_error("Couldn't unqueu audio buffer: "); + SoundManager::check_al_error("Couldn't unqueue audio buffer: "); if(fillBufferAndQueue(buffer) == false) break; @@ -73,26 +73,27 @@ StreamSoundSource::update() if(!playing()) { if(processed == 0 || !looping) return; - - // we might have to restart the source if we had a buffer underrun + + // we might have to restart the source if we had a buffer underrun log_info << "Restarting audio source because of buffer underrun" << std::endl; play(); } - if(fade_state == FadingOn) { - Uint32 ticks = SDL_GetTicks(); - float time = (ticks - fade_start_ticks) / 1000.0; + if(fade_state == FadingOn || fade_state == FadingResume) { + float time = real_time - fade_start_time; if(time >= fade_time) { set_gain(1.0); fade_state = NoFading; } else { set_gain(time / fade_time); } - } else if(fade_state == FadingOff) { - Uint32 ticks = SDL_GetTicks(); - float time = (ticks - fade_start_ticks) / 1000.0; + } 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); @@ -101,22 +102,22 @@ 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_start_ticks = SDL_GetTicks(); + this->fade_time = fade_time_; + this->fade_start_time = real_time; } 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, - STREAMFRAGMENTSIZE - bytesread); + bytesread += file->read(bufferdata.get() + bytesread, + STREAMFRAGMENTSIZE - bytesread); // end of sound file if(bytesread < STREAMFRAGMENTSIZE) { if(looping) @@ -127,9 +128,8 @@ StreamSoundSource::fillBufferAndQueue(ALuint buffer) } while(bytesread < STREAMFRAGMENTSIZE); if(bytesread > 0) { - ALenum format = SoundManager::get_sample_format(file); - alBufferData(buffer, format, bufferdata, bytesread, file->rate); - delete[] bufferdata; + 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); @@ -140,3 +140,4 @@ StreamSoundSource::fillBufferAndQueue(ALuint buffer) return bytesread >= STREAMFRAGMENTSIZE; } +/* EOF */