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.

¿Fue útil?

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top