在Vista中,对于任何一个音频流都有四种不同的音量控制方式,它们是:
1. 流音量(Stream Volume)
2. 简单音量(Simple Volume)
3. 通道音量(Channel Volume)
4. 端点音量(EndPoint Volume)
由于每种方式是一个增益级(gain stage),所以每一种都可以添加到音频输入采样中,并生成最终的音频输出流。
图中的每个WASAPI实例表示一个音频流,这些流会在音频合成器(Mixer)中合并起来并“流向”音频驱动。流音量、简单音量、通道音量均通过向某个独立的音频流中插入一个APO实现,而端点音量则是在合成器后面添加一个APO或者用硬件音量控制来处理,这取决于用户的音频解决方案的功能。
那么这些不同的音频控制有什么联系呢?
首先来讲讲流音量。流音量是多通道音量,它对每个音频流起作用,可以让应用程序实现一些相对简单的3d效果(使用多通道流音量控制来模拟一个处于活动状态的球被弹起后的位置改变)。你可以让应用程序控制某个独立音频流的音量,但这种需求比较少。
接下来是通道音量。通道音量是针对音频会话(session)的音量 ,用于控制整个会话中的所有音频流的音量(如果你还记得“大图”贴的话,其中讲到过一个会话包含了许多音频流)。通道音量之所以存在是因为有waveOutSetVolume API——由于波形音量是多通道(立体声)音量,所以我们必须在WASAPI中模拟一个。同样的,这种音量也很少被使用——通常仅当从控制面板运行系统安装任务(空间修正(room correction))时才会改变通道音量,所以这一设置会影响所有的应用程序而不仅仅针对某个特定的应用程序)。
再来则是简单音量。简单音量是这对音频会话的音量,用于控制整个会话中的所有音频流的音量。它是一种统一的音量,会平均应用到所有的通道。这也是我们希望大部分应用程序使用的音量控制方式——因为它提供了一种简单的控制应用程序音量和静音状态的方式,这种方式对于大部分应用程序已经足够了。这种音量其实就是Vista声音混合器中显示的每个应用程序的音量滑块。
逻辑上讲,你可以把上面三个音量一起应用(但这其实不是事实,它们其实是同时被应用的)来为每个音频流创建最终音量。
最后我们来讲端点音量。正如我以前提到过得,端点音量表示主音量(master output)输出,它是作用于最后合成的音频流的,可以对特定的端点起到主音量控制的作用。