我正在用java设计音频架构。我知道我知道,我应该使用c ++ ...
无论如何,我已经阅读了Craig Lindleys的书籍Digital Audio with java。他描述了一种拉结构,其中设备在链表中连接,并且接收设备在它之前立即向设备请求数据。该设备调用相同的接口方法,以便在设备之前从设备获取数据。该方法类似于:
public int getSamples(byte[] data);
我很想知道其他人对此的看法。 c ++,java,等等。可以稍微详细说明专业工具,能力和理性之类的架构。这些系统是否完全依赖于类似于Lindley描述的“拉结构”,尽管更为成熟。
原谅问题的广泛性。
答案 0 :(得分:2)
我见过基于推拉的音频架构,两者都有利弊。
在基于推送的系统中,每个过滤器将数据向下推送到下游过滤器,您需要一些定时推送请求的概念,以便在声卡准备就绪时在音频处理单元链的末尾有数据对于数据。这通常以外部时钟的形式出现,这会耗费图形。 DirectShow以这种方式工作。
在基于拉取的系统中,您可以使用声卡中的I / O请求来驱动图形的抽取,从而使您的设备可以运行时钟。在此系统中,您仍需要在图表的开头(数据源)进行缓冲。
我建议不要使用基于拉/推的系统,而是执行器式架构。想象一下,您有一组音频处理单元(APU)由AudioGraph对象管理,后者知道它们是如何连接的。现在,您可以使用声卡中的音频回调,并将任何音频输入传递给您的AudioGraph,并让AudioGraph通过每个音频处理单元管理处理数据。这将数据流与I / O请求完全分开,并允许您的AudioGraph执行并行化处理请求,运行requets以无序处理每个过滤器等操作。此外,每个APU无需了解其邻居它们只是在AudioGraph级别“连接在一起”。这是OS X上的AudioUnits。