0

我正在使用 C++ 开发一个使用 OpenGL 的 Xcode 小应用程序。我试图找到一种向我的应用程序添加简单声音的方法。我对 OpenAL 不太成功(Alut 在 Mac 中不可用)并且无法使 sfml 和 SDL 在我的系统上工作。所以我决定尝试 Apple 的 PlayFile 示例:

http://developer.apple.com/library/mac/#samplecode/PlayFile/Introduction/Intro.html#//apple_ref/doc/uid/DTS40008651

我可以使用这个例子播放声音。但是,当声音开始播放时,OpenGL 会冻结,即所有动画都会停止,直到声音播放完毕。

我检查了文件 PlayFile.cpp 并找到了这一行:

    usleep ((int)(fileDuration * 1000. * 1000.));

我认为它负责冻结OpenGL。在这行之前,我们开始播放声音。在这一行之后,我们清理缓冲区。有什么方法可以更改代码,以便声音开始播放,OpenGL 继续其任务,一旦声音播放完毕,我们就清理缓冲区?我尝试使用指针等其他解决方案在播放开始后进行清理,但现在我无法从应用程序中发出任何声音。

有什么建议么?

4

1 回答 1

1

好的,经过几天的研究,我找到了解决此问题的方法。我使用 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);

这样我的动画可以很容易地与声音相结合。

于 2013-05-01T14:31:44.610 回答