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 | |
parent | 3aacd0a3d5efa9001c97dbaa761c7ad90df789be (diff) | |
download | openttd-72124862f0cdf799da0773be8d8a0dd3da0a01bc.tar.xz |
(svn r14631) -Add: support for Allegro as sound backend.
-rw-r--r-- | source.list | 4 | ||||
-rw-r--r-- | src/openttd.cpp | 1 | ||||
-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 | ||||
-rw-r--r-- | src/video/allegro_v.cpp | 11 |
6 files changed, 117 insertions, 3 deletions
diff --git a/source.list b/source.list index facc10586..b4687fcaf 100644 --- a/source.list +++ b/source.list @@ -123,6 +123,7 @@ window.cpp # Header Files #if ALLEGRO + sound/allegro_s.h video/allegro_v.h #end ai/ai.h @@ -646,6 +647,9 @@ music/null_m.cpp #end # Sound +#if ALLEGRO + sound/allegro_s.cpp +#end sound/null_s.cpp #if SDL sound/sdl_s.cpp diff --git a/src/openttd.cpp b/src/openttd.cpp index 54ae08f7b..ea56b0c58 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -1184,6 +1184,7 @@ void GameLoop() InputLoop(); + _sound_driver->MainLoop(); MusicLoop(); } 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 { diff --git a/src/video/allegro_v.cpp b/src/video/allegro_v.cpp index a70a2709c..f69c7121e 100644 --- a/src/video/allegro_v.cpp +++ b/src/video/allegro_v.cpp @@ -374,9 +374,14 @@ static void PollEvent() } } +/** There are multiple modules that might be using Allegro and + * Allegro can only be initiated once. */ +int _allegro_count = 0; + const char *VideoDriver_Allegro::Start(const char * const *parm) { - if (install_allegro(SYSTEM_AUTODETECT, &errno, NULL)) return NULL; + if (_allegro_count == 0 && install_allegro(SYSTEM_AUTODETECT, &errno, NULL)) return NULL; + _allegro_count++; install_timer(); install_mouse(); @@ -391,7 +396,7 @@ const char *VideoDriver_Allegro::Start(const char * const *parm) void VideoDriver_Allegro::Stop() { - allegro_exit(); + if (--_allegro_count == 0) allegro_exit(); } #if defined(UNIX) || defined(__OS2__) || defined(PSP) @@ -431,7 +436,7 @@ void VideoDriver_Allegro::MainLoop() #else /* Speedup when pressing tab, except when using ALT+TAB * to switch to another application */ - if (keys[KEY_TAB] && (key_shifts & KB_ALT_FLAG) == 0) + if (key[KEY_TAB] && (key_shifts & KB_ALT_FLAG) == 0) #endif { if (!_networking && _game_mode != GM_MENU) _fast_forward |= 2; |