Windows音频端点API.正在获取我的音频设备的名称

Windows Audio Endpoint API. Getting the names of my Audio Devices

本文关键字:音频 我的 获取 端点 API Windows      更新时间:2023-10-16

我目前的主要目标是获取有关本地机器的所有音频端点设备的详细信息。这是表示音频外围设备的对象。我希望能够根据一些逻辑选择从哪个设备录制(或者最终允许用户手动这样做)。

以下是我迄今为止的收获。我对c++还很陌生,所以处理所有这些抽象类都有点棘手,所以也可以随意评论代码质量。

//Create vector of IMMDevices
UINT endpointCount = NULL;
(*pCollection).GetCount(&endpointCount);
std::vector<IMMDevice**> IMMDevicePP;   //IMMDevice seems to contain all endpoint devices, so why have a collection here?
for (UINT i = 0; i < (endpointCount); i++)
{
IMMDevice* pp = NULL;
(*pCollection).Item(i, &pp);
IMMDevicePP.assign(1, &pp);
}

我目前的技术目标是获得实现此接口的对象:http://msdn.microsoft.com/en-us/library/windows/desktop/dd371414(v=vs.85).aspx这是一种应该表示单个音频端点设备的类型,而IMMDevice似乎包含设备的集合。然而,IMMEndpoint只包含一个名为GetDataFlow的方法,所以我不确定这是否对我有帮助。同样,目标是轻松选择从哪个端点设备录制和流式传输音频。

有什么建议吗?我是否使用了错误的API?这个API对于音频的实际流和采样确实有很好的命令,但我有点不知所措,不知道如何确保使用所需的设备。

WASAPI将允许您做您需要的事情,以便您使用正确的API。不过,您错误地认为IMMDevice代表音频设备的集合,即IMMDeviceCollection。IMMDevice表示单个音频设备。WASAPI所说的"设备"并不是指您所期望的声卡,而是指此类卡上的单个输入/输出。例如,具有模拟输入/输出+数字输出的声卡将显示为3个IMMDevices,每个IMMDevice都有自己的IMMDEndpoint。我不确定你想要什么详细信息,但在我看来IMMDevice会为你提供你需要的一切。基本上,你会想做这样的事情:

  • 创建IMMDeviceEnumerator
  • 调用指定呈现、捕获或两者的EnumAudioEndpoints,以枚举到IMMDeviceCollection中
  • 从IMMDeviceCollection获取单个IMMDevice实例
  • 可以使用OpenPropertyStore从IMMDevice查询设备名称和描述(http://msdn.microsoft.com/en-us/library/windows/desktop/dd370812%28v=vs.85%29.aspx)。其他支持的设备详细信息可在此处找到:http://msdn.microsoft.com/en-us/library/windows/desktop/dd370794%28v=vs.85%29.aspx.
  • 从IMMDeviceCollection获得的IMMDevice实例也将是IMMDEndpoint的实例,使用QueryInterface在两者之间切换。然而,正如您所指出的,这只会告诉您是否已经掌握了渲染或捕捉设备。只在EnumAudioEndpoints上直接询问您想要的内容要容易得多
  • 关于代码质量:使用x->f()代替if(*x).f(),尽管从技术上讲,->运算符是通过对象指针调用函数的常用方法
  • 不要使用vector::assign,显然它会在每次调用中替换整个vector的内容,因此无论可用设备的数量如何,您最终都会得到一个大小为1的集合。请改用push_back

按照Sjoerd所述枚举IMMDevices后,必须检索IPropertyStore设备的信息。您必须从中提取PROPVARIANT对象,如下所示:

PROPERTYKEY key;
HRESULT keyResult = (*IMMDeviceProperties[i]).GetAt(p, &key);

然后

PROPVARIANT propVari;
HRESULT propVariResult = (*IMMDeviceProperties[i]).GetValue(key, &propVari);

根据这些文件:

http://msdn.microsoft.com/en-us/library/windows/desktop/bb761471(v=vs.85).aspxhttp://msdn.microsoft.com/en-us/library/windows/desktop/aa380072(v=vs.85).aspx

最后,为了导航大型PROPVARIANT结构以获得音频端点设备的友好名称,只需访问PROPVARIANT结构的pwszVal成员,如下所示:

http://msdn.microsoft.com/en-us/library/windows/desktop/dd316594(v=vs.85).aspx

一切都是为了找到正确的文档!