(svn r14631) -Add: support for Allegro as sound backend.
authorrubidium
Tue, 25 Nov 2008 21:09:00 +0000
changeset 10380 f4adb9648a93
parent 10379 dd9d0aade65e
child 10381 c043aa0c1695
(svn r14631) -Add: support for Allegro as sound backend.
source.list
src/openttd.cpp
src/sound/allegro_s.cpp
src/sound/allegro_s.h
src/sound/sound_driver.hpp
src/video/allegro_v.cpp
--- a/source.list	Tue Nov 25 19:32:12 2008 +0000
+++ b/source.list	Tue Nov 25 21:09:00 2008 +0000
@@ -123,6 +123,7 @@
 
 # Header Files
 #if ALLEGRO
+	sound/allegro_s.h
 	video/allegro_v.h
 #end
 ai/ai.h
@@ -646,6 +647,9 @@
 #end
 
 # Sound
+#if ALLEGRO
+	sound/allegro_s.cpp
+#end
 sound/null_s.cpp
 #if SDL
 	sound/sdl_s.cpp
--- a/src/openttd.cpp	Tue Nov 25 19:32:12 2008 +0000
+++ b/src/openttd.cpp	Tue Nov 25 21:09:00 2008 +0000
@@ -1184,6 +1184,7 @@
 
 	InputLoop();
 
+	_sound_driver->MainLoop();
 	MusicLoop();
 }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/sound/allegro_s.cpp	Tue Nov 25 21:09:00 2008 +0000
@@ -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 */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/sound/allegro_s.h	Tue Nov 25 21:09:00 2008 +0000
@@ -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 */
--- a/src/sound/sound_driver.hpp	Tue Nov 25 19:32:12 2008 +0000
+++ b/src/sound/sound_driver.hpp	Tue Nov 25 21:09:00 2008 +0000
@@ -8,6 +8,9 @@
 #include "../driver.h"
 
 class SoundDriver: public Driver {
+public:
+	/* Called once every tick */
+	virtual void MainLoop() {}
 };
 
 class SoundDriverFactoryBase: public DriverFactoryBase {
--- a/src/video/allegro_v.cpp	Tue Nov 25 19:32:12 2008 +0000
+++ b/src/video/allegro_v.cpp	Tue Nov 25 21:09:00 2008 +0000
@@ -374,9 +374,14 @@
 	}
 }
 
+/** 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 @@
 
 void VideoDriver_Allegro::Stop()
 {
-	allegro_exit();
+	if (--_allegro_count == 0) allegro_exit();
 }
 
 #if defined(UNIX) || defined(__OS2__) || defined(PSP)
@@ -431,7 +436,7 @@
 #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;