Windows Audio Endpoint API。获取我的音频设备的名称

时间:2014-09-18 22:30:44

标签: c++ windows wasapi

目前我的主要目标是获取有关所有本地机器的音频端点设备的详细信息。那是代表音频外设的对象。我希望能够根据某些逻辑选择要录制的设备(或最终允许用户手动执行此操作)。

这是我到目前为止所得到的。我对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肯定有很好的命令用于音频的实际流式传输和采样,但我对如何确保使用所需的设备感到有点迷失。

2 个答案:

答案 0 :(得分:3)

WASAPI将允许您执行所需操作,以便您使用正确的API。你错误的IMMDevice代表了一组音频设备,那就是IMMDeviceCollection。 IMMDevice代表单个音频设备。通过“设备”,WASAPI并不意味着你所期望的音频卡,而是指这种卡上的单个输入/输出。例如,具有模拟输入/输出+数字输出的音频卡将显示为3个IMM设备,每个IMM设备具有其自己的IMMEndpoint。我不确定您的详细信息,但在我看来,IMMDevice将为您提供所需的一切。基本上,你会想做这样的事情:

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

答案 1 :(得分:1)

在枚举你的IMMDevices后,Sjoerd声明必须检索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).aspx    http://msdn.microsoft.com/en-us/library/windows/desktop/aa380072(v=vs.85).aspx

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

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

所有关于找到正确的文档!