//open the wave out device and allocate wavOutBuffer
long waveOpenOut(void)
{
MMRESULT wresult;
lphWaveOut = &hWaveOut; //wave handle
lpwfOut = &pwfOut; //wave format
pwfOut.wFormatTag=WAVE_FORMAT_PCM;
pwfOut.nChannels=2;
pwfOut.nSamplesPerSec=SAMPLES;
pwfOut.nAvgBytesPerSec=SAMPLES*2*BITS/8;
pwfOut.nBlockAlign=2*BITS/8;
pwfOut.wBitsPerSample=BITS;
pwfOut.cbSize = 0;
wresult = waveOutOpen(lphWaveOut,WAVE_MAPPER,lpwfOut,(DWORD) cbWaveOutProc,(DWORD) 0,(DWORD) CALLBACK_FUNCTION | WAVE_ALLOWSYNC );
hOutData = GlobalAlloc(GMEM_MOVEABLE,BUFFERLENGTH*4);
wavOutBuffer = (short *)GlobalLock(hOutData);
hOutHdr = GlobalAlloc(GMEM_MOVEABLE,sizeof(WAVEHDR));
lpwoh = (LPWAVEHDR)GlobalLock(hOutHdr);
lpwoh->lpData = (LPSTR)wavOutBuffer;
lpwoh->dwBufferLength=BUFFERLENGTH*4;
lpwoh->dwFlags=0;
return (long)wresult;
}
//close the wave out device and free the wavOutBuffer
long waveCloseOut(void)
{
MMRESULT wresult;
wresult = waveOutReset(hWaveOut);
wresult += waveOutClose(hWaveOut);
GlobalUnlock(hOutData);
hOutData = GlobalFree(hOutData);
GlobalUnlock(hOutHdr);
hOutHdr = GlobalFree(hOutHdr);
return (long) wresult;
}
//open the wave in device and allocate the wavInBuffer
long waveOpenIn(void)
{
MMRESULT wresult;
lphWaveIn = &hWaveIn; //wave handle
lpwfIn = &pwfIn; //wave format
pwfIn.wFormatTag=WAVE_FORMAT_PCM;
pwfIn.nChannels=2;
pwfIn.nSamplesPerSec=SAMPLES;
pwfIn.nAvgBytesPerSec=SAMPLES*2*BITS/8;
pwfIn.nBlockAlign=2*BITS/8;
pwfIn.wBitsPerSample=BITS;
pwfIn.cbSize = 0;
wresult = waveInOpen(lphWaveIn,WAVE_MAPPER,lpwfIn,(DWORD) cbWaveInProc,(DWORD) 0,(DWORD) CALLBACK_FUNCTION | WAVE_ALLOWSYNC );
hInData = GlobalAlloc(GMEM_MOVEABLE,BUFFERLENGTH*4);
wavInBuffer = (short *)GlobalLock(hInData);
hInHdr = GlobalAlloc(GMEM_MOVEABLE,sizeof(WAVEHDR));
lpwih = (LPWAVEHDR)GlobalLock(hInHdr);
lpwih->lpData = (LPSTR)wavInBuffer;
lpwih->dwBufferLength=BUFFERLENGTH*4;
lpwih->dwFlags=0;
return (long)wresult;
}
//close the wave out device and free waveInBuffer
long waveCloseIn(void)
{
MMRESULT wresult;
wresult = waveInClose(hWaveIn);
GlobalUnlock(hInData);
hInData = GlobalFree(hInData);
GlobalUnlock(hInHdr);
hInHdr = GlobalFree(hInHdr);
return (long)wresult;
}
//*********HIGHER LEVEL API***********
long FAR PASCAL PlayTrack()
{
MMRESULT wresult;
wresult=waveOutPrepareHeader(hWaveOut,lpwoh,sizeof(WAVEHDR));
wresult+=waveOutWrite(hWaveOut,lpwoh,sizeof(WAVEHDR));
return (long) wresult;
}
long FAR PASCAL RecordTrack()
{
MMRESULT wresult;
wresult=waveOutPrepareHeader(hWaveOut,lpwoh,sizeof(WAVEHDR));
wresult+=waveInPrepareHeader(hWaveIn,lpwih,sizeof(WAVEHDR));
wresult+=waveInAddBuffer(hWaveIn,lpwih,sizeof(WAVEHDR));
wresult+=waveInStart(hWaveIn);
wresult+=waveOutWrite(hWaveOut,lpwoh,sizeof(WAVEHDR));
return (long) wresult;
}
long FAR PASCAL StopTracks()
{
MMRESULT wresult;
wresult = waveInStop(hWaveIn);
wresult = waveOutReset(hWaveOut);
wresult = waveOutUnprepareHeader(hWaveOut,lpwoh,sizeof(WAVEHDR));
wresult = waveInReset(hWaveIn);
wresult = waveInUnprepareHeader(hWaveIn,lpwih,sizeof(WAVEHDR));
return (long) wresult;
}