MSDN에서 퍼온 글입니다.waveOutProc으로 F1을 치면 다음과 같은 글이 있습니다.
Applications should not call any system-defined functions from inside a callback function, except for EnterCriticalSection, LeaveCriticalSection, midiOutLongMsg, midiOutShortMsg, OutputDebugString, PostMessage, PostThreadMessage, SetEvent, timeGetSystemTime, timeGetTime, timeKillEvent, and timeSetEvent. Calling other wave functions will cause deadlock.
가장 마지막 부분을 보면 callback에서는 wave... function을 사용하지 말라는 권고가 있습니다. 회현님이 작정하신 코드에는 MM_WOM_DONE이 올 때 waveOutUnprepareHeader를 호출하고 있는데, 이는 dead lock이 걸릴 수도 있다는 얘기입니다.
그리고 delay를 고의로 발생시키는 방법을 가르쳐 드리겠습니다. 작업표시줄의 아무 프로그램이나 계속 클릭해서 윈도우의 minimize, restore를 계속 생기게 해 보십시오. thread 수행이 조금씩 느려져서(minimize, restore의 수행이 우선순위가 상당히 높음) 음성 delay가 금방 생기게 됩니다.
걍 노파심에서 몇자 끄적여 봅니다.
김회현 님이 쓰신 글 :
: 여러분들의 말씀 처럼 오류메세지를 보고서는 메모리쪽 문제가 있을 것이다만 짐작 갈 따름이지
: 알 수가 없어서.. 메모리를 자꾸 잡아 먹는 부분을 찾았습니다.
:
:
: 문제의 부분입니다.
:
: waveOutWrite 함수를 수행하고 나면 발생하는 이벤트 WOM_DONE 처리 하는 부분입니다.
:
: void __stdcall chatPhone::wave_outproc(HWAVEOUT hwo, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
: {
: int errorCode, i = 0;
: char tmp[50];
:
: switch(uMsg){
: case WOM_DONE:
: errorCode = waveOutUnprepareHeader( hWaveOut, (LPWAVEHDR)dwParam1, sizeof(WAVEHDR) );
:
:
: if(errorCode != MMSYSERR_NOERROR) {
: switch(errorCode) {
: case MMSYSERR_INVALHANDLE:
: Memo1->Lines->Add("Specified device handle is invalid.");
: break;
: case MMSYSERR_NODRIVER:
: Memo1->Lines->Add("No device driver is present.");
: break;
: case MMSYSERR_NOMEM:
: Memo1->Lines->Add("Unable to allocate or lock memory.");
: break;
: case WAVERR_STILLPLAYING:
: Memo1->Lines->Add("WAVERR_STILLPLAYING");
: waveOutReset(hWaveOut);
: break;
: }
: }
:
: break;
: }
: }
:
:
: 무슨 문제 였나면여.. 2시간 정도 돌리면 WAVERR_STILLPLAYING 에러가 자꾸 나더라구여.
:
: 그래서 그부분에 waveOutReset(hWaveOut); 을 해 줬습니다.
:
: 그러니깐 죽지도 않고 딜레이가 생기다가 waveOutReset(hWaveOut) 이 불려지면 딜레이가 다시 안생기고 또 생기다가 안생기고 합니다.
:
: 60ms 음성 데이타 처리만 해도 안나타났는데 30ms로 처리해서 나타난 문제이구요.
:
: 이렇게 해결했습니다.
:
: 모두 즐프 하세여.
:
:
: 김회현 님이 쓰신 글 :
: :
: : 1:1 음성채팅 프로그램을 만들고 있는데요.
: :
: : 한 2시간 정도 돌리면
: :
: : "프로그램에서 오류가 발생했습니다.... 닫기 무시"
: : 이런 메세지박스가 뜹니다.
: :
: : 닫기를 누르면 또
: : "04!:00002bfb의 모듈 ES197X.DRV 에서 chatPhone 잘못된 페이지 오류 발생"
: : 이란 메세지 박스가 또 뜹니다.
: : chatPhone 가 프로그램명 입니다.
: :
: : 대체 무슨 문제 때문인지 모르겠습니다.
: :
: : 짐작 가는 부분이라도 있으신 분은 답글 주세요.
: :
: :
: :
: :
: :
|