在Windows 7中有多个回放设备。
示例(在我的笔记本电脑上):扬声器和双耳机独立双耳机SPDIF (通过HP Dock实现数字输出)
情况是这样的:我正在编写一个应用程序,让用户选择输出设备并将其保存到应用程序的设置中。因此,它为用户提供了一个组合框中所有Directsound设备的选择。用户选择他喜欢的一个并保存它。
我的要求是:在此列表的初始加载中,我希望选择默认设备(如Windows7-控制面板->声音->回放选项卡中所设置)
因此,我枚举音频输出设备的代码是:
代码:
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设置。
发布于 2011-08-26 02:04:50
下面是一种查询驱动程序以获得首选回放设备(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”。
https://stackoverflow.com/questions/7152259
复制相似问题