DSPack - 如何获取声音输出的默认设备?

2024-01-02

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

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

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

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

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

Code:

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;

获取列表后,我想检测声音控制面板中设置为“默认设备”的项目,然后选择它。这样应用程序就能第一次保存正确的设备,而无需用户执行此工作。

这可以做到吗?如何?

提前致谢。

EDIT:请注意,我想选择并保存(到 INI 文件)默认设备,以便我的应用程序可以使用它来输出声音(通过 DSPack 组件)。我不想更改 Windows 设置。


这是一个查询驱动程序以获取首选播放设备的方法(http://msdn.microsoft.com/en-us/library/aa909815.aspx 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”即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DSPack - 如何获取声音输出的默认设备? 的相关文章

随机推荐

  • 虚拟的概念

    我对 CPP 很陌生 正在学习后期绑定多态性 根据我所阅读和理解的内容 virtual 关键字用于后期绑定 它在编译时内部创建一个由 vptr 指向的 vtable 所以 例如 class BASE public virtual void
  • C++ 如何管理依赖项(例如使用 github 中的库)

    我对 C 世界很陌生 所以请原谅我提出这样一个虚拟问题 我用谷歌搜索了一下 但找不到正确的答案 我的问题相当简单 我应该如何在 C 世界中使用库 例如在 Java 中 有maven and gradle为了这个任务 在Python中 我使用
  • Ruby - 获取下一个夏令时更改

    我知道有一种方法可以确定某个时间是否是夏令时 Time now dst 但是有没有办法告诉我们下一个夏令时更改的日期 例如 谷歌返回Sunday November 12015 年下一次夏令时变更 由于这些日期是基于其他值 例如您正在使用的时
  • Springfox Swagger:无法解析指针:/definitions/Instant

    我们有一个 SpringBoot 项目 并且使用 Springfox Swagger 来生成 API 文档 有一个响应类包含 private Collection
  • 将我的登录凭据存储在 redux-react 中

    我想将我的登录凭据存储在 redux react 中 我附加了几行代码 问题的一部分 sksignup js import React Component from react import useState from react impo
  • 大虾PDF-如何获取文本框的高度

    我有一个包含动态文本的 formatted text box 当没有给出具体尺寸时 盒子似乎可以很好地扩展 问题是它似乎没有将光标移动到框的底部 因此我的文本与 formatted text box 中的文本重叠 如果我可以确定文本框的高度
  • AlarmManager Android 日常

    我正在尝试制定一个时间表 它应该每天下午 1 点或 2 点运行 目前我只能让它每 10 秒或 10 分钟运行一次 Intent myIntent new Intent AndroidAlarmService this MyAlarmServ
  • 以编程方式生成请求验证令牌

    从一个空的 MVC 项目开始 这是我的Startup cs using Microsoft AspNetCore Builder using Microsoft AspNetCore Hosting using Microsoft Exte
  • Couchbase 文档日期搜索 - DateTime.Now()

    我在 CB 中有一份文档 其中有两个日期 开始日期和结束日期 比方说 产品的价格折扣 10 折扣从今天开始到下周五结束 我怎样才能从CB获得今天有有效折扣的所有文件 我做了一个视图 其中包含以下内容 var dt new Date 得到今天
  • Richardson-Lucy 反卷积可以恢复潜在内核吗?

    我知道理查森 露西反卷积是为了恢复潜在图像 但假设我们有一个噪声图像和原始图像 我们能找到引起转变的内核吗 下面是一个 MATLAB 代码理查森 露西反卷积 http en wikipedia org wiki Richardson E2
  • OS X Server + GIT 与 SSH 集成失败并出现权限被拒绝错误

    我的 GIT 服务器托管在单独的 Linux 服务器上 我有 SSH RSA 密钥没有密码 我能够使用 Xcode 连接到 GIT 服务器 并且所有操作都可以通过 Xcode 5 0 2 在源代码管理中正常工作 我在本地计算机上安装了 OS
  • 为什么 String.length() 是一个方法?

    如果 String 对象是不可变的 因此显然不能改变它的长度 为什么length 一种方法 而不是简单地public final int length比如数组中有什么 它只是一个 getter 方法 还是进行某种计算 只是想看看这背后的逻辑
  • Apple 如何查找电子邮件中的日期、时间和地址?

    在 iOS 电子邮件客户端中 当电子邮件包含日期 时间或位置时 文本将成为超链接 只需点击链接即可创建约会或查看地图 它不仅适用于英语电子邮件 也适用于其他语言 我喜欢这个功能 并且想了解他们是如何做到的 最简单的方法是使用许多正则表达式并
  • EF6 急切加载相关实体的单个属性

    在 EF6 中 我有一个实体客户 具有实体地址的导航属性 地址实体包含属性 城市 我可以急切地加载地址实体 同时获取所有客户 如下所示 dbSet Customers Include customer gt customer Address
  • 从 HttpWebRequest 下载时缺少某些元素?

    我正在使用 httpwebrequest 从给定的 url 下载数据 但很少有元素没有响应 Dim Request As HttpWebRequest CType WebRequest Create https www royalmail
  • 如何使InnoDB表在服务器重启时不重置自动增量?

    我的开发机器上运行的是 MySQL 5 5 37 我使用 innodb 表 面临下一个问题 服务器重新启动后自动增量重置 Found 自动锁模式 http dev mysql com doc refman 5 1 en innodb par
  • Twitter Open Graph 图像未显示

    我正在尝试在网站中实现 OpenGraph 这是我的元数据代码
  • Laravel 方法分页不存在

    我正在尝试对模型结果进行分页 但收到 分页方法不存在 这是我的代码 user dispatches Dispatch all gt where user id Auth id gt paginate 10 我需要获取用户 ID 等于当前经过
  • 我可以在 Three.js 中隐藏网格的面吗?

    我想使网格的某些部分在运行时不可见 我可以将这些部分设置为不可见 透明吗 通过改变单个面孔的属性 网格本身仅使用一种材料 示例说明 as the editor理解这个问题 想象一个网格 这里有 20 个顶点的几何图形 其中每个四个顶点的四边
  • DSPack - 如何获取声音输出的默认设备?

    在 Windows 7 中 有多个播放设备 示例 在我的笔记本电脑上 扬声器和双耳机 独立双耳机 SPDIF 通过 HP Dock 进行数字输出 情况是这样的 我正在编写一个应用程序 让用户选择输出设备并将其保存到应用程序的设置中 因此 它