gpt4 book ai didi

c++ - Windows 音频端点 API。获取我的音频设备的名称

转载 作者:可可西里 更新时间:2023-11-01 11:18:25 24 4
gpt4 key购买 nike

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

这是我到目前为止所得到的。我是 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);
}

我目前更技术化的目标是获得实现这个接口(interface)的对象: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 个 IMMDevice,每个都有自己的 IMMMEndpoint。我不确定您需要什么详细信息,但在我看来 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->f() 而不是 if (*x).f(),尽管从技术上讲它是同一件事 -> 运算符是通过对象指针调用函数的常用方法
  • 不要使用 vector::assign,显然它会在每次调用时替换整个 vector 的内容,因此无论可用设备的数量如何,您最终都会得到大小为 1 的集合。请改用 push_back。

关于c++ - Windows 音频端点 API。获取我的音频设备的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25923454/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com