#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
+void
SoundManager::register_for_update( StreamSoundSource* sss ){
if( sss != NULL ){
update_list.push_back( sss );
- }
+ }
}
void
i++;
}
}
- }
+ }
}
void
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() ){
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());
- }
+ }
}
-