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