OpenAL - 后台运行功能

时间:2016-01-29 00:44:30

标签: cocoa openal

我从一些教程中编写了一些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?

1 个答案:

答案 0 :(得分:1)

您不需要持续设置源位置。只要一旦改变就设置它,OpenAL将永远记住这个位置。但是,您需要连续重新填充缓冲区,除非您正在循环播放。