设计音频架构

designing an audio architecture

本文关键字:音频      更新时间:2023-10-16

我正在用java设计一个音频架构。我知道我知道,我应该使用c++。。。

不管怎样,我读过Craig Lindley的书《数字音频与java》。他描述了一种拉式体系结构,其中设备连接在链表中,信宿设备从紧接在它之前的设备请求数据。这些设备调用相同的接口方法来从之前的设备获取数据。该方法类似于:

public int getSamples(byte[] data);

我很想看看其他人对此有何看法。c++、java等等。可以在某种程度上详细说明pro-tools、ableton和rational之类的东西的架构。这些系统是否完全依赖于类似于Lindley所描述的"拉式架构",尽管更成熟。

原谅这个问题的宽泛性。

我见过基于推拉的音频架构,它们都有优点和缺点。

在一个基于推送的系统中,每个过滤器都将数据推送到下游过滤器,你需要对推送请求进行定时,这样当声卡准备好接收数据时,你就可以在音频处理单元链的末端获得数据。这通常是以外部时钟的形式出现的,它对图形的泵浦进行计时。DirectShow就是这样工作的。

在基于拉的系统中,您可以使用声卡的I/O请求来驱动图形的泵浦,这可以让您的设备运行计时。在这个系统中,您仍然需要在图形(数据源)开始时进行缓冲。

我建议不要使用基于拉/推的系统,而是使用执行器风格的体系结构。想象一下,您有一组音频处理单元(APU),由AudioGraph对象管理,该对象知道它们是如何连接的。现在,您可以使用声卡的音频回调,将任何音频输入传递给AudioGraph,并让AudioGraph通过每个音频处理单元管理处理数据。这将数据流与I/O请求完全分离,并允许AudioGraph并行处理请求、运行请求以无序处理每个过滤器等。此外,每个APU不需要知道其邻居,它们只在AudioGraph级别"连接在一起"。这是操作系统X上的AudioUnits作品。