Question

Existe-t-il un moyen d'obtenir le nom du périphérique audio complet dans Windows XP et versions ultérieures?

Je peux utiliser MIXERCAPS mais le membre szPname sera limité à 32 caractères (y compris NULL). Pour un nom de périphérique audio «Microphone (Périphérique audio haute définition)», je ne récupère que «Microphone (Haute définition aud»), car MAXPNAMELEN est défini sur 32. J'ai essayé de le redéfinir en un nombre plus important. sans effet.

Voici le code que j'utilise:

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

J'ai lu cette question , mais il fait référence à Vista et aux versions ultérieures.

Était-ce utile?

La solution

Si vous utilisez l'interface multimédia Windows classique, vous ne pourrez probablement pas contourner la limitation MAXPNAMELEN, car elle est compilée dans Windows lui-même.

Cependant, vous pourrez peut-être obtenir le nom complet du périphérique si vous utilisez plutôt DirectSound. Le code suivant n’a pas été testé, mais je pense que cela devrait fonctionner.

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
    }
}

Autres conseils

Vous pouvez essayer d’utiliser devcon. Disponible sur le site de Microsoft ici .

Je pense que devcon listclass media peut vous donner le résultat que vous recherchez.

Ci-dessous, le code (Delphi):

Ceci utilise DirectShow / ActiveX, Il énumère les périphériques DirectSound, qui incluent également les périphériques WaveOut encapsulés.

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top