www.pudn.com > audioTest.rar > AudioUIThread.cpp
// AudioUIThread.cpp : 实现文件
//
#include "stdafx.h"
#include "AudioUIThread.h"
// CAudioUIThread
IMPLEMENT_DYNCREATE(CAudioUIThread, CWinThread)
CAudioUIThread::CAudioUIThread(): m_waveIn(NULL)
, m_monDevice(NULL)
, m_monWave(NULL)
, m_audioNum(0)
,m_hasVoice(NULL)
,ai(NULL)
{
}
CAudioUIThread::CAudioUIThread(AudioInfo *AI)
: m_waveIn(NULL)
, m_monDevice(NULL)
, m_monWave(NULL)
,m_hasVoice(NULL)
, m_audioNum(0)
{
ai=AI;
}
CAudioUIThread::~CAudioUIThread()
{
/*if(m_pMainWnd)
{
delete m_pMainWnd;
m_pMainWnd = NULL;
}*/
if(ai!=NULL)
{
//delete ai->audio;
delete []ai;
}
for (int i = 0; i < m_audioNum; ++i)
{
if(!m_waveIn[i].Close())
{
AfxMessageBox( m_waveIn[i].GetError() );
}
}
if(m_waveIn!=NULL)
delete[] m_waveIn;
if(m_monDevice!=NULL)
delete[] m_monDevice;
if(m_monWave!=NULL)
delete[] m_monWave;
if(m_hasVoice!=NULL)
delete[] m_hasVoice;
}
BOOL CAudioUIThread::InitInstance()
{
// TODO: 在此执行任意逐线程初始化
//重载这个函数
CFrameWnd * wnd=new CFrameWnd;
wnd->Create(NULL,"UI Thread Window");
//wnd->ShowWindow(SW_SHOW);
wnd->UpdateWindow();
m_pMainWnd=wnd;
//初始化音频
InitAudio();
return TRUE;
}
int CAudioUIThread::ExitInstance()
{
// TODO: 在此执行任意逐线程清理
//m_pMainWnd->DestroyWindow();//????????????????
return CWinThread::ExitInstance();
}
BEGIN_MESSAGE_MAP(CAudioUIThread, CWinThread)
ON_THREAD_MESSAGE(WM_MSG_1,OnMyMsgAudio)
END_MESSAGE_MAP()
// CAudioUIThread 消息处理程序
bool CAudioUIThread::InitAudio()
{
int num=ai->num;
if (ai->num > 0)
{
m_audioNum = num;
m_waveIn = new CWaveIn[num];
m_monDevice = new CWaveDevice[num];
m_monWave = new CWave[num];
m_hasVoice=new BOOL[num];
for (int i = 0; i < num; ++i)
{
//m_audio[i] = audio[i];
m_waveIn[i].regist((LPVOID)this/*->m_pMainWnd*/);
m_hasVoice[i] = FALSE;
//SetTimer(i+1,500,NULL);
}
for (int i = 0; i < m_audioNum; i++)
{
for(int j=0; j<(int)CWaveInterface::GetWaveInCount();j++)
{
if (CWaveInterface::GetWaveInName(j) == ai->audio[i].AudioName)
{
m_monWave[i].BuildFormat(1,8000,8);//但通道就可以了
if(!m_monDevice[i].IsInputFormat(m_monWave[i]))
{
AfxMessageBox("Format non support");
return false;
}
m_monDevice[i].setSpecializedDevice(j);
m_waveIn[i].SetWaveFormat(m_monWave[i].GetFormat());
m_waveIn[i].SetDevice(m_monDevice[i]);
if ( !m_waveIn[i].Open() ) {//打开录音设备
AfxMessageBox(m_waveIn[i].GetError() );
return false;
}
if ( !(m_waveIn[i].Record()) ) {
AfxMessageBox( m_waveIn[i].GetError() );
return false;
}
break;
}
}
}
return true;
}
else
{
AfxMessageBox("未进行语音模块设置,语音模块未启动!");
return true;
}
}
void CAudioUIThread::OnMyMsgAudio(WPARAM wParam,LPARAM lParam)
{
AfxMessageBox("receving message!");
wimm_data *wd=(wimm_data*)wParam;
int *p=(int*)wd->data_buffer;
DWORD len=(DWORD)wd->len;
DWORD deviceNo=(DWORD)wd->deviceNo;
double total=0;
double tt=0;
double avg=0;
for(int i=0; i < (int)len; i++)
{
total+=(128-abs(p[i]));
tt+=abs(p[i]);
}
avg=total/len;
int vol=tt/len;
for (int i = 0; i < m_audioNum; ++i)
{
if (CWaveInterface::GetWaveInName(deviceNo) == ai->audio[i].AudioName)
{
if(vol < ai->audio[i].silent)
{
m_hasVoice[i] = TRUE;
}
}
}
delete[] p;
delete wd;
return;
}
int CAudioUIThread::Run()
{
/*MSG msg;
while(::GetMessage(&msg,NULL,0,0))
{
switch(msg.message)
{
case WM_MSG_1:
OnMyMsgAudio(msg.wParam,msg.lParam);
break;
}
}*/
//在waveIn中利用PostThreadMessage了就不用重载Run()了
return CWinThread::Run();
}
//void CAudioUIThread::EndThread(int t)
//{
// //AfxEndThread((UINT)t,1);
// this->PostThreadMessage(WM_QUIT,0,0);
//}