使用通信设备

在 Windows 7 中,Windows 多媒体控制面板 Mmsys.cpl 提供新的“通信”选项卡。此选项卡包含的选项使用户能够设置用于定义系统如何管理通信设备的选项。 通信设备主要用于在计算机上拨打或接听电话。 对于只有一个呈现设备(扬声器)和一个捕获设备(麦克风)的计算机,这些音频设备也充当默认通信设备。 当用户连接新设备(如 USB 耳机)时,系统会通过查找 OEM 填充的配置设置来执行自动设备角色检测。 如果系统确定最适合通信的设备,则系统将 eCommunications 角色分配给该设备。 对于这些设备,Windows 7 Mmsys.cpl 提供“默认通信设备”选项,使用户能够分别为音频呈现(“播放”选项卡)和音频捕获(“录制”选项卡)选择通信设备。 系统执行自动角色检测,但不设置用于通信的特定设备。 用户必须执行此操作。 新的 eCommunications 角色允许应用程序将用户选择用于处理通话的设备与用作多媒体设备(音乐播放)的设备区分开。 例如,如果用户具有连接到计算机的耳机和扬声器,则系统将 eConsole 角色分配给扬声器,并将 eCommunications 角色分配给耳机。 用户选择要用作通信设备的耳机后,若要开发通信应用程序,可以将耳机专用于呈现音频流。 用户无法更改系统分配的设备角色的应用程序。 有关设备角色的更多信息,请参阅设备角色

通信应用程序(如 VoIP 和统一通信应用程序)通过计算机拨打和接听电话。 例如,VoIP 应用程序可能会将包含振铃通知的流分配给用于呈现音频流的通信设备集的终结点。 此外,应用程序可能会在设置为通信设备的捕获和呈现终结点设备上打开语音输入和输出流。

若要将通信功能集成到应用程序中,可以使用:

  • MMDevice API—获取对通信设备的终结点的引用。
  • WASAPI—通过通信设备呈现和捕获音频流。 操作系统将通信设备上打开的流视为通信流

通信应用程序枚举设备,并以与使用核心音频 API 管理非通信流相同的方式为通信(呈现或捕获)流提供流管理。

可以在通信应用程序中集成的功能之一是闪避流衰减。 此行为定义打开通信流时其他声音必须发生的情况,例如在通信设备上收到通话时。 系统可能会根据用户选择降低非通信流的音频音量或将其静音。 当打开或关闭通信流以呈现或捕获流时,音频系统会生成闪避事件。 默认情况下,操作系统提供默认的闪避体验。 媒体应用程序可以替换默认行为并处理这些事件本身,以提供自定义的闪避体验。

以下部分介绍如何使用核心音频 API 提供自定义闪避体验。

获取对通信设备终结点的引用

若要使用通信设备,直接 WASAPI 客户端必须使用设备枚举器枚举设备。 通过调用 IMMDeviceEnumerator::GetDefaultAudioEndpoint 获取对默认通信设备终结点的引用。 在此调用中,应用程序必须在 Role 参数中指定 eCommunications,以将设备枚举限制为通信设备。 获取对设备终结点的引用后,可以通过调用 IMMDevice::Activate 来激活为终结点限定的服务。 例如,可以传递 IID_IAudioClient 服务标识符来激活音频客户端对象,并将其用于流管理,通过 IID_IAudioEndpointVolume 标识符来访问通信设备终结点的音量控件,或通过 IID_IAudioSessionManager 标识符来激活会话管理器,与终结点的策略引擎进行交互。 有关流操作的信息,请参阅流管理

通过使用 IMMDevice 引用,还可以访问设备终结点的属性存储。 这些属性值(如设备友好名称和制造商名称)由 OEM 填充,并使应用程序能够确定通信设备的特征。 有关详细信息,请参阅设备属性

以下示例代码获取对用于呈现音频流的默认通信设备终结点的引用。

IMMDevice *defaultDevice = NULL;

hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL,
            CLSCTX_INPROC_SERVER, 
            __uuidof(IMMDeviceEnumerator), 
            (LPVOID *)&deviceEnumerator);

hr = deviceEnumerator->GetDefaultAudioEndpoint(eRender, 
            eCommunications, &defaultDevice);

流管理