X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Faudio%2Fstream_sound_source.cpp;h=bb178725d4cee6dc9538b19f51cc2b516d08f99a;hb=25da12d34b356745dcf3669f234e17ee5bfa6b80;hp=930f34c5093e58ded63a154b60eb279909f7ecd5;hpb=67690e081c28b818e94796be284206326bc8a6b9;p=supertux.git diff --git a/src/audio/stream_sound_source.cpp b/src/audio/stream_sound_source.cpp index 930f34c50..bb178725d 100644 --- a/src/audio/stream_sound_source.cpp +++ b/src/audio/stream_sound_source.cpp @@ -1,22 +1,42 @@ -#include -#include - -#include - -#include "stream_sound_source.hpp" -#include "sound_manager.hpp" -#include "sound_file.hpp" -#include "msg.hpp" - -StreamSoundSource::StreamSoundSource() - : file(0), fade_state(NoFading), looping(false) +// 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 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 +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// 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, 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(0), + 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 + sound_manager->register_for_update( this ); } StreamSoundSource::~StreamSoundSource() { + //don't update me any longer + sound_manager->remove_from_update( this ); delete file; stop(); alDeleteBuffers(STREAMFRAGMENTS, buffers); @@ -45,7 +65,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; @@ -54,15 +74,14 @@ StreamSoundSource::update() if(!playing()) { if(processed == 0 || !looping) return; - - // we might have to restart the source if we had a buffer underrun - msg_info << "Restarting audio source because of buffer underrun" << std::endl; + + // 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; + float time = real_time - fade_start_time; if(time >= fade_time) { set_gain(1.0); fade_state = NoFading; @@ -70,8 +89,7 @@ StreamSoundSource::update() set_gain(time / fade_time); } } else if(fade_state == FadingOff) { - Uint32 ticks = SDL_GetTicks(); - float time = (ticks - fade_start_ticks) / 1000.0; + float time = real_time - fade_start_time; if(time >= fade_time) { stop(); fade_state = NoFading; @@ -86,7 +104,7 @@ 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_start_time = real_time; } bool @@ -97,7 +115,7 @@ StreamSoundSource::fillBufferAndQueue(ALuint buffer) size_t bytesread = 0; do { bytesread += file->read(bufferdata + bytesread, - STREAMFRAGMENTSIZE - bytesread); + STREAMFRAGMENTSIZE - bytesread); // end of sound file if(bytesread < STREAMFRAGMENTSIZE) { if(looping) @@ -110,14 +128,15 @@ StreamSoundSource::fillBufferAndQueue(ALuint buffer) if(bytesread > 0) { ALenum format = SoundManager::get_sample_format(file); alBufferData(buffer, format, bufferdata, bytesread, file->rate); - delete[] bufferdata; 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; } +/* EOF */