【发布时间】:2019-06-04 04:55:30
【问题描述】:
我的 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 并返回一个布尔值。
这行得通,尽管看起来很草率,但我继续前进。
当我尝试在 AUGraph 捕获混音器的输出时显示 UIActivityIndicatorView 时,事情变得更加令人担忧。简而言之,当我这样做时......
[activityIndicator startAnimating];
while ([myMixerObject graphIsRunning]) {
// NSLog(@"...waiting for graph to stop...");
}
[activityIndicator stopAnimating];
...指示器永远不会出现。
为了好玩,我将[activityIndicator startAnimating] 放在了while 循环中,但它仍然没有出现。
我检查了 activityIndicator 对象是否被正确实例化(例如,我可以让它在图形未运行时出现),所以它让我相信在 AUGraph 运行时调用它有一些特别之处。
我还是 iOS 和 Core Audio 的新手,但我知道一些 Core Audio 调用发生在实时线程上,所以我首先怀疑存在一些并发问题。但是我不知道从哪里开始。我的while() 循环是麻烦开始的地方吗?我应该以不同的方式处理吗?
【问题讨论】:
标签: ios core-audio