c++ - 分离线程中的 OpenAL alSourcePlay()
问题描述
我正在尝试使用 C++11 线程播放音乐。初始化 OpenAL 后,我的Music::Play()
方法中有以下代码:
alSourcePlay(source);
ALint source_state;
alGetSourcei(source, AL_SOURCE_STATE, &source_state);
while (source_state == AL_PLAYING) {
alGetSourcei(source, AL_SOURCE_STATE, &source_state);
alGetSourcef(source, AL_SEC_OFFSET, &song_time);
}
由于这个 while 循环是阻塞的,我必须在与我的主程序逻辑不同的线程中运行它。我尝试将以下内容添加到main()
:
Music music;
std::thread tmusic(&Music::Play, &music);
...一切都很好。然后我决定将此功能移动到我的主程序类中的一个方法中:
Program::PlayMusic() {
Music music;
std::thread tmusic(&Music::Play, &music);
}
我认为这不起作用,因为线程对象在Program::PlayMusic()
结束后立即超出范围,并且线程被销毁。我尝试使用 将线程与线程对象分离tmusic.detach()
,这似乎工作正常,但音乐只在某些时候播放。这似乎与轨道的大小有关。我的原始歌曲是一个 ~350MB WAV 文件,我正在使用它加载:
buffer = alutCreateBufferFromFile("music.wav");
将文件修剪到 ~4MB 似乎有帮助,但它仍然只在某些时候播放。任何帮助将不胜感激!
解决方案
推荐阅读
- python - 如何使用其中同一库中的多个函数为函数声明多个 kwargs
- javascript - reCAPTCHA v2 复选框小部件未在我的 REACT 应用程序上呈现
- c - 为什么在一行上声明变量会产生意想不到的结果?
- ios - iOS,我可以知道我是否有使用 CallKit 的来电吗?(不是网络电话)
- reactjs - NextJS,如何将服务器端呈现的应用程序上传到我的 FTP 帐户
- javascript - 在 Blade Foreach 循环中动态隐藏元素
- python - Numpy 在 Spyder 3.8 (Python 3) 中不起作用
- ios - Swift:确定类型是否符合协议导致错误
- c# - 如何将图像放入合并的单元格中
- kubernetes - Kubernetes 的 Pod 无法访问外部 MySQL 服务器