2013-02-21 76 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) 

只有缓冲区和队列的下一个块如果有一个空闲缓冲区。