Windows音频端点API.正在获取我的音频设备的名称
Windows Audio Endpoint API. Getting the names of my Audio Devices
我目前的主要目标是获取有关本地机器的所有音频端点设备的详细信息。这是表示音频外围设备的对象。我希望能够根据一些逻辑选择从哪个设备录制(或者最终允许用户手动这样做)。
以下是我迄今为止的收获。我对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
一切都是为了找到正确的文档!
- 我的神经网络不起作用 [XOR 问题]
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 我的字符计数代码计算错误.为什么
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- cmake在我的项目中所需的所有静态库都不成功
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 为什么我的for循环不能正确获取argv
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 0-1背包代码中的错误.我的代码中有什么错误
- 当我的阵列太大时出现分段错误
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 为什么二进制搜索在我的测试中不起作用
- 如何指定我希望我的LIB链接到的DLL文件?-Visual Studio 2019
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 我的游戏引擎的 FMOD 音频
- Windows音频端点API.正在获取我的音频设备的名称
- 我的OpenAL c++音频流缓冲区故障
- 使用IOBluetooth框架的音频数据污染了我的RFCOMM通道
- 我正在我的程序中使用 ffmpeg 库来录制视频和音频