Windows多媒体音频API的简易封装库

在Windows操作系统中,多媒体音频API为开发者提供了一种方式,使得他们能够为应用程序添加音频服务。尽管Vista引入了新的用户模式音频组件,使得操作变得更为简单,但微软已经明确表示不会将Vista的核心音频API向后兼容,例如XP等旧版Windows系统。考虑到仍有大量用户在使用XP及更早的Windows操作系统,因此需要一个解决方案来满足这些旧系统的需要。

为了解决这个问题,创建了一个小型的封装库,它以API的形式存在,提供了一种直接的方式来与标准的音频控制进行程序化交互,比如音量、平衡和静音。使用这个API仍然需要对混音器文档中使用的术语和基本概念有一定的理解。

混音器(Mixer)是将(混合)、路由和改变音频信号数据的水平和其他特性的设备。一个系统可以有零个或多个混音器。

每个混音器有一个或多个目的地,每个目的地有零个或多个控制和多个连接。

连接向目的地提供音频数据,并有零个或多个控制。如果一个连接有两个通道,那么每个通道的音量可以独立控制(平衡)。

控制影响音频信号数据的特性,如音量。每个与混音器关联的控制都有一个系统分配的唯一ID,范围从0到N。如果一个混音器有一个目的地,该目的地有两个连接,那么将为它分配九个控制ID,编号从零到八,假设每个连接和目的地都有三个控制。如果有三台混音器,就会有三组控制ID号码,每组从零开始。

目的地的概念可能有些令人困惑,但发现将目的地视为接收或消费与它关联的连接数据的接收器或消费者是有用的。令人困惑的部分是,目的地可能是输出设备,如扬声器,也可能是输入设备,如波形输入设备。扬声器显然是输出设备,但波形输入设备显然不是输出设备。SDK文档的介绍部分使用“音频线路”一词来指代目的地和连接,但这个术语在文档的其余部分使用并不一致,所以在这里避免使用它。

封装库的类

封装库中的CMixer类枚举了与混音器关联的所有目的地、连接和控制。它提供了对控制标签和界限数据的访问,以及对每个控制的状态数据的读写访问。以下图表更清晰地展示了混音器类组件之间的关系:

  • 混音器(Mixer):有一个目的地集合。
  • 目的地(Destination):有一个连接和控制的集合。
  • 连接(Connection):有一个控制的集合。
  • 控制(Control):有一个通道的集合,通常是两个。

CMixer类依赖于另外两个类CMixerDestination和CMixerControl的支持。CMixerDestination类管理与目的地关联的数据,而CMixerControl类提供对控制的状态和度量数据的访问。

使用代码

要完全使用CMixer类,需要熟悉三个SDK定义的结构,这些结构用于提供有关混音器组件的信息:

  • MIXERCAPS结构描述了混音器设备的能力。
  • MIXERLINE结构描述了连接或目的地的状态和度量。
  • MIXERCONTROL结构描述了连接或目的地的单个控制的状态和度量。

如果有兴趣将Windows控件与混音器控件关联起来,只需要参考SDK文档中的MIXERCONTROL结构定义,因为这个结构包含了控制的ID号、类型、名称和界限数据。

包含的VolumeControl示例应用程序是一个简单的MFC对话框应用程序,它有一个与系统中找到的第一个混音器的第一个音量控制同步的单个音量控制。在已经打开了特定的音频设备(如波形输入/输出、MIDI输入/输出或辅助设备)的情况下,可以使用设备的ID索引值或打开句柄来初始化CMixer实例。

AudioDialog示例MFC对话框应用程序包括在内,以解决需要更广泛的混音器信息的情况。它枚举了系统中的所有混音器,并允许用户显示与任何混音器、目的地、连接和控制相关联的数据。它还根据用户选择的混音器和目的地,呈现了一系列音量、平衡和静音复选框控件组,类似于系统提供的音量控制实用程序。

构建说明

两个示例应用程序都是用Visual Studio 2005构建的,因为认为大多数人至少会有这个版本,而且将项目更新到较新版本的VS比将其转换为旧版本要简单得多。这两个应用程序都在Vista、XP和2K上进行了测试。AudioDialog应用程序应该首先构建,因为它创建了VolumeControl应用程序使用的混音器API库文件。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485