音频锥形音量控件
IAudioEndpointVolume 接口管理音频锥形的音量控件。 这些控件非常适合显示音量滑块的 Windows 应用程序。 对于与音频锥形音量控件关联的音量滑块而言,滑块位置的每次变化都会产生与滑块移动距离成正比的感知响度变化。 对于特定的移动距离,无论滑块的移动是发生在滑块移动范围的下部、上部还是中部,感知响度的增减量都大致相同。 感知响度与音频信号功率的对数大致呈线性关系。
术语音频锥形原本是指音频电子设备中用作音量控件的电位器中的锥形电阻元件。 音频锥形电阻元件在零音量位置处最宽,在最大音量位置处最窄。 电位器可控制设备通过扬声器播放音频信号的电压电平。 锥形设计的目的是让电位器游标的位置与扬声器的感知响度之间形成近似线性关系。 游标的位置与扬声器电压之间的关系是非线性的。
与此相反,具有线性锥形的电阻元件在电位器游标的移动范围内具有均匀的宽度。 因此,扬声器上的电压会随着游标的位置呈线性变化。 游标的位置与响度之间的关系是非线性的。
同样,显示音量滑块的 Windows 应用程序也会定义滑块位置与扬声器输出信号电平之间的关系。 实际上,这种关系可以是线性锥形或音频锥形。
下图显示了线性锥形音量控件的滑块位置与输出电压和感知响度之间的映射关系。
在上图左侧,音频数模转换器 (DAC) 的输出电压电平会随着音量滑块从最小位置(标注为 Min)移动到最大位置(标注为 Max)而线性增加。 垂直轴上的标号 VFS 表示 DAC 满量程输出电压。
然而,感知响度的变化近似于音频信号功率的对数,如上图右侧所示。 因此,在接近最小设置的区间内移动滑块会导致感知响度发生相对较大的变化,而在接近最大设置的相同宽度区间内移动滑块则会导致感知响度发生相对较小的变化。
在上图右侧,垂直轴上的响度是相对于满量程功率设置(0 分贝)以分贝 (dB) 为单位来衡量的。 响度曲线在负无穷大处与垂直轴相交,但图表中只显示了从 0 分贝到 -96 分贝的部分曲线。 只显示这部分曲线的决定显得有些随意,但 -96 分贝方便地表示了 16 位 DAC 次低输出电平相对于满量程功率的功率。 该值的计算公式为 20.log₁₀(1/65535)。
由于滑块位置在上图中最小设置附近的细微变化都会导致响度的显著变化,用户可能会发现在这一范围内音量较难控制。 相对较小的滑块移动就能使音量远高于或低于所需的水平。 改进后的音量控制器可使滑块位置与响度之间的关系变得更加线性。
下图显示了音频锥形音量控件的滑块位置与输出电压和感知响度之间的映射关系。
如上图右侧所示,随着滑块位置的变化,感知响度大致呈线性变化。 为此,DAC 电压必须随位置呈非线性变化,如图左侧所示。 当滑块从最大设置向左移动时,曲线渐近于 0 伏。 滑块最小位置的电压非常小,但也不一定完全为零。
IAudioEndpointVolume 接口中的以下方法使用以分贝为单位的音量设置:
- IAudioEndpointVolume::GetChannelVolumeLevel
- IAudioEndpointVolume::GetMasterVolumeLevel
- IAudioEndpointVolume::SetChannelVolumeLevel
- IAudioEndpointVolume::SetMasterVolumeLevel
这些方法在音量设置和感知响度之间产生了近似线性的关系。 这些方法管理的音量控件的分贝音量范围取决于音频终结点设备。 要确定特定设备的音量范围,请调用 IAudioEndpointVolume::GetVolumeRange 方法。
相比之下,IAudioEndpointVolume 接口中以下方法的音量设置在音量范围内遵循了一条更为平缓的锥形曲线:
- IAudioEndpointVolume::GetChannelVolumeLevelScalar
- IAudioEndpointVolume::GetMasterVolumeLevelScalar
- IAudioEndpointVolume::SetChannelVolumeLevelScalar
- IAudioEndpointVolume::SetMasterVolumeLevelScalar
- IAudioEndpointVolume::VolumeStepDown
- IAudioEndpointVolume::VolumeStepUp
在 Windows Vista 中,这些方法使用的曲线介于上图所示的音频锥形曲线和线性锥形曲线之间。 请注意,在未来的 Windows 版本中,曲线的形状可能会发生变化。 上述列表中的前四种方法将音量水平表示为 0.0(最小音量)至 1.0(最大音量)范围内的标准化值。 对于列表中的最后两个方法,请调用 IAudioEndpointVolume::GetVolumeStepInfo 方法来获取音量范围内的步进数。
下列接口的音量设置使用线性锥形曲线:
有关这些接口的详细信息,请参阅会话音量控件。 此外,有关不同版本的 Windows 中的音量范围和默认音量级别的信息,请参阅默认音频音量设置。
相关主题