播放AUGraph时显示UIActivityIndi​​catorView

时间:2013-06-30 16:51:06

标签: ios core-audio

我的iOS应用程序有4个filePlayer单元连接到AUGraph中的混音器单元。我希望用户能够将四个filePlayer单元的“混合”通过电子邮件发送为一个.caf文件。

我通过将回调附加到remoteIO并在回调函数中捕获混音器的输出,并通过ExtAudioFileWriteAsync将混音器的输出写入文件。

当用户点击我的“导出混合和电子邮件”按钮时,我启动了该过程 - 也就是说我呼叫AUGraphStart。由于AUGraphStart发生在其他线程上,我的应用程序接下来会在图表运行时调用MFMailComposeViewController代码。此代码显示电子邮件表单,并将混合的.caf文件附加到电子邮件中。这里显而易见的问题是文件在创建时没有完全写入,因为图表仍在运行。

要解决这个问题,在开始AUGraph的开始之后我就这样做了:

    while ([myMixerObject graphIsRunning]) {
//        NSLog(@"...waiting for graph to stop...");
    }

graphIsRunning只需调用AUGraphIsRunning并返回一个布尔值。

尽管看似滑倒,但这仍然奏效,但我继续前进。

当我试图在AUGraph捕捉混音器的输出时显示UIActivityIndicatorView时,事情变得更加令人担忧。简而言之,当我这样做时......

    [activityIndicator startAnimating];
    while ([myMixerObject graphIsRunning]) {
//        NSLog(@"...waiting for graph to stop...");
    }
    [activityIndicator stopAnimating];

......指标永远不会出现。

只是为了踢,我把[activityIndicator startAnimating]放在while循环中,但它仍然没有出现。

我已经检查了activityIndi​​cator对象是否正确实例化(例如,我可以在图表未运行时显示它)所以它让我相信在AUGraphwhile()时调用它有一些特别之处运行

我还是iOS和Core Audio的新手,但我知道一些Core Audio调用是在实时线程上发生的,所以我首先怀疑是否存在一些并发问题。但是我不知道从哪里开始。我的{{1}}循环是麻烦的开始吗?我应该以不同的方式接近吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

您的while循环阻止了主线程,这就是您遇到UI问题的原因。我建议您定期注册(使用NSTimer或GCD计时器)定时调用(每秒5-10次),而不是轮询调音台对象。此回调应检查混频器图表是否正在运行。图表停止后,您的计时器回调可以处理必要的UI更改和清理。