我正在创建音频单元v3。到目前为止,我已经取得了不错的进展,我制作了一个主机应用程序,可以加载我所有的第三方插件。我创建了一个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中正在做什么。

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

最佳答案

打开文件和为读取文件分配内存应该在实时音频上下文之外进行,例如在选择UI文件时,而不要在“音频单元”回调中进行。

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

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

关于ios - 如何在音频单元扩展(实时过程)中分配内存以播放音频文件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61281973/

10-11 21:38