summaryrefslogtreecommitdiff
path: root/src/sound/win32_s.c
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2007-01-02 19:19:48 +0000
committerrubidium <rubidium@openttd.org>2007-01-02 19:19:48 +0000
commit013df98f79866a75f367853c9e436f3c5c79f645 (patch)
treead4a63860df2626b22f77e7dac712e958bea54cb /src/sound/win32_s.c
parent3d32fd3f4bfaceb8a48530fbc2f4bd5db2752596 (diff)
downloadopenttd-013df98f79866a75f367853c9e436f3c5c79f645.tar.xz
(svn r7759) -Merge: makefile rewrite. This merge features:
- A proper ./configure, so everything needs to be configured only once, not for every make. - Usage of makedepend when available. This greatly reduces the time needed for generating the dependencies. - A generator for all project files. There is a single file with sources, which is used to generate Makefiles and the project files for MSVC. - Proper support for OSX universal binaries. - Object files for non-MSVC compiles are also placed in separate directories, making is faster to switch between debug and release compiles and it does not touch the directory with the source files. - Functionality to make a bundle of all needed files for for example a nightly or distribution of a binary with all needed GRFs and language files. Note: as this merge moves almost all files, it is recommended to make a backup of your working copy before updating your working copy.
Diffstat (limited to 'src/sound/win32_s.c')
-rw-r--r--src/sound/win32_s.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/src/sound/win32_s.c b/src/sound/win32_s.c
new file mode 100644
index 000000000..a39cee985
--- /dev/null
+++ b/src/sound/win32_s.c
@@ -0,0 +1,87 @@
+/* $Id$ */
+
+#include "../stdafx.h"
+#include "../openttd.h"
+#include "../driver.h"
+#include "../functions.h"
+#include "../mixer.h"
+#include "win32_s.h"
+#include <windows.h>
+#include <mmsystem.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(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_PTR 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_PTR)&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,
+};