c++ - 使用带有 OpenGL 的 PlayFile 苹果示例会卡住 OpenGL,直到播放声音结束

标签 c++ xcode opengl audio

我正在使用 Xcode 使用 C++ 开发一个使用 OpenGL 的小应用程序。 我试图找到一种方法来向我的应用程序添加简单的声音。我在 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 继续其任务,播放完声音后我们清理缓冲区?我尝试使用指针等其他解决方案,在播放开始后进行清理,但现在我无法从应用程序中发出任何声音。

有什么建议吗?

最佳答案

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

相关文章:

OSX 中的 SwiftUI 自定义文本字段

c++ - glScalef 命令偏离中心

javascript - WebGL - 沿行进方向旋转对象

c++ - 从类方法返回作用域枚举时命名空间混淆

c++ - 必须使用尾随返回类型的示例,因为问题无法用旧方法解决

iphone - 从界面生成器更改 View 的两个方向的布局

java - 体素游戏 : rendering blocks different ways and perfomance

c++ - "A case label may only be used within a switch"

c++ - C++段错误中的堆算法

c++ - 在 Xcode 中为 C++ 项目使用框架头文件