#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()
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<OpenALSoundSource> source (new OpenALSoundSource());
ALuint buffer;
if(i != buffers.end()) {
buffer = i->second;
} else {
- try {
- // Load sound file
- std::auto_ptr<SoundFile> file (load_sound_file(filename));
+ // Load sound file
+ std::auto_ptr<SoundFile> 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
try {
std::auto_ptr<OpenALSoundSource> source
- (static_cast<OpenALSoundSource*> (create_sound_source(filename)));
+ (intern_create_sound_source(filename));
if(pos == Vector(-1, -1)) {
source->set_rollof_factor(0);
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)
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(); ) {