|
MM_WOM_DONE 메시지를 어떻게 처리하시나요?
콜백함수로? 아님 윈도우 메시지로?
MM_WOM_DONE 메시지 처리부분에서 waveOutUnprepareHeader
함수를 반드시 호출해줘야 합니다. 혹시 빠트린건 아닌지 확인해 보세영 ^^
김회현 님이 쓰신 글 :
: WIM_DATA 이벤트를 받으면 버퍼에 찬 음성을 압축해서 보내는 쓰레드 UDP로 보내구여..
:
: 상대가 보낸 음성 데이타를 받아서 압축을 풀어서 Play 할 수 있도록 플래이 쓰레드를 여기서 또 불러줘여.
:
: 이렇게 3개의 쓰레드가 돌구 있습니다.
:
: 코덱은 723.1 을 쓰고여..
:
:
:
: 그런데 플래이 쓰레드가 동작하면 프로그램이 리소스를 점점 많이 잡아 먹다가 다운 됩니다.
:
: 프로그램이 진행되다가 갑자기 다운 되는 것이라
: waveInStop,waveOutPause,waveInReset,waveOutUnprepareHeader,waveOutClose 와 같은 함수는 실행 되기도
: 전에 죽습니다.
:
: 문제의 쓰인 변수선언과 Play_Thread 입니다.
:
: #define PCMBUFFERSIZE 960
: #define G711BUFFERSIZE 480
: #define BUFFERCOUNT 8
: #define G7231BUFFERSIZE 48
:
: typedef struct{
: BYTE pWaveOut[PCMBUFFERSIZE];
: int pchk;
: int endchk;
: } PlayBuf;
:
: PlayBuf playbuf[BUFFERCOUNT];
:
: void __stdcall CGxAudio::Play_Thread(LPVOID lpParameter)
: {
: int errorCode;
: char tmp[100];
:
: BOOL *bStop = (BOOL*)lpParameter;
:
: while (*bStop)
: {
: if(PlayCheck == TRUE) {
: Sleep(10);
: continue;
: }
:
: // 이버퍼에 음성데이타가 있는지를 Check.
: if (playbuf[PlayCount].pchk != 1) {
: Sleep(10);
: continue;
: }
:
: // 음성 데이타를 Header에 Setting
: WaveHeaderOut[PlayCount]->lpData = (LPSTR)playbuf[PlayCount].pWaveOut;
: WaveHeaderOut[PlayCount]->dwBufferLength = PCMBUFFERSIZE;
: WaveHeaderOut[PlayCount]->dwBytesRecorded = 0L;
: WaveHeaderOut[PlayCount]->dwFlags = 0L;
: WaveHeaderOut[PlayCount]->dwLoops = 0L;
:
: if (hWaveOut != NULL) {
: // 음성 재생
: waveOutPrepareHeader(hWaveOut,WaveHeaderOut[PlayCount],sizeof(WAVEHDR));
:
: errorCode=
: waveOutWrite(hWaveOut,WaveHeaderOut[PlayCount],sizeof(WAVEHDR));
:
: if(errorCode) {
: switch(errorCode){
: case MMSYSERR_INVALHANDLE :
: ShowMessage("MMSYSERR_INVALHANDLE");
: break;
: case MMSYSERR_NODRIVER :
: ShowMessage("MMSYSERR_NODRIVER");
: break;
: case MMSYSERR_NOMEM :
: ShowMessage("MMSYSERR_NOMEM");
: break;
: case WAVERR_UNPREPARED :
: ShowMessage("WAVERR_UNPREPARED");
: break;
: }
: }
:
: playbuf[PlayCount].pchk = 0;
:
: if (PlayCount == (BUFFERCOUNT-1)) PlayCount = 0;
: else PlayCount++;
:
: }
: }
:
: PlayThread_CreateCheck = 0;
: *bStop = TRUE;
: ExitThread(0);
: }
:
: waveOutWrite 함수를 지우고 실행해 보니깐 죽지는 않네여..
:
: 이 함수가 없으면 상대에게 넘어온 음성을 play이 못하는데 어떻하나여.. ㅜ.ㅜ
:
: 제발 답글 주세여~
:
: 아시거나.. 혹시 의심 가시는 부분이라두 말씀해 주시면 감사 하겠습니다. ^^
|