在队列缓冲区OpenAL中单击
Clicks in queue buffers 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();
//
}
请帮帮我。我需要用这个代码做些什么才能让它工作。我不明白如何使用这个缓冲区:(
应该使用alSourcei(alSource, AL_BUFFER, alSampleSet[0])
或alSourceQueueBuffers(alSource, 1, alSampleSet)
,但不能同时使用。当您进行流式传输时,请使用后者。
取消排队前检查已处理的缓冲区:
alGetSourcei(alSource, AL_BUFFERS_PROCESSED, out p)
如果有可用的缓冲区,则仅对下一个区块进行缓冲和排队。
相关文章:
- QTreeView幻灯片多选后无法使用单击选择
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- QML TableView 使用 QtQuick.Controls 2 单击行
- ImGui 在单击按钮后冻结
- 有没有办法区分Qt小部件是通过鼠标单击还是通过按表键获得焦点?
- 我想使用此代码单击某个特定窗口,但它无法正常工作
- 如何在QSplashScreen中禁用鼠标单击
- 单击一个按钮后创建一个按钮
- C++鼠标单击时的屏幕截图不起作用
- 我的主窗口在创建时或单击更新区域时是否会收到编辑控件?
- 标签检测鼠标单击 c++
- 如何将我的程序添加到文件和文件夹的macOS右键单击菜单?
- 使用 SFML 在矩形的矢量中查找鼠标单击量
- 在单击 QPushButton 时调用带有参数的函数
- 如何在单击按钮FLTK的确切时刻获得小部件的值
- 如何使用鼠标单击选择多个 QLabel 对象?
- WM_PAINT基于按钮单击
- 在使用 c++ 的 win32 api 中,我想跟踪双击和三次单击等
- 如何获得鼠标光标连接时按下左键单击和在C++中释放左键单击时?
- 在队列缓冲区OpenAL中单击