设备和数据类型
[与此页面关联的功能 波形音频是一项旧功能。 它已被 WASAPI 和 Audio Graphs 取代。 WASAPI 和 Audio Graphs 已针对Windows 10和Windows 11进行了优化。 如果可能,Microsoft 强烈建议新代码使用 WASAPI 和 音频图 ,而不是 波形音频。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]
本部分介绍如何使用波形音频设备,并包含有关如何打开、关闭和查询其功能的信息。 它还介绍如何使用设备句柄和设备标识符跟踪系统中的设备。
打开Waveform-Audio输出设备
使用 waveOutOpen 函数打开波形音频输出设备进行播放。 此函数打开与指定设备标识符关联的设备,并通过写入指定内存位置的句柄返回打开设备的句柄。
某些多媒体计算机具有多个波形音频输出设备。 除非想要在系统中打开特定的波形音频输出设备,否则在打开设备时,应使用设备标识符WAVE_MAPPER标志。 waveOutOpen 函数在系统中选择最能播放指定数据格式的设备。
查询音频设备
Windows 提供以下函数来确定系统中有多少特定类型的设备可用。
函数 | 说明 |
---|---|
auxGetNumDevs | 检索系统中存在的辅助输出设备数。 |
waveInGetNumDevs | 检索系统中存在的波形音频输入设备数。 |
waveOutGetNumDevs | 检索系统中存在的波形音频输出设备的数量。 |
音频设备由设备标识符标识。 设备标识符是根据系统中存在的设备数隐式确定的。 设备标识符的范围从 0 到 1 比存在的设备数少 1。 例如,如果系统中有两个波形音频输出设备,则有效的设备标识符为 0 和 1。
确定系统中存在多少特定类型的设备后,可以使用以下函数之一来查询每个设备的功能。
函数 | 说明 |
---|---|
auxGetDevCaps | 检索指定辅助输出设备的功能。 |
waveInGetDevCaps | 检索指定波形音频输入设备的功能。 |
waveOutGetDevCaps | 检索指定波形音频输出设备的功能。 |
其中每个函数都使用有关指定设备功能的信息填充结构。 下表列出了与其中每个函数对应的结构。
函数 | 结构 |
---|---|
auxGetDevCaps | AUXCAPS |
waveInGetDevCaps | WAVEINCAPS |
waveOutGetDevCaps | WAVEOUTCAPS |
标准格式列在 WAVEOUTCAPS 结构的 dwFormats 成员中。 波形音频设备可以支持非标准格式。 若要确定设备是否支持特定格式 (标准或非标准) ,可以使用 WAVE_FORMAT_QUERY 标志调用 waveOutOpen 函数。 此标志不打开设备。 在传递给 waveOutOpen 的 pwfx 参数指向的 WAVEFORMATEX 结构中指定有问题的格式。
波形音频输出设备支持的功能各不相同。 WAVEOUTCAPS 结构的 dwSupport 成员指示设备是否支持音量和音调更改等功能。
设备句柄和设备标识符
打开音频设备的每个函数指定设备标识符、指向内存位置的指针,以及每种类型的设备唯一的一些参数。 内存位置由设备句柄填充。 调用其他音频函数时,使用此设备句柄标识打开的音频设备。
音频设备的标识符和句柄之间的差异很微妙,但很重要:
- 设备标识符是根据系统中存在的设备数隐式确定的。 此数字是使用 auxGetNumDevs、 waveInGetNumDevs 或 waveOutGetNumDevs 函数获取的。
- 使用 waveInOpen 或 waveOutOpen 函数打开设备驱动程序时,将返回设备句柄。
没有打开或关闭辅助音频设备的功能。 辅助音频设备不需要像波形音频设备一样打开和关闭,因为没有与之关联的连续数据传输。 所有辅助音频函数都使用设备标识符来标识设备。
Waveform-Audio输出数据类型
以下数据类型是为波形音频输出函数定义的。
类型 | 说明 |
---|---|
HWAVEOUT | 打开波形音频输出设备的句柄。 |
WAVEFORMATEX | 指定特定波形音频输入设备支持的数据格式的结构。 此结构还用于波形音频输入设备。 |
WAVEHDR | 用作波形音频输入数据块标头的结构。 此结构还用于波形音频输入设备。 |
WAVEOUTCAPS | 用于查询特定波形音频输出设备的功能的结构。 |
指定Waveform-Audio数据格式
调用 waveOutOpen 函数以打开设备驱动程序进行播放或查询驱动程序是否支持特定数据格式时,请使用 pwfx 参数指定指向包含所请求波形音频数据格式的 WAVEFORMATEX 结构的指针。 WAVEFORMATEX 取代 WAVEFORMAT 和 PCMWAVEFORMAT 结构。
对于分隔为两个以上的声道或样本大小不是 8 的倍数的音频数据,应使用 WAVEFORMATEXTENSIBLE。 此结构只是配置 WAVEFORMATEX 的 cbSize 成员指向的额外字节,以提供有关格式的额外信息。 WAVEFORMATEXTENSIBLE 可以转换为 WAVEFORMATEX。
还有两种剪贴板格式可用于表示音频数据:CF_WAVE和CF_RIFF。 使用CF_WAVE格式以其中一种标准格式表示数据,例如 11 kHz 或 22 kHz PCM。 使用 CF_RIFF 格式表示无法表示为标准波形音频文件的更复杂的数据格式。
写入Waveform-Audio数据
成功打开波形音频输出设备驱动程序后,可以开始播放声音。 Windows 提供 waveOutWrite 函数,用于将数据块发送到波形音频输出设备。
使用 WAVEHDR 结构指定使用 waveOutWrite 发送的波形音频数据块。 此结构包含指向锁定的数据块的指针、数据块的长度和一些标志。 在使用此数据块之前,必须准备好它;有关准备数据块的信息,请参阅 音频数据块。
使用 waveOutWrite 将数据块发送到输出设备后,必须等待设备驱动程序完成数据块,然后才能释放数据块。 如果要发送多个数据块,则必须监视数据块的完成情况,以了解何时发送其他块。 有关数据块的详细信息,请参阅 音频数据块。
PCM Waveform-Audio 数据格式
WAVEHDR 结构的 lpData 成员指向波形音频数据样本。 对于 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 个字节的倍数,但这些样本可能不是字节对齐的。 通道排列由掩码指定。 有关详细信息,请参阅 WAVEFORMATEXTENSIBLE。 |
关闭Waveform-Audio输出设备
波形音频播放完成后,调用 waveOutClose 以关闭输出设备。 如果在播放波形音频文件时调用 waveOutClose ,关闭操作将失败,函数将返回指示设备未关闭的错误代码。 如果不想在关闭设备之前等待播放结束,请在关闭前调用 waveOutReset 函数。 这将结束播放并允许关闭设备。 在关闭设备之前,请务必使用 waveOutUnprepareHeader 函数清理所有数据块上的准备工作。