資源簡介
這份代碼實現打開PCM裸流文件并用雙緩存機制進行播放的,可在VS2013下直接編譯運行,其中包含一個PCM裸流文件。

代碼片段和文件信息
#include?
#include?
#pragma?comment(lib?“winmm.lib“)
#define?DATASIZE?1024*512?//分次截取數據大小
FILE* pcmfile;??//音頻文件
HWAVEOUT????????hwo;
void?CALLBACK?WaveCallback(HWAVEOUT?hWave?UINT?uMsg?DWORD?dwInstance?DWORD?dw1?DWORD?dw2)//回調函數
{
switch?(uMsg)
{
case?WOM_DONE://上次緩存播放完成觸發該事件
{
LPWAVEHDR?pWaveHeader?=?(LPWAVEHDR)dw1;
pWaveHeader->dwBufferLength?=?fread(pWaveHeader->lpData?1?DATASIZE?pcmfile);;
waveOutPrepareHeader(hwo?pWaveHeader?sizeof(WAVEHDR));
waveOutWrite(hwo?pWaveHeader?sizeof(WAVEHDR));
break;
}
}
}
void?main()?
{
int?????????????cnt;
WAVEHDR?????????wh1;
WAVEHDR?????????wh2;
WAVEFORMATEX????wfx;
fopen_s(&pcmfile?“paomo.pcm“?“rb“);//打開文件
wfx.wFormatTag?=?WAVE_FORMAT_PCM;//設置波形聲音的格式
wfx.nChannels?=?1;//設置音頻文件的通道數量
wfx.nSamplesPerSec?=?8000;//設置每個聲道播放和記錄時的樣本頻率
wfx.nAvgBytesPerSec?=?16000;//設置請求的平均數據傳輸率單位byte/s。這個值對于創建緩沖大小是很有用的
wfx.nBlockAlign?=?2;//以字節為單位設置塊對齊
wfx.wBitsPerSample?=?16;
wfx.cbSize?=?0;//額外信息的大小
waveOutOpen(&hwo?WAVE_MAPPER?&wfx?(DWORD)WaveCallback?0L?CALLBACK_FUNCTION);//打開一個給定的波形音頻輸出裝置來進行聲音播放,方式為回調函數方式。如果是對話框程序,可以將第五個參數改為(DWORD)this,操作跟本Demo程序相似
wh1.dwLoops?=?0L;//播放區一
wh1.lpData?=?new?char[DATASIZE];
wh1.dwBufferLength?=?DATASIZE;?
fread(wh1.lpData?1?DATASIZE?pcmfile);
wh1.dwFlags?=?0L;
waveOutPrepareHeader(hwo?&wh1?sizeof(WAVEHDR));//準備一個波形數據塊用于播放
waveOutWrite(hwo?&wh1?sizeof(WAVEHDR));//在音頻媒體中播放第二個參數指定的數據,也相當于開啟一個播放區的意思
wh2.dwLoops?=?0L;//播放區二,基本同上
wh2.lpData?=?new?char[DATASIZE];
wh2.dwBufferLength?=?DATASIZE;
fread(wh2.lpData?1?DATASIZE?pcmfile);
wh2.dwFlags?=?0L;
waveOutPrepareHeader(hwo?&wh2?sizeof(WAVEHDR));
waveOutWrite(hwo?&wh2?sizeof(WAVEHDR));
while?(wh1.dwBufferLength?!=?0?||?wh2.dwBufferLength?!=?0)//如果文件還在沒播放完則等待500ms
{
Sleep(500);
}
waveOutUnprepareHeader(hwo?&wh1?sizeof(WAVEHDR));//清理數據
waveOutUnprepareHeader(hwo?&wh2?sizeof(WAVEHDR));
delete?[]wh1.lpData;
delete?[]wh2.lpData;
fclose(pcmfile);//關閉文件
return;
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2015-03-22?02:20??PcmDoubleBufferPla
?????目錄???????????0??2015-03-22?02:20??PcmDoubleBufferPla
?????目錄???????????0??2015-03-22?02:20??PcmDoubleBufferPla
?????文件????????1009??2015-03-21?18:20??PcmDoubleBufferPla
?????文件???????18944??2015-03-22?02:20??PcmDoubleBufferPla
?????目錄???????????0??2015-03-22?02:20??PcmDoubleBufferPla
?????文件?????4144064??2014-06-09?21:51??PcmDoubleBufferPla
?????文件????????2343??2015-03-22?02:20??PcmDoubleBufferPla
?????文件????????4115??2015-03-21?18:22??PcmDoubleBufferPla
?????文件?????????962??2015-03-21?18:22??PcmDoubleBufferPla
評論
共有 條評論