设备格式
对于音频应用程序,使用更高级别的音频 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 使用 波形 或 波形波形 结构来指定流格式。 波形符XTENSIBLE 结构实际上是一种 波形 结构,已扩展以描述更广泛的格式。 可由独立 波形 结构描述的任何格式也可以由 波形波形图XTENSIBLE 结构描述。
波形 结构的第一个成员是 波形 结构。 波形 结构的内容指示它是独立 波形波形 结构还是 波形波形 结构的一部分。
独立 波形符号 结构可以充分描述一种格式,其中包含一个或两个通道和一个样本大小,该格式是 8 位的倍数。 本身,波形 结构无法指定通道到扬声器位置的映射。 此外,尽管 波形图X 指定每个音频样本的容器大小,但它不能指定样本中的精度位数(例如,24 位容器中的 20 位精度)。 相比之下,波形图XTENSIBLE 结构可以指定通道到扬声器的映射以及每个样本中的精度位数。
有关 波形 和 波形波形的详细信息,请参阅 Windows DDK 文档。
从 Windows 7 开始,波形信号 已扩展到表示设备格式,用于通过与 IEC 61937 兼容的接口传输编码音频。 有关新结构的信息,请参阅 表示 IEC 61937 传输的格式。
指定设备格式
以下 WASAPI 方法使用 波形处理X 和 波形波形图XTENSIBLE 结构来描述流格式:
GetMixFormat 方法检索音频引擎用于其共享模式流内部处理的流格式。 该方法始终使用 波形波形符XTENSIBLE 结构,而不是独立 波形波形 结构来指定格式。
IsFormatSupported 方法指示音频终结点设备是否支持特定流格式。 调用方必须指定流格式是用于共享模式还是独占模式。 对于共享模式格式,该方法查询音频引擎以确定它是否支持指定的格式。 对于独占模式格式,该方法将查询设备驱动程序。 某些设备驱动程序将报告,如果格式是由独立 波形波形符 结构指定的,则它们支持 1 通道或 2 通道 PCM 格式,但如果由 WAVEFORMATEXTENSIBLE 结构指定,则会拒绝相同的格式。 为了从这些驱动程序中获取可靠的结果,独占模式应用程序应为每个 1 通道或 2 通道 PCM 格式调用 IsFormatSupported 两次—一个调用应使用独立 波形波形 结构来指定格式,另一个调用应使用 波形信号 结构来指定相同的格式。
在应用程序使用 GetMixFormat 或 IsFormatSupported 查找共享模式或独占模式流的合适格式后,应用程序可以调用 Initialize 方法以使用该格式初始化流。 尝试使用与从 GetMixFormat 方法获取的混合格式的格式初始化共享模式流的应用程序,但其通道数和采样率与混合格式相同,很可能成功。 在调用 初始化之前,应用程序可以调用 IsFormatSupported,以验证 Initialize 是否接受格式。
音频引擎用于其内部处理共享模式流的混合格式与音频终结点设备在共享模式下使用的流格式密切相关,但不一定与音频终结点设备在共享模式下使用的流格式密切相关。 通过 Windows 多媒体控制面板 Mmsys.cpl,用户可以选择音频终结点设备在共享模式下运行时将使用的流格式。 步骤如下:
若要运行 Mmsys.cpl,请打开命令提示符窗口并输入以下命令:
控件 mmsys.cpl
或者,可以通过右键单击位于任务栏右侧的通知区域中的扬声器图标并选择 播放设备 或 录制设备来运行 Mmsys.cpl。
打开 Mmsys.cpl 窗口后,从播放设备列表或录制设备列表中选择设备,然后单击 属性。
当属性窗口打开时,单击“高级”,然后从 标记为“默认格式”的框中的可用格式列表中选择一种格式。
例如,假设用户从播放设备的可用格式列表中选择以下默认格式:
2 通道, 16 位, 44100 Hz (CD 质量)
这是设备在共享模式下运行时随后将使用的格式。 在 Windows Vista 中,音频引擎将使用此格式的略有修改版本,以便对共享模式流进行内部处理。 音频引擎将使用具有相同数量的通道(两个)和相同采样率(44100 Hz)的格式,但在处理样本之前,它将将样本转换为浮点数。 在通过设备播放浮点样本之前,音频引擎会将输出混合中的浮点样本转换为 16 位整数。
应用程序可以查询音频终结点设备的 PKEY_AudioEngine_DeviceFormat 属性,以获取用户为设备选择的共享模式格式。 有关查询设备属性的信息,请参阅 设备属性。
某些应用程序可能会发现设备 PKEY_AudioEngine_DeviceFormat 属性指定的格式是一种适合在设备上打开独占模式流的格式。 管理独占模式流的其他应用程序可能具有其他要求,这些要求要求与设备进行复杂的格式协商。 通常,其中一个应用程序会构造一个合适的格式列表,该列表的开头采用首选格式。 然后,应用程序以迭代方式调用 IsFormatSupported 列表中每个连续格式,从列表开头开始,直到找到设备支持的格式。
相关主题