做过音频的进来帮帮忙啊

unsway123 2008-05-27 10:24:14
最近在写一个关于类似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;

}
}





}
...全文
77 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
unsway123 2008-05-27
  • 打赏
  • 举报
回复
录音与采集也要另外的开辟线程吗?
我源程序中的waveinstar该放在那里,该另外开辟线程吗
我上面那样写的对吗?
我的void CChatDlg::OnPhone()就是在对话框中响应了语音聊天按钮的响应函数
是不是点击后就该创建线程呢
ouyh12345 2008-05-27
  • 打赏
  • 举报
回复
unsway123 2008-05-27
  • 打赏
  • 举报
回复
什么意思啊,有点不明白,难道还是要在点击语音聊天按钮后,就开辟线程吗?
非常谢谢你的帮忙和关心
ouyh12345 2008-05-27
  • 打赏
  • 举报
回复
开线程来做
在响应函数里做会阻塞界面的
unsway123 2008-05-27
  • 打赏
  • 举报
回复
我的语音聊天是用的一个新的button,你的意思是在这个button的响应函数里面来进行语音的采集和播放呢
ouyh12345 2008-05-27
  • 打赏
  • 举报
回复
文字和语音没有什么关系,2者应该分开来做

应该另外做个button,就叫语音聊天,然后采集声音和发送数据等,都放在一个线程里做

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧