CodecCommander.kext是星辰云资源搜集到用于防止睡眠唤醒之后的无声,可用于修改CodecCommander驱动可以解决耳机有杂音和睡眠唤醒无法自动切换或无声的问题,

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,可随时删除此限制。

			<key>8086</key>
			<string>Disabled HDMI</string>
			<key>10de</key>
			<string>Disabled HDMI</string>
			<key>1002</key>
			<string>Disabled HDMI</string>				

FAQ

从半睡眠状态恢复后音频丢失?

发生这种情况的唯一情况是,当播放音频并突然决定要让机器进入睡眠状态时。如果此时退出进入睡眠状态,系统将丢失音频,直到用户停止剩下的播放并允许编解码器进入空闲状态。

下载地址

隐藏内容
本内容需权限查看
  • 普通: 9.9星币
  • 会员: 免费
  • 终身会员: 免费
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。