From 72124862f0cdf799da0773be8d8a0dd3da0a01bc Mon Sep 17 00:00:00 2001 From: rubidium Date: Tue, 25 Nov 2008 21:09:00 +0000 Subject: (svn r14631) -Add: support for Allegro as sound backend. --- src/openttd.cpp | 1 + src/sound/allegro_s.cpp | 74 ++++++++++++++++++++++++++++++++++++++++++++++ src/sound/allegro_s.h | 27 +++++++++++++++++ src/sound/sound_driver.hpp | 3 ++ src/video/allegro_v.cpp | 11 +++++-- 5 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 src/sound/allegro_s.cpp create mode 100644 src/sound/allegro_s.h (limited to 'src') 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 + +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 { +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; -- cgit v1.2.3-54-g00ecf