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 - 如何获取声音输出的默认设备? 的相关文章

  • Delphi - 如何将通用参数传递给接受 const 参数数组的函数

    我有一个 基类 其中包含一个 函数 该函数接受 const 数组 类型的参数 如下所示 type TBaseClass class TObject public procedure NotifyAll const AParams array
  • XE2 中的 COM 是否损坏?我该如何解决它?

    Update XE2 Update 2 修复了下述错误 下面的程序是从实际程序中截取的 在 XE2 中失败并出现异常 这是 2010 年的回归 我没有 XE 来测试 但我希望该程序在 XE 上运行良好 感谢 Primo 确认代码在 XE 上
  • 无法通过Delphi替换Word应用程序中的页脚文本

    我正在尝试替换页脚中的文本 我使用以下代码 通过它我可以替换正常内容 正文 但不能替换页脚 页眉中的内容 myWinWordApp CreateOLEObject Word Application myWinWordApp visible
  • 在 Inno Setup 中使用 StringToColor

    我想为表单上的标签 TNewStaticText 属性颜色 TColor 读写 分配一些颜色 我将颜色存储为 RRGGBB 字符串 我想使用 Delphi 函数 StringToColor 将其转换为 TColor 但如果我在脚本中使用此函
  • 为什么我不能在接收数组参数的函数中使用 SetLength?

    我正在尝试使用以下函数来设置动态数组 即 var 参数 的长度 当我尝试编译代码时只有一个错误 dcc64 错误 lolcode dpr 138 E2008 不兼容类型 function execute var command array
  • Delphi错误数据集未处于插入或编辑模式

    客观的 单击 TRxDBCombo 上的按钮调用搜索框 从搜索框中选择记录时 结果将设置为 TComboEditBox 的字段值 并发布在 TRxMemoryData 数据集中 错误 第二次调用此函数时出现数据集未处于插入或编辑模式 TDB
  • Delphi 7,加载PNG到TImage

    只是想加载 PNG 尝试使用适用于其他格式的 OleGraphic 来使用我的 LoadPic 但在 PNG 上失败 目标是将图像复制到隐藏位图 然后将其屏蔽并复制到可见的工作图像画布 如果 CopyRect 不这样做 请随意提出其他建议
  • 获取 TransactSql 批处理中的语句数计数

    对于不使用 Delphi 的读者 虽然以下内容是根据 Delphi 编码来表达的 但我的实际技术问题不是特定于 Delphi 的 而是关于如何找出 Sql Server 如何 理解 TransactSql 批处理提交给它 TAdoQuery
  • 如何仅在调试模式下激活 ReportMemoryLeaksOnShutdown?

    我需要激活ReportMemoryLeaksOnShutdown报告应用程序内存泄漏的功能 但仅限于调试模式 当 Delphi IDE 运行时 我怎样才能做到这一点 如果您的意思是使用调试构建配置 D2007 编译的 调试模式 则您将定义
  • 如何在滚动框上创建缓慢的滚动效果?

    我喜欢在滚动框中平移图像后创建平滑的减慢滚动效果 就像平移地图一样谷歌地图 http maps google com 我不确定它是什么类型 但行为完全相同 当快速移动地图时 当您释放鼠标时它不会立即停止 而是开始减慢速度 有什么想法 组件
  • 使用Delphi检查HTML代码中是否有对象属性值

    如何使用Delphi检查HTML代码中是否有输入对象属性值 there isn t value attribute
  • Async InputQuery 不处理“取消”按钮

    我正在使用一个简单的调用TDialogServiceAsync InputQuery 使用单个输入 它只是忽略了Cancel按钮和窗口的X关闭按钮 But the Ok按钮工作正常 这是我的代码 uses FMX DialogService
  • 具有 csOwnerDrawFixed 样式的组合框如何表现得像 csDropDown 样式?

    我正在使用一个组合框 http docwiki embarcadero com Libraries en Vcl StdCtrls TComboBoxstyle 属性设置为的组件csOwnerDrawFixed 我实现了绘图项一切工作正常
  • 为什么未初始化的指针会导致内存访问冲突接近 0?

    据说often 但并非总是如此 当你在接近于零的内存位置 比如 89 美元 获得 AV 时 你就有了一个未初始化的指针 但我也在 Delphi 书籍中看到了这一点 嗯 或者它们都是由同一作者写的 Update 引自 Bob Swart 等人
  • 石和磅的格式正确吗?

    我有一个图表 用于显示重量 以英石和磅 lbs 为单位 该图表由记录中的数据填充 对于权重 数据类型为 Double 记录数据是在运行时编辑的 我需要知道一种正确格式化输入数据的方法 为了更好地理解 首先看一下这些示例值 它们表示为石和磅
  • 每次 TDbGrid 的选定位置更改时都会触发什么事件?

    我的项目中有一个 TDbGrid 每次更改所选行时我都试图触发一个事件 行中的任何更改都已经更新了链接到同一数据源的所有数据感知控件 但还需要进行其他更改 我需要一个事件处理程序 我认为 OnColEnter 会起作用 根据帮助文件 它在以
  • delphi中如何实现多重继承?

    我正在对一个旧库进行完全重写 我不确定如何处理这种情况 为了便于理解 大家都欢呼自行车类比 我有以下课程 TBike 自行车本身 TBikeWheel 自行车的一个轮子 TBikeWheelFront and TBikeWheelBack
  • Delphi IDE导致CPU过热

    我正在使用 Delphi 7 但我已经尝试过 Delphi 2005 2010 版本 在所有这些新版本中 当 Delphi IDE 在屏幕上可见时 我的 CPU 利用率为 50 一个核心为 100 另一个核心为 宽松 当 IDE 最小化时
  • Mac 上的 Delphi - 可能吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我负责一个 Delphi Win32 项目管理应用程序 我刚刚完成了向 Delphi 2009 的迁移
  • 如何调试仅在应用程序关闭时发生的崩溃? (德尔福)

    因此 经过最近的一些更改 我们发现我们最古老的应用程序之一有时会在关闭时崩溃 这会以 运行时错误 216 消息的形式或来自 Windows 错误报告的消息的形式表明应用程序已停止工作 该应用程序已经发出OutputDebugString 每

随机推荐

  • 虚拟的概念

    我对 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 进行数字输出 情况是这样的 我正在编写一个应用程序 让用户选择输出设备并将其保存到应用程序的设置中 因此 它