我一直在编写一些OpenAL应用程序,它们都是命令行项目。一个项目通过在一个while循环中反复调用alSource3f
来不断改变源空间的位置。这对于刚刚运行的应用程序来说很好。我可以听到源缓冲区的音频,并在应用程序运行时听到它在三维空间中的位置变化。但是,我想使用可可应用程序中的某个UI滑块自动更改源位置。问题是,现在我不能允许这个while循环在主线程上操作,因为它锁定了UI。我试图把while循环和它的内容上使用GCD API这样的背景队列:OpenAL - 在后台运行函数
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
do {
// get next theta
updateSourceLocation(player);
CheckALError ("Couldn't set source position");
// refill buffers if needed
refillALBuffers (&player);
CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.1, false);
} while (difftime(time(NULL), startTime) < RUN_TIME);
});
功能updateSourceLocation内部调用alSource3f
,并通过在CheckALError下一行我得到OpenAL Error: Couldn't set source position (AL_INVALID_ENUM)
。 OpenAL库函数只能在主线程上调用吗?我能做些什么来控制主线程上的UI并在后台队列或线程上运行OpenAL?
可以向下选民解释?这是一个高于我的头脑解决的问题,我发布了上下文和代码,以及我的尝试的细节和解释。 –