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); 
//}