我需要阅读Windows属性,声音和录制设备中显示的录制设备的名称。按照我的例子,它的Realtek高清晰度音频(我猜它实际上是它的控制器名称)。 如果windows显示它,必须有WinAPI函数来确定它。 我做了一些关于它的谷歌研究,但没有特别成功。
答案 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。这在概念上有点相似,但有点复杂。序列如下:
MFCreateAttributes
开始创建Media Foundation属性COM对象。 SetGuid
成员告诉它枚举声音(而不是视频)设备。MFEnumDeviceSources
实际枚举设备。
这可以指向IMFActivate
接口。GetAllocatedString
(传递MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME
)以获取设备的名称。在后一种情况下,COM的常用警告适用。 COM本身就是一个过度设计的混乱,媒体基金会试图最大化这个概念。基本上不可避免的是,枚举MF设备的代码将比DirectSound的上述代码至少长3倍,难以理解5倍。如果你正在认真使用MF,你几乎肯定会想要创建一些包装来隔离这种丑陋,但你无法真正摆脱它,而对于像枚举设备这样的小任务,你可能不会减少它。