介绍 pcm格式是音频非压缩格式。如果要对音频文件播放,需要先转换为pcm格式。
windows提供了多套函数用于播放,本文介绍Waveform Audio Functions系列函数。
原始的播放函数比较难用,因工作需要,我写了一个播放器,将播放相关函数封装了;非常好用,还不易出错。
播放流程
程序头文件可以根据头文件窥探函数功能,下面再做简单介绍。
classCPcmPlay
{public:
CPcmPlay();~CPcmPlay();//是否打开了 播放设备
BOOL IsOpen();//nSamplesPerSec 采样频率 8000//采样位数 :8,16//声道个数: 1
BOOL Open(int nSamplesPerSec, int wBitsPerSample, intnChannels);//设置声音大小 0到100
BOOL SetVolume(intvolume);//播放内存数据//异步播放,block指针数据可以立即删除
MMRESULT Play(LPSTR block, DWORD size);void StopPlay(); //停止播放
BOOL IsOnPlay(); //是否有数据在播放
void Close();//关闭播放设备
double GetCurPlaySpan(); //获取当前块已播放的时长
double GetLeftPlaySpan(); //获取剩余播放播放的时长
BOOL IsNoPlayBuffer();//打开音频还没播放过
private:voidOnOpen();voidOnClose();void OnDone(WAVEHDR *header);void AddHeader(WAVEHDR *header);void DelHeader(WAVEHDR *header);//根据数据长度,计算播放长度 单位秒
double GetPlayTimeSpan(intbufferLen);void staticCALLBACK MyWaveOutProc(HWAVEOUT hwo, UINT uMsg, DWORD_PTR dwInstance,
DWORD_PTR dwParam1, DWORD_PTR dwParam2);private:
UINT64 m_totalPlayBuffer;
WAVEFORMATEX m_waveForm;
HWAVEOUT m_hWaveOut;
std::listm_listWaveOutHead;
CCritical m_listLock;
};
1)打开音频设备
BOOL CPcmPlay::Open(int nSamplesPerSec,int wBitsPerSample,intnChannels)