0

我的 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循环中,但它仍然没有出现。

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

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

4

1 回答 1

2

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

于 2013-06-30T20:53:41.050 回答