From 66bbf336c6af7353ef0aeed58002c46543b30635 Mon Sep 17 00:00:00 2001 From: rubidium Date: Tue, 2 Jan 2007 19:19:48 +0000 Subject: (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. --- src/sound/win32_s.c | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 src/sound/win32_s.c (limited to 'src/sound/win32_s.c') 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 +#include + +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, +}; -- cgit v1.2.3-70-g09d2