87 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/* $Id$ */
 | 
						|
 | 
						|
#include "../stdafx.h"
 | 
						|
#include "../openttd.h"
 | 
						|
#include "../driver.h"
 | 
						|
#include "../functions.h"
 | 
						|
#include "../mixer.h"
 | 
						|
#include "../helpers.hpp"
 | 
						|
#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 = MallocT<char>(_bufsize * 4);
 | 
						|
	if (hdr->lpData == NULL ||
 | 
						|
			waveOutPrepareHeader(_waveout, hdr, sizeof(WAVEHDR)) != MMSYSERR_NOERROR)
 | 
						|
		error("waveOutPrepareHeader failed");
 | 
						|
}
 | 
						|
 | 
						|
static void FillHeaders()
 | 
						|
{
 | 
						|
	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 != NULL) FillHeaders();
 | 
						|
			break;
 | 
						|
		default: break;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
static const char *Win32SoundStart(const char* const* parm)
 | 
						|
{
 | 
						|
	WAVEFORMATEX wfex;
 | 
						|
	wfex.wFormatTag = WAVE_FORMAT_PCM;
 | 
						|
	wfex.nChannels = 2;
 | 
						|
	wfex.wBitsPerSample = 16;
 | 
						|
	wfex.nSamplesPerSec = GetDriverParamInt(parm, "hz", 11025);
 | 
						|
	wfex.nBlockAlign = (wfex.nChannels * wfex.wBitsPerSample) / 8;
 | 
						|
	wfex.nAvgBytesPerSec = wfex.nSamplesPerSec * wfex.nBlockAlign;
 | 
						|
 | 
						|
	_bufsize = GetDriverParamInt(parm, "bufsize", 1024);
 | 
						|
 | 
						|
	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()
 | 
						|
{
 | 
						|
	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,
 | 
						|
};
 |