如何在音频单元扩展(实时进程)中为音频文件播放分配内存?

How does one allocate memory in an Audio Unit extension (realtime process) for audiofile playback?

我正在创建音频单元 v3。到目前为止,我已经取得了不错的进展,我制作了一个主机应用程序来加载我所有的第 3 方插件。我创建了一个 auv3 插件来处理音频并且可以被其他主机加载。

我现在想制作一个 au,它从磁盘加载音频数据并以采样精度(时间拉伸、颗粒状的东西等)在随机位置扫描数据。我认为这将是一个很酷的示例播放插件,可以为 AudioKit 做出贡献。

因此,这将在 AudioKit 框架中制作 AKSampler 级别的东西。翻AK源码的时候感觉少了点什么

在浏览 github 时,我来到了如下位置: https://github.com/AudioKit/AudioKit/tree/118affee65f4c9b8d4780ef1a03a6d03004bbcee/AudioKit/Common/Nodes/Playback/Samplers

然后我看了看这里: https://github.com/AudioKit/AudioKit/blob/118affee65f4c9b8d4780ef1a03a6d03004bbcee/AudioKit/Common/Nodes/Playback/Samplers/Disk%20Streamer/AKDiskStreamerAudioUnit.mm

这把我带到了这里: https://github.com/AudioKit/AudioKit/blob/d69dabf090a5e78d4495d938bf6c0aea9f672630/AudioKit/Common/Nodes/Playback/Samplers/Disk%20Streamer/AKDiskStreamerDSPKernel.hpp

然后最终在这里: https://github.com/AudioKit/AudioKit/blob/d69dabf090a5e78d4495d938bf6c0aea9f672630/AudioKit/Core/Soundpipe/modules/wavin.c

我不是在寻找有关 AKSampler 的信息,具体来说,只是一般音频文件是如何加载的,以及它如何与 au 扩展过程的实时性质相关。

我在任何地方都找不到任何 IPC/XPC 代码,所以我猜测它与连接到其他进程或其他东西的循环缓冲区无关。

AudioKit是否会在音频文件播放的实时过程中分配内存?这似乎违背了经验丰富的音频程序员的所有警告(http://www.rossbencina.com/code/real-time-audio-programming-101-time-waits-for-nothing 之类的文章),但我无法弄清楚 AudioKit 和通常在 iOS.. [=15= 中做了什么]

我只是不理解或发现了什么? :D

打开文件和为文件读取分配内存应该在实时音频上下文之外完成,也许在 UI 文件选择期间,永远不要在音频单元回调中完成。

在 AU 回调中随机访问样本的一种方法是内存映射文件 (mmap C API),然后在 before[=] 之前触摸内存映射中的每个样本17=] 将内存指针(不安全原始等)和文件长度(映射边界)传递给音频单元。然后你可以在回调中以固定的延迟进行虚拟随机访问文件读取。

一种通过执行校验和(并可能稍后丢弃结果)来接触数组中每个样本的方法。需要此内存读取才能让 iOS 虚拟内存系统将块从文件 VM 交换到 RAM,这样存储系统读取就不会在实时上下文中发生。