首页 > 解决方案 > 分离线程中的 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 似乎有帮助,但它仍然只在某些时候播放。任何帮助将不胜感激!

标签: c++multithreadingc++11openal

解决方案


推荐阅读