我的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循环中,但它仍然没有出现。
我已经检查了activityIndicator对象是否正确实例化(例如,我可以在图表未运行时显示它)所以它让我相信在AUGraph
是while()
时调用它有一些特别之处运行
我还是iOS和Core Audio的新手,但我知道一些Core Audio调用是在实时线程上发生的,所以我首先怀疑是否存在一些并发问题。但是我不知道从哪里开始。我的{{1}}循环是麻烦的开始吗?我应该以不同的方式接近吗?
提前致谢。
答案 0 :(得分:1)
您的while
循环阻止了主线程,这就是您遇到UI问题的原因。我建议您定期注册(使用NSTimer
或GCD计时器)定时调用(每秒5-10次),而不是轮询调音台对象。此回调应检查混频器图表是否正在运行。图表停止后,您的计时器回调可以处理必要的UI更改和清理。