C++ 在队列缓冲区中单击OpenAL
我的程序运行不正常。我需要用boost::asio播放从网络中获取的声音。那个声音是对的,因为若我把它给文件,我就有声音文件。但在扬声器中,我听到重复的咔哒声。这是我的代码:C++ 在队列缓冲区中单击OpenAL,c++,boost-asio,openal,C++,Boost Asio,Openal,我的程序运行不正常。我需要用boost::asio播放从网络中获取的声音。那个声音是对的,因为若我把它给文件,我就有声音文件。但在扬声器中,我听到重复的咔哒声。这是我的代码: while (!ExitKey) { boost::system::error_code error; size_t len = VoiceSocket->read_some(boost::asio::buffer(buf), error); if (len==0) {
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();
//
}
请帮帮我。我需要用这个代码做什么才能让它工作。我不明白如何使用此缓冲区:您应该同时使用alSourceialSource、Alu BUFFER、alSampleSet[0]或AlsourceQueueBuffersSource、1、alSampleSet,但不能同时使用两者。当您正在进行流式处理时,请使用后者
在取消排队前检查已处理的缓冲区:
alGetSourcei(alSource, AL_BUFFERS_PROCESSED, out p)
如果有空闲缓冲区,则仅缓冲并排队等待下一个块