⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 audiorec.cpp

📁 一个VC实现的,用G.729a实现的语言对讲的例子
💻 CPP
字号:
// AudioRec.cpp: implementation of the CAudioRec class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "RemoteTalk.h"
#include "AudioRec.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
void waveInErrorMsg(MMRESULT mmr,char* szTitle)
{
	char txt[MAXERRORLENGTH];
	waveInGetErrorText(mmr,txt,MAXERRORLENGTH);
	MessageBox(0,txt,szTitle,MB_OK|MB_ICONWARNING);
}

CAudioRec::CAudioRec()
{
	m_mmr=0;	
	m_hIn=0;
}

CAudioRec::~CAudioRec()
{
	Destroy();
}

BOOL CAudioRec::Start()
{
	BOOL bRet=FALSE;
	if(!m_hIn)
		goto RET;
	if(!AllocBuffer())
		goto RET;
	m_mmr=waveInStart(m_hIn);
	if(m_mmr)
		goto RET;
	
	
	
	bRet=TRUE;
	
RET:

	return bRet;
}


BOOL CAudioRec::Stop()
{
	BOOL bRet=FALSE;
	
	if(!m_hIn)
		goto RET;
	
	m_mmr=waveInReset(m_hIn);
	if(m_mmr)
		goto RET;
	if(!FreeBuffer())
		goto RET;
	bRet=TRUE;
RET:

	return TRUE;
}

BOOL CAudioRec::AllocBuffer()
{
	BOOL bRet=FALSE;
	UINT i;
	
	m_pHdr=new WAVEHDR[NUM_BUF];
		
	for(i=0;i<NUM_BUF;i++)
	{
		ZeroMemory(&m_pHdr[i],sizeof(WAVEHDR));
		m_pHdr[i].lpData=new char[m_nBufSize];
		m_pHdr[i].dwBufferLength=m_nBufSize;
		m_mmr=waveInPrepareHeader(m_hIn,&m_pHdr[i],sizeof(WAVEHDR));
		if(m_mmr)		
			goto RET;
		
		m_mmr=waveInAddBuffer(m_hIn,&m_pHdr[i],sizeof(WAVEHDR));
		if(m_mmr)
			goto RET;
	}
	
	bRet=TRUE;
RET:
	return bRet;
}

BOOL CAudioRec::FreeBuffer()
{
	BOOL bRet=FALSE;
	
	UINT i;
	if(!m_pHdr)
		goto RET;

	for(i=0;i<NUM_BUF;i++)
	{
		waveInUnprepareHeader(m_hIn,&m_pHdr[i],sizeof(WAVEHDR));
		if(m_pHdr[i].lpData)
			delete []m_pHdr[i].lpData;
		
	}
	delete []m_pHdr;
	bRet=TRUE;
RET:
	return bRet;

}

BOOL CAudioRec::Create(WAVEFORMATEX *pwf,DWORD dwCallBack,DWORD dwInst,DWORD fdwOpen ,DWORD dwBufSize)
{
	BOOL bRet=FALSE;
	if(m_hIn)
	{
		bRet=TRUE;
		goto RET;
	}
	if(!OpenDev(pwf,dwCallBack,dwInst,fdwOpen))
		goto RET;
	m_nBufSize=dwBufSize;
	bRet=TRUE;
RET:
	return bRet;
}

BOOL CAudioRec::Destroy()
{
	BOOL bRet=FALSE;
	if(!CloseDev())
		goto RET;
	bRet=TRUE;
RET:
	return bRet;
}

//WaveIn

BOOL CAudioRec::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=waveInOpen(0,WAVE_MAPPER,pfmt,0,0,WAVE_FORMAT_QUERY);
	if(mmr)
	{
		SetLastMMError(mmr);
		goto RET;
	}
	mmr=waveInOpen(&m_hIn,WAVE_MAPPER,pfmt,dwCallback,dwCallbackInstance,fdwOpen);
	if(mmr)
	{	
		SetLastMMError(mmr);
		goto RET;
	}
	bRet=TRUE;
RET:
	return bRet;
}

CAudioRec::operator HWAVEIN() const
{
	return m_hIn;
}

MMRESULT CAudioRec::GetLastMMError()
{
	return m_mmr;
}

void CAudioRec::SetLastMMError(MMRESULT mmr)
{
	m_mmr=mmr;
}

BOOL CAudioRec::CloseDev()
{
	BOOL bRet=FALSE;
	if(!m_hIn)
		goto RET;
	m_mmr=waveInReset(m_hIn);
	if(m_mmr)
		goto RET;
	m_mmr=waveInClose(m_hIn);
	if(m_mmr)
		goto RET;
	m_hIn=0;
	bRet=TRUE;
RET:
	return bRet;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -