diff options
author | rubidium <rubidium@openttd.org> | 2008-11-25 21:09:00 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2008-11-25 21:09:00 +0000 |
commit | 72124862f0cdf799da0773be8d8a0dd3da0a01bc (patch) | |
tree | 8f56ace83113a8c96887be195a473b1132beb9e5 /src/sound | |
parent | 3aacd0a3d5efa9001c97dbaa761c7ad90df789be (diff) | |
download | openttd-72124862f0cdf799da0773be8d8a0dd3da0a01bc.tar.xz |
(svn r14631) -Add: support for Allegro as sound backend.
Diffstat (limited to 'src/sound')
-rw-r--r-- | src/sound/allegro_s.cpp | 74 | ||||
-rw-r--r-- | src/sound/allegro_s.h | 27 | ||||
-rw-r--r-- | src/sound/sound_driver.hpp | 3 |
3 files changed, 104 insertions, 0 deletions
diff --git a/src/sound/allegro_s.cpp b/src/sound/allegro_s.cpp new file mode 100644 index 000000000..f3d9579a9 --- /dev/null +++ b/src/sound/allegro_s.cpp @@ -0,0 +1,74 @@ +/* $Id$ */ + +/** @file allegro_s.cpp Playing sound via Allegro. */ + +#ifdef WITH_ALLEGRO + +#include "../stdafx.h" + +#include "../driver.h" +#include "../mixer.h" +#include "../sdl.h" +#include "allegro_s.h" +#include <allegro.h> + +static FSoundDriver_Allegro iFSoundDriver_Allegro; +/** The stream we are writing too */ +static AUDIOSTREAM *_stream = NULL; +/** The number of samples in the buffer */ +static const int BUFFER_SIZE = 512; + +void SoundDriver_Allegro::MainLoop() +{ + /* We haven't opened a stream yet */ + if (_stream == NULL) return; + + void *data = get_audio_stream_buffer(_stream); + /* We don't have to fill the stream yet */ + if (data == NULL) return; + + /* Mix the samples */ + MxMixSamples(data, BUFFER_SIZE); + + /* Allegro sound is always unsigned, so we need to correct that */ + uint16 *snd = (uint16*)data; + for (int i = 0; i < BUFFER_SIZE * 2; i++) snd[i] ^= 0x8000; + + /* Tell we've filled the stream */ + free_audio_stream_buffer(_stream); +} + +/** There are multiple modules that might be using Allegro and + * Allegro can only be initiated once. */ +extern int _allegro_count; + +const char *SoundDriver_Allegro::Start(const char * const *parm) +{ + if (_allegro_count == 0 && install_allegro(SYSTEM_AUTODETECT, &errno, NULL)) return NULL; + _allegro_count++; + + /* Initialise the sound */ + if (install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, NULL) != 0) return NULL; + + /* Okay, there's no soundcard */ + if (digi_card == DIGI_NONE) { + DEBUG(driver, 0, "allegro: no sound card found"); + return NULL; + } + + _stream = play_audio_stream(BUFFER_SIZE, 16, true, 11025, 255, 128); + return NULL; +} + +void SoundDriver_Allegro::Stop() +{ + if (_stream != NULL) { + stop_audio_stream(_stream); + _stream = NULL; + } + remove_sound(); + + if (--_allegro_count == 0) allegro_exit(); +} + +#endif /* WITH_ALLEGRO */ diff --git a/src/sound/allegro_s.h b/src/sound/allegro_s.h new file mode 100644 index 000000000..181f45059 --- /dev/null +++ b/src/sound/allegro_s.h @@ -0,0 +1,27 @@ +/* $Id$ */ + +/** @file allegro_s.h Base fo playing sound via Allegro. */ + +#ifndef SOUND_ALLEGRO_H +#define SOUND_ALLEGRO_H + +#include "sound_driver.hpp" + +class SoundDriver_Allegro: public SoundDriver { +public: + /* virtual */ const char *Start(const char * const *param); + + /* virtual */ void Stop(); + + /* virtual */ void MainLoop(); +}; + +class FSoundDriver_Allegro: public SoundDriverFactory<FSoundDriver_Allegro> { +public: + static const int priority = 5; + /* virtual */ const char *GetName() { return "allegro"; } + /* virtual */ const char *GetDescription() { return "Allegro Sound Driver"; } + /* virtual */ Driver *CreateInstance() { return new SoundDriver_Allegro(); } +}; + +#endif /* SOUND_ALLEGRO_H */ diff --git a/src/sound/sound_driver.hpp b/src/sound/sound_driver.hpp index 8f3f08579..5756db309 100644 --- a/src/sound/sound_driver.hpp +++ b/src/sound/sound_driver.hpp @@ -8,6 +8,9 @@ #include "../driver.h" class SoundDriver: public Driver { +public: + /* Called once every tick */ + virtual void MainLoop() {} }; class SoundDriverFactoryBase: public DriverFactoryBase { |