src/sound/win32_s.cpp
branchcustombridgeheads
changeset 5649 55c8267c933f
parent 5643 3778051e8095
child 5650 aefc131bf5ce
equal deleted inserted replaced
5648:1608018c5ff2 5649:55c8267c933f
       
     1 /* $Id$ */
       
     2 
       
     3 #include "../stdafx.h"
       
     4 #include "../openttd.h"
       
     5 #include "../driver.h"
       
     6 #include "../functions.h"
       
     7 #include "../mixer.h"
       
     8 #include "win32_s.h"
       
     9 #include <windows.h>
       
    10 #include <mmsystem.h>
       
    11 
       
    12 static HWAVEOUT _waveout;
       
    13 static WAVEHDR _wave_hdr[2];
       
    14 static int _bufsize;
       
    15 
       
    16 static void PrepareHeader(WAVEHDR *hdr)
       
    17 {
       
    18 	hdr->dwBufferLength = _bufsize * 4;
       
    19 	hdr->dwFlags = 0;
       
    20 	hdr->lpData = malloc(_bufsize * 4);
       
    21 	if (hdr->lpData == NULL ||
       
    22 			waveOutPrepareHeader(_waveout, hdr, sizeof(WAVEHDR)) != MMSYSERR_NOERROR)
       
    23 		error("waveOutPrepareHeader failed");
       
    24 }
       
    25 
       
    26 static void FillHeaders(void)
       
    27 {
       
    28 	WAVEHDR *hdr;
       
    29 
       
    30 	for (hdr = _wave_hdr; hdr != endof(_wave_hdr); hdr++) {
       
    31 		if (!(hdr->dwFlags & WHDR_INQUEUE)) {
       
    32 			MxMixSamples(hdr->lpData, hdr->dwBufferLength / 4);
       
    33 			if (waveOutWrite(_waveout, hdr, sizeof(WAVEHDR)) != MMSYSERR_NOERROR)
       
    34 				error("waveOutWrite failed");
       
    35 		}
       
    36 	}
       
    37 }
       
    38 
       
    39 static void CALLBACK waveOutProc(HWAVEOUT hwo, UINT uMsg, DWORD_PTR dwInstance,
       
    40 	DWORD dwParam1, DWORD dwParam2)
       
    41 {
       
    42 	switch (uMsg) {
       
    43 		case WOM_DONE:
       
    44 			if (_waveout) FillHeaders();
       
    45 			break;
       
    46 
       
    47 		default:
       
    48 			break;
       
    49 	}
       
    50 }
       
    51 
       
    52 static const char *Win32SoundStart(const char* const* parm)
       
    53 {
       
    54 	WAVEFORMATEX wfex;
       
    55 	int hz;
       
    56 
       
    57 	_bufsize = GetDriverParamInt(parm, "bufsize", 1024);
       
    58 	hz = GetDriverParamInt(parm, "hz", 11025);
       
    59 	wfex.wFormatTag = WAVE_FORMAT_PCM;
       
    60 	wfex.nChannels = 2;
       
    61 	wfex.nSamplesPerSec = hz;
       
    62 	wfex.nAvgBytesPerSec = hz * 2 * 2;
       
    63 	wfex.nBlockAlign = 4;
       
    64 	wfex.wBitsPerSample = 16;
       
    65 	if (waveOutOpen(&_waveout, WAVE_MAPPER, &wfex, (DWORD_PTR)&waveOutProc, 0, CALLBACK_FUNCTION) != MMSYSERR_NOERROR)
       
    66 		return "waveOutOpen failed";
       
    67 	PrepareHeader(&_wave_hdr[0]);
       
    68 	PrepareHeader(&_wave_hdr[1]);
       
    69 	FillHeaders();
       
    70 	return NULL;
       
    71 }
       
    72 
       
    73 static void Win32SoundStop(void)
       
    74 {
       
    75 	HWAVEOUT waveout = _waveout;
       
    76 
       
    77 	_waveout = NULL;
       
    78 	waveOutReset(waveout);
       
    79 	waveOutUnprepareHeader(waveout, &_wave_hdr[0], sizeof(WAVEHDR));
       
    80 	waveOutUnprepareHeader(waveout, &_wave_hdr[1], sizeof(WAVEHDR));
       
    81 	waveOutClose(waveout);
       
    82 }
       
    83 
       
    84 const HalSoundDriver _win32_sound_driver = {
       
    85 	Win32SoundStart,
       
    86 	Win32SoundStop,
       
    87 };