200分 谁能告诉我我错哪了?!
很简单的功能,我想放PCM
void CPlayPcmDlg::OnButton1()
{
// TODO: Add your control notification handler code here
pBuffer1 = new BYTE[16384];
memset(pBuffer1, 0, 16384);
memset(&waveformat, 0, sizeof(WAVEFORMATEX));
waveformat.wFormatTag = WAVE_FORMAT_PCM ;
waveformat.nChannels = 2 ;
waveformat.nSamplesPerSec = 48000;
waveformat.wBitsPerSample = 16 ;
waveformat.nBlockAlign = waveformat.nChannels * waveformat.wBitsPerSample / 8 ;
waveformat.nAvgBytesPerSec = 48000 * waveformat.nBlockAlign ;
waveformat.cbSize = 0 ;
if (waveOutOpen (&hWaveOut, WAVE_MAPPER, &waveformat, (DWORD)this->GetSafeHwnd(), 0, CALLBACK_WINDOW) != MMSYSERR_NOERROR)
{
return;
}
pWaveHdr1 = new WAVEHDR;
memset(pWaveHdr1, 0, sizeof(WAVEHDR));
pWaveHdr1->lpData = (char*)pBuffer1 ;
pWaveHdr1->dwBufferLength = 16384 ;
pWaveHdr1->dwBytesRecorded = 0 ;
pWaveHdr1->dwUser = 0 ;
pWaveHdr1->dwFlags = 0 ;
pWaveHdr1->dwLoops = 1 ;
pWaveHdr1->lpNext = NULL ;
pWaveHdr1->reserved = 0 ;
waveOutPrepareHeader (hWaveOut, pWaveHdr1, sizeof (WAVEHDR)) ;
}
LRESULT CPlayPcmDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
DWORD dwRead = 0;
switch(message) {
case MM_WOM_OPEN:
memset(pBuffer1, 0, 16384);
::ReadFile(hFile, pBuffer1, 16384, &dwRead, NULL);
waveOutWrite (hWaveOut, (PWAVEHDR) pWaveHdr1, sizeof (WAVEHDR)) ;
break;
case MM_WOM_DONE:
{
memset( ((PWAVEHDR) lParam)->lpData, 0, 16384);
::ReadFile(hFile, ((PWAVEHDR) lParam)->lpData, 16384, &dwRead, NULL);
waveOutWrite (hWaveOut, (PWAVEHDR) lParam, sizeof (WAVEHDR)) ;
break;
}
default:
break;
}
return CDialog::WindowProc(message, wParam, lParam);
}