有没有办法在Windows XP及更高版本中获得完整音频设备名称?
我可以使用MIXERCAPS,但szPname成员将限制为32个字符(包括NULL)。对于音频设备名称“麦克风(高清晰度音频设备)”,我只返回“麦克风(高清晰度Aud)”。这是由于MAXPNAMELEN被定义为32.我已经尝试将其重新定义为更大的数字而没有效果
以下是我正在使用的代码:
MIXERCAPS mc;
ZeroMemory( &mc, sizeof(MIXERCAPS) );
mm = mixerGetDevCaps( reinterpret_cast<UINT_PTR>(m_hMixer), &mc, sizeof(MIXERCAPS) );
我看到this question,但它引用了Vista及更高版本。
答案 0 :(得分:1)
如果您使用经典的Windows多媒体界面,您可能无法绕过MAXPNAMELEN限制,因为它已编译到Windows本身。
但是,如果您使用DirectSound,则可能会获得完整的设备名称。以下代码未经测试,但我认为它应该有效。
BOOL CALLBACK EnumCallback(LPGUID guid, LPCSTR descr, LPCSTR modname, LPVOID ctx)
{
std::vector<std::string> *names = (std::vector<std::string>*)ctx;
names->push_back(std::string(descr));
return TRUE;
}
int main()
{
std::vector<std::string> names;
if (!FAILED(DirectSoundEnumerate(&EnumCallback, &names)))
{
// do stuff
}
}
答案 1 :(得分:0)
您可以尝试使用devcon。可在Microsoft网站here上找到。
我认为devcon listclass媒体可能会为您提供您正在寻找的结果。
答案 2 :(得分:0)
以下是我的(Delphi)代码:
这是使用DirectShow / ActiveX, 它还可以使用包含WaveOut设备的DirectSound设备。
procedure EnumAudioDevices;
var
dsCreateDevEnum : ICreateDevEnum;
EnumDevice : IEnumMoniker;
DeviceMoniker : IMoniker;
Data : Integer;
DevicePropBag : IPropertyBag;
DeviceName : OLEVariant;
I : Integer;
begin
// CLSID_CQzFilterClassManager = Entire DirectShow Filter List
If CoCreateInstance(CLSID_SystemDeviceEnum,nil,CLSCTX_INPROC_SERVER,IID_ICreateDevEnum,dsCreateDevEnum) = S_OK then
Begin
If dsCreateDevEnum.CreateClassEnumerator(CLSID_AudioRendererCategory,EnumDevice,0) = S_OK then
Begin
I := 0;
EnumDevice.Reset;
While EnumDevice.Next(1,DeviceMoniker,@Data) = S_OK do
Begin
If DeviceMoniker.BindToStorage(nil,nil,IID_IPropertyBag,DevicePropBag) = NOERROR then
Begin
If DevicePropBag.Read('FriendlyName',DeviceName,nil) = NOERROR then
Begin
// Success
ShowMessage(DeviceName);
Inc(I);
End;
DevicePropBag := nil;
End;
DeviceMoniker := nil;
End;
EnumDevice := nil;
End;
dsCreateDevEnum := nil;
End;
End;