Mac频繁“鞭炮”声解决
这几天我的 MacBook Pro 开始闹别扭。
不是死机,不是卡顿,是放鞭炮(爆裂声、爆破声,爆裂,破音,噼啪声)—— 每隔一会儿,扬声器里就蹦出一声脆响,像有人在音频线上弹了一下手指。起初我以为是歌的问题,换了一首,还是有。换了播放器,还是有。
其实“鞭炮声”我刚买到电脑就偶尔会有,不过不是很频繁,只是偶尔内存占用过高才会出现,去了天才吧,远程服务都没解决。这次太频繁了,简直忍不了!
更诡异的是,它不是随机的。每次我切换任意应用窗口时几乎必现,"啪啪"几声。我切得越快,响得越勤。
环境信息
机型:MacBook Pro 14-inch (MacBookPro18,3)
芯片:Apple M1 Pro
系统:macOS 14(Sonoma)
音频输出:内置扬声器(44100 Hz)
外接设备:DisplayPort 显示器音频、2 个 USB 音频设备
网上思路
我做的第一件事是打开 YouTube 搜索"Mac audio crackling fix",然后看了几个视频,看了几个帖子,就是我以前看过的帖子,全都在教我重置 NVRAM 和修改采样率, 我照做了。没用。
有人说”音频MIDI设置“更换音频输出格式(44100/48000/88200 Hz)无效
折腾了几个小时,什么都没解决,但我在B站看到有位博主-我爱吃清补凉 发布了一件有意思的事:sudo purge 能 100% 复现这个爆音。
这个命令本来是用来清空内存缓存的。我只是随手跑了一下,结果音箱立刻"啪啪啪"炸了几声,像在抗议。
这说明这不是硬件问题。这是软件问题,而且和系统负载有关。
排查
我想到最近做过两件事:用 CleanMyMac 清理了一遍电脑,还装了几个新软件,看到有人说可能是Intel种类的软件也会导致破音,所以依次卸载了,但也没用。
然后想到是不是卸载软件导致某些驱动没清理干净,先查音频驱动。Mac 有个东西叫 HAL 插件,第三方软件可以往里塞虚拟音频设备,直接挂在系统音频管线上。我跑了一下:
❯ ls /Library/Audio/Plug-Ins/HAL/
ToDeskOutputDriver.driver eqMac.driver
eqMac 是我发现爆音之后才装的均衡器,想着也许能调好——结果没用,还把问题搞复杂了。先卸掉。
ToDesk 是远程桌面软件,装了挺久了,一直没出过问题。我当时没太在意它。
卸完 eqMac,删完eqMac 驱动,爆音还在。
查到这里我开始觉得可能是 M1 芯片的架构问题。M1 Pro 的 CPU
核心在空闲时会进入很深的休眠状态,省电效果很好,但唤醒有延迟。切换窗口的瞬间,性能核被唤醒,这个抖动可能让实时音频线程来不及填充缓冲区,然后就爆音了。
我跑了一下电源管理状态:
❯ pmset -g
System-wide power settings:
Currently in use:
standby 1
Sleep On Power Button 1
hibernatefile /var/vm/sleepimage
powernap 1
networkoversleep 0
disksleep 10
sleep 1 (sleep prevented by Electron, coreaudiod, coreaudiod, sharingd, powerd, Music)
hibernatemode 3
ttyskeepawake 1
displaysleep 60
tcpkeepalive 1
lowpowermode 0
womp 1
输出里有一行:
sleep 1 (sleep prevented by Electron, NeteaseMusic, coreaudiod, coreaudiod, ...)
coreaudiod 出现了两次。
我盯着这行字看了一会儿。coreaudiod 是 macOS 的音频核心守护进程,正常情况下只有一个。出现两次,意味着系统里有两套并行运转的音频图——一套是真实的扬声器,另一套是某个虚拟设备。
虚拟音频设备?eqMac 驱动我已经删除了,就剩ToDesk?
差点忽略的关键细节
我之前测试过 ToDesk——停掉了它的后台服务,但爆音没消失,所以我以为它没问题,就排除掉了。
但我忽略了一件事:停服务和卸载 HAL 驱动是两回事。
ToDesk 的 launchd 服务负责运行远程桌面功能,可以随时停止。但它的 HAL 驱动是由 coreaudiod
在启动时直接加载的,停服务根本不影响驱动的加载。那个虚拟音频设备一直挂在那里,安静地拖累着整个音频管线。
我把驱动文件移走,重启 coreaudiod:
sudo mv /Library/Audio/Plug-Ins/HAL/ToDeskOutputDriver.driver ~/Desktop/
sudo pkill coreaudiod
播放音乐,切换窗口。
舒缓的音乐~
跑 sudo purge。
还是舒缓的音乐~,终于找到原因了,ToDesk!!! 终于可以听边听杰伦新专辑边coding了!
再次检查:
❯ pmset -g
System-wide power settings:
Currently in use:
standby 1
Sleep On Power Button 1
hibernatefile /var/vm/sleepimage
powernap 1
networkoversleep 0
disksleep 10
sleep 1 (sleep prevented by useractivityd, Electron, sharingd, NeteaseMusic, coreaudiod, powerd)
hibernatemode 3
ttyskeepawake 1
displaysleep 60
tcpkeepalive 1
lowpowermode 0
womp 1
为什么会这样
ToDesk 的 HAL 驱动在系统里创建了一个虚拟音频输出设备,专门用于远程桌面时把本机声音传给对端。这本身没什么问题,但这个虚拟设备会让 CoreAudio 同时维护两套音频图,整体处理开销变大。
平时 CPU 够用,多这点开销无所谓。但一旦系统有抖动——切窗口让 GPU 和性能核突然拉起来,或者 purge 之后磁盘 I/O 暴增——音频实时线程就来不及在 deadline 前填满缓冲区,缓冲区欠载,爆音。
ToDeskOutputDriver.driver 是 ToDesk 安装的虚拟音频设备 HAL 插件,供远程桌面会话时传输音频使用。当它被加载时,会产生以下连锁问题:
ToDesk HAL 驱动加载
│
├─ CoreAudio 创建第二套音频图(虚拟设备)
│ └─ coreaudiod 持有两个电源断言 → pmset 显示两个 coreaudiod
│
└─ 整体音频管线处理开销增加
└─ CPU 抖动时(切窗口 / purge 后 I/O 暴增)
└─ 实时音频线程来不及填充缓冲区
└─ 音频缓冲区欠载(Buffer Underrun)
└─ 爆裂声 / 静音
为什么以前没问题? 我最近刚更新过我的ToDesk,可能是 ToDesk 在某次静默更新中更换了 HAL 驱动实现,新版本在 M1 Pro 上存在兼容性问题,导致虚拟设备的处理开销显著增大。
至于为什么以前没事?最可能的原因是 ToDesk 在某次更新里悄悄换了 HAL 驱动的实现,新版本在 M1 Pro 上效率变差了,开销变大了,容错空间也就没了。
解决方案
方案 A:永久删除 HAL 驱动(推荐)
如果不需要远程桌面时的音频传输功能:
sudo rm -rf /Library/Audio/Plug-Ins/HAL/ToDeskOutputDriver.driver
sudo pkill coreaudiod
ToDesk 的远程控制功能完全不受影响,只是远程会话中对方听不到本机声音。
方案 B:按需切换
如果偶尔需要远程音频:
需要远程音频时,移回驱动
sudo mv ~/Desktop/ToDeskOutputDriver.driver /Library/Audio/Plug-Ins/HAL/
sudo pkill coreaudiod
不需要时,移走驱动
sudo mv /Library/Audio/Plug-Ins/HAL/ToDeskOutputDriver.driver ~/Desktop/
sudo pkill coreaudiod
本文只是提供一种思路,大家可以按需排查是否本机其它驱动导致的。
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://notemi.cn/mac-frequent-firecrackers-sound-resolved.html