2016-01-29 31 views
-1

我一直在编写一些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?

+0

可以向下选民解释?这是一个高于我的头脑解决的问题,我发布了上下文和代码,以及我的尝试的细节和解释。 –

回答

1

您不需要连续设置源位置。只要设置它,OpenAL就会永远记住这个位置。但是你需要不断补充缓冲区,除非你正在循环播放。

+0

但我想设置位置。现在,然后,每当。我的问题的关键是,我可以将它设置在主线程(阻止用户界面),或者我可以在后台线程,但是当我做openAL引发错误。 –