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;

録音デバイスを取得したい場合は、上記の to メソッドの "WaveOut" を "WaveIn" に置き換えてください。

于 2011-08-26T02:04:50.537 に答える