修改CodecCommander.kext 驅(qū)動(dòng)可以解決耳機(jī)有雜音和睡眠喚醒無法自動(dòng)切換或無聲的問題.
步驟:
打開CodecCommander.kext/Contents/里面的info.plist悄晃,如下圖
看到Codec Profiles 之后打開折疊遇骑,如下圖
紅色方框內(nèi)是我根據(jù)我surface pro 3 ACL288 聲卡改好的
第一紅色方塊內(nèi)的參數(shù)設(shè)定 10ec_0288_HDA_10ec_0191
打開原始的16進(jìn)制的顯卡信息圖,提取方法見我帖子http://www.reibang.com/p/f6b8bc6e69ea。
我的顯卡信息為
Codec: Realtek ALC288
Address: 0
Vendor Id: 0x10ec0288
Subsystem Id: 0x10ec0191
Revision Id: 0x100003
前面10ec_0288指的是 Vendor ID叉钥,后面 10ec_0191是Subsystem Id号杠。 這一項(xiàng)我取名為Realtek ALC288 SP3 這個(gè)名字自己隨便取嗜暴,只需要保持和第二個(gè)紅框中的名稱保持一致就行胀莹。
第二個(gè)紅框作用就是修正睡眠喚醒和雜音問題,我其實(shí)沒有感覺什么雜音困擾豆混。
第一個(gè)藍(lán)框Unsolicited Response的設(shè)定是為了修正睡眠喚醒耳機(jī)和外放切換的問題
Command值的 02170882 為Address+NodeID+708+設(shè)定值
查看我的聲卡信息中 HP Out at Ext 所在的節(jié)點(diǎn)篓像,并且找到節(jié)點(diǎn)信息中有Unsolicited: tag=xx, enabled=1 這一行。
Node 0x21 [Pin Complex] wcaps 0x40058d: Stereo Amp-Out
Control: name="Headphone Playback Switch", index=0, device=0
ControlAmp: chs=3, dir=Out, idx=0, ofs=0
Control: name="Headphone Jack", index=0, device=0
Amp-Out caps: ofs=0x00, nsteps=0x00, stepsize=0x00, mute=1
Amp-Out vals: [0x00 0x00]
Pincap 0x0000001c: OUT HP Detect
Pin Default 0x03211020: [Jack] HP Out at Ext Left
Conn = 1/8, Color = Black
DefAssociation = 0x2, Sequence = 0x0
Pin-ctls: 0xc0: OUT HP
Unsolicited: tag=01, enabled=1
Power states: D0 D1 D2 D3 EPSS
Power: setting=D0, actual=D0
Connection: 2
0x0c* 0x0d
0x21 SET_UNSOLICITED_ENABLE 0x82中的0x21為NodeID皿伺,0x82中的82為設(shè)定值
設(shè)定值是8bits的一個(gè)數(shù)员辩。記作a7 a6 a5 a4 a3 a2 a1 a0.
a7=1,表示enabled鸵鸥。
a6=0奠滑,沒意義
a5-a0丹皱,存放tag,需要將tag的值用6為數(shù)的二進(jìn)制值表示
tag=01(十進(jìn)制)=000001(二進(jìn)制)
則a7 a6 a5 a4 a3 a2 a1 a0=10000001
a7 a6 a5 a4=1000(二進(jìn)制)=8(十進(jìn)制)
a3 a2 a1 a0=0001(二進(jìn)制)=1(十進(jìn)制)
則設(shè)定值=81
最后加得到的設(shè)定值加1宋税,即82
第二個(gè)藍(lán)框 SET_PIN_WIDGET_CONTROL設(shè)定是為了修正耳機(jī)雜音摊崭。需要設(shè)定的是 Mic at Ext 所在的節(jié)點(diǎn)信息,我的節(jié)點(diǎn)信息如下:
Node 0x18 [Pin Complex] wcaps 0x40048b: Stereo Amp-In
Control: name="Mic Boost Volume", index=0, device=0
ControlAmp: chs=3, dir=In, idx=0, ofs=0
Control: name="Mic Jack", index=0, device=0
Amp-In caps: ofs=0x00, nsteps=0x03, stepsize=0x27, mute=0
Amp-In vals: [0x00 0x00]
Pincap 0x00003724: IN Detect
Vref caps: HIZ 50 GRD 80 100
Pin Default 0x03a11030: [Jack] Mic at Ext Left
Conn = 1/8, Color = Black
DefAssociation = 0x3, Sequence = 0x0
Pin-ctls: 0x24: IN VREF_80
Unsolicited: tag=02, enabled=1
Power states: D0 D1 D2 D3 EPSS
Power: setting=D0, actual=D0
Command 值的01870724為Address+NodeID+707+Pin-ctls
0x18 SET_PIN_WIDGET_CONTROL 0x24中的0x18為NodeID杰赛,0x24為Pin-ctls值
最后send delay 的值是 推遲發(fā)送命令的時(shí)間呢簸,單位是ms。如果命令發(fā)送太早乏屯,有可能導(dǎo)致無法執(zhí)行根时。
Sleep Nodes 這項(xiàng)無關(guān)緊要,也沒有什么危害性辰晕。
將改好后CodecCommander.kext放入S/L/E蛤迎,你的黑蘋果睡眠喚醒聲音切換就完成了。
現(xiàn)在還有更簡(jiǎn)單直接的hotpatch方式含友,將下面代碼扔進(jìn)MaciASL里替裆,生成aml文件扔進(jìn)patched文件夾,config文件添加讀取它就好了窘问。
// This SSDT demonstrates a custom configuration for ALC288.
// It is the same data that is currently in the Info.plist
// If you had a codec that needed the same configuration, you could
// load this SSDT in order to implement it without modifying the kext.
// It will override the defaults specfied by the CodecCommander Info.plist
// Customize to suit your needs.
DefinitionBlock ("", "SSDT", 1, "hack", "ALC288", 0)
{
External(_SB.PCI0.HDEF, DeviceObj)
Name(_SB.PCI0.HDEF.RMCF, Package()
{
"CodecCommander", Package()
{
"Custom Commands", Package()
{
Package(){}, // signifies Array instead of Dictionary
Package()
{
// 0x18 SET_PIN_WIDGET_CONTROL 0x24
"Command", Buffer() { 0x01, 0x87, 0x07, 0x24 },
"On Init", ">y",
"On Sleep", ">n",
"On Wake", ">y",
},
Package()
{
// 0x21 SET_UNSOLICITED_ENABLE 0x82
"Command", Buffer() { 0x02, 0x17, 0x08, 0x82 },
"On Init", ">y",
"On Sleep", ">n",
"On Wake", ">y",
},
},
"Perform Reset", ">n",
"Send Delay", 10,
"Sleep Nodes", ">n",
},
})
}
//EOF
不推薦hotpatch形式辆童,會(huì)導(dǎo)致外置mic無法使用,目前不知道原因南缓。