C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[12078] [급!질문]음성채팅 프로그램을 만드는중인데여 ...
김회현 [] 1153 읽음    2001-10-25 14:14
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이 못하는데 어떻하나여.. ㅜ.ㅜ

제발 답글 주세여~

아시거나.. 혹시 의심 가시는 부분이라두 말씀해 주시면 감사 하겠습니다. ^^

+ -

관련 글 리스트
12078 [급!질문]음성채팅 프로그램을 만드는중인데여 ... 김회현 1153 2001/10/25
12110     Re:[급!질문]음성채팅 프로그램을 만드는중인데여 ... BarleyTea 1356 2001/10/26
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.