做过音频的进来帮帮忙啊
最近在写一个关于类似QQ的软件,文字聊天部分已经效果很好,用UDP传输的
现在在弄声音部分的,我的要求是能够语音聊天,像QQ那样的效果,
我想问的是:文字聊天的接收部分是用线程写的,当我开启了文字聊天后,想同时进行语音聊天,我开辟线程该从那里开辟?
我有一个button,是不是当我一按这个button都就立即开辟线程,还是怎么做?
waveinstar是接收语音数据的函数,这个函数该不该放在线程函数里面。
贴我写的代码,我的语音是UDP传输的,此时我已经开始文字聊天了,这样开辟线程对吗?
void CChatDlg::OnPhone()
{
// TODO: Add your control notification handler code here
MMRESULT mmReturn = 0;
GetDlgItem(IDC_PHONE)->EnableWindow(false);
for(int i=0;i<InBlocks;i++)
{
m_AudioDataIn[i]=new PBYTE[IN_BUF_SIZE];
}
for(int j=0;j<OutBlocks;j++)
{
m_AudioDataOut[j]=new PBYTE[IN_BUF_SIZE];
}
pBuffer1=new PBYTE[IN_BUF_SIZE];
pBuffer2=new PBYTE[IN_BUF_SIZE];
if(!pBuffer1||!pBuffer2)
{
if(pBuffer1)
{
delete pBuffer1;
pBuffer1=NULL;
}
if(pBuffer2)
{
delete pBuffer2;
pBuffer2=NULL;
}
AfxMessageBox("内存分配出错!");
return;
}
m_waveformin.wFormatTag=WAVE_FORMAT_PCM;//音频格式类型
m_waveformin.nChannels=1;//声道
m_waveformin.nSamplesPerSec=11025;//采样频率
m_waveformin.nAvgBytesPerSec=11025;//每秒钟字节数
m_waveformin.nBlockAlign=1;//样本字节数
m_waveformin.wBitsPerSample=8;//样本量化位数
m_waveformin.cbSize=0;//附加信息字节大小
mmReturn=::waveInOpen(&m_hRecord,WAVE_MAPPER,&m_waveformin,(DWORD)this->m_hWnd,NULL,CALLBACK_WINDOW);
if(mmReturn)
{
AfxMessageBox("没有找到相关设备!");
delete pBuffer1;
delete pBuffer2;
pBuffer1=NULL;
pBuffer2=NULL;
return;
}
else
{
pWaveHdr1=new WAVEHDR;
pWaveHdr1->lpData=(LPTSTR)pBuffer1;
pWaveHdr1->dwBufferLength=IN_BUF_SIZE;//指定缓冲区大小
pWaveHdr1->dwBytesRecorded=0;
pWaveHdr1->dwUser=0;//用户数据
pWaveHdr1->dwFlags=0;
pWaveHdr1->dwLoops=1;//音频输出时数据块循环的次数
pWaveHdr1->lpNext=NULL;
pWaveHdr1->reserved=0;
::waveInPrepareHeader(m_hRecord,pWaveHdr1,sizeof(WAVEHDR));
pWaveHdr2=new WAVEHDR;
pWaveHdr2->lpData=(LPTSTR)pBuffer2;
pWaveHdr2->dwBufferLength=IN_BUF_SIZE;//指定缓冲区大小
pWaveHdr2->dwBytesRecorded=0;
pWaveHdr2->dwUser=0;//用户数据
pWaveHdr2->dwFlags=0;
pWaveHdr2->dwLoops=1;//音频输出时数据块循环的次数
pWaveHdr2->lpNext=NULL;
pWaveHdr2->reserved=0;
::waveInPrepareHeader(m_hRecord,pWaveHdr2,sizeof(WAVEHDR));
::waveInAddBuffer(m_hRecord,pWaveHdr1,sizeof(WAVEHDR));
::waveInAddBuffer(m_hRecord,pWaveHdr2,sizeof(WAVEHDR));
::waveInStart(m_hRecord);
::AfxBeginThread(Listen,this);//创建工作者线程
::AfxBeginThread(Send,this);//创建工作者线程
m_waveformout.wFormatTag=WAVE_FORMAT_PCM;
m_waveformout.nChannels=1;
m_waveformout.nSamplesPerSec=11025;
m_waveformout.nAvgBytesPerSec=11025;
m_waveformout.nBlockAlign=1;
m_waveformout.wBitsPerSample=8;
m_waveformout.cbSize=0;
mmReturn=::waveOutOpen(&m_hPlay,WAVE_MAPPER,&m_waveformout,(DWORD)this->m_hWnd,NULL,CALLBACK_WINDOW);
if(mmReturn)
{
AfxMessageBox("没有找到相关设备!");
delete pBuffer1;
delete pBuffer2;
pBuffer1=NULL;
pBuffer2=NULL;
return;
}
}
}