X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Faudio%2Fsound_manager.cpp;h=b2697c1abd32cfc22b3dbc5fa7e60584c6776ce7;hb=6b0c80bde84af0bf9323320d99f2fccd7c9eeedd;hp=cc10db7ce0265a42c25d58abedb0c710d8148f3b;hpb=b51f8f420a99f380d9389bdd7a020b9a33a72820;p=supertux.git diff --git a/src/audio/sound_manager.cpp b/src/audio/sound_manager.cpp index cc10db7ce..b2697c1ab 100644 --- a/src/audio/sound_manager.cpp +++ b/src/audio/sound_manager.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include "sound_file.hpp" #include "sound_source.hpp" @@ -34,6 +35,16 @@ #include "log.hpp" #include "timer.hpp" +#ifndef DEBUG + /** Older openal versions often miss this function and it isn't that vital for + * supertux... + */ +#ifdef alcGetString +#undef alcGetString +#endif +#define alcGetString(x,y) "" +#endif + SoundManager* sound_manager = 0; SoundManager::SoundManager() @@ -111,40 +122,52 @@ SoundManager::load_file_into_buffer(SoundFile* file) return buffer; } -SoundSource* -SoundManager::create_sound_source(const std::string& filename) +OpenALSoundSource* +SoundManager::intern_create_sound_source(const std::string& filename) { if(!sound_enabled) - return create_dummy_sound_source(); + throw std::runtime_error("sound disabled"); + + std::auto_ptr source (new OpenALSoundSource()); ALuint buffer; - - // reuse an existing static sound buffer + + // reuse an existing static sound buffer SoundBuffers::iterator i = buffers.find(filename); if(i != buffers.end()) { buffer = i->second; } else { - try { - // Load sound file - std::auto_ptr file (load_sound_file(filename)); + // Load sound file + std::auto_ptr file (load_sound_file(filename)); - if(file->size < 100000) { - buffer = load_file_into_buffer(file.get()); - buffers.insert(std::make_pair(filename, buffer)); - } else { - StreamSoundSource* source = new StreamSoundSource(); - source->set_sound_file(file.release()); - return source; - } - } catch(std::exception& e) { - log_warning << "Couldn't load soundfile '" << filename << "': " << e.what() << std::endl; - return create_dummy_sound_source(); + if(file->size < 100000) { + buffer = load_file_into_buffer(file.get()); + buffers.insert(std::make_pair(filename, buffer)); + } else { + StreamSoundSource* source = new StreamSoundSource(); + source->set_sound_file(file.release()); + return source; } + + log_debug << "Uncached sound \"" << filename << "\" requested to be played" << std::endl; } - - OpenALSoundSource* source = new OpenALSoundSource(); + alSourcei(source->source, AL_BUFFER, buffer); - return source; + return source.release(); +} + +SoundSource* +SoundManager::create_sound_source(const std::string& filename) +{ + if(!sound_enabled) + return create_dummy_sound_source(); + + try { + return intern_create_sound_source(filename); + } catch(std::exception &e) { + log_warning << "Couldn't create audio source: " << e.what() << std::endl; + return create_dummy_sound_source(); + } } void @@ -152,7 +175,7 @@ SoundManager::preload(const std::string& filename) { if(!sound_enabled) return; - + SoundBuffers::iterator i = buffers.find(filename); // already loaded? if(i != buffers.end()) @@ -172,11 +195,11 @@ SoundManager::play(const std::string& filename, const Vector& pos) { if(!sound_enabled) return; - + try { - std::auto_ptr source - (static_cast (create_sound_source(filename))); - + std::auto_ptr source + (intern_create_sound_source(filename)); + if(pos == Vector(-1, -1)) { source->set_rollof_factor(0); } else { @@ -193,7 +216,7 @@ void SoundManager::manage_source(SoundSource* source) { assert(source != NULL); - + OpenALSoundSource* openal_source = dynamic_cast (source); if(openal_source != NULL) { sources.push_back(openal_source); @@ -201,6 +224,27 @@ SoundManager::manage_source(SoundSource* source) } void +SoundManager::register_for_update( StreamSoundSource* sss ){ + if( sss != NULL ){ + update_list.push_back( sss ); + } +} + +void +SoundManager::remove_from_update( StreamSoundSource* sss ){ + if( sss != NULL ){ + StreamSoundSources::iterator i = update_list.begin(); + while( i != update_list.end() ){ + if( *i == sss ){ + i = update_list.erase(i); + } else { + i++; + } + } + } +} + +void SoundManager::enable_sound(bool enable) { if(device == NULL) @@ -274,12 +318,12 @@ SoundManager::play_music(const std::string& filename, bool fade) void SoundManager::set_listener_position(const Vector& pos) { - static Uint32 lastticks = 0; + static Uint32 lastticks = SDL_GetTicks(); Uint32 current_ticks = SDL_GetTicks(); if(current_ticks - lastticks < 300) return; - lastticks = current_ticks; + lastticks = current_ticks; alListener3f(AL_POSITION, pos.x, pos.y, 0); } @@ -293,18 +337,19 @@ SoundManager::set_listener_velocity(const Vector& vel) void SoundManager::update() { - static float lasttime = real_time; + static Uint32 lasttime = SDL_GetTicks(); + Uint32 now = SDL_GetTicks(); - if(real_time - lasttime < 0.3) + if(now - lasttime < 300) return; - lasttime = real_time; + lasttime = now; // update and check for finished sound sources for(SoundSources::iterator i = sources.begin(); i != sources.end(); ) { OpenALSoundSource* source = *i; source->update(); - + if(!source->playing()) { delete source; i = sources.erase(i); @@ -322,6 +367,13 @@ SoundManager::update() alcProcessContext(context); check_alc_error("Error while processing audio context: "); } + + //run update() for stream_sound_source + StreamSoundSources::iterator s = update_list.begin(); + while( s != update_list.end() ){ + (*s)->update(); + s++; + } } ALenum @@ -344,7 +396,7 @@ SoundManager::get_sample_format(SoundFile* file) throw std::runtime_error("Only 16 and 8 bit samples supported"); } } - + throw std::runtime_error("Only 1 and 2 channel samples supported"); } @@ -365,7 +417,7 @@ SoundManager::check_alc_error(const char* message) std::stringstream msg; msg << message << alcGetString(device, err); throw std::runtime_error(msg.str()); - } + } } void @@ -376,6 +428,5 @@ SoundManager::check_al_error(const char* message) std::stringstream msg; msg << message << alGetString(err); throw std::runtime_error(msg.str()); - } + } } -