在C ++中访问录制设备名称的标签

时间:2014-09-22 13:53:41

标签: c++ windows winapi recording

我需要阅读Windows属性,声音和录制设备中显示的录制设备的名称。按照我的例子,它的Realtek高清晰度音频(我猜它实际上是它的控制器名称)。 如果windows显示它,必须有WinAPI函数来确定它。 我做了一些关于它的谷歌研究,但没有特别成功。

1 个答案:

答案 0 :(得分:0)

这取决于您要模仿的Windows版本。通过Windows XP,控制面板无疑显示了DirectSound设备。显示它们非常简单明了:

#include <windows.h>
#include <iostream>
#include <dsound.h>

#pragma comment(lib, "dsound.lib")
#pragma comment(lib, "ole32.lib")

BOOL CALLBACK sound_capture_callback(LPGUID, LPCSTR description, LPCSTR, void *) {
    std::cout << description << "\n";
    return true;
}

int main() { 
    DWORD ignore;
    CoInitialize(NULL);
    DirectSoundCaptureEnumerate(sound_capture_callback, (void*)&ignore);    
    CoUninitialize();
}

从Windows 7开始(或者可能是Vista - 不记得确定)微软增加了他们所谓的Media Foundation。这在概念上有点相似,但有点复杂。序列如下:

  1. 您从MFCreateAttributes开始创建Media Foundation属性COM对象。
  2. 您使用该对象的SetGuid成员告诉它枚举声音(而不是视频)设备。
  3. 您致电MFEnumDeviceSources实际枚举设备。 这可以指向IMFActivate接口。
  4. 您在每个界面上调用GetAllocatedString(传递MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME)以获取设备的名称。
  5. 在后一种情况下,COM的常用警告适用。 COM本身就是一个过度设计的混乱,媒体基金会试图最大化这个概念。基本上不可避免的是,枚举MF设备的代码将比DirectSound的上述代码至少长3倍,难以理解5倍。如果你正在认真使用MF,你几乎肯定会想要创建一些包装来隔离这种丑陋,但你无法真正摆脱它,而对于像枚举设备这样的小任务,你可能不会减少它。