2 // This file is part of the PicoDrive Megadrive Emulator
\r
4 // Copyright (c) 2011 FinalDave (emudave (at) gmail.com)
\r
6 // This code is licensed under the GNU General Public License version 2.0 and the MAME License.
\r
7 // You can choose the license that has the most advantages for you.
\r
9 // SVN repository can be found at http://code.google.com/p/cyclone68000/
\r
14 int WaveLen=0; // Length of each buffer in samples
\r
15 short *WaveDest=NULL; // Destination to render sound
\r
17 static HWAVEOUT WaveOut=NULL;
\r
18 static short *WaveBuf=NULL; // Wave double-buffer
\r
19 static WAVEHDR WaveHeader[2]; // WAVEHDR for each buffer
\r
20 static int WavePlay=0; // Next buffer side to play
\r
27 if (WaveOut) return 0; // Already initted
\r
29 memset(&wfx,0,sizeof(wfx));
\r
30 memset(&WaveHeader,0,sizeof(WaveHeader));
\r
32 wfx.wFormatTag=WAVE_FORMAT_PCM;
\r
33 wfx.nChannels=2; // stereo
\r
34 wfx.nSamplesPerSec=WaveRate; // sample rate
\r
35 wfx.wBitsPerSample=16;
\r
36 // Calculate bytes per sample and per second
\r
37 wfx.nBlockAlign=(unsigned short)( (wfx.wBitsPerSample>>3)*wfx.nChannels );
\r
38 wfx.nAvgBytesPerSec=wfx.nSamplesPerSec*wfx.nBlockAlign;
\r
40 waveOutOpen(&WaveOut,WAVE_MAPPER,&wfx,0,NULL,CALLBACK_NULL);
\r
42 // Allocate both buffers
\r
43 WaveBuf=(short *)malloc(WaveLen<<3);
\r
44 if (WaveBuf==NULL) return 1;
\r
45 memset(WaveBuf,0,WaveLen<<3);
\r
47 // Make WAVEHDRs for both buffers
\r
49 pwh->lpData=(char *)WaveBuf;
\r
50 pwh->dwBufferLength=WaveLen<<2;
\r
54 *pwh=WaveHeader[0]; pwh->lpData+=WaveLen<<2;
\r
56 // Prepare the buffers
\r
57 waveOutPrepareHeader(WaveOut,WaveHeader, sizeof(WAVEHDR));
\r
58 waveOutPrepareHeader(WaveOut,WaveHeader+1,sizeof(WAVEHDR));
\r
60 // Queue both buffers:
\r
62 WaveHeader[0].dwFlags|=WHDR_DONE;
\r
63 WaveHeader[1].dwFlags|=WHDR_DONE;
\r
73 if (WaveOut) waveOutReset(WaveOut);
\r
78 if (pwh->lpData) waveOutUnprepareHeader(WaveOut,pwh,sizeof(*pwh));
\r
80 memset(WaveHeader,0,sizeof(WaveHeader));
\r
82 free(WaveBuf); WaveBuf=NULL; WaveLen=0;
\r
84 if (WaveOut) waveOutClose(WaveOut); WaveOut=NULL;
\r
90 WAVEHDR *pwh=NULL; int i=0;
\r
95 pwh=WaveHeader+WavePlay;
\r
96 if (pwh->lpData==NULL) return 1; // Not initted
\r
98 if (pwh->dwFlags&WHDR_DONE)
\r
100 // This buffer has finished - start it playing again
\r
101 WaveDest=(short *)pwh->lpData;
\r
105 waveOutWrite(WaveOut,pwh,sizeof(*pwh));
\r
106 Last=WavePlay; // Remember the last buffer we played
\r
109 WavePlay++; WavePlay&=1;
\r
112 if (Last>=0) WavePlay=Last^1; // Next buffer to play is the other one
\r