0

好的 --- 我是不是快要发布我的音频分析应用程序了,我发现使用核心音频的 monotouch 存在问题。Monotouch 实际上具有核心音频/远程 io 的绑定,并且由 Miguel 编写的示例运行良好。这在 99% 的时间里都很好用。问题出现在我认为“停止世界”垃圾收集器发生在 coreaudio 的渲染回调期间。那时我们处于托管代码中,所以我可以认为渲染回调在 gc 完成之前不会返回。因此,每 160 帧中大约有 1 帧被丢弃(大约每 2 到 4 秒)。

所以我有三个选择,没有智慧知道哪个是浪费时间。

在 c 中编写代码音频渲染回调(以及所有其他核心音频接口代码)。然后我可以在我的托管代码可以分析它的情况下快速获取样本。即使我暂停 20 毫秒,这也可以避免丢帧。我的主要问题是我可以用单点触控做到这一点吗?如果完全不受管理,核心音频回调函数会被 gc 停止吗?然后我可以有一个非托管循环队列,我可以根据需要调用它来读取数据。

只需以某种方式调整 gc 以降低效率但减少世界暂停时间。如果它总是低于 5 毫秒,我们可能是安全的。我不知道如何在 xamarin 工作室做到这一点。它只是一堆链接器选项还是什么?

使用另一个 API。我已经尝试过输入队列 API,但延迟很糟糕。有中间立场吗?

我知道 CoreAudio 很棒,但不得不承认这个应用程序的 Android 端口在这方面要快 100 倍,以满足我的需求。

4

1 回答 1

4

Apple DTS recommends not even using generic Objective C methods in short duration Core Audio callbacks, only deterministic straight C (maybe static dispatch C++). Any dynamic dispatch or memory management can potentially cause audio underflow. So unless you can turn off, or guaranteed deterministically bound, all GC and other memory management inside the Monotouch runtime (doubtful) it's probably not appropriate for real-time callbacks.

That's the cost of low latency audio, especially on older hardware.

于 2013-08-14T06:32:14.743 回答