繁体   English   中英

如何使用remoteio回调同步后台线程中环形缓冲区的填充

[英]How to synchronize the filling of a ring buffer in a background thread with a remoteio callback

我正在寻找一个使用remoteio中的环形缓冲区来输出非常大的音频文件的实现。

我遇到了来自苹果的CARingBuffer,但遇到了噩梦,想在我的ios项目中实现它。

作为替代方案,我遇到了我一直使用的这个环形缓冲区(未成功)。

环形缓冲区

我如何实现这一点如下。

  1. 打开使用extaudiofileref完美剪切的音频文件。

  2. 从文件中完全读取我的环形缓冲区(帧数inTimeSamples =读取点数)

  3. 在我的回调中,如果环形缓冲区不足50%,我会在后台调用performselector以添加更多样本。

  4. 如果有足够的样本,我只是从缓冲区读取。

在我接近文件末尾并想要循环播放之前,所有这些似乎都可以正常工作。 当reapoint +填充环形缓冲区所需的样本数量超过帧总数时,我从文件的其余部分中提取了一些音频,寻求第0帧,然后读取其余部分。

这听起来总是小故障。 我认为这可能与以下事实有关:remoteio回调的运行速度比后台线程快得多,因此,到后台线程完成时,不仅计算的读取点发生了变化,而且缓冲区的头尾也没有变化他们应该是。

如果示例代码太大而无法发布,我将接受伪代码作为答案。 我缺乏解决此问题的方法。

这可能不是您要找的答案,但是SFBAudioEngine可以在iOS上编译并运行,并且可以轻松处理此用例。 它基本上是RemoteIO AU的更高级别的抽象,并且比Core Audio本身支持的格式更多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM