目前我的主要目标是获取有关所有本地机器的音频端点设备的详细信息。那是代表音频外设的对象。我希望能够根据某些逻辑选择要录制的设备(或最终允许用户手动执行此操作)。
这是我到目前为止所得到的。我对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肯定有很好的命令用于音频的实际流式传输和采样,但我对如何确保使用所需的设备感到有点迷失。
答案 0 :(得分:3)
WASAPI将允许您执行所需操作,以便您使用正确的API。你错误的IMMDevice代表了一组音频设备,那就是IMMDeviceCollection。 IMMDevice代表单个音频设备。通过“设备”,WASAPI并不意味着你所期望的音频卡,而是指这种卡上的单个输入/输出。例如,具有模拟输入/输出+数字输出的音频卡将显示为3个IMM设备,每个IMM设备具有其自己的IMMEndpoint。我不确定您的详细信息,但在我看来,IMMDevice将为您提供所需的一切。基本上,你会想做这样的事情:
答案 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
所有关于找到正确的文档!