我从一些教程中编写了一些OpenAL应用程序,它们都是命令行项目。一个项目通过在while循环中重复调用alSource3f
来不断更改空间中源的位置。这对于刚运行的应用程序来说很好。我可以听到源缓冲区的音频,并在应用程序运行时听到它在3d空间中更改位置。但是,我想使用cocoa应用程序中的一些UI滑块自动动态更改源位置。问题是现在我不能允许这个while循环在主线程上操作,因为它锁定了UI。我尝试使用GCD api将while循环及其内容抛出到后台队列中:
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?
答案 0 :(得分:1)
您不需要持续设置源位置。只要一旦改变就设置它,OpenAL将永远记住这个位置。但是,您需要连续重新填充缓冲区,除非您正在循环播放。