Obtenez le nom complet du périphérique audio de Windows
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.
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;