【问题标题】:Displaying a UIActivityIndicatorView While Playing an AUGraph在播放 AUGraph 时显示 UIActivityIndi​​catorView
【发布时间】: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 循环中,但它仍然没有出现。

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

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

【问题讨论】:

    标签: ios core-audio


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      相关资源
      最近更新 更多