如何在音频单元扩展(实时进程)中为音频文件播放分配内存?
Posted
技术标签:
【中文标题】如何在音频单元扩展(实时进程)中为音频文件播放分配内存?【英文标题】:How does one allocate memory in an Audio Unit extension (realtime process) for audiofile playback? 【发布时间】:2020-07-31 13:34:30 【问题描述】:我正在创建一个音频单元 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
【问题讨论】:
【参考方案1】:应在实时音频上下文之外(可能在 UI 文件选择期间)打开文件并为文件读取分配内存,而不应在音频单元回调内完成。
在 AU 回调中随机访问样本的一种方法是内存映射文件(mmap C API),然后在传递内存指针之前触摸内存映射中的每个样本(不安全raw 等)和文件长度(映射边界)到音频单元。然后,您可以在回调中以固定延迟执行虚拟随机访问文件读取。
一种通过校验和(可能稍后丢弃结果)来接触数组中每个样本的方法。此内存读取是让 iOS 虚拟内存系统将文件 VM 中的块交换到 RAM 所必需的,因此存储系统读取不会在实时上下文中发生。
【讨论】:
这适用于 iOS 和 macOS。我在 App Store 中有使用这种方法的应用。 太棒了!生病了,也许我应该编辑问题以适应这个答案。了解从 au auv3 进程访问文件的好方法是我的整体兴趣 我会自己搜索,但有没有您可能知道的任何资源或示例代码,您推荐用于了解更多细节?以上是关于如何在音频单元扩展(实时进程)中为音频文件播放分配内存?的主要内容,如果未能解决你的问题,请参考以下文章
在IOS核心音频中,如何找到文件播放器音频单元的真实当前播放头位置?
PCM音频实时播放:音频字节数组(16/8位)转为PCM ArrayBuffer流