summaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authortron <tron@openttd.org>2005-07-23 15:16:57 +0000
committertron <tron@openttd.org>2005-07-23 15:16:57 +0000
commit07a6e612ec560945c55798b67bbb56a00f1cb06b (patch)
tree1e83d1a7e27b80f46817858872b1f46a903f1d1b /sound
parentaf1d71985678a907dcb2c76e4873ec317cefecfc (diff)
downloadopenttd-07a6e612ec560945c55798b67bbb56a00f1cb06b.tar.xz
(svn r2685) -Codechange: Split the music/sound/video drivers into separate files and move them into subfolders.
This results in shorter and hopefully easier to maintain files. Note: I had to change paths in #include statements of some unrelated files, because I added the ottd base directory to the include path (-I.)
Diffstat (limited to 'sound')
-rw-r--r--sound/null.c11
-rw-r--r--sound/null.h8
-rw-r--r--sound/sdl.c40
-rw-r--r--sound/sdl.h8
-rw-r--r--sound/win32.c84
-rw-r--r--sound/win32.h8
6 files changed, 159 insertions, 0 deletions
diff --git a/sound/null.c b/sound/null.c
new file mode 100644
index 000000000..e7d0c8c10
--- /dev/null
+++ b/sound/null.c
@@ -0,0 +1,11 @@
+#include "stdafx.h"
+#include "openttd.h"
+#include "sound/null.h"
+
+static const char *NullSoundStart(const char * const *parm) { return NULL; }
+static void NullSoundStop(void) {}
+
+const HalSoundDriver _null_sound_driver = {
+ NullSoundStart,
+ NullSoundStop,
+};
diff --git a/sound/null.h b/sound/null.h
new file mode 100644
index 000000000..63cc5ef8f
--- /dev/null
+++ b/sound/null.h
@@ -0,0 +1,8 @@
+#ifndef SOUND_NULL_H
+#define SOUND_NULL_H
+
+#include "hal.h"
+
+extern const HalSoundDriver _null_sound_driver;
+
+#endif
diff --git a/sound/sdl.c b/sound/sdl.c
new file mode 100644
index 000000000..2f227ad39
--- /dev/null
+++ b/sound/sdl.c
@@ -0,0 +1,40 @@
+#include "stdafx.h"
+#include "openttd.h"
+#include "driver.h"
+#include "mixer.h"
+#include "sdl.h"
+#include "sound/sdl.h"
+#include <SDL.h>
+
+static void CDECL fill_sound_buffer(void *userdata, Uint8 *stream, int len)
+{
+ MxMixSamples(_mixer, stream, len / 4);
+}
+
+static const char *SdlSoundStart(const char * const *parm)
+{
+ SDL_AudioSpec spec;
+
+ const char *s = SdlOpen(SDL_INIT_AUDIO);
+ if (s != NULL) return s;
+
+ spec.freq = GetDriverParamInt(parm, "hz", 11025);
+ spec.format = AUDIO_S16SYS;
+ spec.channels = 2;
+ spec.samples = 512;
+ spec.callback = fill_sound_buffer;
+ SDL_CALL SDL_OpenAudio(&spec, &spec);
+ SDL_CALL SDL_PauseAudio(0);
+ return NULL;
+}
+
+static void SdlSoundStop(void)
+{
+ SDL_CALL SDL_CloseAudio();
+ SdlClose(SDL_INIT_AUDIO);
+}
+
+const HalSoundDriver _sdl_sound_driver = {
+ SdlSoundStart,
+ SdlSoundStop,
+};
diff --git a/sound/sdl.h b/sound/sdl.h
new file mode 100644
index 000000000..9e593991a
--- /dev/null
+++ b/sound/sdl.h
@@ -0,0 +1,8 @@
+#ifndef SOUND_SDL_H
+#define SOUND_SDL_H
+
+#include "hal.h"
+
+extern const HalSoundDriver _sdl_sound_driver;
+
+#endif
diff --git a/sound/win32.c b/sound/win32.c
new file mode 100644
index 000000000..9d58515a3
--- /dev/null
+++ b/sound/win32.c
@@ -0,0 +1,84 @@
+#include "stdafx.h"
+#include "openttd.h"
+#include "driver.h"
+#include "functions.h"
+#include "mixer.h"
+#include "sound/win32.h"
+#include <windows.h>
+
+static HWAVEOUT _waveout;
+static WAVEHDR _wave_hdr[2];
+static int _bufsize;
+
+static void PrepareHeader(WAVEHDR *hdr)
+{
+ hdr->dwBufferLength = _bufsize * 4;
+ hdr->dwFlags = 0;
+ hdr->lpData = malloc(_bufsize * 4);
+ if (hdr->lpData == NULL ||
+ waveOutPrepareHeader(_waveout, hdr, sizeof(WAVEHDR)) != MMSYSERR_NOERROR)
+ error("waveOutPrepareHeader failed");
+}
+
+static void FillHeaders(void)
+{
+ WAVEHDR *hdr;
+
+ for (hdr = _wave_hdr; hdr != endof(_wave_hdr); hdr++) {
+ if (!(hdr->dwFlags & WHDR_INQUEUE)) {
+ MxMixSamples(_mixer, hdr->lpData, hdr->dwBufferLength / 4);
+ if (waveOutWrite(_waveout, hdr, sizeof(WAVEHDR)) != MMSYSERR_NOERROR)
+ error("waveOutWrite failed");
+ }
+ }
+}
+
+static void CALLBACK waveOutProc(HWAVEOUT hwo, UINT uMsg, DWORD dwInstance,
+ DWORD dwParam1, DWORD dwParam2)
+{
+ switch (uMsg) {
+ case WOM_DONE:
+ if (_waveout) FillHeaders();
+ break;
+
+ default:
+ break;
+ }
+}
+
+static const char *Win32SoundStart(const char* const* parm)
+{
+ WAVEFORMATEX wfex;
+ int hz;
+
+ _bufsize = GetDriverParamInt(parm, "bufsize", 1024);
+ hz = GetDriverParamInt(parm, "hz", 11025);
+ wfex.wFormatTag = WAVE_FORMAT_PCM;
+ wfex.nChannels = 2;
+ wfex.nSamplesPerSec = hz;
+ wfex.nAvgBytesPerSec = hz * 2 * 2;
+ wfex.nBlockAlign = 4;
+ wfex.wBitsPerSample = 16;
+ if (waveOutOpen(&_waveout, WAVE_MAPPER, &wfex, (DWORD)&waveOutProc, 0, CALLBACK_FUNCTION) != MMSYSERR_NOERROR)
+ return "waveOutOpen failed";
+ PrepareHeader(&_wave_hdr[0]);
+ PrepareHeader(&_wave_hdr[1]);
+ FillHeaders();
+ return NULL;
+}
+
+static void Win32SoundStop(void)
+{
+ HWAVEOUT waveout = _waveout;
+
+ _waveout = NULL;
+ waveOutReset(waveout);
+ waveOutUnprepareHeader(waveout, &_wave_hdr[0], sizeof(WAVEHDR));
+ waveOutUnprepareHeader(waveout, &_wave_hdr[1], sizeof(WAVEHDR));
+ waveOutClose(waveout);
+}
+
+const HalSoundDriver _win32_sound_driver = {
+ Win32SoundStart,
+ Win32SoundStop,
+};
diff --git a/sound/win32.h b/sound/win32.h
new file mode 100644
index 000000000..1f7b82b27
--- /dev/null
+++ b/sound/win32.h
@@ -0,0 +1,8 @@
+#ifndef SOUND_WIN32_H
+#define SOUND_WIN32_H
+
+#include "hal.h"
+
+extern const HalSoundDriver _win32_sound_driver;
+
+#endif