使二合一声卡耳机麦克风生效整理

前言

自我这台华硕 VM510LI 安装黑苹果以来一直留下两个问题未解决,一是 VGA,二是耳机麦克风无输入。今天终于在远景坛友关云长羽帖子的帮助下解决了麦克风无输入的问题。

帖子链接:【声卡驱动完善进阶】——关于耳机杂音解决办法及三节点信息驱动双麦克风的猜想

修改 AppleALC

过程整理

根据关云长羽的帖子,启发了我,我是 ALC233,和他的声卡一摸一样,但是我们两个的 Codec 并不一样,他内置麦克风有效节点是 Node 0x1a 而我的是 Node 0x1b,故此我并不可以直接使用他的驱动以及方法。

后来我看他的过程,是使用 layout13,他 layout13 本来就有 LineIn 这个线路输入节点,而我并没有,Pathmap 里面也没有关于 0x19 (25)节点的路径,故此我声卡要耳机麦克风生效的话,必须使用符合以下条件。

  • layout4.xml 设定 Inputs 的 Mic 和 LineIn。
  • 添加 LineIn 的 MuteGPIO(如果你的节点是 VREF_80 或者其他数值的话)
  • PlatformsX.xml 中需要添加 Node 0X19 的有效路径。
  • PinConfigData.kext 里添加 Node 0x19的 ConfigData。

关于 LineIn 这个节点查找,为何是0X19,关云长羽原贴上有说,而我猜测是不是和修改 Pin Widget Control 后耳机正常无杂音的节点有关系?关于耳机杂音问题参考我之前写的帖子:http://bbs.pcbeta.com/viewthread-1733228-1-1.html

layout4.xml

layout4配置

  • MuteGPIO 由 Noid 0x19 的VREF_80 0x50+0x0100+0x19 > 1342242841(我的 Node 节点是 VREF_HIZ,但是从 ID3 和 ID13 提取的都有这个,当时我不确定是否这个值会影响结果,故此我也加进去了)
  • SignalProcessing 可以放在 Mic,也可以放在 LineIn,放在那里那里就有麦克风降噪。详细可以看看紫米的帖子完整製作仿冒 LegacyHDA.kext (12/16)

Platforms4.xml

在 AppleALC 里面,ALC233 ID4 的 PathMaps 是没有 Node 0x19 的路径的,因为 Node 19在我们的 Codec 里面根本不是有效节点。

但既然关云长羽说尝试一下将 Node 0x19这个当成有效的 LineIn 节点来做,那么我就直接按照仿冒贴的方法,找到 0X19的 PathMaps。(怎么找请看上面说到的紫米帖)

PathMaps配置

PinConfigData.kext 添加 Node 0X19 的 ConfigData

这里我偷了下懒,直接从 ID3 和 ID13 复制了 019开头的四组节点信息过来,因为同款声卡,Codec 是一样的,既然前人已经写了数据,那么应该差不了多少。

提取 AppleALC ID4 的 ConfigData

1
2
3
4
01471C10 01471D00 01471E17 01471F90
01B71C20 01B71D00 01B71EA0 01B71F90
02171C30 02171D10 02171E21 02171F01
01470C02

AppleALC 提取的 ID13

1
2
3
4
01471C10 01471D00 01471E17 01471F99
02171C20 02171D10 02171E21 02171F03
01A71C30 01A71D01 01A71EA0 01A71F99
01971C40 01971D10 01971E81 01971F03

后来我将 Node 0X19 从 ID13提取出来,然后放入 ID4 的 ConfigData 中,最终的 ConfigData(其中我将最后一个数字改成1,并不是必须,我看紫米的帖子后瞎折腾的,后来成功后发现可用,也就留着没改了。)

1
2
3
4
01471C10 01471D00 01471E17 01471F90
01B71C10 01B71D00 01B71EA0 01B71F90
02171C30 02171D10 02171E21 02171F01
01971C20 01971D10 01971E81 01971F01

结果

OK 修改好 AppleALC 编译后,测试一下关云长羽的方法,的确成功了,线路输入有了,而且也有电频输入。

可是,发现了一个问题,第二次插入后再也无法切换回线路输入,而且耳机插入后,又像以前那样只有背景声了。(感觉问题更糟糕了)

用 EAPD-Codec-Commander-master RM 项目的 widget_dump.sh 查看,发现一开机因为我用了脚本,开机是设置 0X19为24,故此第一次插入是正常的,然而拔出后,0X19变成02了,而 0X1B(内置麦克风节点)变成24,再插入耳机,这两个数字不会变了,一直是那样。

后来反复研究无果,编译 AppleALC,修改了无数遍 layout 和 Pathmap,折腾的死去活来的。

第二天,复习关云长羽的帖子,发现他提到的 ALCPlugFix 帖子,我又去看了下这个项目的代码和关云长羽提到的 main.m 文件源码部分,不会编程,但是我发现了一个比较有趣的地方。

main.m

使用 ALCPlugFix 解决耳机插入拔出的 Pin Widget Control 设定

ALCPlugFix 这个程序,作者没有写任何的说明,我也是从关云长羽的帖子得知这个程序。

ALCPlugFix 项目地址

后来发现个程序会检测耳机的插入和拔出情况,根据插入或者拔出,可以运行 Shell。

我现在需要的就是:

插入耳机的时候 Node 0x19 Pin Widget Control 为 24,Node 0X1B Pin Widget Control 为 02。

拔出耳机时候 Node 0x19 Pin Widget Control 为 02,Node 0X1B Pin Widget Control 为 24。

最终我根据上章节结果里截图的设置。并且编译后运行 ALCPlugFix 后,耳机的所有问题都得到解决了。

还发现作者已经写好了开机自运行的安装脚本。

使用方法

下载我编译好的 ALCPlugFix.zip(编译只适合 ALC233 的情况,如果是需要运行其他的 hda-verb 命令,自己按照上图填好你需要的 hda-verb 命令。)

cd 到 ALCPlugFix 的解压目录,运行以下命令

1
2
sudo chmod +x install.sh
sudo ./install.sh

脚本会安装 ALCPlugFix 和 hda-verb 到 /usr/bin,然后安装 good.win.ALCPlugFix.plist 自启动服务,并加载。(hda-verb 需要放入 CodecCommander.kext)

和我一样都是 9CC3 的朋友可以直接下载我做好的 AppleALC_For_ALC233_LayoutID4.zip驱动。

提供 AppleALC_For_ALC233_LayoutID4 源码参考