我正在使用 Xcode 使用 C++ 开发一个使用 OpenGL 的小应用程序。 我试图找到一种方法来向我的应用程序添加简单的声音。我在 OpenAL 上不太成功(Alut 在 Mac 中不可用)并且无法使 sfml 和 SDL 在我的系统上工作。所以我决定试试 Apple 的 PlayFile 示例:
我可以使用这个例子来播放声音。然而,当声音开始播放时,OpenGL 卡住,即所有动画停止,直到声音播放完毕。
我检查了文件 PlayFile.cpp 并找到了这一行:
usleep ((int)(fileDuration * 1000. * 1000.));
我认为它负责卡住 OpenGL。在这一行之前,我们开始播放声音。在这一行之后,我们清理缓冲区。有什么办法可以更改代码,以便开始播放声音,OpenGL 继续其任务,播放完声音后我们清理缓冲区?我尝试使用指针等其他解决方案,在播放开始后进行清理,但现在我无法从应用程序中发出任何声音。
有什么建议吗?
最佳答案
好的,经过几天的研究,我找到了解决这个问题的方法。我使用 pthread 创建了多个线程,每个线程一个。我刚刚添加了
#include <pthread.h>
任何定义线程的文件。我为我的声音和线程定义了一个列表:
pthread_t threads[3];
string sounds[3] = {"back.wav", "Arrow1.wav", "Arrow2.wav"};
并使用了一个简单的函数:
void * playSound(void *threadid)
{
long tid;
tid = (long)threadid;
player(sounds[tid], 1);
pthread_exit(NULL);
}
当我创建线程时播放声音:
pthread_create(&threads[2], NULL, playSound, (void *)2);
这样我的动画可以很容易地与声音结合。
关于c++ - 使用带有 OpenGL 的 PlayFile 苹果示例会卡住 OpenGL,直到播放声音结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16218542/