5 int WaveLen=0; // Length of each buffer in samples
\r
6 short *WaveDest=NULL; // Destination to render sound
\r
8 static HWAVEOUT WaveOut=NULL;
\r
9 static short *WaveBuf=NULL; // Wave double-buffer
\r
10 static WAVEHDR WaveHeader[2]; // WAVEHDR for each buffer
\r
11 static int WavePlay=0; // Next buffer side to play
\r
18 if (WaveOut) return 0; // Already initted
\r
20 memset(&wfx,0,sizeof(wfx));
\r
21 memset(&WaveHeader,0,sizeof(WaveHeader));
\r
23 wfx.wFormatTag=WAVE_FORMAT_PCM;
\r
24 wfx.nChannels=2; // stereo
\r
25 wfx.nSamplesPerSec=WaveRate; // sample rate
\r
26 wfx.wBitsPerSample=16;
\r
27 // Calculate bytes per sample and per second
\r
28 wfx.nBlockAlign=(unsigned short)( (wfx.wBitsPerSample>>3)*wfx.nChannels );
\r
29 wfx.nAvgBytesPerSec=wfx.nSamplesPerSec*wfx.nBlockAlign;
\r
31 waveOutOpen(&WaveOut,WAVE_MAPPER,&wfx,0,NULL,CALLBACK_NULL);
\r
33 // Allocate both buffers
\r
34 WaveBuf=(short *)malloc(WaveLen<<3);
\r
35 if (WaveBuf==NULL) return 1;
\r
36 memset(WaveBuf,0,WaveLen<<3);
\r
38 // Make WAVEHDRs for both buffers
\r
40 pwh->lpData=(char *)WaveBuf;
\r
41 pwh->dwBufferLength=WaveLen<<2;
\r
45 *pwh=WaveHeader[0]; pwh->lpData+=WaveLen<<2;
\r
47 // Prepare the buffers
\r
48 waveOutPrepareHeader(WaveOut,WaveHeader, sizeof(WAVEHDR));
\r
49 waveOutPrepareHeader(WaveOut,WaveHeader+1,sizeof(WAVEHDR));
\r
51 // Queue both buffers:
\r
53 WaveHeader[0].dwFlags|=WHDR_DONE;
\r
54 WaveHeader[1].dwFlags|=WHDR_DONE;
\r
64 if (WaveOut) waveOutReset(WaveOut);
\r
69 if (pwh->lpData) waveOutUnprepareHeader(WaveOut,pwh,sizeof(*pwh));
\r
71 memset(WaveHeader,0,sizeof(WaveHeader));
\r
73 free(WaveBuf); WaveBuf=NULL; WaveLen=0;
\r
75 if (WaveOut) waveOutClose(WaveOut); WaveOut=NULL;
\r
81 WAVEHDR *pwh=NULL; int i=0;
\r
86 pwh=WaveHeader+WavePlay;
\r
87 if (pwh->lpData==NULL) return 1; // Not initted
\r
89 if (pwh->dwFlags&WHDR_DONE)
\r
91 // This buffer has finished - start it playing again
\r
92 WaveDest=(short *)pwh->lpData;
\r
96 waveOutWrite(WaveOut,pwh,sizeof(*pwh));
\r
97 Last=WavePlay; // Remember the last buffer we played
\r
100 WavePlay++; WavePlay&=1;
\r
103 if (Last>=0) WavePlay=Last^1; // Next buffer to play is the other one
\r