3

在 Windows 7 中有多个播放设备。

示例(在我的笔记本电脑上):扬声器和双耳机独立双耳机 SPDIF(通过 HP Dock 数字输出)

情况是这样的:我正在编写一个应用程序,让用户选择输出设备并将其保存到应用程序的设置中。因此,它为用户提供了一个组合框中所有 Directsound 设备的选择。用户选择他喜欢的一个并保存它。

我的要求是:在此列表的初始加载时,我想选择默认设备(在 Windows 7 - 控制面板 -> 声音 -> 播放选项卡中设置)

所以我枚举音频输出设备的代码是:

代码:

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 设置。

4

1 回答 1

2

这是一个查询驱动程序以获取首选播放设备的方法(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”即可。

于 2011-08-26T02:04:50.537 回答