我的 iOS 应用程序有 4 个 filePlayer 单元连接到 AUGraph 中的 Mixer 单元。我希望用户能够将四个 filePlayer 单元的“混合”作为一个 .caf 文件通过电子邮件发送。
我通过将回调附加到 remoteIO 并在回调中通过 ExtAudioFileWriteAsync 将混音器的输出写入文件来捕获混音器的输出。
AUGraphStart
当用户单击我的“导出混合和电子邮件”按钮时,我开始该过程 - 也就是说我打电话。由于AUGraphStart
发生在不同的线程上,我的应用程序接下来MFMailComposeViewController
会在图形运行时调用代码。此代码显示电子邮件表单并将混合的 .caf 文件附加到电子邮件中。这里明显的问题是文件在创建时并没有完全写入,因为图形仍在运行。
为了解决这个问题,在启动 AUGraph 之后,我这样做:
while ([myMixerObject graphIsRunning]) {
// NSLog(@"...waiting for graph to stop...");
}
graphIsRunning
只需调用AUGraphIsRunning
并返回一个布尔值。
这奏效了,尽管看起来很草率,但我继续前进。
当我尝试显示一段UIActivityIndicatorView
时间 AUGraph 正在捕获混音器的输出时,事情变得更加令人担忧。简而言之,当我这样做时...
[activityIndicator startAnimating];
while ([myMixerObject graphIsRunning]) {
// NSLog(@"...waiting for graph to stop...");
}
[activityIndicator stopAnimating];
...指示器永远不会出现。
只是为了踢我放在[activityIndicator startAnimating]
while循环中,但它仍然没有出现。
我已经检查了 activityIndicator 对象是否被正确实例化(例如,我可以让它在图形未运行时出现),所以它让我相信在运行时调用它有一些特别之处AUGraph
。
我还是 iOS 和 Core Audio 的新手,但我知道一些 Core Audio 调用发生在实时线程上,所以我首先怀疑存在一些并发问题。但是我不知道从哪里开始。我的while()
循环是麻烦开始的地方吗?我应该以不同的方式接近吗?