2009-09-15 20 views
5

¿Hay alguna forma de obtener el nombre del dispositivo de audio completo en Windows XP y posterior?Obtenga el nombre completo del dispositivo de audio de Windows

Puedo usar MIXERCAPS pero el miembro szPname limitará a 32 caracteres (incluyendo NULL). Para un nombre de dispositivo de audio de "Micrófono (Dispositivo de audio de alta definición)", solo recupero "Micrófono (Alta definición Aud". Esto se debe a que MAXPNAMELEN está definido como 32. He intentado redefinirlo a un número mayor sin efecto .

Aquí está el código que estoy utilizando:

MIXERCAPS mc; 
ZeroMemory(&mc, sizeof(MIXERCAPS)); 
mm = mixerGetDevCaps(reinterpret_cast<UINT_PTR>(m_hMixer), &mc, sizeof(MIXERCAPS)); 

vi this question, pero hace referencia a Vista y posterior

+0

Disculpe, pero, ¿de qué lenguaje de programación se trata esta pregunta? –

Respuesta

1

Si usa la clásica interfaz multimedia de Windows, probablemente no pueda evitar la limitación de MAXPNAMELEN, ya que está compilada en Windows.

Sin embargo, es posible que pueda obtener el nombre completo del dispositivo si usa 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 
    } 
} 
0

Usted podría tratar de usar devcon Disponible en el sitio here de Microsoft

...

Creo que los medios de devcon listclass pueden darte el resultado que estás buscando.

+0

o prueba: devcon listclass AudioEndpoint –

0

continuación es mi (Delphi) código:

Esto es usando DirectShow/ActiveX, Se enumurates dispositivos DirectSound, que incluyen dispositivos WaveOut envoltorio ya bien.

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; 
Cuestiones relacionadas