DSPack - Как получить устройство по умолчанию для вывода звука? - PullRequest
3 голосов
/ 22 августа 2011

В Windows 7 есть несколько устройств воспроизведения.

Пример (на моем ноутбуке): колонки и двойные наушники Независимые двойные наушники SPDIF (цифровой выход через док-станцию ​​HP)

Ситуация, таким образом, таковаЯ пишу приложение, которое позволяет пользователю выбрать устройство вывода и сохранить его в настройках приложения.Таким образом, он предлагает пользователю выбор всех устройств Directsound в выпадающем списке.Пользователь выбирает тот, который он предпочитает, и сохраняет его.

Мое требование: При первоначальной загрузке этого списка я хочу выбрать устройство по умолчанию (как установлено в Windows 7 - Панель управления -> Звук -> Воспроизведениеtab)

Итак, мой код для перечисления устройств вывода звука:

Код:

procedure TForm1.FillDevices;
var
  AudioDevEnum: TSysDevEnum;
  n: string;
  i, ps: integer;
begin

  AudioDevEnum := TSysDevEnum.Create(CLSID_AudioRendererCategory);
  try

    if AudioDevEnum.CountFilters = 0 then
      Exit;

    for i := 0 to AudioDevEnum.CountFilters - 1 do
    begin
      n  := AudioDevEnum.Filters[i].FriendlyName;
      ps := pos('DirectSound: ', n);
      if ps <> 0 then
      begin
        ps := pos('Modem', n);
        if ps = 0 then
        begin
          // Delete(n, 1, 13);
          lstDevices.Items.Add(n);
        end;
      end;
    end;
    lstDevices.ItemIndex := 0;

  finally
    AudioDevEnum.Free;
  end;
end;

После получения списка я хочу обнаружить элемент, который установленв качестве «устройства по умолчанию» на панели управления звуком и выберите его.Это сделано для того, чтобы приложение в первый раз сохраняло правильное устройство без необходимости выполнения этой работы пользователем.

Можно ли это сделать?Как?

Заранее спасибо.

РЕДАКТИРОВАТЬ: Обратите внимание, что я хочу выбрать и сохранить (в INI-файл) устройство по умолчанию, чтобы оно могло использоваться моимприложение для вывода звука (через компонент DSPack).Я не хочу менять настройки Windows.

1 Ответ

1 голос
/ 26 августа 2011

Вот метод, который запрашивает драйвер для предпочтительного устройства воспроизведения (http://msdn.microsoft.com/en-us/library/aa909815.aspx), GetWaveOutDeviceList вернет список устройств, GetWaveOutDevice вернет индекс в списке предпочтительного устройства.

// this method will return the index in the list
function GetWaveOutDevice: Cardinal;
const
  DRVM_MAPPER=$2000;
  DRVM_MAPPER_PREFERRED_GET = DRVM_MAPPER + 21;
  DRVM_MAPPER_PREFERRED_SET = DRVM_MAPPER + 22;
var
 LDW2: Cardinal;
begin
 Result := $FFFFFFFF;
 LDW2 := 0;
 waveOutMessage( WAVE_MAPPER, DRVM_MAPPER_PREFERRED_GET, DWORD( @Result ), DWORD( @LDW2 ) );
end;

// this method will retrieve the list of devices
procedure GetWaveOutDeviceList(List: TStrings);
var
 Index: Integer;
 LCaps: WAVEOUTCAPS;
begin
  List.Clear;
  for Index := 0 to waveOutGetNumDevs -1 do begin
    waveOutGetDevCaps( Index, @LCaps, SizeOf( LCaps ) );
    List.add( LCaps.szPname );
  end;
end;

Если вы хотите получить записывающие устройства, просто замените «WaveOut» на «WaveIn» в приведенных выше методах.

...