程序很简单,就是把一段很长的音频,分成一秒的片段处理然后播放,用单缓冲会出现咔咔的声音,就想使用双缓冲,结果咔咔声并没有消除,而且播放音频很乱,简单代码如下:UNI_SZ= 44100;
HWAVEOUT hwaveout;
WAVEFORMATEX waveformat;
waveformat.wFormatTag = WAVE_FORMAT_PCM ;
waveformat.nChannels = 2 ;
waveformat.nSamplesPerSec = 44100 ;
waveformat.nAvgBytesPerSec = waveformat.nSamplesPerSec*2*2 ;
waveformat.nBlockAlign = 4 ;
waveformat.wBitsPerSample = 16 ;
waveformat.cbSize = 0 ;waveOutOpen(&hwaveout,WAVE_MAPPER,&waveformat,(DWORD)waveOutProc,NULL,CALLBACK_FUNCTION );
short* pSht=(short*)calloc(sizeof(short)*UNI_SZ*2,1);
short* pSht1=(short*)calloc(sizeof(short)*UNI_SZ*2,1);PWAVEHDR waveheadr=(PWAVEHDR)calloc(1,sizeof(WAVEHDR));
waveheadr->lpData=(char*)pSht;
waveheadr->dwBytesRecorded=0;
waveheadr->dwLoops=1;PWAVEHDR waveheadr1=(PWAVEHDR)calloc(1,sizeof(WAVEHDR));
waveheadr1->lpData=(char*)pSht1;
waveheadr1->dwBytesRecorded=0;
waveheadr1->dwLoops=1;bool llll=true;
while(...)
{
short Out[UNI_SZ+200]={0};
process(...);
if(llll)
{
for (int ijk=0;ijk<current_block_size;ijk++)
{
pSht[ijk]=lOut[ijk];
}
llll=false;
}
else
{
for (int ijk=0;ijk<current_block_size;ijk++)
{
pSht1[ijk]=Out[ijk];
} llll=true;
}
waveOutPrepareHeader(hwaveout,waveheadr,sizeof(WAVEHDR));
waveOutPrepareHeader(hwaveout,waveheadr1,sizeof(WAVEHDR));
waveOutWrite(hwaveout,waveheadr,sizeof(WAVEHDR));
waveOutWrite(hwaveout,waveheadr1,sizeof(WAVEHDR));
}
waveOutClose(hwaveout);回调函数如下:
void CALLBACK waveOutProc(
HWAVEOUT hwo,
UINT uMsg,
DWORD dwInstance,
DWORD dwParam1,
DWORD dwParam2
)
{
//HANDLE hEvt=(HANDLE)dwInstance;
if(uMsg == WOM_DONE)
{
LPWAVEHDR pWaveHeader = (LPWAVEHDR)dwParam1;//系统自动识别是哪一个WAVEHDR播放完毕
waveOutUnprepareHeader( hwo, pWaveHeader, sizeof(WAVEHDR) );//播放完后须调用此函数
//此处填充WAVEHDR的lpdate缓冲
waveOutPrepareHeader( hwo, pWaveHeader, sizeof(WAVEHDR));
waveOutWrite( hwo, pWaveHeader, sizeof(WAVEHDR) ); }
return;
}
HWAVEOUT hwaveout;
WAVEFORMATEX waveformat;
waveformat.wFormatTag = WAVE_FORMAT_PCM ;
waveformat.nChannels = 2 ;
waveformat.nSamplesPerSec = 44100 ;
waveformat.nAvgBytesPerSec = waveformat.nSamplesPerSec*2*2 ;
waveformat.nBlockAlign = 4 ;
waveformat.wBitsPerSample = 16 ;
waveformat.cbSize = 0 ;waveOutOpen(&hwaveout,WAVE_MAPPER,&waveformat,(DWORD)waveOutProc,NULL,CALLBACK_FUNCTION );
short* pSht=(short*)calloc(sizeof(short)*UNI_SZ*2,1);
short* pSht1=(short*)calloc(sizeof(short)*UNI_SZ*2,1);PWAVEHDR waveheadr=(PWAVEHDR)calloc(1,sizeof(WAVEHDR));
waveheadr->lpData=(char*)pSht;
waveheadr->dwBytesRecorded=0;
waveheadr->dwLoops=1;PWAVEHDR waveheadr1=(PWAVEHDR)calloc(1,sizeof(WAVEHDR));
waveheadr1->lpData=(char*)pSht1;
waveheadr1->dwBytesRecorded=0;
waveheadr1->dwLoops=1;bool llll=true;
while(...)
{
short Out[UNI_SZ+200]={0};
process(...);
if(llll)
{
for (int ijk=0;ijk<current_block_size;ijk++)
{
pSht[ijk]=lOut[ijk];
}
llll=false;
}
else
{
for (int ijk=0;ijk<current_block_size;ijk++)
{
pSht1[ijk]=Out[ijk];
} llll=true;
}
waveOutPrepareHeader(hwaveout,waveheadr,sizeof(WAVEHDR));
waveOutPrepareHeader(hwaveout,waveheadr1,sizeof(WAVEHDR));
waveOutWrite(hwaveout,waveheadr,sizeof(WAVEHDR));
waveOutWrite(hwaveout,waveheadr1,sizeof(WAVEHDR));
}
waveOutClose(hwaveout);回调函数如下:
void CALLBACK waveOutProc(
HWAVEOUT hwo,
UINT uMsg,
DWORD dwInstance,
DWORD dwParam1,
DWORD dwParam2
)
{
//HANDLE hEvt=(HANDLE)dwInstance;
if(uMsg == WOM_DONE)
{
LPWAVEHDR pWaveHeader = (LPWAVEHDR)dwParam1;//系统自动识别是哪一个WAVEHDR播放完毕
waveOutUnprepareHeader( hwo, pWaveHeader, sizeof(WAVEHDR) );//播放完后须调用此函数
//此处填充WAVEHDR的lpdate缓冲
waveOutPrepareHeader( hwo, pWaveHeader, sizeof(WAVEHDR));
waveOutWrite( hwo, pWaveHeader, sizeof(WAVEHDR) ); }
return;
}
BOOL MakeWaveFile (INS ins, TCHAR * szFileName)
{
DWORD dwWritten ;
HANDLE hFile ;
int iChunkSize, iPcmSize, iNumSamples ;
PBYTE pBuffer ;
WAVEFORMATEX waveform ; hFile = CreateFile (szFileName, GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) ;
if (hFile == NULL)
return FALSE ;
iNumSamples = ((long) ins.iMsecTime * SAMPLE_RATE / 1000 + 1) / 2 * 2 ;
iPcmSize = sizeof (PCMWAVEFORMAT) ;
iChunkSize = 12 + iPcmSize + 8 + iNumSamples ;
if (NULL == (pBuffer = malloc (iNumSamples)))
{
CloseHandle (hFile) ;
return FALSE ;
}
FillBuffer (ins, pBuffer, iNumSamples) ;
waveform.wFormatTag = WAVE_FORMAT_PCM ;
waveform.nChannels = 1 ;
waveform.nSamplesPerSec = SAMPLE_RATE ;
waveform.nAvgBytesPerSec = SAMPLE_RATE ;
waveform.nBlockAlign = 1 ;
waveform.wBitsPerSample = 8 ;
waveform.cbSize = 0 ;
WriteFile (hFile, "RIFF", 4, &dwWritten, NULL) ;
WriteFile (hFile, &iChunkSize, 4, &dwWritten, NULL) ;
WriteFile (hFile, "WAVEfmt ", 8, &dwWritten, NULL) ;
WriteFile (hFile, &iPcmSize, 4, &dwWritten, NULL) ;
WriteFile (hFile, &waveform, sizeof (WAVEFORMATEX) - 2, &dwWritten, NULL) ;
WriteFile (hFile, "data", 4, &dwWritten, NULL) ;
WriteFile (hFile, &iNumSamples, 4, &dwWritten, NULL) ;
WriteFile (hFile, pBuffer, iNumSamples, &dwWritten, NULL) ;
CloseHandle (hFile) ;
free (pBuffer) ;
if ((int) dwWritten != iNumSamples)
{
DeleteFile (szFileName) ;
return FALSE ;
}
return TRUE ;
}