Windows 核心音频 API 中的 ERoles 枚举值代表啥?它们是相互排斥的吗?

Posted

技术标签:

【中文标题】Windows 核心音频 API 中的 ERoles 枚举值代表啥?它们是相互排斥的吗?【英文标题】:What do the ERoles enumeration values in Windows Core Audio APIs represent? Are they mutually exclusive?Windows 核心音频 API 中的 ERoles 枚举值代表什么?它们是相互排斥的吗? 【发布时间】:2019-09-24 04:44:36 【问题描述】:

来自 Microsoft API 文档:https://docs.microsoft.com/en-us/windows/win32/api/mmdeviceapi/ne-mmdeviceapi-erole

ERole 枚举

typedef enum __MIDL___MIDL_itf_mmdeviceapi_0000_0000_0002 
  eConsole,
  eMultimedia,
  eCommunications,
  ERole_enum_count
 ERole;

定义音频端点设备选择播放的“角色”列表

常量

eConsole 游戏、系统通知声音和语音命令。 eMultimedia 音乐、电影、旁白和现场音乐录制。 电子通讯 语音通讯(与他人交谈)。 ERole_enum_count ERole 枚举中的成员数(不包括 ERole_enum_count 成员)。

我没有从文档页面得到的是:

如果设备设置为eConsole,是否会完全排除在处理范围内

音乐、电影、旁白和现场音乐录制,以及

语音通信(与他人交谈)

我不相信答案是肯定的,因为底层硬件或操作系统不知道没有用户标记的音频流是音乐还是语音。那么这个ERole 是什么?与目标内容类型“良好”(主观和统计)播放的音频混合配置?延迟设置?还是两个或多个属性的组合?

更新

感谢@Roman R. 的回答。现在更多的问题仍然适合问题标题:

IMMDeviceEnumerator::GetDefaultAudioEndpoint 的文档说:

HRESULT GetDefaultAudioEndpoint(
  EDataFlow dataFlow,
  ERole     role,
  IMMDevice **ppEndpoint
);

角色

端点设备的角色。调用者应设置此参数 以下 ERole 枚举值之一

电子控制台

电子多媒体

电子通讯

所以只能分配“ONE”角色;并且由于ERole_enum_count 不像大多数枚举自定义协议那样是一个真正的选项,如何确保“all of the roles”由单个设备播放,正如the Device Roles 和您在该页面上的引用中提到的那样?

【问题讨论】:

【参考方案1】:

Device Roles:

一个特定的渲染或捕获设备可能没有分配上表中的一个、一个、部分或所有角色。在任何时候,表中的每个角色都被分配给一个(并且只有一个)渲染设备和一个(并且只有一个)捕获设备。也就是说,为渲染设备分配角色独立于为捕获设备分配角色。

上面的第一句话回答了角色是否互斥的问题。设备不会被排除在处理音频 I/O 之外。相反,角色定义了哪个设备用于具有多个设备的系统中的特定活动。例如,通信软件将使用设置为角色eCommunications 的设备进行音频捕获/渲染,同时媒体播放将转到另一台设备。

Automatic Device Role Detection:

假设计算机具有默认渲染设备(扬声器)和默认捕获设备(麦克风)。用户将 USB 耳机连接到计算机。安装适当的驱动程序后,操作系统会尝试检测要为新音频设备分配的角色。

例如,

...通信应用程序可以通过处理来自设备端点的通知来实现诸如闪避等行为来增强用户体验。

更新

所以只能分配“ONE”角色

不正确,文档对此有明确的说明。

您所指的 API 允许您获取特定角色的默认设备。同一设备可以同时默认为另一个角色。

让我再次从评论中删除这个:“角色可以帮助您在 [多个] 设备之间进行选择。”角色对应用程序使用音频设备没有任何限制。它们只是在系统配备多个设备的情况下帮助选择合适的设备,并且可能还有针对设备的角色特定自定义,例如回声消除。

【讨论】:

感谢您的回答。这真的很有帮助。我应该深入研究文档。但是在阅读更多之后,现在我的新问题是:如果选择ERole_enum_count作为设备的角色,那么该设备将扮演“所有角色”? 首先,您不应该为设备选择角色,这意味着您从应用程序中“分配”它们。角色可帮助您在 [多个] 设备之间进行选择。其次,ERole_enum_count 不是真正的值,它是人工枚举条目,有助于角色枚举(一般广泛用于枚举)。 哦。但这会导致新的问题。你能看看我更新的问题吗? 知道了。因此,对于 API,它是“每次调用”的一个角色。谢谢! 假设您开发了一个包含音频内容的通信应用程序。你想传递这个音频,你去 API 并请求:“我应该使用什么设备,哪个更好适合通信音频内容?”干得好。您不在乎同一设备是否也用于多媒体。或者您确实关心,然后您会进行另一个 API 调用来找出它。获得设备引用后,您只需将其用作普通设备,无需注意分配的角色。

以上是关于Windows 核心音频 API 中的 ERoles 枚举值代表啥?它们是相互排斥的吗?的主要内容,如果未能解决你的问题,请参考以下文章

WebRTC Windows Native音频中的Core Audio API

如何在 Windows 中从任何格式转换为 PCM

是否可以在 Windows 7 中获取指向默认音频端点设备缓冲区的指针?

使用Windows API实现本地音频采集

如何在 Windows 7 中更改音频输出设备的默认共享模式采样率?

核心音频指导/入门