Jak pobrać pełną nazwę urządzeń wyjściowych audio?

0

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ć.

2
woolfik napisał(a):

Od razu wspomnę, że rozwiązania z Direct Sound i biblioteką BASS zostawiam na sam koniec

A akurat to byłoby najprostsze. DirectSoundEnumerate i jako parametr podajesz wskaźnik na funkcję, która zostanie wywołana i dostanie nazwę urządzenia jako jeden z parametrów.

0

No dobra @Azarien zrobiłem jak napisałeś w zasadzie działa więc masz +1

1 użytkowników online, w tym zalogowanych: 0, gości: 1