Witajcie,
Potrzebuję pobrać listę urządzeń wyjściowych audio jakie są podpięte do komputera. Finalnie zrobiłem to w następujący sposób:
type tagWAVEOUTCAPSW2 = record
wMid: Word; { manufacturer ID }
wPid: Word; { product ID }
vDriverVersion: MMVERSION; { version of the driver }
szPname: array[0..MAXPNAMELEN-1] of WideChar; { product name (NULL terminated UnicodeString) }
dwFormats: DWORD; { formats supported }
wChannels: Word; { number of sources supported }
reserved: Word;
dwSupport: DWORD;
manufacturerGuid: TGUID;
producerGUID: TGUID;
nameGUID: TGUID;
end;
procedure GetWaveOutDevices(DeviceNames: TStrings);
var
DNum: Integer;
i: Integer;
Caps: tagWAVEOUTCAPSW2;
reg: TRegistry;
begin
DNum := waveOutGetNumDevs; // liczba urządzeń
reg := TRegistry.Create;
try
reg.RootKey := HKEY_LOCAL_MACHINE;
for i := 0 to DNum - 1 do // ich nazwy
begin
waveOutGetDevCaps(i, @Caps, SizeOf(Caps));
if reg.OpenKeyReadOnly('SYSTEM\CURRENTCONTROLSET\CONTROL\MEDIACATEGORIES\'+GUIDToString(caps.nameGUID)) then
begin
DeviceNames.Add(reg.ReadString('Name'));
reg.CloseKey;
end
else
DeviceNames.Add(String(Caps.szPname));
end;
finally
reg.Free;
end;
end;
finalnie szPname ma tylko 32 znaki więc udało się wygooglać, że z rejestru można pobrać pełną nazwę. Niestety jeśli mam głośniki w laptopie + słuchawki na USB to z rejestru odczytuje mi nazwę tylko dla słuchawek USB bez głośników. Nazwa głośników dalej leci z parametru szPname. Jakieś podpowiedzi?
Od razu wspomnę, że rozwiązania z Direct Sound i biblioteką BASS zostawiam na sam koniec jeśli nic innego nie uda się wykombinować.