2013-02-21 8 views
1

내 프로그램이 제대로 작동하지 않습니다. 나는 boost :: asio로 네트워크에서 가져온 사운드를 재생해야한다. 그 소리는 옳다. 왜냐하면 내가 파일에 그것을 주면 나는 소리 파일을 가지고 있기 때문이다. 그러나 스피커에서 반복되는 클릭을 듣습니다. 그것이 내 코드입니다.대기열 버퍼에서 클릭 OpenAL

while (!ExitKey) 
{ 
    boost::system::error_code error; 
    size_t len = VoiceSocket->read_some(boost::asio::buffer(buf), error); 
    if (len==0) 
    { 
     continue; 
    } 
    file.write(buf.data(), 882); 
    if (firstit++>=3) 
    { 
     alSourceUnqueueBuffers(alSource, 1, &alUnqueueBuf); 
    } 
    if (iteration <=3) 
    { 
     alBufferData(alSampleSet[iteration++], AL_FORMAT_MONO16, buf.data(), buf.size(), 44100); 
    } 
    else 
    { 
     iteration = 0; 
     alBufferData(alSampleSet[iteration++], AL_FORMAT_MONO16, buf.data(), buf.size(), 44100); 
    } 
    //alSourceQueueBuffers(alSource, 3, alSampleSet); 
    alSourcei(alSource, AL_BUFFER, alSampleSet[0]); 
    alSourcei(alSource, AL_BUFFER, alSampleSet[1]); 
    alSourcei(alSource, AL_BUFFER, alSampleSet[2]); 

    alSourceQueueBuffers(alSource, 1, alSampleSet); 
    // 
    //alSourcei(alSource, AL_LOOPING, alSampleSet); 
    ALenum alErr0 = AL_NO_ERROR; 
    ALenum alErr1 = AL_INVALID_NAME; 
    ALenum alErr2 = AL_INVALID_ENUM; 
    ALenum alErr3 = AL_INVALID_VALUE; 
    ALenum alErr4 = AL_INVALID_OPERATION; 
    ALenum alErr5 = AL_OUT_OF_MEMORY; 
    ALenum alErr = alGetError(); 
    //alGetSourcei(alSource, AL_SOURCE_STATE, &alErr); 
    alSourcePlay(alSource); 
    alErr = alGetError(); 
    // 
} 

도와주세요. 이 코드를 사용하려면이 코드를 사용해야합니다. . 나는이 함께 작업하는 :(

답변

0

당신은 당신이 스트리밍하는 경우 중 하나 alSourcei(alSource, AL_BUFFER, alSampleSet[0]) 또는 alSourceQueueBuffers(alSource, 1, alSampleSet) 있지만 모두 함께, 다음 후자를 사용하여 사용해야합니다 버퍼링 방법을 이해 해달라고

처리 버퍼의

확인 unqueueing 전에 :.

alGetSourcei(alSource, AL_BUFFERS_PROCESSED, out p) 

사용 가능한 버퍼가있는 경우에만 다음 청크를 버퍼링하고 대기열에 넣습니다.