dump-coeff.sh
工具概述
使用 AppleALC 的 alc-verb
在 macOS 中转储 HDA 编解码器节点的处理功能,
前置准备工作
把alc-verb
文件放入到/usr/local/bin
命令如下
sudo cp ./alc-verb /usr/local/bin
问题及解决办法
在 AppleALC 中正常设置 Pin Configuration(这是一个单独的问题)。但是在Mac 系统上一些声卡还需要设置供应商特定的处理上限值。
这个脚本可以协助识别这些 ConfigData 中的附加值。
问题:
a)在AppleALC中找到了一个layout,声音看起来像在工作(所有滑块等都存在),但没有声音,而这个声卡在 Linux 上有声音。
b) 在 macOS 和 Linux 的干净启动中,有声音,但在 Windows 中使用 Realtek 声卡驱动程序后,在 macOS 或 Linux 中无声音。同样,滑块存在,声音看起来没问题,但没有声音。
解决方案
通常,这是因为未设置(问题 a.)或设置了特定于供应商的节点上的某些处理功能,但随后由适用于 Windows 的 Realtek 声音驱动程序(问题 b.)再次主动清除(在 sutdown 上)。
诀窍是能够比较有声音和无声音之间的处理上限值。
问题a的解决办法
对于问题a,您需要在Linux中转储参数(带声音)和在macOS中转储参数(无声音)。
问题b的解决办法
对于问题b.您需要在Windows之后的冷启动到macOS(即有声音)和在Windows之后的热启动到macOS(即没有声音)时转储参数。(在 Linux 中进行初始转储仍然很有用,以获取正确的值,请参见下文。ncoeff
Linux 参数转储
注意:如果您已经有完整安装,则可以从完整安装中导出,如果没有可以从Linux live USB导出,方法都是相同的。
首先执行以下命令,该命令会将处理上限转储添加到 Linux 编解码器转储中:
echo 1 | sudo tee /sys/module/snd_hda_codec/parameters/dump_coef
然后使用以下命令转储 Linux 编解码器:
cat /proc/asound/card0/codec#0
您可能需要更改声卡或编解码器编号。
在转储中搜索"processing caps" - 通常只有一个节点具有这些上限。对于具有处理上限的每个节点,将有一个值。ncoeff
macOS 参数转储
使用此 dump-coeff.sh
脚本。
device-index:通常为 0,但您可能需要更改此值才能访问正确的编解码器,我的电脑上就是1。
node-id:在 Linux 编解码器转储中看到的相同节点 ID 值。
count:这应该是在 Linux 编解码器转储中看到的值。ncoeff
该脚本将在 macOS 中以类似于 Linux 编解码器转储的格式转储处理上限值:应适用于 ,在从 Linux 编解码器转储中仅提取相关行后。diff
Windows 参数转储
来自hla63的信息:"华硕博客上的RtHDDump(Windows应用程序)"可用于将这些值转储到Windows上。
现在怎么办?
现在,您可以看到哪些"processing caps"不同。你可能会发现说10或11个值不同。在这一点上,需要一些猜测和常识,以便弄清楚哪些值是重要的 - 通常你只需要改变1或2个值来获得声音,所以你需要实验来找到哪些值是重要的。
假设节点0x20,“processing caps” 0x37 0x0101有声音,而0x0100没有声音。然后,要设置所需的值,您需要执行以下操作:
alc-verb 0x20 0x5 0x37
(将处理系数指数设置为接下来读/写)
alc-verb 0x20 0x4 0x0101
(设置处理系数的值)
在上述命令之后,编解码器现在将准备好写入(或读取)下一个大写字母(0x38),因此为了测试写入是否有效,我们需要:
alc-verb 0x20 0x5 0x37
(将处理系数指数设置为接下来读/写)
alc-verb 0x20 0xC 0x0
(读取值处理系数的值)
如何使更改永久生效?
希望经过一些上面的游戏后,你会得到声音。现在,您希望使更改永久生效。这需要打包动词并将它们添加到AppleALC中的布局中。ConfigData
以0x7或0xF开头的动词是3位(12位)动词,例如0x705,0xF05。其他动词是 1 位(4 位)动词。原生 macOS 和原生 Intel HDA 惯例是将 4 位谓词写为单个数字,例如,0x4,0xC;但是Linux惯例是将它们写成三位数字,始终以0作为第2和第3位数字,例如,0x400,0xC00。
12 位谓词的包装如下:
0x0nnvvvdd
4 位谓词的包装如下:
0x0nnvdddd
其中 nn 是节点 ID;v 或 vvv 是动词;dddd 或 dd 是数据。(打包版本始终完全相同,无论用于编写扩展动词的约定如何。
例如:
alc-verb 0x20 0x5 0x37
alc-verb 0x20 0x4 0x0101
包装到:
0x02050037
0x02040101
处理上限设置始终成对出现,如上例所示。第一个动词是SET_COEF_INDEX
(又名0x5,0x500),并在节点上设置处理系数,该系数将由下一个命令读取或写入。第二个动词是SET_PROC_COEF
(又名0x4,0x400),它实际上设置了值。
找到使用 手动启用声音的最小动词后,您可以打包它们并将其添加到AppleALC中动词数据的末尾,以用于声卡和布局。alc-verb ConfigData
要尝试此操作,您可以直接在 EFI 驱动器上进行编辑。确保标识并编辑您正在使用的编解码器 ID 和布局 ID 的条目。应将任何新值添加到现有 ./EFI/OC/Kexts/AppleALC.kext/Contents/Info.plistConfigData
AppleALC PR?
如果您在Realtek Windows驱动程序之后修复了声音(并且您已经确定了需要更改的最小处理coefs数量),那么将更改作为PR提交给AppleALC可能是一个好主意,因为它可能会为其他用户解决相同的问题。您应始终与原始布局作者核实他们对更改是否满意。
关于语法的说明alc-verb
alc-verb 0x20 0x4 0x0101
也可以作为 或 运行 (即 接受 Apple/Intel 语法或 Linux 语法动词)。alc-verb 0x20 0x400 0x0101alc-verb 0x20 SET_PROC_COEF 0x0101alc-verb
在 Linux 上(使用而不是 )后两个版本有效,但第一个版本不起作用(即 只接受 Linux 语法动词)。hda-verb alc-verb hda-verb
从AppleALC版本1.6.9开始使用,所有三个版本都可以正常工作。在版本 1.6.9 之前使用 AppleALC,只有第一个版本可以正常工作。alc-verb