#include <sstream>
#include <memory>
#include <assert.h>
+#include <SDL.h>
#include "sound_file.hpp"
#include "sound_source.hpp"
#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()
if(!sound_enabled)
return create_dummy_sound_source();
+ std::auto_ptr<OpenALSoundSource> source;
+ try {
+ source.reset(new OpenALSoundSource());
+ } catch(std::exception& e) {
+ log_warning << "Couldn't create audio source: " << e.what() << std::endl;
+ return create_dummy_sound_source();
+ }
+
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;
return create_dummy_sound_source();
}
}
-
- OpenALSoundSource* source = new OpenALSoundSource();
+
alSourcei(source->source, AL_BUFFER, buffer);
- return source;
+ return source.release();
}
void
{
if(!sound_enabled)
return;
-
+
SoundBuffers::iterator i = buffers.find(filename);
// already loaded?
if(i != buffers.end())
{
if(!sound_enabled)
return;
-
+
try {
- std::auto_ptr<OpenALSoundSource> source
+ std::auto_ptr<OpenALSoundSource> source
(static_cast<OpenALSoundSource*> (create_sound_source(filename)));
-
+
if(pos == Vector(-1, -1)) {
source->set_rollof_factor(0);
} else {
SoundManager::manage_source(SoundSource* source)
{
assert(source != NULL);
-
+
OpenALSoundSource* openal_source = dynamic_cast<OpenALSoundSource*> (source);
if(openal_source != NULL) {
sources.push_back(openal_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)
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);
}
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);
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
throw std::runtime_error("Only 16 and 8 bit samples supported");
}
}
-
+
throw std::runtime_error("Only 1 and 2 channel samples supported");
}
std::stringstream msg;
msg << message << alcGetString(device, err);
throw std::runtime_error(msg.str());
- }
+ }
}
void
std::stringstream msg;
msg << message << alGetString(err);
throw std::runtime_error(msg.str());
- }
+ }
}
-