CodecCommander.kext是黑苹果屋搜集到用于防止睡眠唤醒之后的无声,可用于修改CodecCommander驱动可以解决耳机有杂音和睡眠唤醒无法自动切换或无声的问题,
CodecCommander.kext 是开源的音频辅助驱动,用于更新 HDA(高清音频)编解码器上的 EAPD(外部放大器)状态,该编解码器在扬声器或耳机节点上使用给定的放大器。
在 macOS 中,EAPD 会在整个睡眠过程中关闭电源,因此在唤醒计算机后,音频仍无法正常工作。通常,此外部放大器存在于笔记本电脑和 ITX 主板上,最常见于带有 ALC269,ALC665 和类似编解码器的机器上。当机器进入睡眠状态时,即使看起来好像音频在工作,放大器也会断电,并且在唤醒后仍不会从扬声器/耳机发出声音,因为放大器需要发送一个编解码器命令才能通电。
此驱动旨在解决这个问题。
过去依赖自定义 IOAudioFamily,苹果公司的开源文件已更改,其中包含一种在睡眠唤醒后更新 EAPD 状态的方法,但是这种方法的弊端在于需要修改源才能进行。而众所周知,苹果公司倾向于在发布操作系统更新后将源的发布推迟3周至2个月。
无需等待苹果公司发布源,无需搜索节点布局匹配的 kext,也无需为不同的 macOS 版本(如果需要的话,可以使用几代)使用不同的驱动。
安装使用
必须在 Info.plist 中编辑设置。驱动定义了多个默认设置,这些设置的值为:
- Check Infinitely 和 Check Interval 目前已无实际作用
- Perform Reset —从睡眠唤醒后是否执行完整的编解码器重置(在休眠后将编解码器返回冷启动状态)
- Perform Reset on External Wake —与上面相同,但用于用户过早中断机器进入睡眠状态时
- Perform Reset on EAPD Fail —如果 EAPD 更新在唤醒后失败,则驱动将执行完整的编解码器重置,以尝试恢复编解码器
- Send Delay —驱动将命令发送到编解码器之前需要等待的时间(以毫秒为单位),如果发送时间太早(取决于PC计算能力)可能不会响应
- Update Nodes —编解码器可以报告某些节点的 EAPD 功能,但是 EAPD 可能物理上并不存在。如果希望此功能以更新 EAPD 节点则启用
- Sleep Nodes —根据 Intel 的 EAPD 处理规范,当机器过渡到睡眠状态时,必须正确地挂起具有 EAPD 功能的节点。即使不遵循也不会有问题,可自行决定。
自定义 Commands & Commander Client
在引导过程中,睡眠时或唤醒时向编解码器发送自定义命令。结构如下:
实际命令是在任何 Plist 编辑器中指定的,无论是 Xcode 还是 PlistEdit。可以通过设置各自的标志来选择在冷启动,睡眠和唤醒时执行命令。
自定义配置
同样,创建配置文件的最简单方法是通过适当的 plist 编辑工具。必须定义一个新的配置文件,即 vendorid_deviceid,后跟配置文件名称:
如果用户的编解码器已经有一个配置文件,但是有不同的变体并且该配置不适用,则可以使用扩展的配置文件定义,例如:
这里需要使用主板的制造商ID。要查这个ID,可以在 IORegistry 中查找或检查 CodecCommander 的日志:
然后,要设置配置文件,您需要创建一个字典,并命名为刚刚指定的名称。默认配置文件与自定义配置文件合并,因此要做的就是覆盖不匹配的默认设置。
HDMI 编解码器
默认情况下,HDMI 编解码器已禁用,以防止 CodecCommander 连接到它们上。如果出于某种原因需要修改 HDMI,可随时删除此限制。
<key>8086</key>
<string>Disabled HDMI</string>
<key>10de</key>
<string>Disabled HDMI</string>
<key>1002</key>
<string>Disabled HDMI</string>
FAQ
从半睡眠状态恢复后音频丢失?
发生这种情况的唯一情况是,当播放音频并突然决定要让机器进入睡眠状态时。如果此时退出进入睡眠状态,系统将丢失音频,直到用户停止剩下的播放并允许编解码器进入空闲状态。
评论38