程序很简单,就是把一段很长的音频,分成一秒的片段处理然后播放,用单缓冲会出现咔咔的声音,就想使用双缓冲,结果咔咔声并没有消除,而且播放音频很乱,简单代码如下: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;
}

解决方案 »

  1.   

    \Windows程序设计Code\Chap22\Record1\Record1.c
    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 ;
    }
      

  2.   

    http://download.csdn.net/source/3184342