注:該方法經(jīng)測試支持12、13、14、15系統(tǒng),但每次升級系統(tǒng)都需要下載最新的AppleALC-master進(jìn)行重新編譯,并配合最新的lilu.kext才能正常驅(qū)動。
教程以ALC892為例,主要針對筆記本的聲卡。由于筆記本聲卡經(jīng)常同一型號的聲卡驅(qū)動并不能通用,往往需要自己定制。臺式機大多沒有這個問題,只需要用AppleALC-master生成通用聲卡即可,通用聲卡不好用的可以借鑒本篇文章的思路。(臺式機或者嫌麻煩的,可以直接跳到第八節(jié),直接進(jìn)行編譯,如果不完美再進(jìn)行定制)
目錄:
一、定制驅(qū)動目標(biāo)文件
二、定制聲卡信息提取
三、所需工具
四、codec提取方法
五、修改configdata信息
六、推導(dǎo)節(jié)點及Platforms.xml修改
七、制作輔助文件
八、編譯聲卡驅(qū)動
九、實現(xiàn)聲卡驅(qū)動
十、總結(jié)
一、定制驅(qū)動目標(biāo)文件
完全自制聲卡驅(qū)動,主要是要制作4個文件:
1.Applealc-master——resources——alc892中Platforms.xml.zlib(節(jié)點文件)
2.Applealc-master——resources——alc892中l(wèi)ayout1.xml.zlib(layoutID文件)
3.Applealc-master—>resources—>alc892—>info.Plist
(描述聲卡以及對layout和Platforms文件位置、id的說明)
4.Applealc-master—>resources—>pinconfigs.kext—>contents—>info.Plist
(包含codecID和layoutID相關(guān)值)
二、定制聲卡信息提取
1、提取聲卡codec
2、verbit獲取你的聲卡configdata和節(jié)點信息
3、推導(dǎo)自己的Platforms節(jié)點
三、所需工具
1、Ubuntu系統(tǒng)。
2、verbit
將codec生成verbs.txt文件。
鏈接:verbit.zip
3、zlib轉(zhuǎn)換器
鏈接:已包含修改好的Platforms.xml以及zlib轉(zhuǎn)換器
4、AppleALC-master聲卡驅(qū)動
鏈接:vit9696大神最新AppleALC-master
需要最新lilu.kext配合,并且需要完整lilu才行(lilu中不能缺少Resources文件夾)
鏈接:vit9696大神最新Lilu-master
四、codec提取方法
1、U盤安裝Ubuntu系統(tǒng)
網(wǎng)上很多需要在U盤中寫入鏡像,其實現(xiàn)在的Ubuntu也有類似WinPE的功能,將下載好的安裝包解壓到U盤中即可。新版ubuntu出現(xiàn)了解壓后無法引導(dǎo)的情況,用制作U盤啟動盤的方法把鏡像寫入U盤就可以(記得提前把U盤數(shù)據(jù)轉(zhuǎn)移,會格盤的)。
開機啟動時引導(dǎo)進(jìn)入U盤的Ubuntu系統(tǒng)
出現(xiàn)Ubuntu的系統(tǒng)選項,選擇Try Ubuntu without installing

進(jìn)入Ubuntu系統(tǒng)的桌面打開我的電腦,進(jìn)入路勁proc/asound/card1,將文件夾里面的所有名為codec#開頭的文件都復(fù)制出來,其中一個就是你的聲卡codec,千萬不要把HDMI音頻的文件復(fù)制出來了(如果card1沒有就一定在card0文件夾,筆記本一般都在card1中)
2、進(jìn)入macOS系統(tǒng)中,將提取的Codec.txt改名為codec_dump.txt放在桌面上,將verbit.zip解壓到桌面,打開終端輸入:
cd desktop
./verbit codec_dump.txt > verbs.txt
獲得verbs.txt(部分朋友獲取的為空白,是因為兩個命令一起使用的結(jié)果)
注意:部分聲卡終端輸入命令會得到一個錯誤文件,
文件的內(nèi)容如下:
Codec: Realtek ALC269VC
Address: 0
AFG Function Id: 0x1 (unsol 1)
需要刪除codec_dump.txt文件中的這行數(shù)據(jù)AFG Function Id: 0x1 (unsol 1),也要把空格刪除完。再執(zhí)行一次命令,得到正確的verbit.txt文件。(感謝Lenged發(fā)現(xiàn)問題)

打開codec.txt搜索上面的紅框中的Node,找到每個Node下面的Pin Default那行,看看中間是否有[N/A],將有[N/A]的將“節(jié)點信息”中的一行刪除。
刪除后,紅框中的modified verbs每行四個數(shù),一共7組就是需要的configdata(codec.txt內(nèi)搜索EAPD字樣,存在EAPD,必須在configdata中該接口最后加入一組01470C02)
五、修改configdata信息
①第一組

紅框中是接口的順序。數(shù)字越低那么優(yōu)先權(quán)就越高。如果有 [N/A] 的接口既是無用的接口可以設(shè)成 f。
內(nèi)置麥克風(fēng) —— Mic at Int N/A
內(nèi)置揚聲器 ——Speaker at Int N/A
線路輸出 —— line out
外置麥克風(fēng) —— Mic at Ext Rear
線路輸入 —— Line In at Ext Rear
耳機 —— HP Out at Ext Rear
SPDIFOut —— SPDIF Out at Ext Rear
如果你的聲卡有l(wèi)ine out 節(jié)點那么
Mic at Int N/A =5
Speaker at Int N/A =1
line out =2
Mic at Ext Rear =6
Line In at Ext Rear =5
HP Out at Ext Rear =3
SPDIF Out at Ext Rear =4
如果無line out則
Mic at Int N/A =4
HP Out at Ext Rear =2
Mic at Ext Rear = 5
Line In at Ext Rear =4
Speaker at Int N/A =1
SPDIF Out at Ext Rear =3
注:以上關(guān)聯(lián),是我自行摸索出來的,僅供參考。感謝 @jomggx
提供出的建議,我將相對規(guī)范貼出來供參考
1.Mic(Mic at Int)
2.Line In
3.SPDIF In
4.IntSpeaker(Speaker at Int )
5.Headphone(HP Out at Ext Rear )
6.SPDIF Out
7.Ext Mic(Mic at Ext Rear)
8.Line Out
F.屏蔽
(耳機優(yōu)先級一定要低于內(nèi)置揚聲器,外置麥克風(fēng)一定要低于內(nèi)置麥克風(fēng),默認(rèn)開啟的是內(nèi)置揚聲器和麥克風(fēng),第四組數(shù)據(jù)把耳機設(shè)置為0,既插入檢測。這樣就可以實現(xiàn)自動切換了。)
有興趣的可以查看以下資料
https://www.insanelymac.com/forum/topic/149128-how-to-pinconfig-for-linux-users-%EF%BF%BD-realtek-alc883-example/
http://bbs.pcbeta.com/viewthread-1772989-1-1.html
②第二組

line out設(shè)置為f,其余皆為0
③第三組

第三組為接口顏色,這個改不改無所謂,我是默認(rèn)沒改
0 = Unknown
1 = Black
2 = Grey
3 = Blue
4 = Green
5 = Red
6 = Orange
7 = Yellow
8 = Purple
9 = Pink
A - D = Reserved
E = White
F = Other
④第四組

接口為 0,表示當(dāng)接口被檢測到時使用。如果是筆記本的話內(nèi)建的麥克風(fēng)和揚聲器要設(shè)成1,即當(dāng)耳機插入時,內(nèi)建揚聲器靜音,耳機0 接口被檢測到就是用耳機。
Mic at Int N/A =1
Speaker at Int N/A =1
line out =0
Mic at Ext Rear =0
Line In at Ext Rear =0
HP Out at Ext Rear =0
SPDIF Out at Ext Rear =1
⑤第五組

設(shè)定接口功能信息,按照以下進(jìn)行修改
0 = Line Out
1 = Speaker
2 = HP Out
3 = CD
4 = SPDIF Out
5 = Digital Other Out
6 = Modem Line Side
7 = Modem Handset Side
8 = Line In
9 = AUX
A = Mic In
B = Telephone
C = SPDIF In
D = Digital Other In
E = Reserved
F = Other
Mic at Int N/A =a
Speaker at Int N/A =1
line out =0
Mic at Ext Rear =8(ALC892需要通過line in實現(xiàn)外置mic)
Line In at Ext Rear =8
HP Out at Ext Rear =2
SPDIF Out at Ext Rear =4
⑥第六組

連接裝置類型
0 = Unknown
1 = 1/8" stereo/mono
2 = 1/4' stereo/mono
3 = ATAPI internal
4 = RCA
5 = Optical
6 = Other Digital
7 = Other Analog
8 = Multichannel Analog (DIN)
9 = XLR/Professional
A = RJ-11 (Modem)
B = Combination
F = Other
通常接口是 1/8" stereo/mono,SPDIF 是 Optical。筆記本內(nèi)建的接口是 ATAPI internal。(這只是描述,對驅(qū)動沒有本質(zhì)影響,我默認(rèn)沒有修改。)
⑦第七組

0為插入接口的,如外置麥克風(fēng)、耳機等。
(如果codec_dump出來有 [N/A] 的就是無用的port,數(shù)字為4。)
9為給筆記本內(nèi)建,像內(nèi)置揚聲器、內(nèi)置麥克風(fēng)等
Mic at Int N/A =9
Speaker at Int N/A =9
line out =0
Mic at Ext Rear =0
Line In at Ext Rear =0
HP Out at Ext Rear =0
SPDIF Out at Ext Rear =0
⑧第八組

插口所在位置
0 = Rear(后)
1 = Front(前)
8=HDMI
9=ATAPI (內(nèi)建)
(這只是描述,對驅(qū)動沒有本質(zhì)影響,我默認(rèn)沒有修改。)
將八組數(shù)據(jù)修改后進(jìn)行整理得到configdata值(每個參數(shù)中保留一位空格):
codec.txt內(nèi)搜索EAPD,存在EAPD字樣的接口后加入 0XX70C02(XX為接口名)
01271c50 01271d01 01271ea6 01271f90
01471c10 01471d01 01471e17 01471f90 01470C02
01771c20 01771d10 01771e01 01771f01
01871c60 01871d10 01871ea1 01871f01
01a71c50 01a71d10 01a71e81 01a71f01
01b71c30 01b71d10 01b71e21 01b71f01 01b70C02
01e71c40 01e71d11 01e71e45 01e71f01
六、推導(dǎo)節(jié)點及Platforms.xml修改
鏈接:已包含修改好的Platforms.xml以及zlib轉(zhuǎn)換器
1、推導(dǎo)節(jié)點

紅框中為接口節(jié)點。
想要實現(xiàn)接口功能需要推導(dǎo)節(jié)點,一般為3個節(jié)點實現(xiàn)一個接口功能,且節(jié)點一般不重復(fù)。其中輸入為反向推導(dǎo),輸出為正向推導(dǎo),即輸入時接口節(jié)點是最后一個節(jié)點,輸出時接口節(jié)點是第一個節(jié)點(codec中的節(jié)點值為16進(jìn)制,Platforms.xml中需要轉(zhuǎn)換成10進(jìn)制)
注:部分朋友的揚聲器、mic等只有兩個節(jié)點,疑似接口功能被屏蔽,需要在linux下激活接口才能提取到信息。過程復(fù)雜,建議詳細(xì)查看黑果小兵的聲卡驅(qū)動定制教程,本教程已不適用。
①輸入以Mic at int(內(nèi)置麥克風(fēng))為例在codec_dump.txt搜索0x12,
搜索到2個0x12,一個為節(jié)點本身即Node 0x12,一個在關(guān)聯(lián)節(jié)點0x22下


然后在codec_dump.txt搜索0x22,搜索到2個0x22,一個為節(jié)點本身即Node 0x22,一個在關(guān)聯(lián)節(jié)點0x09下


按照輸入節(jié)點反向推導(dǎo),獲得內(nèi)置麥克風(fēng)的節(jié)點為:
十六進(jìn)制:0x09 → 0x22 → 0x12
十進(jìn)制:9 → 34 → 18
②輸出以Speaker at Int N/A(內(nèi)置揚聲器)為例在codec_dump.txt搜索0x14,
搜索到4個0x14,首先找到節(jié)點本身即Node 0x14

找到connection中有關(guān)聯(lián)節(jié)點0x0c
在codec_dump.txt搜索0x0c,搜索到6個0x0c,首先找到節(jié)點本身即Node 0x0c

找到connection中有關(guān)聯(lián)節(jié)點0x02,0x0b,在已選節(jié)點不重復(fù)的前提下,優(yōu)先選擇數(shù)字小,即0x02節(jié)點
按照輸出節(jié)點正向推導(dǎo),獲得內(nèi)置揚聲器的節(jié)點為:
十六進(jìn)制:0x14 → 0x0c → 0x02十進(jìn)制: 20 → 12 → 2
由此推導(dǎo)出所有節(jié)點,由于節(jié)點很多,可能出現(xiàn)有共同關(guān)聯(lián)的節(jié)點,且沒有其他節(jié)點,則更換上個節(jié)點,重新推導(dǎo),直到?jīng)]有重復(fù)的為止。

2、修改Platforms.xml
根據(jù)我的Platforms.xml進(jìn)行修改即可

PathMap下一共三大項:
0為輸入(第一輸入項,外置mic可以實現(xiàn)自動切換的只需要一個輸入項,無法實現(xiàn)的需要第二輸入項),1為輸出(第一輸出項),2為SPDIF
輸入項分為三大項:
0為內(nèi)置mic,1為linein,2為外置mic(ALC892外置mic通過linein實現(xiàn),由此刪除外置mic項)
輸出項分為三大項:
0為耳機,1為內(nèi)置揚聲器,2位lineout
以內(nèi)置mic為例:內(nèi)置mic底層三項代表三個節(jié)點,將之前推導(dǎo)的三個節(jié)點按順序輸入到NodeID中,在內(nèi)置mic節(jié)點添加boost項(設(shè)置電平增效數(shù)值為1、2、3,數(shù)值3最大),設(shè)置為3,可以減少mic雜音的情況(外置mic和linein的節(jié)點也可以添加boost項)

部分機器會出現(xiàn)插入外置mic不識別的情況,其實只是外置mic無法自動切換導(dǎo)致無法顯示出來,需要調(diào)整將節(jié)點到第二類輸入項中來實現(xiàn)手動切換,如圖

以此類推,所有節(jié)點修改完畢后,在PathMapID中輸入你的聲卡型號,Platforms.xml完畢,保存后用zlib轉(zhuǎn)換器轉(zhuǎn)換成Platforms.xml.zlib格式。
七、制作輔助文件
1、Applealc-master——resources——alc892中的info.Plist
用來描述你的聲卡以及對layout和Platforms文件位置、id的說明
ALC892的codecID為283904146,這是0x10ec0892十六進(jìn)制轉(zhuǎn)換過來的。在codec_dump開頭中可以找到,macos的計算器有進(jìn)制轉(zhuǎn)換功能。
然后修改layouts第一項,修改id為1,path地址改為你做好的layouts.xml.zlib文件,Platforms設(shè)置方式一樣。(全篇LayoutID統(tǒng)一為1,也可統(tǒng)一為其他數(shù)字)

2、Applealc-master——resources——pinconfigs.kext——contents中的info.Plist
集合了所有聲卡的信息,我們只用保留需要的,為防止沖突,只修改第一項,其他都可以刪除。第一項中修改codec為alc892,codecID為283904146,這是0x10ec0892十六進(jìn)制轉(zhuǎn)換過來的。在codec_dump開頭中可以找到,macos的計算器有進(jìn)制轉(zhuǎn)換功能。configData中修改為自己的configdata即可。LayoutID修改為1(全篇LayoutID所有統(tǒng)一為1,也可統(tǒng)一為其他數(shù)字)

3、Applealc-master——resources——alc892中l(wèi)ayout1.xml.zlib
描述聲卡型號以及聲卡ID信息
首先向zlib文件轉(zhuǎn)換為xml文件才可以編輯
LayoutID修改為1(全篇LayoutID所有統(tǒng)一為1,也可統(tǒng)一為其他數(shù)字),修改codecID為283904146,這是0x10ec0892十六進(jìn)制轉(zhuǎn)換過來的。在codec_dump開頭中可以找到,macos的計算器有進(jìn)制轉(zhuǎn)換功能。
pathmapID修改為892。部分聲卡需要刪除lineout項才能驅(qū)動,需要自行嘗試。

外置mic需要修改電壓控制值來實現(xiàn)外置mic驅(qū)動。
搜索codec中外置mic下的vref值,vref含義為初始電壓基礎(chǔ)上增加的百分比,如圖為vref為50。當(dāng)vref不為Hiz時,muteGPIO={(vref轉(zhuǎn)換為16進(jìn)制)+"0100"+node id}轉(zhuǎn)換為10進(jìn)制,codec中vref表示的是十進(jìn)制,計算時轉(zhuǎn)為16進(jìn)制。如:在節(jié)點 0x18發(fā)現(xiàn)vref_50,50轉(zhuǎn)換為16進(jìn)制=32,則muteGPIO=(32010018)轉(zhuǎn)換為10進(jìn)制=838926360;如果vref為Hiz,則muteGPIO=0

由于外置mic需要通過linein實現(xiàn),因此修改linein中的muteGPIO為838926360

最后確認(rèn)一共需要修改和定制的為4個文件:
1.Applealc-master——resources——alc892—>Platforms.xml.zlib
2.Applealc-master——resources——alc892—>layout1.xml.zlib
3.Applealc-master—>resources—>alc892—>info.Plist
4.Applealc-master—>resources—>pinconfigs.kext—>contents—>info.Plist
全篇所有的layoutID都為1,如果需要修改其他數(shù)字,需要注意layout文件名也需要修改,如layout25.xmI.zlib
這四個文件保存好以后,系統(tǒng)升級驅(qū)動失效時可獲取最新的AppleALC-master文件重新編譯即可,十分方便。
八、編譯聲卡驅(qū)動
下載好最新的AppleALC-master文件,由于10.12.6之后需要lilu.kext才能編譯并驅(qū)動聲卡,還需要下載最新的lilu.kext放置在AppleALC-master的根目錄,需要注意的是lilu.kext中必須包含有Resources(部分lilu.kext缺少該文件)
將之前定制好的四個文件,放置在對應(yīng)的位置,運行AppleALC-master中的AppleALC.xcodeproj

如果出現(xiàn)紅色嘆號報錯,可能出現(xiàn)以下問題:
1、缺少lilu.kext文件或lilu.kext中缺少resources下的文件(查找最新lilu.kext,并確保必須包含有Resources)

2、顯示缺少liluAPI,說明lilu.kext與AppleALC-master版本不對應(yīng),在下載時確保最新或者版本說明中相互對應(yīng),確保相互兼容。

九、實現(xiàn)聲卡驅(qū)動
將做好驅(qū)動和對應(yīng)版本的lilu.kext放到EFI—>CLOVER—>kexts—>10.13文件夾中。
然后在config.plist中加入以下代碼:
<dict>
<key>Audio</key>
<dict>
<key>Inject</key>
<string>1</string>
</dict>
在10.15系統(tǒng)升級后,部分朋友因為ALC聲卡驅(qū)動造成睡眠自動重啟,可以打入kexttopatch補丁
Find: 63 6F 6D 2E 61 70 70 6C 65 00 5F 5F 6B 65 72 6E 65 6C 5F 5F 00
Replace: 6E 6F 74 2E 61 70 70 6C 65 00 5F 5F 6B 65 72 6E 65 6C 5F 5F 00
clover注入ID不能讓這個聲卡驅(qū)動正常工作所以這里必須采用DSDT注入ID
打開DSDT搜索HDEF插入函數(shù)
Method (_DSM, 4, NotSerialized) // _DSM: Device-Specific Method`
{
Store (Package (0x0A)
{
"hda-gfx",
Buffer (0x0A)
{
"onboard-1"
},
"codec-id",
Buffer (0x04)
{
0x92, 0x08, 0xEC, 0x10 //修改為自己的聲卡型號
},
"layout-id",
Buffer (0x04)
{
0x01, 0x00, 0x00, 0x00//修改為自己的layoutID
},
"device-type",
Buffer (0x07)
{
"ALC892"http://修改為自己的聲卡型號
},
"PinConfigurations",
Buffer (Zero) {}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0) }
十、總結(jié)
以這種仿冒方式定制的聲卡,對于筆記本十分友好,同時也能很好的解決喚醒無聲以及雜音問題。以上教程是通過學(xué)習(xí)遠(yuǎn)景貼并總結(jié)個人經(jīng)驗寫成的,我個人定制聲卡驅(qū)動后沒有出現(xiàn)喚醒無聲以及雜音等問題,如果由以上問題沒有解決的,可以參考一下帖子。這里附上原貼,以及我個人的帖子
作者:13469977015002 傻瓜式仿冒聲卡驅(qū)動第二季(仿冒ALC892)
(適用于10.12和13)ALC892的經(jīng)驗之談,簡化大神教程幫助喜歡動手仿冒的朋友
部分不適用于該教程的聲卡可以根據(jù)黑果小兵的教程進(jìn)行嘗試,祝Good Lock。
黑果小兵:使用AppleALC聲卡仿冒驅(qū)動AppleHDA的正確姿勢