设备和数据类型

[与此页面关联的功能(波形音频)是一项旧功能。 它已被 WASAPIAudio Graphs取代。 WASAPIAudio Graph 已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft强烈建议新代码尽可能使用 WASAPIAudio Graph,而不是 波形音频。 Microsoft建议重写使用旧 API 的现有代码,以尽可能使用新 API。]

本部分介绍如何使用波形音频设备,并包括有关如何打开、关闭和查询其功能的信息。 它还介绍如何使用设备句柄和设备标识符跟踪系统中的设备。

打开 Waveform-Audio 输出设备

使用 waveOutOpen 函数打开波形音频输出设备进行播放。 此函数打开与指定设备标识符关联的设备,并通过写入指定内存位置的句柄返回打开设备的句柄。

一些多媒体计算机具有多个波形音频输出设备。 除非要在系统中打开特定的波形音频输出设备,否则在打开设备时,应使用设备标识符的WAVE_MAPPER标志。 waveOutOpen 函数选择系统中最能播放指定数据格式的设备。

查询音频设备

Windows 提供以下功能来确定系统中可用的特定类型的设备数。

功能 描述
auxGetNumDevs 检索系统中存在的辅助输出设备数。
waveInGetNumDevs 检索系统中存在的波形音频输入设备数。
waveOutGetNumDevs 检索系统中存在的波形音频输出设备数。

 

音频设备由设备标识符标识。 设备标识符从系统中存在的设备数隐式确定。 设备标识符的范围从零到一个小于存在的设备数。 例如,如果系统中有两个波形音频输出设备,则有效的设备标识符为 0 和 1。

确定系统中存在特定类型的设备数后,可以使用以下函数之一来查询每个设备的功能。

功能 描述
auxGetDevCaps 检索指定辅助输出设备的功能。
waveInGetDevCaps 检索指定波形音频输入设备的功能。
waveOutGetDevCaps 检索指定波形音频输出设备的功能。

 

其中每个函数都填充了一个结构,其中包含有关指定设备功能的信息。 下表列出了对应于其中每个函数的结构。

功能 结构
auxGetDevCaps AUXCAPS
waveInGetDevCaps WAVEINCAPS
waveOutGetDevCaps WAVEOUTCAPS

 

标准格式列在 WAVEOUTCAPS 结构的 dwFormats 成员中。 波形音频设备可以支持非标准格式。 若要确定设备是否支持特定格式(标准格式或非标准格式),可以使用 WAVE_FORMAT_QUERY 标志调用 waveOutOpen 函数。 此标志未打开设备。 在传递给 waveOutOpenpwfx 参数所指向的 WAVEATEX 结构中指定有问题的格式。

波形音频输出设备因支持的功能而异。 dwSupportWAVEOUTCAPS 结构的成员指示设备是否支持音量和音调更改等功能。

设备句柄和设备标识符

打开音频设备的每个函数都指定设备标识符、指向内存位置的指针,以及每种设备类型特有的一些参数。 内存位置填充了设备句柄。 使用此设备句柄在调用其他音频功能时识别打开的音频设备。

音频设备的标识符和句柄之间的差异是微妙但重要的:

没有打开或关闭辅助音频设备的函数。 辅助音频设备不需要像波形音频设备一样打开和关闭,因为没有与之关联的连续数据传输。 所有辅助音频功能都使用设备标识符来标识设备。

Waveform-Audio 输出数据类型

为波形音频输出函数定义了以下数据类型。

类型 描述
HWAVEOUT 打开的波形音频输出设备的句柄。
波形 指定特定波形音频输入设备支持的数据格式的结构。 此结构还用于波形音频输入设备。
WAVEHDR 用作波形音频输入数据块的标头的结构。 此结构还用于波形音频输入设备。
WAVEOUTCAPS 用于查询特定波形音频输出设备功能的结构。

 

指定 Waveform-Audio 数据格式

调用 waveOutOpen 函数以打开设备驱动程序进行播放或查询驱动程序是否支持特定数据格式时,请使用 pwfx 参数指定指向包含所请求波形音频数据格式的 WAVEATEX 结构的指针。 WAVEATEX 取代 波形PCMWAVEFORMAT 结构。

对于分隔为两个以上的通道或样本大小不是 8 的倍数的音频数据,应使用 波形图XTENSIBLE。 此结构只需配置 cbSize波形图X 成员指向的额外字节,以提供有关格式的额外信息。 波形 可以转换为 波形

还可以使用两种剪贴板格式来表示音频数据:CF_WAVE和CF_RIFF。 使用 CF_WAVE 格式以标准格式之一表示数据,例如 11 kHz 或 22 kHz PCM。 使用CF_RIFF格式来表示无法表示为标准波形音频文件的复杂数据格式。

写入 Waveform-Audio 数据

成功打开波形音频输出设备驱动程序后,可以开始播放声音。 Windows 提供了 waveOutWrite 函数,用于将数据块发送到波形音频输出设备。

使用 WAVEHDR 结构指定使用 waveOutWrite 发送的波形音频数据块。 此结构包含指向锁定数据块的指针、数据块的长度和一些标志。 在使用此数据块之前,必须准备好此数据块;有关准备数据块的信息,请参阅 音频数据块

使用 waveOutWrite将数据块发送到输出设备后,必须先等待设备驱动程序完成数据块,然后释放它。 如果要发送多个数据块,则必须监视数据块的完成情况,以了解何时发送其他块。 有关数据块的详细信息,请参阅 音频数据块

PCM Waveform-Audio 数据格式

lpDataWAVEHDR 结构指向波形音频数据样本的成员。 对于 8 位 PCM 数据,每个示例都由单个无符号数据字节表示。 对于 16 位 PCM 数据,每个样本都由 16 位有符号值表示。 下表汇总了 PCM 波形音频数据的最大、最小值和中点值。

数据格式 最大值 最小值 中点值
8 位 PCM 255 (0xFF) 0 128 (0x80)
16 位 PCM 32,767 (0x7FFF) –32,768 (0x8000) 0

 

PCM 数据打包

数据字节的顺序在 8 位和 16 位格式之间以及单声道和立体声格式之间变化。 以下列表描述了不同 PCM 波形音频数据格式的数据打包。

PCM 波形音频格式 描述
8 位单声道 每个示例都是 1 个字节,对应于单个音频通道。 示例 1 后跟示例 2、3、4 等。
8 位立体声 每个示例为 2 个字节。 示例 1 后跟示例 2、3、4 等。 对于每个样本,第一个字节是通道 0(左通道),第二个字节是通道 1(右通道)。
16 位单声道 每个示例为 2 个字节。 示例 1 后跟示例 2、3、4 等。 对于每个样本,第一个字节是通道 0 的低序字节,第二个字节是通道 0 的高阶字节。
16 位立体声 每个样本为 4 个字节。 示例 1 后跟示例 2、3、4 等。 对于每个样本,第一个字节是通道 0(左通道)的低序字节;第二个字节是通道 0 的高序字节;第三个字节是通道 1(右通道)的低序字节:第四个字节是通道 1 的高阶字节。
别人 每个样本都包含在一个块中,该块的倍数为 4 个字节,但样本可能不对齐。 通道排列由掩码指定。 有关详细信息,请参阅 波形

 

关闭 Waveform-Audio 输出设备

波形音频播放完成后,调用 waveOutClose 关闭输出设备。 如果在播放波形音频文件时调用了 waveOutClose,关闭作将失败,并且该函数返回一个错误代码,指示设备未关闭。 如果不想在关闭设备之前等待播放结束,请在关闭前调用 waveOutReset 函数。 这将结束播放并允许关闭设备。 在关闭设备之前,请务必使用 waveOutUnprepareHeader 函数清理所有数据块的准备。