设备格式

对于音频应用程序而言,使用更高级别的音频 API(如 DirectSound 或 Windows 多媒体 waveOutXxx 函数)的好处在于,API 会自动在应用程序使用的流格式和音频设备使用的格式之间进行转换。 相比之下,核心音频 API 的限制性更强,因为它们要求应用程序流使用的格式与设备使用的格式相同或密切相关。 因此,使用核心音频 API 播放或录制音频流的应用程序可能需要在流格式之间进行部分或全部转换。

使用 WASAPI 管理共享模式流的应用程序只能依靠音频引擎执行有限的格式转换。 音频引擎可在应用程序使用的标准 PCM 采样大小和引擎内部处理使用的浮点采样之间进行转换。 不过,应用数据流的格式通常必须与设备使用的流格式具有相同的通道数和采样率。

如果应用程序在独占模式下使用设备,则必须使用音频硬件明确支持的流格式。 在独占模式下,应用程序和设备直接交换音频数据,而无需音频引擎干预。

许多音频设备都同时支持 PCM 和非 PCM 流格式。 但是,音频引擎只能混合 PCM 流。 因此,只有独占模式的流才能使用非 PCM 格式。 此外,独占模式只支持具有固定数据速率的非 PCM 格式。 固定速率非 PCM 格式的一个示例是 48 kHz Windows Media Audio Professional (WMA Pro) 音频流,它会以数字形式通过索尼/飞利浦数字接口 (S/PDIF) 链路进行传输而无需解码。 有关通过 S/PDIF 使用 WMA Pro 流的更多信息,请参阅指定 WMA Pro 数据范围

WASAPI 使用 WAVEFORMATEXWAVEFORMATEXTENSIBLE 结构来指定流格式。 WAVEFORMATEXTENSIBLE 结构实际上就是 WAVEFORMATEX 结构,经过扩展后可以描述更多的格式。 任何可以用独立的 WAVEFORMATEX 结构描述的格式也可以用 WAVEFORMATEXTENSIBLE 结构来描述。

WAVEFORMATEXTENSIBLE 结构的第一个成员是 WAVEFORMATEX 结构。 WAVEFORMATEX 结构的内容表明它是独立的 WAVEFORMATEX 结构,还是 WAVEFORMATEXTENSIBLE 结构的一部分。

独立的 WAVEFORMATEX 结构可以充分描述一个或两个通道且采样大小为 8 位的倍数的格式。 WAVEFORMATEX 结构本身不能指定声道与扬声器位置的映射关系。 此外,尽管 WAVEFORMATEX 为每个音频样本指定了容器的大小,但它不能指定样本的精度位数(例如,24 位容器中的精度位数为 20 位)。 相比之下,WAVEFORMATEXTENSIBLE 结构既可以指定声道到扬声器的映射,也可以指定每个采样的精度位数。

有关 WAVEFORMATEXWAVEFORMATEXTENSIBLE 的详细信息,请参阅 Windows DDK 文档。

从 Windows 7 开始,WAVEFORMATEXTENSIBLE 已扩展到表示通过 IEC 61937 兼容接口传输编码音频的设备格式。 有关新结构的信息,请参阅 IEC 61937 传输的表示格式

指定设备格式

以下 WASAPI 方法使用 WAVEFORMATEXWAVEFORMATEXTENSIBLE 结构来描述流格式:

GetMixFormat 方法可检索音频引擎在内部处理共享模式流时使用的流格式。 该方法始终使用 WAVEFORMATEXTENSIBLE 结构,而不是独立的 WAVEFORMATEX 结构来指定格式。

IsFormatSupported 方法指示音频终结点设备是否支持特定流格式。 调用方必须指定流格式是用于共享模式还是独占模式。 对于共享模式格式,该方法会查询音频引擎,以确定其是否支持指定的格式。 对于独占模式格式,该方法会查询设备驱动程序。 如果格式是由独立的 WAVEFORMATEX 结构指定的,某些设备驱动程序会报告它们支持 1 通道或 2 通道 PCM 格式,但如果格式是由 WAVEFORMATEXTENSIBLE 结构指定的,则会拒绝接受相同的格式。 要从这些驱动程序中获得可靠的结果,独占模式应用程序应为每种 1 通道或 2 通道 PCM 格式调用两次 IsFormatSupported — 一次调用应使用独立的 WAVEFORMATEX 结构来指定格式,另一次调用应使用 WAVEFORMATEXTENSIBLE 结构来指定相同的格式。

在应用程序使用 GetMixFormatIsFormatSupported 为共享模式或独占模式流查找合适的格式后,可以调用 Initialize 方法来初始化采用该格式的流。 如果应用程序尝试使用与 GetMixFormat 方法获得的混合格式不完全相同的格式来初始化共享模式流,但该格式与混合格式具有相同的通道数和采样率,则很可能会成功。 在调用 Initialize 之前,应用程序可以调用 IsFormatSupported 来验证 Initialize 是否接受该格式。

音频引擎在内部处理共享模式流时使用的混合格式与音频终结点设备在共享模式下使用的流格式密切相关,但不一定完全相同。 通过 Windows 多媒体控制面板 Mmsys.cpl,用户可以选择音频终结点设备在共享模式下运行时将使用的流格式。 步骤如下:

  1. 若要运行 Mmsys.cpl,请打开命令提示符窗口,然后输入以下命令:

    control mmsys.cpl

    或者,也可以右键单击通知区域(位于任务栏右侧)中的扬声器图标,然后选择播放设备录制设备来运行 Mmsys.cpl。

  2. 打开 Mmsys.cpl 窗口后,从播放设备列表或录音设备列表中选择一个设备,然后单击“属性”。

  3. 打开属性窗口后,单击“高级”,然后在标有“默认格式”的框中从可用格式列表中选择一种格式。

例如,假设用户从播放设备的可用格式列表中选择了以下默认格式:

2 通道,16 位,44100 Hz(CD 质量)

这是设备随后在共享模式下运行时将使用的格式。 在 Windows Vista 中,音频引擎在内部处理共享模式流时,将使用这种格式的一个稍作修改的版本。 音频引擎将使用具有相同通道数(两个)和相同采样率 (44100 Hz) 的格式,但在处理之前会将采样转换为浮点数。 音频引擎会将输出混合中的浮点采样转换为 16 位整数,然后再通过设备进行播放。

应用程序可以查询音频终结点设备的 PKEY_AudioEngine_DeviceFormat 属性,以获取用户为设备选择的共享模式格式。 有关查询设备属性的信息,请参阅设备属性

某些应用程序可能会认为设备的 PKEY_AudioEngine_DeviceFormat 属性指定的格式是在设备上打开独占模式流的合适格式。 其他管理独占模式数据流的应用程序可能有额外的要求,需要与设备进行复杂的格式协商。 通常情况下,这些应用程序之一会构建一个合适格式的列表,并将首选格式放在列表的开头。 然后,应用程序从列表的起始位置开始,对列表中的每一种格式以迭代方式调用 IsFormatSupported,直至找到设备支持的格式。

音频终结点设备