簡體   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