这个问题折腾好几天了,在这里请教大家有没有解决的办法?
我现在做了一个局域网语音聊天的东西,可是等做好了以后,在使用的过程中,等用一段时间后,它自己就会死掉,后来调试一检查,原来是执行waveOutWrite时没了反应。
它执行的顺序是这样的,在语音播放时定义了一个回调函数,每当一个缓冲区播放完毕后,便向接收线程发送一个消息,接收线程接到消息后,便接收数据,然后便进行播放,一般情况下,刚开始播放时是不会出错的,等运行一段时间后(可能五六秒钟也可能一个小时)后,当执行到waveOutWrite时便没有反应了,具体代码如下:
// 回调函数
procedure WaveOutProc(HW: HWAVEOUT; MS: Integer; UX: Cardinal; p1: PWAVEHDR; p2: Cardinal); stdcall; far;
begin
if ms = WOM_DONE then
begin
repeat until waveOutUnprepareHeader(hw, p1, Sizeof(WAVEHDR)) = 0;
if ThreadOut <> 0 then PostThreadMessage(ThreadOut, WM_RECVAUDIO, hw, Integer(p1));
end;
end;
// 接收线程
procedure TAudioRecvThread.Execute;
var
p: PWAVEHDR;
ms: MSG;
J: Integer;
error: Integer;
begin
while not Terminated do
begin
GetMessage(ms, 0, 0, 0);
case ms.message of
WM_RECVAUDIO:
begin
P := PWAVEHDR(ms.lParam);
repeat
J := FSocket.RecvBuffer(@(P^.lpData[0]), BufInSize);
until ((FSocket.LastError = 0){ and (J = BufInSize)}) or Terminated;
p^.dwFlags := 0;
p^.dwBufferLength := J;
p^.dwBytesRecorded := J;
repeat
until (waveOutPrepareHeader(ms.wParam, p, Sizeof(WAVEHDR)) = 0) or Terminated;
repeat
until (waveOutWrite(ms.wParam, p, Sizeof(WAVEHDR)) = 0) or Terminated;
end;
WM_TERMINATE: Terminate;
end; // case
end; // while
end;
不知道waveOutWrite这个函数在什么情况下就没有反应了?