我的iOS应用程序有4个filePlayer单元连接到AUGraph中的一个混音器单元。我希望用户能够通过电子邮件将四个filePlayer单元的“混合”作为一个.caf文件。
我通过将回调附加到remoteIO并在回调中通过ExtAudioFileWriteAsync将混合器的输出写入文件来捕获混合器的输出。
当用户点击我的"Export Mix and Email“按钮时,我启动这个过程-也就是调用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];...the指示灯从不出现。
为了好玩,我把[activityIndicator startAnimating]放在while循环中,但它仍然没有出现。
我已经检查了activityIndicator对象是否被正确实例化(例如,我可以让它在图形不运行时出现),所以它让我相信在AUGraph运行时调用它有一些特殊之处。
我对iOS和Core Audio还很陌生,但我知道一些Core Audio调用是在实时线程上进行的,所以我的第一个怀疑是存在一些并发问题。然而,我不知道从哪里开始。问题是从我的while()循环开始的吗?我应该以不同的方式来处理吗?
发布于 2013-07-01 04:53:41
您的while循环阻塞了主线程,这就是您遇到UI问题的原因。我建议注册一个周期性(每秒5-10次)调用的回调函数(使用NSTimer或GCD定时器),而不是轮询您的mixer对象。此回调应检查混音器图是否正在运行。一旦图形停止,您的计时器回调就可以处理必要的UI更改和清理。
https://stackoverflow.com/questions/17392655
复制相似问题