惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
WordPress大学
WordPress大学
宝玉的分享
宝玉的分享
人人都是产品经理
人人都是产品经理
博客园 - 聂微东
IT之家
IT之家
V
V2EX
Jina AI
Jina AI
V
Visual Studio Blog
有赞技术团队
有赞技术团队
博客园 - 司徒正美
博客园 - 叶小钗
The Cloudflare Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
小众软件
小众软件
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 三生石上(FineUI控件)
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Google DeepMind News
Google DeepMind News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
腾讯CDC
Google Online Security Blog
Google Online Security Blog
博客园 - 【当耐特】
Apple Machine Learning Research
Apple Machine Learning Research
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
N
News and Events Feed by Topic
N
News and Events Feed by Topic
The Last Watchdog
The Last Watchdog
W
WeLiveSecurity
月光博客
月光博客
Security Archives - TechRepublic
Security Archives - TechRepublic
Webroot Blog
Webroot Blog
SecWiki News
SecWiki News
博客园_首页
罗磊的独立博客
量子位
Latest news
Latest news
I
Intezer
V
Vulnerabilities – Threatpost
A
Arctic Wolf
Last Week in AI
Last Week in AI
Recent Commits to openclaw:main
Recent Commits to openclaw:main
S
SegmentFault 最新的问题
S
Security Affairs
阮一峰的网络日志
阮一峰的网络日志
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
酷 壳 – CoolShell
酷 壳 – CoolShell
P
Palo Alto Networks Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
N
News | PayPal Newsroom

Kaffa.im

Kaffa.im - 寻找数据源头 Kaffa.im - 玩魔方 Kaffa.im - AI 在常见病上取代医生 Kaffa.im - 上 NextCloud,一站搞定个人数据同步 在 Windows 上 Bose SoundLink 音箱声音自动停止问题的解决 Kaffa.im - 交易的实质——浪随风向 Kaffa.im - 新手学电脑从入门到精通 Kaffa.im - 数字化转型之路(从数字化到数智化) Kaffa.im - 机器人简史 Kaffa.im - 安卓Frida逆向与协议分析 Kaffa.im - 数学的惊奇 Kaffa.im - 牌局心理学 Kaffa.im - Python计算机视觉实战 Kaffa.im - ALaunch v1.0 发布 Kaffa.im - 结构性优势 Kaffa.im - 尤瓦尔·赫拉利-真假信息与连接 Kaffa.im - 小狗钱钱 Kaffa.im - 短视频编导全能手 Kaffa.im - 爆品创新:新时代爆品打造法 Kaffa.im - 如何阅读一本书 Kaffa.im - 冰血暴第一季 Kaffa.im - 冰血暴第二季 Kaffa.im - 冰血暴第三季 Kaffa.im - 冰血暴第四季 Kaffa.im - 冰血暴第五季 Kaffa.im - 思维迭代的26个卓越方法 Kaffa.im - 再度唤醒世界:赖特诗选 Kaffa.im - 中国量化投资 Kaffa.im - Clojure Recipes Kaffa.im - 文案卖货 Kaffa.im - 印象派与东亚美术 Kaffa.im - 深入实战vue开发 Racket Programming the Fun Way Kaffa.im - 我们为什么爱喝酒 Kaffa.im - 雅余的自省《独立博客自省问卷15题》 Kaffa.im - 2024年第41-42周周报 莫名解决局域网内 macOS 与 Windows 不能互访的问题 Kaffa.im - 2024年第39-40周周报 Kaffa.im - 2024年第37-38周周报 Kaffa.im - Money Focused Freestyle 给网站增加了 DIŸgöd 的 follow(Description 方式) Kaffa.im - 给网站增加了 DIŸgöd 的 follow Kaffa.im - 2024年第35-36周周报 Kaffa.im - 记录盒马鲜生好吃的烘培和好喝的啤酒 Kaffa.im - 边水往事 Kaffa.im - 事件流实战 Kaffa.im - 神经漫游者 Kaffa.im - 重启蒙娜丽莎 Kaffa.im - 零伯爵 Kaffa.im - TypeScript编程 Kaffa.im - 唯有书籍——读书、藏书及与书有关的一切 Kaffa.im - 福佳白啤 Kaffa.im - 2024年第33-34周周报 Kaffa.im - 安全意识、记一次MySQL勒索 Kaffa.im - 2024年第31-32周周报 Kaffa.im - 关于遗产代码维护 Kaffa.im - Rust项目开发实战 Kaffa.im - 抖音盒子:短视频与直播带货从入门到精通 Kaffa.im - 浮华与金戈(中世纪上) Kaffa.im - Rust系统编程 Kaffa.im - 大话机器智能 Kaffa.im - 为什么伟大不能被计划——对创意、创新和创造的自由探索 Kaffa.im - 电解质水平替、该不该喝酒及智商堪忧 Kaffa.im - AI融入生活的两点想法 Kaffa.im - 2024年第29-30周周报 Kaffa.im - 《黑客与画家》中累加器引发的思考 Kaffa.im - 2024年第27-28周周报 Kaffa.im - 别丧了,一点也不酷 Kaffa.im - 心智的本质 Kaffa.im - 宽客人生 Kaffa.im - 工作一年拉开差距:问题解决 Kaffa.im - 工作一年拉开差距:逻辑思考 Kaffa.im - Svelte和Sapper实战 Kaffa.im - The Digital Factory Kaffa.im - 游世与自然生活——庄子评传 Kaffa.im - 工作的原理·发现问题篇 Kaffa.im - 工作的原理·解决问题篇 Kaffa.im - DB Service Kaffa.im - 2024年第26周周报 Kaffa.im - 「KN.phoenix」终极笔记软件需求 Kaffa.im - ALaunch v0.9 发布 当我们 Build in Public 时,我们谈些什么 Kaffa.im - 2024年第25周周报 Kaffa.im - 给网站增加最近评论功能 Kaffa.im - 2024年第24周周报 Kaffa.im - [翻译]此网站是个人的 Kaffa.im - [翻译]制作自己的独立网站 Kaffa.im - [翻译]制作自己的独立网站 Kaffa.im - 2024年第23周周报 清除 Microsoft Edge 自动跳转 https 的缓存 参加 AWS 讲 AIGC 活动 Kaffa.im - 2024年第22周周报 Kaffa.im - 2024年第21周周报 Kaffa.im - 2024年第20周周报 Kaffa.im - 营销管理 Kaffa.im - 所有旅生,AI的一图定位来了 Kaffa.im - 2024年第19周周报 Kaffa.im - 2024年第18周周报 Kaffa.im - 年轻只是爱构建
Kaffa.im - Windows 音频设备控制之旅
Kaffa · 2024-11-02 · via Kaffa.im

我的需求

笔记本通过 TypeC-DP 1.4 口连接了显示器,听音乐时,我使用笔记本连接的音频输出设备,看视频时,我使用显示器的音频输出口,因此,我有了需要在笔记本和显示器之间快速切换音频设备的需求。

解决过程

我拥有 Windows 编程能力,在 AI 时代想到的第一解决途径就是Prompt,AI 帮我编写一段小功能:你是 Windows 编程的高级程序员,我需要实现一个最简的功能,我需要界面上提供系统音频设备列表供选择,计划用 Python Tkinter 实现,可以用一组单选框,竖直排列,选中设备后设置为 Windows 默认音频设备。请得到代码后复查一遍可能的问题,提供最终可运行的代码。

得到代码后,我表示没看出 API 是什么,于是问 Windows 中切换音频设备的 API 什么,我想着实现 Python 后,可转化为一个简单的 C 程序一键在多个音频设备之间切换,我的基本思路是:先列出设备,再在设备间循环激活为默认。

后续过程就不列举了,AI 提供的代码,都是无法运行的,以下列举 AI 的关键代码。

实现方式一:

import comtypes
from comtypes import GUID, COMObject, POINTER
from comtypes.client import CreateObject
from comtypes.gen import PolicyConfigClient

def set_default_audio_endpoint(device_id):
   # 使用comtypes创建PolicyConfigClient对象
   pPolicyConfig = CreateObject(PolicyConfigClient.CLSID_PolicyConfigClient,
                                interface = PolicyConfigClient.IPolicyConfig)
   # 调用SetDefaultEndpoint方法设置默认音频端点
   hr = pPolicyConfig.SetDefaultEndpoint(device_id, 0)
   if hr == 0:
       print("默认音频端点设置成功")
   else:
       print("默认音频端点设置失败")


if __name__ == '__main__':
   # 这里需要替换为实际的设备ID
   device_id = "{0.0.0.0}"
   set_default_audio_endpoint(device_id)

实现方式二::

from pycaw.pycaw import AudioUtilities, IMMDeviceEnumerator

def get_speaker_device_id():
   device_enumerator = IMMDeviceEnumerator()
   speakers = AudioUtilities.GetSpeakers()
   device_id = speakers.GetId()
   return device_id

if __name__ == '__main__':
   device_id = get_speaker_device_id()
   set_default_audio_endpoint(device_id)

我后来使用一段复杂的 Python 代码调用了一个本地 dll 文件作为桥梁实现了切换。然后,为去掉这个不明就里的 dll,把问题弄得更明白一点,我查阅了 Microsoft 的文档,文档中居然没有提!

最后我发现实现切换的是 Microsoft Windows Undocumented API,列举和操纵此设置,居然分属在不同的 COM 接口中,未有文档的是 PolicyConfigClient 接口,它是一个特殊的 COM 接口,脚本无法创建和使用它的属性和方法,需要 Native 代码通过最基本的结构去调用。

然后,我浏览了交友网站 GitHub,发现世界上还有几个和我有一样需求的人,并且有几个 Geek 动手实现了 AudioSwitch 软件,以及还有几个 C# 和 vbs 的实现,经过比较,我还是喜欢 C++ 实现的版本。

AudioSwitch 软件运行后,按 F12 就能自动切换系统默认的音频设备。我于是下载源码,发现它使用一个叫做 SCons-win32 的编译工具进行了编译,我又查阅了 SCons-win32 帮助,成功编译出了 AudioSwitch.exe

当我完成编译,微软的安全软件居然报 Trojan:Win32/Bearfoos.A!ml,我去微软官方查询了 Bearfoos.A!ml 解释带 !ml 的是机器学习判断的木马。

我查看了它的源代码,然后 SCons-win32 作为可能引入病毒的第二个可能,风险也不高,我的编译器也是本地,安全软件扫描过的,所以我认为它大概率是误报,于是向微软提交了该二进制软件,几天后,我发现微软排除了它的威胁。

随后的几天中,我感觉都非常方便。

新的发现

突然有一天,我发现 Windows 托盘区的小喇叭似乎自带切换功能,只是这个功能,我才发现。相比开机自动运行一个小软件然后按 F12,和点击托盘区的小图标再点展开再点设备的三次操作来说,我觉得已经差不多了。

按一次键盘和点击三次鼠标,我感觉还是键盘轻松点,但弊端是 F12 是容易和其它热键冲突的。比如 MadEdit 中 F12 就是进入一个 PostIt 模式,如果从菜单进入了,再 F12 时,就无法生效了。

结论

  1. 虽然 AI 编程已经很厉害,你讲清楚了需求,它也无法写出切换音频设备的小功能。
  2. AI 无法完成的原因是它使用了 Windows 未公开的技术。
  3. 新问题很少,这个问题 Windows 的发展过程的几十年间,已经被很多人用不同方式解决。
  4. 如果要解决电脑问题,通过编程解决只是一种直接的方式,你去问 AI 怎么编程,这时有两个结果,一个是 AI 实现了,二是 AI 未能实现,但无论是搜索还是 AI,最后都可以解决。
  5. 解决问题本来还有更简单的办法,也许是对问题解空间的搜索方向错误了。

但无论如何,现有的 AI 都不算能直接解决此问题,最后还得依靠专家的知识和一个灵感和一个机会。