解决休眠唤醒外放丢失:CodecCommander.kext 2.7.1
概述
CodecCommander.kext 是黑苹果星球搜集到的开源的音频辅助驱动,用于更新 HDA(高清音频)编解码器上的 EAPD(外部放大器)状态,该编解码器在扬声器或耳机节点上使用给定的放大器。
在 macOS 中,EAPD 会在整个睡眠过程中关闭电源,因此在唤醒计算机后,音频仍无法正常工作。通常,此外部放大器存在于笔记本电脑和 ITX 主板上,最常见于带有 ALC269,ALC665 和类似编解码器的机器上。当机器进入睡眠状态时,即使看起来好像音频在工作,放大器也会断电,并且在唤醒后仍不会从扬声器/耳机发出声音,因为放大器需要发送一个编解码器命令才能通电。
此驱动旨在解决这个问题。
过去依赖自定义 IOAudioFamily,苹果公司的开源文件已更改,其中包含一种在睡眠唤醒后更新 EAPD 状态的方法,但是这种方法的弊端在于需要修改源才能进行。而众所周知,苹果公司倾向于在发布操作系统更新后将源的发布推迟3周至2个月。
无需等待苹果公司发布源,无需搜索节点布局匹配的 kext,也无需为不同的 macOS 版本(如果需要的话,可以使用几代)使用不同的驱动。
安装使用
必须在 Info.plist 中编辑设置。驱动定义了多个默认设置,这些设置的值为:
<key>Default</key>
<dict>
<key>Check Infinitely</key>
<false/>
<key>Check Interval</key>
<integer>3000</integer>
<key>Custom Commands</key>
<array/>
<key>Perform Reset</key>
<true/>
<key>Perform Reset on External Wake</key>
<true/>
<key>Perform Reset on EAPD Fail</key>
<false/>
<key>Send Delay</key>
<integer>300</integer>
<key>Update Nodes</key>
<true/>
<key>Sleep Nodes</key>
<true/>
</dict>
- 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
在引导过程中,睡眠时或唤醒时向编解码器发送自定义命令。结构如下:
<key>Custom Commands</key>
<array>
<dict>
<key>Command</key>
<data>AhcIgw==</data>
<key>Comment</key>
<string>0x21 SET_UNSOLICITED_ENABLE 0x83</string>
<key>On Init</key>
<true/>
<key>On Sleep</key>
<false/>
<key>On Wake</key>
<true/>
</dict>
</array>
实际命令是在任何 Plist 编辑器中指定的,无论是 Xcode 还是 PlistEdit。可以通过设置各自的标志来选择在冷启动,睡眠和唤醒时执行命令。
自定义配置
同样,创建配置文件的最简单方法是通过适当的 plist 编辑工具。必须定义一个新的配置文件,即 vendorid_deviceid,后跟配置文件名称:
<key>10ec_0269</key>
<string>Realtek ALC269</string>
如果用户的编解码器已经有一个配置文件,但是有不同的变体并且该配置不适用,则可以使用扩展的配置文件定义,例如:
<key>10ec_0269_HDA_1028_04d9</key>
<string>Realtek ALC269</string>
这里需要使用主板的制造商ID。要查这个ID,可以在 IORegistry 中查找或检查 CodecCommander 的日志:
CodecCommander: Version 2.4.0 starting.
CodecCommander: ....CodecVendor Id: 0x10ec0269
CodecCommander: ....Codec Address: 0
CodecCommander: ....Subsystem Id: 0x102804d9
CodecCommander: ....PCI Sub Id: 0x102804d9
然后,要设置配置文件,您需要创建一个字典,并命名为刚刚指定的名称。默认配置文件与自定义配置文件合并,因此要做的就是覆盖不匹配的默认设置。
<key>Realtek ALC269VB</key>
<dict>
<key>Custom Commands</key>
<array>
<dict>
<key>Command</key>
<data>AhcIgw==</data>
<key>Comment</key>
<string>0x21 SET_UNSOLICITED_ENABLE 0x83</string>
<key>On Init</key>
<true/>
<key>On Sleep</key>
<false/>
<key>On Wake</key>
<true/>
</dict>
</array>
<key>Send Delay</key>
<integer>20</integer>
<key>Sleep Nodes</key>
<false/>
</dict>
HDMI 编解码器
默认情况下,HDMI 编解码器已禁用,以防止 CodecCommander 连接到它们上。如果出于某种原因需要修改 HDMI,可随时删除此限制。
FAQ
从半睡眠状态恢复后音频丢失?
发生这种情况的唯一情况是,当播放音频并突然决定要让机器进入睡眠状态时。如果此时退出进入睡眠状态,系统将丢失音频,直到用户停止剩下的播放并允许编解码器进入空闲状态。
1. 本站资源收集于网络,仅做学习和交流使用,请于下载后24小时内删除。如果你喜欢我们推荐的软件,请购买正版支持作者。
2. 如有无法下载的链接,联系:admin#heipg.cn,或到QQ群进行反馈,我们将及时进行处理。
3. 本站发布的内容若侵犯到您的权益,请联系站长删除,联系方式:admin#heipg.cn,我们将第一时间配合处理!
黑苹果星球 » 解决休眠唤醒外放丢失:CodecCommander.kext 2.7.1