Obtenga el nombre completo del dispositivo de audio de Windows
Pregunta
¿Hay alguna forma de obtener el nombre de dispositivo de audio completo en Windows XP y versiones posteriores?
Puedo usar MIXERCAPS pero el miembro szPname se limitará a 32 caracteres (incluido NULL). Para un nombre de dispositivo de audio de "Micrófono (Dispositivo de audio de alta definición)", solo obtengo "Micrófono (Aud de alta definición". Esto se debe a que MAXPNAMELEN está definido en 32. He intentado redefinirlo a un número mayor sin ningún efecto.
Aquí está el código que estoy usando:
MIXERCAPS mc;
ZeroMemory( &mc, sizeof(MIXERCAPS) );
mm = mixerGetDevCaps( reinterpret_cast<UINT_PTR>(m_hMixer), &mc, sizeof(MIXERCAPS) );
Vi esta pregunta , pero hace referencia a Vista y posterior.
Solución
Si usa la clásica interfaz multimedia de Windows, probablemente no pueda sortear la limitación MAXPNAMELEN, ya que está compilada en el propio Windows.
Sin embargo, es posible que pueda obtener el nombre completo del dispositivo si utiliza DirectSound en su lugar. El siguiente código no ha sido probado pero creo que debería funcionar.
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
}
}
Otros consejos
Puedes intentar usar devcon. Disponible en el sitio de Microsoft aquí .
Creo que devcon listclass media puede darte el resultado que estás buscando.
A continuación se muestra mi código (Delphi):
Esto está usando DirectShow / ActiveX, Enumura dispositivos DirectSound, que también incluyen dispositivos WaveOut envueltos.
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;