• 大小: 3.61MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-11-08
  • 语言: C/C++
  • 标签: C++  PCM裸流  双缓存  

资源简介

这份代码实现打开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  PcmDoubleBufferPlayer\
     目录           0  2015-03-22 02:20  PcmDoubleBufferPlayer\Debug\
     目录           0  2015-03-22 02:20  PcmDoubleBufferPlayer\PcmDoubleBufferPlayer\
     文件        1009  2015-03-21 18:20  PcmDoubleBufferPlayer\PcmDoubleBufferPlayer.sln
     文件       18944  2015-03-22 02:20  PcmDoubleBufferPlayer\PcmDoubleBufferPlayer.v12.suo
     目录           0  2015-03-22 02:20  PcmDoubleBufferPlayer\PcmDoubleBufferPlayer\Debug\
     文件     4144064  2014-06-09 21:51  PcmDoubleBufferPlayer\PcmDoubleBufferPlayer\paomo.pcm
     文件        2343  2015-03-22 02:20  PcmDoubleBufferPlayer\PcmDoubleBufferPlayer\PcmDoubleBufferPlayer.cpp
     文件        4115  2015-03-21 18:22  PcmDoubleBufferPlayer\PcmDoubleBufferPlayer\PcmDoubleBufferPlayer.vcxproj
     文件         962  2015-03-21 18:22  PcmDoubleBufferPlayer\PcmDoubleBufferPlayer\PcmDoubleBufferPlayer.vcxproj.filters

评论

共有 条评论