Xamarin.ios monotouch中的Coreaudio渲染回调

Xamarin.ios monotouch中的Coreaudio渲染回调,xamarin.ios,core-audio,Xamarin.ios,Core Audio,好的---我很快就要发布我的音频分析应用程序了,我发现monotouch使用核心音频存在问题。Monotouch实际上为核心音频/远程io提供了绑定,Miguel编写了一个很好的示例。这在99%的情况下都很有效。问题出现在我认为“停止世界”垃圾收集器在coreaudio中的渲染回调期间发生的地方。在这一点上,我们处于托管代码中,因此我可以认为在gc完成之前渲染回调不会返回。因此,每160帧中大约有1帧被丢弃(大约每2到4秒) 因此,我有三个选择,没有智慧知道这是浪费时间 用c编写音频渲染回调代码

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

因此,我有三个选择,没有智慧知道这是浪费时间

用c编写音频渲染回调代码(以及所有其他核心音频接口代码)。然后我可以pinvoke以我的托管代码能够分析的速度获取样本。即使我暂停20毫秒,这也可以避免掉帧。我的主要问题是我可以用monotouch来完成吗?如果核心音频回调函数完全处于非托管状态,它会被gc停止吗?然后,我可以拥有一个非托管循环队列,必要时我可以通过它读取数据

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

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


我知道CoreAudio非常棒,但必须承认,为了满足我的需求,该应用程序的Android端口在这方面的开发速度快了大约100倍。

Apple DTS建议在短时间的核心音频回调中甚至不要使用通用的Objective C方法,而只使用确定性的直接C(可能是静态调度C++)。任何动态调度或内存管理都可能导致音频下溢。因此,除非您能够关闭Monotouch运行时内的所有GC和其他内存管理(值得怀疑),否则它可能不适合实时回调


这就是低延迟音频的成本,尤其是在旧硬件上。

苹果DTS建议在短时间的核心音频回调中甚至不要使用通用的Objective C方法,只使用确定性的直接C(可能是静态调度C++)。任何动态调度或内存管理都可能导致音频下溢。因此,除非您能够关闭Monotouch运行时内的所有GC和其他内存管理(值得怀疑),否则它可能不适合实时回调


这就是低延迟音频的成本,尤其是在较旧的硬件上。

如果你有一个可复制的测试用例,我会将它作为一个bug提交给Xamarin,看看他们说什么——我确信我可以做到这一点——我不认为这完全是一个bug,更重要的是它“按设计工作”:渲染回调需要一定的时间保证,而gc可以取消该时间保证。考虑到必须有更多的人希望单触式低延迟音频录制不会出现故障,我还是把它传给大家好。如果可以用Obj-C来做,你应该可以用MT来做,我想Xamarin会同意的。如果GC存在某种干扰,那么要么需要对GC进行调优,要么可能在代码中采用不同的方法。不管怎样,我想Xamarin的人都希望看到你的代码,看看冲突可能发生在哪里。好吧,我确实发现我在首选的HardwareIobufferDuration=0.005上太激进了。这是5毫秒,即使将其更改为0.010,也会使我的问题消失。我将查看分析器,看看gc暂停的时间有多长。当然,在较旧的硬件上(我正在开发第5代iPodtouch),速度会慢一些。我想看看你的应用程序,看看GC对你的影响,并提供一些反馈。你能在Xamarin和我们分享一下吗?提交一个bug报告,并将其标记为“private”,以保持您的内容的私密性。如果您有一个可复制的测试用例,我会将它作为bug提交给Xamarin,看看他们说什么确保我可以做到这一点——我不认为这完全是一个bug,更重要的是它“按设计工作”:渲染回调需要一定的时间保证,而gc可以取消该时间保证。考虑到必须有更多的人希望单触式低延迟音频录制不会出现故障,我还是把它传给大家好。如果可以用Obj-C来做,你应该可以用MT来做,我想Xamarin会同意的。如果GC存在某种干扰,那么要么需要对GC进行调优,要么可能在代码中采用不同的方法。不管怎样,我想Xamarin的人都希望看到你的代码,看看冲突可能发生在哪里。好吧,我确实发现我在首选的HardwareIobufferDuration=0.005上太激进了。这是5毫秒,即使将其更改为0.010,也会使我的问题消失。我将查看分析器,看看gc暂停的时间有多长。当然,在较旧的硬件上(我正在开发第5代iPodtouch),速度会慢一些。我想看看你的应用程序,看看GC对你的影响,并提供一些反馈。你能在Xamarin和我们分享一下吗?提交一个bug报告并将其标记为“private”,以保持您的内容的私密性。太好了,谢谢您提供的信息。Fontunately我的应用程序可以处理每百万帧中删除一帧的问题。只是160个左右的人中没有一个。将最小响应时间从5ms增加到20ms为gc提供了足够的空间来完成其工作。我仍然在想,如果monotouch运行时仍然可以停止核心音频回调,或者因为它完全不受管理,如果我可以在那里进行回调,我是否真的进行了“在本机库中写入所有内容”。还要注意,iOS可以在音频单元启动后更改应用程序请求的缓冲区持续时间。如果有