📄 audioplay.cpp
字号:
// AudioPlay.cpp: implementation of the CAudioPlay class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "RemoteTalk.h"
#include "AudioPlay.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
void waveOutErrorMsg(MMRESULT mmr,char* szTitle)
{
char txt[MAXERRORLENGTH];
waveOutGetErrorText(mmr,txt,MAXERRORLENGTH);
MessageBox(0,txt,szTitle,MB_OK|MB_ICONWARNING);
}
CAudioPlay::CAudioPlay()
{
m_mmr=0;
m_hOut=0;
}
CAudioPlay::~CAudioPlay()
{
Destroy();
}
//Alloc new buf,and delete it when done
BOOL CAudioPlay::Play(char *buf, UINT uSize)
{
BOOL bRet=FALSE;
char* p;
LPWAVEHDR pwh=new WAVEHDR;
if(!pwh)
goto RET;
p=new char[uSize];
if(!p)
goto RET;
CopyMemory(p,buf,uSize);
ZeroMemory(pwh,sizeof(WAVEHDR));
pwh->dwBufferLength=uSize;
pwh->lpData=p;
m_mmr=waveOutPrepareHeader(m_hOut,pwh,sizeof(WAVEHDR));
if(m_mmr)
goto RET;
m_mmr=waveOutWrite(m_hOut,pwh,sizeof(WAVEHDR));
if(m_mmr)
goto RET;
bRet=TRUE;
RET:
return bRet;
}
BOOL CAudioPlay::Create(WAVEFORMATEX *pwf,DWORD dwCallBack,DWORD dwInst,DWORD fdwOpen )
{
BOOL bRet=FALSE;
if(m_hOut)
{
bRet=TRUE;
goto RET;
}
if(!OpenDev(pwf,dwCallBack,dwInst,fdwOpen))
goto RET;
bRet=TRUE;
RET:
return bRet;
}
BOOL CAudioPlay::Destroy()
{
BOOL bRet=FALSE;
if(!CloseDev())
goto RET;
bRet=TRUE;
RET:
return bRet;
}
CAudioPlay::operator HWAVEOUT() const
{
return m_hOut;
}
MMRESULT CAudioPlay::GetLastMMError()
{
return m_mmr;
}
void CAudioPlay::SetLastMMError(MMRESULT mmr)
{
m_mmr=mmr;
}
BOOL CAudioPlay::CloseDev()
{
BOOL bRet=FALSE;
if(!m_hOut)
goto RET;
m_mmr=waveOutReset(m_hOut);
if(m_mmr)
goto RET;
m_mmr=waveOutClose(m_hOut);
if(m_mmr)
goto RET;
m_hOut=0;
bRet=TRUE;
RET:
return bRet;
}
BOOL CAudioPlay::OpenDev(WAVEFORMATEX* pfmt,DWORD dwCallback,DWORD dwCallbackInstance,DWORD fdwOpen)
{
BOOL bRet=FALSE;
WAVEFORMATEX wf;
if(!pfmt)
{
wf.wFormatTag = WAVE_FORMAT_PCM;
wf.cbSize = 0;
wf.wBitsPerSample=16;
wf.nSamplesPerSec=8000;
wf.nChannels=1;
wf.nAvgBytesPerSec = wf.nSamplesPerSec*(wf.wBitsPerSample/8);
wf.nBlockAlign = wf.nChannels *(wf.wBitsPerSample/8);
pfmt=&wf;
}
MMRESULT mmr;
mmr=waveOutOpen(0,WAVE_MAPPER,pfmt,0,0,WAVE_FORMAT_QUERY);
if(mmr)
{
SetLastMMError(mmr);
goto RET;
}
mmr=waveOutOpen(&m_hOut,WAVE_MAPPER,pfmt,dwCallback,dwCallbackInstance,fdwOpen);
if(mmr)
{
SetLastMMError(mmr);
goto RET;
}
bRet=TRUE;
RET:
return bRet;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -