870920 Menu

AudioProcessor类群详解 5-3

AudioProcessorGraph是AudioProcessor的直接派生类之一,可添加并连接一到多个AudioProcessor(甚至可以添加本类的另一个对象),而后集中产生最终的音频流。所添加的每个AudioProcessor,可以是程序内部的音频处理模块(AudioProcessor的派生类的对象),也可以是外部的音频插件或MIDI音源。也就是说,本类相当于一个元素为AudioProcessor的数据容器。

所添加的每个AudioProcessor以Node(节点)的形式、由本类的成员函数addNode()添加至此,而后可将任意节点的输入和输出通道连接到其它任意节点的对应通道,此举通过addConnection()来完成。一个节点可连接一到多个其他节点,一到多个节点也可连接同一个节点,只要所连接的输入通道和输出通道相匹配即可。从而形成一个类似于数据结构中“图”的音频处理器“图”结构。本类的这一特点非常适合DAW软件中效果器、MIDI音源的加载与连接(信号路由)。

如需播放所有节点的最终处理结果,可使用AudioProcessorPlayer来完成此事。即AudioProcessorPlayer将本类设置为数据来源,而后,由AudioDeviceManager添加并回调AudioProcessorPlayer。

除了全盘继承AudioProcessor的非private成员之外,AudioProcessorGraph还继承了AsyncUpdater(异步更新)类。详解请参见前文。

AudioProcessorGraph无构造参数。有一个静态const int类型的public数据成员:
 midiChannelIndex 此值代表某个节点的MIDI通道

AudioProcessorGraph类的成员函数(网站发布,略)

AudioProcessorGraph有3个嵌套类,其中,嵌套类AudioGraphIOProcessor代表总输入节点或总输出节点,是本类的平级“兄弟”AudioPluginInstance音频插件实例的派生类。另外两个嵌套类为Node和Connection,详解如下。

AudioProcessorGraph::Node
Node类代表AudioProcessorGraph中的一个节点,该类继承自ReferenceCountedObject引用计数类,因此,本类堆对象若使用引用计数,可使用重定义的AudioProcessorGraph::Node::Ptr来声明该类的指针。无需也不能显式创建Node类的堆对象,而是通过AudioProcessorGraph对象addNode()后返回本类的指针。

AudioProcessorGraph::Node类的public成员函数(网站发布,略)。

AudioProcessorGraph::Connection
AudioProcessorGraph::Connection结构体代表AudioProcessorGraph中两个节点及其给定通道之间的连接(可使用AudioProcessorGraph类的addConnection()创建两个节点之间的连接)。其构造函数为:

 AudioProcessorGraph::Connection (来源节点, 来源的通道索引,
目标节点, 目标的通道索引)

AudioProcessorGraph::Connection的public数据成员:
 uint32 sourceNodeId 来源节点的ID。来源节点提供输出通道
 int sourceChannelIndex 来源节点输出通道的索引
 uint32 destNodeId 目标节点的ID。目标节点提供输入通道
 int destChannelIndex 目标通道索引

这里涉及到正确使用AudioProcessorGraph类的一些重要概念:
 AudioProcessorGraph里添加的每一个AudioProcessor均为一个节点。
 各个节点之间可以随意连接,实现信号的路由。这一点非常灵活。
 连接规则:A节点的输出只能连接B节点的输入,并且音频通道不能连接MIDI通道,反之亦然。
 假设A节点的输出通道连接到B节点的输入通道,则A节点为来源节点,B节点为目标节点。
 AudioProcessorGraph中的每个节点(处理器)均有一个ID,添加节点时给出。
 每个节点的ID与其索引不是一回事。ID可以随意指定(若与已有节点的ID相同,则覆盖已有的)。
 每个节点的索引由AudioProcessorGraph内部自动生成和管理。实则数组中的元素索引。
 每个节点可有1到多个输入通道和输出通道。每个通道均有索引,内部自动管理。
 MIDI通道的索引与音频通道的索引不同,音频通道的索引系统内部自动管理,MIDI的则需给出。
 MIDI通道的索引值由AudioProcessorGraph的public数据成员midiChannelIndex来表示。