// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#include <config.h>
#include "sound_manager.hpp"
#include "sound_file.hpp"
#include "sound_source.hpp"
+#include "openal_sound_source.hpp"
#include "stream_sound_source.hpp"
+#include "dummy_sound_source.hpp"
#include "log.hpp"
#include "timer.hpp"
SoundManager::SoundManager()
: device(0), context(0), sound_enabled(false), music_source(0),
- music_enabled(true)
+ music_enabled(false)
{
try {
device = alcOpenDevice(0);
- if (device == 0) {
+ if (device == NULL) {
throw std::runtime_error("Couldn't open audio device.");
}
check_al_error("Audio error after init: ");
sound_enabled = true;
+ music_enabled = true;
} catch(std::exception& e) {
- device = 0;
- context = 0;
+ if(context != NULL)
+ alcDestroyContext(context);
+ context = NULL;
+ if(device != NULL)
+ alcCloseDevice(device);
+ device = NULL;
log_warning << "Couldn't initialize audio device: " << e.what() << std::endl;
print_openal_version();
}
SoundManager::~SoundManager()
{
- if(music_source)
- delete music_source;
+ delete music_source;
for(SoundSources::iterator i = sources.begin(); i != sources.end(); ++i) {
delete *i;
alDeleteBuffers(1, &buffer);
}
- if(context != 0) {
+ if(context != NULL) {
alcDestroyContext(context);
}
- if(device != 0) {
+ if(device != NULL) {
alcCloseDevice(device);
}
}
SoundManager::create_sound_source(const std::string& filename)
{
if(!sound_enabled)
- return 0;
+ return create_dummy_sound_source();
ALuint buffer;
if(i != buffers.end()) {
buffer = i->second;
} else {
- // 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;
+ try {
+ // 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();
}
}
- SoundSource* source = new SoundSource();
+ OpenALSoundSource* source = new OpenALSoundSource();
alSourcei(source->source, AL_BUFFER, buffer);
return source;
}
void
+SoundManager::preload(const std::string& filename)
+{
+ if(!sound_enabled)
+ return;
+
+ SoundBuffers::iterator i = buffers.find(filename);
+ // already loaded?
+ if(i != buffers.end())
+ return;
+
+ std::auto_ptr<SoundFile> file (load_sound_file(filename));
+ // only keep small files
+ if(file->size >= 100000)
+ return;
+
+ ALuint buffer = load_file_into_buffer(file.get());
+ buffers.insert(std::make_pair(filename, buffer));
+}
+
+void
SoundManager::play(const std::string& filename, const Vector& pos)
{
+ if(!sound_enabled)
+ return;
+
try {
- SoundSource* source = create_sound_source(filename);
- if(source == 0)
- return;
+ std::auto_ptr<OpenALSoundSource> source
+ (static_cast<OpenALSoundSource*> (create_sound_source(filename)));
+
if(pos == Vector(-1, -1)) {
- alSourcef(source->source, AL_ROLLOFF_FACTOR, 0);
+ source->set_rollof_factor(0);
} else {
source->set_position(pos);
}
source->play();
- sources.push_back(source);
+ sources.push_back(source.release());
} catch(std::exception& e) {
log_warning << "Couldn't play sound " << filename << ": " << e.what() << std::endl;
}
}
void
+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::enable_sound(bool enable)
{
- if(device == 0)
+ if(device == NULL)
return;
+
sound_enabled = enable;
}
void
SoundManager::enable_music(bool enable)
{
- if(device == 0)
+ if(device == NULL)
return;
+
music_enabled = enable;
if(music_enabled) {
play_music(current_music);
music_source->set_fading(StreamSoundSource::FadingOff, fadetime);
} else {
delete music_source;
- music_source = 0;
+ music_source = NULL;
}
current_music = "";
}
if(filename == "") {
delete music_source;
- music_source = 0;
+ music_source = NULL;
return;
}
// update and check for finished sound sources
for(SoundSources::iterator i = sources.begin(); i != sources.end(); ) {
- SoundSource* source = *i;
+ OpenALSoundSource* source = *i;
source->update();