我在做一个网络聊天的客户端.在接收到网络上的包然后播放时,发现在waveoutwrite这个函数会运行一段时间后不返回.死在里面了.我当时打开播放设备的时候用的是CALLBACK_FUNCTION.现在改为CALLBACK_THREAD,这个问题解决了.但是也还是不知道为什么.
现在出现了一个新问题,现在播放是没有问题了.但是录音的时候我也用的是CALLBACK_THREAD.waveInOpen(&hWaveIn, WAVE_MAPPER, &waveFormatEx, m_dwAudioInId,0,CALLBACK_THREAD);BOOL CAudioPlay::StartInThread()
{
hAudioIn=CreateThread(0,0,AudioInThreadProc,this,0,&m_dwAudioInId);
if(!hAudioIn)
{
TRACE("CWaveOut::StartThread: Strat wave in thread fail.\n");
return FALSE;
}
return TRUE;
}DWORD WINAPI AudioInThreadProc(LPVOID lpParameter)
{
log("AudioInThreadProc start.\n");//输出日志 MSG msg;
while(GetMessage(&msg,0,0,0))
{
log("while start");//输出日志
switch(msg.message )
{
case MM_WIM_OPEN:
TRACE("MM_WIM_OPEN \n");
break;
case MM_WIM_CLOSE:
TRACE("MM_WIM_CLOSE \n");
break;
case MM_WIM_DATA:
WAVEHDR* pWH=(WAVEHDR*)msg.lParam;
waveInUnprepareHeader((HWAVEIN)msg.wParam,pWH,sizeof(WAVEHDR));
log("data");//用来记录日志.
if(pWH->dwBytesRecorded<320)
break;
memcpy(Buffer[In_cur],pWH->lpData,pWH->dwBytesRecorded);
In_cur = ( In_cur +1 ) % MAXINBUFFER; waveInPrepareHeader((HWAVEIN)msg.wParam,pWH,sizeof(WAVEHDR));
waveInAddBuffer((HWAVEIN)msg.wParam,pWH,sizeof(WAVEHDR));
EnterCriticalSection(&waveInCriticalSection);
In_size++;
LeaveCriticalSection(&waveInCriticalSection);
break;
}
Sleep(1);
} TRACE("AudioInThreadProc exit.\n");
return msg.wParam;
}当程序在windows2000 profetinal下运行时没问题,但是在XP下运行时,播放部分没问题.但是录音的线程只有AudioInThreadProc start输出,然后就没有了.怎么回事?有谁可以告诉我?
现在出现了一个新问题,现在播放是没有问题了.但是录音的时候我也用的是CALLBACK_THREAD.waveInOpen(&hWaveIn, WAVE_MAPPER, &waveFormatEx, m_dwAudioInId,0,CALLBACK_THREAD);BOOL CAudioPlay::StartInThread()
{
hAudioIn=CreateThread(0,0,AudioInThreadProc,this,0,&m_dwAudioInId);
if(!hAudioIn)
{
TRACE("CWaveOut::StartThread: Strat wave in thread fail.\n");
return FALSE;
}
return TRUE;
}DWORD WINAPI AudioInThreadProc(LPVOID lpParameter)
{
log("AudioInThreadProc start.\n");//输出日志 MSG msg;
while(GetMessage(&msg,0,0,0))
{
log("while start");//输出日志
switch(msg.message )
{
case MM_WIM_OPEN:
TRACE("MM_WIM_OPEN \n");
break;
case MM_WIM_CLOSE:
TRACE("MM_WIM_CLOSE \n");
break;
case MM_WIM_DATA:
WAVEHDR* pWH=(WAVEHDR*)msg.lParam;
waveInUnprepareHeader((HWAVEIN)msg.wParam,pWH,sizeof(WAVEHDR));
log("data");//用来记录日志.
if(pWH->dwBytesRecorded<320)
break;
memcpy(Buffer[In_cur],pWH->lpData,pWH->dwBytesRecorded);
In_cur = ( In_cur +1 ) % MAXINBUFFER; waveInPrepareHeader((HWAVEIN)msg.wParam,pWH,sizeof(WAVEHDR));
waveInAddBuffer((HWAVEIN)msg.wParam,pWH,sizeof(WAVEHDR));
EnterCriticalSection(&waveInCriticalSection);
In_size++;
LeaveCriticalSection(&waveInCriticalSection);
break;
}
Sleep(1);
} TRACE("AudioInThreadProc exit.\n");
return msg.wParam;
}当程序在windows2000 profetinal下运行时没问题,但是在XP下运行时,播放部分没问题.但是录音的线程只有AudioInThreadProc start输出,然后就没有了.怎么回事?有谁可以告诉我?
解决方案 »
- CLIstCtrl ICON 文字位置显示的问题
- 在2005mfc的单文档框架中使用#include<fstream>编译出错
- 请问如何将一个Static控件里的字符读出并写入另一个静态控件
- 内存映射文件似乎有数目限制,如何解决
- vc中串行化类是哪个类?该类一般用来干嘛!
- 对一个api函数的调用,能不能判断到底是哪个进程在调用这个api?
- 怎样修改Recv到的数据信息?
- TCP IOCP使用对象池的问题
- vc中如何表示精确时间<1s or <0.01s
- 一只菜鸟掉进了深水沟,快来救命啊!扑通,一口又,一口,臭…………。*—(:
- 通过手机作为modem,利用RAS API函数拨号上网的问题?????
- 完成端口方面得问题,希望有经验得朋友可以给个指导
或者while start啊