如何在音频单元扩展(实时进程)中为音频文件播放分配内存?
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
我不是在寻找有关 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,这样存储系统读取就不会在实时上下文中发生。
我正在创建音频单元 v3。到目前为止,我已经取得了不错的进展,我制作了一个主机应用程序来加载我所有的第 3 方插件。我创建了一个 auv3 插件来处理音频并且可以被其他主机加载。
我现在想制作一个 au,它从磁盘加载音频数据并以采样精度(时间拉伸、颗粒状的东西等)在随机位置扫描数据。我认为这将是一个很酷的示例播放插件,可以为 AudioKit 做出贡献。
因此,这将在 AudioKit 框架中制作 AKSampler 级别的东西。翻AK源码的时候感觉少了点什么
在浏览 github 时,我来到了如下位置: https://github.com/AudioKit/AudioKit/tree/118affee65f4c9b8d4780ef1a03a6d03004bbcee/AudioKit/Common/Nodes/Playback/Samplers
我不是在寻找有关 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,这样存储系统读取就不会在实时上下文中发生。