|
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이 못하는데 어떻하나여.. ㅜ.ㅜ
제발 답글 주세여~
아시거나.. 혹시 의심 가시는 부분이라두 말씀해 주시면 감사 하겠습니다. ^^
|