首页 > 解决方案 > 如何在音频单元扩展(实时进程)中为音频文件播放分配内存?

问题描述

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

标签: iosmemorydiskaudiokitaudiounit

解决方案


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

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

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


推荐阅读