2 // This file is part of the PicoDrive Megadrive Emulator
\r
4 // This code is licensed under the GNU General Public License version 2.0 and the MAME License.
\r
5 // You can choose the license that has the most advantages for you.
\r
7 // SVN repository can be found at http://code.google.com/p/cyclone68000/
\r
12 int WaveLen=0; // Length of each buffer in samples
\r
13 short *WaveDest=NULL; // Destination to render sound
\r
15 static HWAVEOUT WaveOut=NULL;
\r
16 static short *WaveBuf=NULL; // Wave double-buffer
\r
17 static WAVEHDR WaveHeader[2]; // WAVEHDR for each buffer
\r
18 static int WavePlay=0; // Next buffer side to play
\r
25 if (WaveOut) return 0; // Already initted
\r
27 memset(&wfx,0,sizeof(wfx));
\r
28 memset(&WaveHeader,0,sizeof(WaveHeader));
\r
30 wfx.wFormatTag=WAVE_FORMAT_PCM;
\r
31 wfx.nChannels=2; // stereo
\r
32 wfx.nSamplesPerSec=WaveRate; // sample rate
\r
33 wfx.wBitsPerSample=16;
\r
34 // Calculate bytes per sample and per second
\r
35 wfx.nBlockAlign=(unsigned short)( (wfx.wBitsPerSample>>3)*wfx.nChannels );
\r
36 wfx.nAvgBytesPerSec=wfx.nSamplesPerSec*wfx.nBlockAlign;
\r
38 waveOutOpen(&WaveOut,WAVE_MAPPER,&wfx,0,NULL,CALLBACK_NULL);
\r
40 // Allocate both buffers
\r
41 WaveBuf=(short *)malloc(WaveLen<<3);
\r
42 if (WaveBuf==NULL) return 1;
\r
43 memset(WaveBuf,0,WaveLen<<3);
\r
45 // Make WAVEHDRs for both buffers
\r
47 pwh->lpData=(char *)WaveBuf;
\r
48 pwh->dwBufferLength=WaveLen<<2;
\r
52 *pwh=WaveHeader[0]; pwh->lpData+=WaveLen<<2;
\r
54 // Prepare the buffers
\r
55 waveOutPrepareHeader(WaveOut,WaveHeader, sizeof(WAVEHDR));
\r
56 waveOutPrepareHeader(WaveOut,WaveHeader+1,sizeof(WAVEHDR));
\r
58 // Queue both buffers:
\r
60 WaveHeader[0].dwFlags|=WHDR_DONE;
\r
61 WaveHeader[1].dwFlags|=WHDR_DONE;
\r
71 if (WaveOut) waveOutReset(WaveOut);
\r
76 if (pwh->lpData) waveOutUnprepareHeader(WaveOut,pwh,sizeof(*pwh));
\r
78 memset(WaveHeader,0,sizeof(WaveHeader));
\r
80 free(WaveBuf); WaveBuf=NULL; WaveLen=0;
\r
82 if (WaveOut) waveOutClose(WaveOut); WaveOut=NULL;
\r
88 WAVEHDR *pwh=NULL; int i=0;
\r
93 pwh=WaveHeader+WavePlay;
\r
94 if (pwh->lpData==NULL) return 1; // Not initted
\r
96 if (pwh->dwFlags&WHDR_DONE)
\r
98 // This buffer has finished - start it playing again
\r
99 WaveDest=(short *)pwh->lpData;
\r
103 waveOutWrite(WaveOut,pwh,sizeof(*pwh));
\r
104 Last=WavePlay; // Remember the last buffer we played
\r
107 WavePlay++; WavePlay&=1;
\r
110 if (Last>=0) WavePlay=Last^1; // Next buffer to play is the other one
\r