【VC开源代码栏目提醒】:网学会员鉴于大家对VC开源代码十分关注,论文会员在此为大家搜集整理了“WaveIn.cpp”一文,供大家参考学习
#include "stdafx.h"
#include "WaveIn.h"
#include "math.h"
#pragma comment(lib,"Winmm")
DWORD CWaveIn::s_dwInstance = 0;
//线程处理
DWORD WINAPI CWaveIn::AudioInThreadProc(LPVOID lpParameter)
{
CWaveIn *pWaveIn;
pWaveIn = (CWaveIn *)lpParameter;
//缓存
char buffer[1024];
//消息处理主循环
MSG msg;
while(GetMessage(&msg,0,0,0))
{
switch(msg.message )
{
//打开录音设备
case MM_WIM_OPEN:
break;
//关闭录音设备
case MM_WIM_CLOSE:
break;
//录音设备返回数据
case MM_WIM_DATA:
//录音格式
WAVEHDR* pWH=(WAVEHDR*)msg.lParam;
//释放缓存
waveInUnprepareHeader((HWAVEIN)msg.wParam,pWH,sizeof(WAVEHDR));
//非法数据
if(pWH->dwBytesRecorded!=SIZE_AUDIO_FRAME)
break;
//复制录音数据
memcpy(buffer,pWH->lpData,pWH->dwBytesRecorded);
//设置时戳
pWaveIn->GetData (buffer ,pWH->dwBytesRecorded );
//为音频设备增加一个缓存,准备继续录音
waveInPrepareHeader((HWAVEIN)msg.wParam,pWH,sizeof(WAVEHDR));
waveInAddBuffer((HWAVEIN)msg.wParam,pWH,sizeof(WAVEHDR));
break;
}
}
//返回
return msg.wParam;
}
//构造函数
CWaveIn::CWaveIn() :
m_wChannel(1),
m_dwSample (WISA_POOR),
m_wBit(16)
{
m_hIn=0;
m_bThreadStart = FALSE;
m_bDevOpen = FALSE;
m_bAllocBuffer = FALSE;
m_bRecord = FALSE;
m_pHdr = NULL;
m_dwAudioInId = 0;
s_dwInstance ++;
}
//构析函数
CWaveIn::~CWaveIn()
{
}
//关闭录音设备
BOOL CWaveIn::CloseDev()
{
//设备已经关闭
if (!m_bDevOpen)
{
//返回
return FALSE;
}
//设备句柄无效
if(!m_hIn)
{
//返回
return FALSE;
}
//关闭录音设备
m_mmr=waveInClose(m_hIn);
//出错
if(m_mmr)
{
//设置设备句柄无效
m_hIn=0;
//设置设备启动标记
m_bDevOpen = FALSE;
//返回
return FALSE;
}
//设置设备句柄无效
m_hIn=0;
//设置设备启动标记
m_bDevOpen = FALSE;
//返回
return TRUE;
}
//打开录音设备
BOOL CWaveIn::OpenDev()
{
//已经打开录音设备
if (m_bDevOpen)
{
//返回
return FALSE;
}
//设置录音设备输出格式
WAVEFORMATEX wfx;
wfx.wFormatTag = WAVE_FORMAT_PCM;
wfx.nChannels = m_wChannel;
wfx.nSamplesPerSec = m_dwSample;
wfx.nAvgBytesPerSec = m_wChannel * m_dwSample * m_wBit / 8;
wfx.nBlockAlign = m_wBit * m_wChannel / 8;
wfx.wBitsPerSample = m_wBit;
wfx.cbSize = 0;
//检查录音设备是否支持设定的输出格式
m_mmr=waveInOpen(0,WAVE_MAPPER,&wfx,0,0,WAVE_FORMAT_QUERY);
//出错
if(m_mmr)
{
//返回
return FALSE;
}
//打开录音设备
m_mmr=waveInOpen(&m_hIn,WAVE_MAPPER,&wfx,m_dwAudioInId,
s_dwInstance,CALLBACK_THREAD);
//出错
if(m_mmr)
{
//返回
return FALSE;
}
//设置设备打开标记
m_bDevOpen = TRUE;
//返回
return TRUE;
}
//启动线程
BOOL CWaveIn::StartThread()
{
//线程已经启动
if (m_bThreadStart)
{
//返回
return FALSE;
}
//创建线程
m_hAudioIn=CreateThread(0,0,AudioInThreadProc,
this,0,&m_dwAudioInId);
//出错
if(!m_hAudioIn)
{
//返回
return FALSE;
}
//设置线程启动标记
m_bThreadStart = TRUE;
//返回
return TRUE;
}
//关闭线程
BOOL CWaveIn::StopThread()
{
//线程已经停止
if (!m_bThreadStart)
{
//返回
return FALSE;
}
//线程句柄有效
if(m_hAudioIn)
{
//循环变量
int t=50;
//线程结束状态信息
DWORD ExitCode;
//线程结束标记
BOOL bEnd=FALSE;
//发送WM_QUIT消息
PostThreadMessage(m_dwAudioInId,WM_QUIT,0,0);
//主循环
while(t)
{
//获取线程结束状态信息
GetExitCodeThread(m_hAudioIn,&ExitCode);
//尚未结束
if(ExitCode!= STILL_ACTIVE)
{
//设置线程结束
bEnd=TRUE;
break;
}
//休眠10毫秒
else
{
Sleep(10);
}
//修改循环变量
t--;
}
//线程尚未结束
if(!bEnd)
{
//终止线程
TerminateThread(m_hAudioIn,0);
}
//录音设备句柄无效
m_hAudioIn=0;
}
//设置线程结束标记
m_bThreadStart = FALSE;
//返回
return TRUE;
}
//启动录音
BOOL CWaveIn::StartRec()
{
//返回值
BOOL bRet=FALSE;
//启动线程失败
if (!StartThread())
{
goto Exit;
};
//打开录音设备失败
if (!OpenDev())
{
goto Exit1;
};
//准备缓存失败
if (!PerPareBuffer())
{
goto Exit2;
}
//开始录音
if (!OpenRecord())
{
goto Exit3;
}
//设置返回值
bRet = TRUE;
goto Exit;
Exit3:
//释放缓存
FreeBuffer();
Exit2:
//关闭录音设备
CloseDev ();
Exit1:
//停止线程
StopThread ();
Exit:
//返回
return bRet;
}
//终止录音
BOOL CWav