小弟现在在做一个音频聊天的项目。声音现在可以正常播放,但是如果窗口间切换的话,
会产生 "x7c938994 处最可能的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突"的异常。
是不是因为窗口切换的时候产生其它消息,声音来不及播放就被新来的数据破坏掉了呢。
数据接收用的是while中recvfrom()来完成的。
我分步执行了一下,waveOutWrite()函数执行后,不管是否播完声音,程序会继续执行,接收数据。
感觉这个地方有问题,却没有想到 什么好方法解决。在没有播放完之前不再接收数据。整体逻辑比较混乱,还请大家帮帮忙
会产生 "x7c938994 处最可能的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突"的异常。
是不是因为窗口切换的时候产生其它消息,声音来不及播放就被新来的数据破坏掉了呢。
数据接收用的是while中recvfrom()来完成的。
我分步执行了一下,waveOutWrite()函数执行后,不管是否播完声音,程序会继续执行,接收数据。
感觉这个地方有问题,却没有想到 什么好方法解决。在没有播放完之前不再接收数据。整体逻辑比较混乱,还请大家帮帮忙
*ptr = xxxx; // 此时 ptr 为 NULL
造成的debug模式下调试, 弹出那个对话框的时候, 点重试, 看看是在哪个地方崩溃的
产生“0xC0000005: 读取位置 0x00000000 时发生访问冲突"
如果把waveOutWrite()函数注销掉,就没有问题了,如果我只是接收一段声音,
接收后再播放也没有问题,只有 实时播放时有这个问题,所以我 怀疑是不是
waveOutWrite()使用上有问题
我感觉waveOutWrite()函数播放 的 时候就 已经开了 一个 现成播放了,因为走到 这个 函数的 时候 并没有停,
又往下面走了,我 现在设了二个缓存,一个接收满,另一个再接收,2个循环用,缓存越大,问题出现的可能性越低,
但是时间长了还会出现
DWORD WINAPI CLIENT_THREAD_UDP(LPVOID lpParameter)
{
while(true)
{
recvfrom(clientData->clientSock,(char*)transData,sizeof(TRANS_DATA),0,(sockaddr*)&servAddr,&servAddrLen);
}
if(transData->type==TYPE_SERVER_DATA)
{
// 播放声音
mainWnd->PlayAudio(transData->data); }
}
主线程中播放
// 声音播放
void CUdpAudioDlg::PlayAudio(char* data)
{
// 播放帧设定
m_wHDROut.dwBufferLength=SIZE_AUDIO_FRAME;
m_wHDROut.lpData=data;
m_wHDROut.dwFlags=WHDR_BEGINLOOP | WHDR_ENDLOOP ;
m_wHDROut.dwLoops=1; // 播放
waveOutPrepareHeader(m_hwOut,&m_wHDROut,sizeof(WAVEHDR));
waveOutWrite(m_hwOut,&m_wHDROut,sizeof(WAVEHDR));}
mainWnd->PlayAudio(transData->data); 发送消息等PostMessage到主线程,让主线程来播放,调用等
按照PostMessage到主线程的方式,我试验了几次,产生新的异常有几次是
在系统函数void __cdecl AtlTraceVU()中HEAP[UdpAudio.exe]: HEAP: Free Heap block 1706f0 modified at 170718 after it was freed
Windows 已在 UdpAudio.exe 中触发一个断点。其原因可能是堆被损坏,这也说明 UdpAudio.exe 中或它所加载的任何 DLL 中有 bug。也有几次是
HEAP[UdpAudio.exe]: Invalid Address specified to RtlGetUserInfoHeap( 00150000, 00170C40 )
Windows 已在 UdpAudio.exe 中触发一个断点。其原因可能是堆被损坏,这也说明 UdpAudio.exe 中或它所加载的任何 DLL 中有 bug。