-
Notifications
You must be signed in to change notification settings - Fork 95
/
Copy pathUse-AppleALC-sound-card-to-drive-the-correct-posture-of-AppleHDA.html
317 lines (284 loc) · 177 KB
/
Use-AppleALC-sound-card-to-drive-the-correct-posture-of-AppleHDA.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
<!DOCTYPE html><html class="theme-next muse use-motion" lang="zh-CN"><head><meta name="generator" content="Hexo 3.8.0"><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=2"><meta name="theme-color" content="#222"><script src="//fastly.jsdelivr.net/npm/[email protected]/pace.min.js"></script><link href="/lib/pace/pace-theme-corner-indicator.min.css?v=1.0.2" rel="stylesheet"><meta name="google-site-verification" content="sDeZZSmv4NPbU3sXi1IL5l8PiZt1wVqR5EKUsxOjruY"><link href="https://fastly.jsdelivr.net/npm/@fancyapps/[email protected]/dist/jquery.fancybox.min.css" rel="stylesheet" type="text/css"><link href="//fonts.googleapis.com/css?family=Noto Serif SC:300,300italic,400,400italic,700,700italic|Noto Serif SC:300,300italic,400,400italic,700,700italic|Roboto Mono:300,300italic,400,400italic,700,700italic&subset=latin,latin-ext" rel="stylesheet" type="text/css"><link href="//fastly.jsdelivr.net/npm/[email protected]/css/font-awesome.min.css" rel="stylesheet" type="text/css"><link href="/css/main.css?v=6.6.0" rel="stylesheet" type="text/css"><link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png?v=6.6.0"><link rel="icon" type="image/png" sizes="32x32" href="/images/favicon.png?v=6.6.0"><link rel="icon" type="image/png" sizes="16x16" href="/images/favicon.png?v=6.6.0"><link rel="mask-icon" href="/images/logo.svg?v=6.6.0" color="#222"><script id="hexo.configurations">var NexT=window.NexT||{},CONFIG={root:"/",scheme:"Muse",version:"6.6.0",sidebar:{position:"left",display:"hide",offset:12,b2t:!1,scrollpercent:!0,onmobile:!0},fancybox:!0,fastclick:!1,lazyload:!1,tabs:!0,motion:{enable:!0,async:!1,transition:{post_block:"fadeIn",post_header:"slideDownIn",post_body:"slideDownIn",coll_header:"slideLeftIn",sidebar:"slideUpIn"}},algolia:{applicationID:"",apiKey:"",indexName:"",hits:{per_page:10},labels:{input_placeholder:"Search for Posts",hits_empty:"We didn't find any results for the search: ${query}",hits_stats:"${hits} results found in ${time} ms"}}}</script><meta name="description" content="大纲,写作中 前言经常给网友仿冒声卡驱动, 一直都没有将过程写下来,鉴于每天会有许多人问如何仿冒声卡,就想将过程记录下来,供大家参考学习 提取codec 通过CLOVER提取codec操作方法:CLOVER v2.4k r4886或者以上,CLOVER下载链接在安装CLOVER时请勾选AudioDex-64.efiCLOVER引导界面,按F8快捷键,它会在EFI/CLOVER/misc目录下生成"><meta name="keywords" content="AppleALC,AppleHDA,声卡仿冒"><meta property="og:type" content="article"><meta property="og:title" content="使用AppleALC声卡仿冒驱动AppleHDA的正确姿势"><meta property="og:url" content="https://blog.daliansky.net/Use-AppleALC-sound-card-to-drive-the-correct-posture-of-AppleHDA.html"><meta property="og:site_name" content="黑果小兵的部落阁"><meta property="og:description" content="大纲,写作中 前言经常给网友仿冒声卡驱动, 一直都没有将过程写下来,鉴于每天会有许多人问如何仿冒声卡,就想将过程记录下来,供大家参考学习 提取codec 通过CLOVER提取codec操作方法:CLOVER v2.4k r4886或者以上,CLOVER下载链接在安装CLOVER时请勾选AudioDex-64.efiCLOVER引导界面,按F8快捷键,它会在EFI/CLOVER/misc目录下生成"><meta property="og:locale" content="zh-CN"><meta property="og:image" content="https://pan.daliansky.net/d/blog/diskutil_disk4.png"><meta property="og:image" content="https://pan.daliansky.net/d/blog/dd_error.png"><meta property="og:image" content="https://pan.daliansky.net/d/blog/Boot_select.jpg"><meta property="og:image" content="https://pan.daliansky.net/d/blog/Ubuntu_boot.jpg"><meta property="og:image" content="https://pan.daliansky.net/d/blog/ubuntu1.png"><meta property="og:image" content="https://pan.daliansky.net/d/blog/ubuntu_codec_and_DSDT.png"><meta property="og:image" content="https://pan.daliansky.net/d/blog/SelectAudioDevice.png"><meta property="og:image" content="https://pan.daliansky.net/d/blog/SoundInputDeviceSelect.png"><meta property="og:image" content="https://pan.daliansky.net/d/blog/codec.png"><meta property="og:image" content="https://pan.daliansky.net/d/blog/node_output.png"><meta property="og:image" content="https://pan.daliansky.net/d/blog/node_input.png"><meta property="og:image" content="https://pan.daliansky.net/d/blog/node12_pathmap.png"><meta property="og:image" content="https://pan.daliansky.net/d/blog/PlistEditorPro.png"><meta property="og:image" content="https://pan.daliansky.net/d/blog/little-endian.jpg"><meta property="og:image" content="https://pan.daliansky.net/d/blog/pinconfigs.png"><meta property="og:image" content="https://pan.daliansky.net/d/blog/ALC_Folder.png"><meta property="og:image" content="https://pan.daliansky.net/d/blog/ALC256_Info.plist.png"><meta property="og:image" content="https://pan.daliansky.net/d/blog/Platforms_edit2.png"><meta property="og:image" content="https://pan.daliansky.net/d/blog/ALC298_ID99_ALC295_ID13.png"><meta property="og:image" content="https://pan.daliansky.net/d/blog/ioreg_pinconfigurations.png"><meta property="og:image" content="https://pan.daliansky.net/d/blog/Pin-ctls.png"><meta property="og:image" content="https://pan.daliansky.net/d/blog/Unsolicited.png"><meta property="og:image" content="https://pan.daliansky.net/d/blog/ALCPlugFix_ALC256.png"><meta property="og:image" content="https://i95.servimg.com/u/f95/18/50/18/69/video_10.png"><meta property="og:image" content="https://pan.daliansky.net/d/blog/path1.png"><meta property="og:image" content="https://pan.daliansky.net/d/blog/path2.png"><meta property="og:updated_time" content="2023-09-20T01:55:32.457Z"><meta name="twitter:card" content="summary"><meta name="twitter:title" content="使用AppleALC声卡仿冒驱动AppleHDA的正确姿势"><meta name="twitter:description" content="大纲,写作中 前言经常给网友仿冒声卡驱动, 一直都没有将过程写下来,鉴于每天会有许多人问如何仿冒声卡,就想将过程记录下来,供大家参考学习 提取codec 通过CLOVER提取codec操作方法:CLOVER v2.4k r4886或者以上,CLOVER下载链接在安装CLOVER时请勾选AudioDex-64.efiCLOVER引导界面,按F8快捷键,它会在EFI/CLOVER/misc目录下生成"><meta name="twitter:image" content="https://pan.daliansky.net/d/blog/diskutil_disk4.png"><link rel="alternate" href="/atom.xml" title="黑果小兵的部落阁" type="application/atom+xml"><link rel="canonical" href="https://blog.daliansky.net/Use-AppleALC-sound-card-to-drive-the-correct-posture-of-AppleHDA.html"><script id="page.configurations">CONFIG.page={sidebar:""}</script><title>使用AppleALC声卡仿冒驱动AppleHDA的正确姿势 | 黑果小兵的部落阁</title><noscript><style>.sidebar-inner,.use-motion .brand,.use-motion .collection-title,.use-motion .comments,.use-motion .menu-item,.use-motion .motion-element,.use-motion .pagination,.use-motion .post-block,.use-motion .post-body,.use-motion .post-header{opacity:initial}.use-motion .logo,.use-motion .site-subtitle,.use-motion .site-title{opacity:initial;top:initial}.use-motion .logo-line-before i{left:initial}.use-motion .logo-line-after i{right:initial}</style></noscript></head><body itemscope itemtype="http://schema.org/WebPage" lang="zh-CN"><div class="container sidebar-position-left page-post-detail"><div class="headband"></div><header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader"><div class="header-inner"><div class="site-brand-wrapper"><div class="site-meta"><div class="custom-logo-site-title"><a href="/" class="brand" rel="start"><span class="logo-line-before"><i></i></span> <span class="site-title">黑果小兵的部落阁</span> <span class="logo-line-after"><i></i></span></a></div><p class="site-subtitle">Hackintosh安装镜像、教程及经验分享</p></div><div class="site-nav-toggle"><button aria-label="切换导航栏"><span class="btn-bar"></span> <span class="btn-bar"></span> <span class="btn-bar"></span></button></div></div><nav class="site-nav"><ul id="menu" class="menu"><li class="menu-item menu-item-home"><a href="/" rel="section"><i class="menu-item-icon fa fa-fw fa-home"></i><br>首页</a></li><li class="menu-item menu-item-archives"><a href="/archives/" rel="section"><i class="menu-item-icon fa fa-fw fa-archive"></i><br>归档</a></li><li class="menu-item menu-item-categories"><a href="/categories/" rel="section"><i class="menu-item-icon fa fa-fw fa-th"></i><br>分类</a></li><li class="menu-item menu-item-tags"><a href="/tags/" rel="section"><i class="menu-item-icon fa fa-fw fa-tags"></i><br>标签</a></li><li class="menu-item menu-item-about"><a href="/about/" rel="section"><i class="menu-item-icon fa fa-fw fa-user"></i><br>关于</a></li><li class="menu-item menu-item-search"><a href="javascript:;" class="popup-trigger"><i class="menu-item-icon fa fa-search fa-fw"></i><br>搜索</a></li></ul><div class="site-search"><div class="popup search-popup local-search-popup"><div class="local-search-header clearfix"><span class="search-icon"><i class="fa fa-search"></i> </span><span class="popup-btn-close"><i class="fa fa-times-circle"></i></span><div class="local-search-input-wrapper"><input autocomplete="off" placeholder="搜索..." spellcheck="false" type="text" id="local-search-input"></div></div><div id="local-search-result"></div></div></div></nav></div></header><a href="https://github.com/daliansky" class="github-corner" title="Follow me on GitHub" aria-label="Follow me on GitHub" rel="noopener" target="_blank"><svg width="80" height="80" viewbox="0 0 250 250" style="fill:#222;color:#fff;position:absolute;top:0;border:0;right:0" aria-hidden="true"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"/><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin:130px 106px" class="octo-arm"/><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"/></svg></a><main id="main" class="main"><div class="main-inner"><div class="content-wrap"><div id="content" class="content"><div id="posts" class="posts-expand"><div class="reading-progress-bar"></div><article class="post post-type-normal" itemscope itemtype="http://schema.org/Article"><div class="post-block"><link itemprop="mainEntityOfPage" href="https://blog.daliansky.net/Use-AppleALC-sound-card-to-drive-the-correct-posture-of-AppleHDA.html"><span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"><meta itemprop="name" content="黑果小兵"><meta itemprop="description" content="黑果小兵,daliansky,blog.daliansky.net,macOS,Hackintosh,黑苹果,linux"><meta itemprop="image" content="/images/avatar.png"></span><span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"><meta itemprop="name" content="黑果小兵的部落阁"></span><header class="post-header"><h1 class="post-title" itemprop="name headline">使用AppleALC声卡仿冒驱动AppleHDA的正确姿势</h1><div class="post-meta"><span class="post-time"><span class="post-meta-item-icon"><i class="fa fa-calendar-o"></i> </span><time title="创建时间:2017-11-09 09:23:23" itemprop="dateCreated datePublished" datetime="2017-11-09T09:23:23+08:00">2017-11-09</time> <span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-calendar-check-o"></i> </span><time title="修改时间:2023-09-20 09:55:32" itemprop="dateModified" datetime="2023-09-20T09:55:32+08:00">2023-09-20</time> </span><span class="post-category"><span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-folder-o"></i> </span><span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/教程/" itemprop="url" rel="index"><span itemprop="name">教程</span></a></span> </span><span class="post-meta-divider">|</span> <span class="post-meta-item-icon" title="阅读次数"><i class="fa fa-eye"></i> <span class="busuanzi-value" id="busuanzi_value_page_pv"></span></span><div class="post-symbolscount"><span class="post-meta-item-icon"><i class="fa fa-file-word-o"></i> </span><span title="本文字数">36k</span> <span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-clock-o"></i> </span><span title="阅读时长">1:05</span></div></div></header><div class="post-body" itemprop="articleBody"><div><div><div class="post-gallery"></div></div></div><h1 id="大纲写作中"><a class="markdownIt-Anchor" href="#大纲写作中"></a> 大纲,写作中</h1><h1 id="前言"><a class="markdownIt-Anchor" href="#前言"></a> 前言</h1><p>经常给网友仿冒声卡驱动, 一直都没有将过程写下来,鉴于每天会有许多人问如何仿冒声卡,就想将过程记录下来,供大家参考学习</p><h1 id="提取codec"><a class="markdownIt-Anchor" href="#提取codec"></a> 提取codec</h1><div class="note primary"><h2 id="通过clover提取codec"><a class="markdownIt-Anchor" href="#通过clover提取codec"></a> 通过<code>CLOVER</code>提取<code>codec</code></h2><p>操作方法:</p><ul><li><code>CLOVER</code> v2.4k r4886或者以上,<a href="https://github.com/Dids/clover-builder/releases" target="_blank" rel="noopener">CLOVER下载链接</a></li><li>在安装<code>CLOVER</code>时请勾选<code>AudioDex-64.efi</code></li><li><code>CLOVER</code>引导界面,按<code>F8</code>快捷键,它会在<code>EFI/CLOVER/misc</code>目录下生成以<code>HdaCodec</code>开头的文件,其中的<code>HdaCodec#x (Realtek ALCxxx).txt</code>就是你需要提取的<code>codec</code></li></ul></div><h2 id="通过linux提取codec"><a class="markdownIt-Anchor" href="#通过linux提取codec"></a> 通过linux提取codec</h2><h3 id="制作ubuntu-linux启动u盘"><a class="markdownIt-Anchor" href="#制作ubuntu-linux启动u盘"></a> 制作Ubuntu Linux启动U盘:</h3><ul><li>下载Ubuntu Linux镜像,可以选择国内开源镜像站点下载:<br><a href="http://mirrors.163.com/ubuntu-releases/" target="_blank" rel="noopener">网易</a> <a href="http://mirrors.sohu.com/ubuntu-releases/" target="_blank" rel="noopener">搜狐</a> <a href="https://mirrors.aliyun.com/ubuntu-releases/" target="_blank" rel="noopener">阿里云</a></li></ul><blockquote><p>如果你只是想通过Linux提取codec的话,可以随便下载个旧的版本即可,比如这个<a href="https://mirrors.aliyun.com/ubuntu-releases/14.04/ubuntu-14.04.5-desktop-amd64.iso" target="_blank" rel="noopener">ubuntu 14.04.5LTS</a>,如果想作为日后的生产力工具的话,我推荐你下载最新发布的<a href="https://mirrors.aliyun.com/ubuntu-releases/17.10/ubuntu-17.10-desktop-amd64.iso" target="_blank" rel="noopener">ubuntu 17.10</a></p></blockquote><h4 id="制作ubuntu-linux安装盘"><a class="markdownIt-Anchor" href="#制作ubuntu-linux安装盘"></a> 制作Ubuntu Linux安装盘</h4><ul><li><p>Windows下请使用工具<code>UltraISO</code>,方法略</p></li><li><p>macOS下制作过程:</p><ul><li><p>插入U盘,确定设备名,方法为打开磁盘工具,选择U盘,可以看到U盘下面有两个分区:<code>disk4s1</code>和<code>disk4s2</code>,那么U盘的设备名就是:<code>disk4</code><img src="https://pan.daliansky.net/d/blog/diskutil_disk4.png" alt="diskutil_disk4"></p></li><li><p>当然最简单的方法还是直接使用命令查看:<code>diskutil list</code>,输出的信息为:</p></li></ul><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"> /dev/disk4 (internal, physical):</span><br><span class="line"></span><br><span class="line"><span class="comment">#: TYPE NAME SIZE IDENTIFIER</span></span><br><span class="line">0: Apple_partition_scheme *2.0 GB disk4</span><br><span class="line">1: Apple_partition_map 4.1 KB disk4s1</span><br><span class="line">2: Apple_HFS 2.4 MB disk4s2</span><br></pre></td></tr></table></figure><p>这个<code>disk4</code>就是你要操作的设备名,后面我们会用到它</p><ul><li><p>卸载U盘,准备写入镜像,输入命令:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">diskutil umountDisk disk4 <span class="comment"># 卸载U盘</span></span><br></pre></td></tr></table></figure></li><li><p>使用<code>dd</code>命令将下载的Ubuntu Linux镜像恢复到U盘上,操作之前我有必要<strong>提醒各位小白,万一你不小心输入错了设备名,那么你连哭的机会都没有,因为dd是按扇区直接物理写入磁盘,别到时候找不到数据了再悔不当初没有认真看到这段文字</strong></p></li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo dd <span class="keyword">if</span>=/Users/sky/Downloads/ISO/ubuntu-17.10-desktop-amd64.iso of=/dev/disk4 bs=1m</span><br></pre></td></tr></table></figure><p>命令输入完后,请仔细认真检查下,尤其是<code>of=/dev/disk4</code>这里,再三确认后回车执行,输入用户密码后请耐心等待6-7分钟,写盘速度取决于你的U盘,镜像恢复的过程中不会有任何的文字输出,U盘写入成功后会显示下面类似的输出信息:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">~ % diskutil umountDisk disk4</span><br><span class="line">Unmount of all volumes on disk4 was successful</span><br><span class="line">~ % sudo dd <span class="keyword">if</span>=/Users/sky/Downloads/ISO/ubuntu-17.10-desktop-amd64.iso of=/dev/disk4 bs=1m</span><br><span class="line">Password:</span><br><span class="line">1431+1 records <span class="keyword">in</span></span><br><span class="line">1431+1 records out</span><br><span class="line">1501102080 bytes transferred <span class="keyword">in</span> 906.101477 secs (1656660 bytes/sec)</span><br></pre></td></tr></table></figure><ul><li>我的U盘竟然写了906秒(15分钟),我先找个地方哭会儿去*<br>同时系统会弹出一个警告窗口,显示类似的信息:<br><img src="https://pan.daliansky.net/d/blog/dd_error.png" alt="dd_error"><br>那是因为Linux的分区格式是ext,在macOS系统下无法识别才会报错,但是其实一个支持UEFI引导的Ubuntu Linux 17.10启动U盘已经制作成功了.点击<code>Ignore</code>忽略或者<code>Eject</code>退出U盘</li></ul></li><li><p>现在您可以使用这个新制作的Ubuntu Linux安装U盘引导Linux去提取codec</p></li></ul><h2 id="提取codec-2"><a class="markdownIt-Anchor" href="#提取codec-2"></a> 提取codec</h2><p>开机按引导设备快捷键<code>F12</code>或者<code>F8</code>进入引导设备选单,选择<code>Ubuntu Linux</code>所在的USB盘回车<br><img src="https://pan.daliansky.net/d/blog/Boot_select.jpg" alt="Boot_select"><br>出现Ubuntu Linux的引导界面,选择<code>Try Ubuntu without installing</code>,该选项可以在不安装的情况下试用Ubuntu<br><img src="https://pan.daliansky.net/d/blog/Ubuntu_boot.jpg" alt="Ubuntu_boot"><br>回车后稍候会进入Ubuntu桌面:<br><img src="https://pan.daliansky.net/d/blog/ubuntu1.png" alt="ubuntu1"><br>按组合键<code>CTRL+ALT+t</code>打开终端,输入以下命令:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> ~/Desktop/ <span class="comment"># 进入用户桌面</span></span><br><span class="line">cp /proc/asound/card0/codec* . <span class="comment"># 将codec开头的文件复制到当时位置</span></span><br><span class="line">sudo cp -R /sys/firmware/acpi/tables . <span class="comment"># 将acpi/tables目录复制到当时位置,tables目录包括了全部的DSDT和SSDT</span></span><br><span class="line">ls -l <span class="comment"># 列表</span></span><br><span class="line">sudo chown -R ubuntu:ubuntu * <span class="comment"># 将当前目录下所有文件及目录所有人修改为ubuntu</span></span><br><span class="line">ls -l <span class="comment"># 列表</span></span><br></pre></td></tr></table></figure><p>显示输出信息如下:<br><img src="https://pan.daliansky.net/d/blog/ubuntu_codec_and_DSDT.png" alt="ubuntu_codec_and_DSDT"><br>将桌面上的codec开头的文件和tables目录复制到LINUX以外的支持写入的盘符下,Linux下面的工作已经完成,您可以继续试用或者重启/关机.</p><h1 id="整理有效节点"><a class="markdownIt-Anchor" href="#整理有效节点"></a> 整理有效节点</h1><p>使用到的工具:<code>verbit.sh</code>,<a href="https://github.com/daliansky/dell7000/blob/master/hda-tools/verbit.sh" target="_blank" rel="noopener">下载链接</a><br>用法: <code>verbit.sh codec#0</code>,它会生成如下显示的信息:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">Verbs from Linux Codec Dump File: codec#0</span><br><span class="line"></span><br><span class="line">Codec: Realtek ALC3246 Address: <span class="number">0</span> DevID: <span class="number">283902550</span> (<span class="number">0x10ec0256</span>)</span><br><span class="line"></span><br><span class="line"> Jack Color Description Node PinDefault Original Verbs</span><br><span class="line">--------------------------------------------------------------------------------------------------------</span><br><span class="line">Digital Unknown Mic at Int N/A <span class="number">18</span> <span class="number">0x12</span> <span class="number">0x90a60170</span> <span class="number">01271</span>c70 <span class="number">01271</span>d01 <span class="number">01271</span>ea6 <span class="number">01271</span>f90</span><br><span class="line">Unknown Unknown Line Out at Ext N/A <span class="number">19</span> <span class="number">0x13</span> <span class="number">0x40000000</span> <span class="number">01371</span>c00 <span class="number">01371</span>d00 <span class="number">01371e00</span> <span class="number">01371</span>f40</span><br><span class="line"> Analog Unknown Speaker at Int N/A <span class="number">20</span> <span class="number">0x14</span> <span class="number">0x90170140</span> <span class="number">01471</span>c40 <span class="number">01471</span>d01 <span class="number">01471e17</span> <span class="number">01471</span>f90</span><br><span class="line"> <span class="number">1</span>/<span class="number">8</span> Black Speaker at Ext Rear <span class="number">24</span> <span class="number">0x18</span> <span class="number">0x411111f0</span> <span class="number">01871</span>cf0 <span class="number">01871</span>d11 <span class="number">01871e11</span> <span class="number">01871</span>f41</span><br><span class="line"> <span class="number">1</span>/<span class="number">8</span> Black Speaker at Ext Rear <span class="number">25</span> <span class="number">0x19</span> <span class="number">0x411111f0</span> <span class="number">01971</span>c10 <span class="number">01971</span>d20 <span class="number">01971e81</span> <span class="number">01971</span>f02</span><br><span class="line"> <span class="number">1</span>/<span class="number">8</span> Black Speaker at Ext Rear <span class="number">26</span> <span class="number">0x1a</span> <span class="number">0x411111f0</span> <span class="number">01</span>a71cf0 <span class="number">01</span>a71d11 <span class="number">01</span>a71e11 <span class="number">01</span>a71f41</span><br><span class="line"> <span class="number">1</span>/<span class="number">8</span> Black Speaker at Ext Rear <span class="number">27</span> <span class="number">0x1b</span> <span class="number">0x411111f0</span> <span class="number">01</span>b71cf0 <span class="number">01</span>b71d11 <span class="number">01</span>b71e11 <span class="number">01</span>b71f41 </span><br><span class="line"> Analog Pink Modem Hand at Ext N/A <span class="number">29</span> <span class="number">0x1d</span> <span class="number">0x40779a2d</span> <span class="number">01</span>d71c2d <span class="number">01</span>d71d9a <span class="number">01</span>d71e77 <span class="number">01</span>d71f40</span><br><span class="line"> <span class="number">1</span>/<span class="number">8</span> Black Speaker at Ext Rear <span class="number">30</span> <span class="number">0x1e</span> <span class="number">0x411111f0</span> <span class="number">01e71</span>cf0 <span class="number">01e71</span>d11 <span class="number">01e71</span>e11 <span class="number">01e71</span>f41</span><br><span class="line"> <span class="number">1</span>/<span class="number">8</span> Black HP Out at Ext Front <span class="number">33</span> <span class="number">0x21</span> <span class="number">0x02211030</span> <span class="number">02171</span>c30 <span class="number">02171</span>d10 <span class="number">02171e21</span> <span class="number">02171</span>f02</span><br><span class="line">--------------------------------------------------------------------------------------------------------</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> Jack Color Description Node PinDefault Modified Verbs</span><br><span class="line">--------------------------------------------------------------------------------------------------------</span><br><span class="line">Digital Unknown Mic at Int N/A <span class="number">18</span> <span class="number">0x12</span> <span class="number">0x90a60170</span> <span class="number">01271</span>c70 <span class="number">01271</span>d00 <span class="number">01271</span>ea6 <span class="number">01271</span>f90</span><br><span class="line">Unknown Unknown Line Out at Ext N/A <span class="number">19</span> <span class="number">0x13</span> <span class="number">0x40000000</span> <span class="number">01371</span>c00 <span class="number">01371</span>d00 <span class="number">01371e00</span> <span class="number">01371</span>f40</span><br><span class="line"> Analog Unknown Speaker at Int N/A <span class="number">20</span> <span class="number">0x14</span> <span class="number">0x90170120</span> <span class="number">01471</span>c20 <span class="number">01471</span>d00 <span class="number">01471e17</span> <span class="number">01471</span>f90</span><br><span class="line"> Analog Pink Modem Hand at Ext N/A <span class="number">29</span> <span class="number">0x1d</span> <span class="number">0x40779a2d</span> <span class="number">01</span>d71c40 <span class="number">01</span>d71d90 <span class="number">01</span>d71e77 <span class="number">01</span>d71f40</span><br><span class="line"> <span class="number">1</span>/<span class="number">8</span> Black HP Out at Ext Front <span class="number">33</span> <span class="number">0x21</span> <span class="number">0x02211030</span> <span class="number">02171</span>c30 <span class="number">02171</span>d10 <span class="number">02171e21</span> <span class="number">02171</span>f01</span><br><span class="line">--------------------------------------------------------------------------------------------------------</span><br><span class="line"></span><br><span class="line">Modified Verbs <span class="keyword">in</span> One Line: <span class="number">01271</span>c70 <span class="number">01271</span>d00 <span class="number">01271</span>ea6 <span class="number">01271</span>f90 <span class="number">01371</span>c00 <span class="number">01371</span>d00 <span class="number">01371e00</span> <span class="number">01371</span>f40 <span class="number">01471</span>c20 <span class="number">01471</span>d00 <span class="number">01471e17</span> <span class="number">01471</span>f90 <span class="number">01</span>d71c40 <span class="number">01</span>d71d90 <span class="number">01</span>d71e77 <span class="number">01</span>d71f40 <span class="number">02171</span>c30 <span class="number">02171</span>d10 <span class="number">02171e21</span> <span class="number">02171</span>f01</span><br><span class="line">--------------------------------------------------------------------------------------------------------</span><br></pre></td></tr></table></figure><p>如果你希望将输出结果保存下来,可以将命令改为:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">verbit.sh codec<span class="comment">#0 > ALC256_dump.txt</span></span><br></pre></td></tr></table></figure><p>这个ALC256_dump.txt就是上面显示的输出信息,你可以使用其它的文字编辑器打开它.<br>重要的信息不能漏掉了,后面我们在编译声卡驱动的时候会经常用到它们:</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Codec: Realtek ALC3246 Address: 0 DevID: 283902550 (0x10ec0256)</span><br></pre></td></tr></table></figure><p>其中的:</p><table><thead><tr><th>名称</th><th>解释</th></tr></thead><tbody><tr><td>Codec: Realtek ALC3246</td><td>是告诉了你的声卡型号是ALC3246(ALC256)</td></tr><tr><td>Address: 0</td><td>会告诉你生成configdata的数据的前缀是0,比如上面显示输出信息最后一行的<code>Modified Verbs in One Line:</code>后面所有的数据中,每组数据的第一位就是这个 <code>0</code> ,如果<code>Address: 2</code>,那么每组数据的第一位就是 <code>2</code> ,这个后面我们会用到它</td></tr><tr><td>DevID: 283902550 (0x10ec0256)</td><td>283902550是0x10ec0256的10进制值,0x10ec 是指vendorID(芯片供应商ID),是REALTEK的设备标识,0256是指型号,去掉前面的0,您的声卡型号就是:ALC256</td></tr></tbody></table><p>过去的教程会告诉你,通过运行<code>verbit.sh</code>整理出来的节点是:</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">18 0x12 Mic at Int</span><br><span class="line">20 0x14 Speaker at Int</span><br><span class="line">33 0x21 HP Out at Ext Front</span><br></pre></td></tr></table></figure><p>至于上面输出信息里显示的0x13 0x1d都是无效的节点.而且它只有三个有效的节点,我的声卡ALC256是用于笔记本,按理说它至少还应该存在另一个Mic Ext的节点,我需要找出它来.看来使用传统的方法已经无法满足我的求知欲了.<br>既然使用Linux可以提取codec,那么有没有可能</p><h1 id="通过linux找出有效的节点"><a class="markdownIt-Anchor" href="#通过linux找出有效的节点"></a> <em>通过Linux找出有效的节点</em></h1><p>呢?<br>为了测试我的声卡存在第四个节点,我需要找出耳机的Mic输入节点,于是乎重新引导进入Linux,插上耳机,它弹出了这个窗口:<br><img src="https://pan.daliansky.net/d/blog/SelectAudioDevice.png" alt="SelectAudioDevice"><br>这三个选项的意思是让我选择声音设备,既然我希望找出耳机麦克风的输入,我就选择了中间带有耳麦的图标<br>进入<code>Sound Settings</code>,点击 <code>Input</code>,选择<code>Headset Microphone</code>,调节<code>Input volume</code>,对着耳麦说话,发现有输入电平了,再切换到内置麦克风<code>Internal Microphone</code>,也有输入电平,那么至少说明我的声卡功能是完整的,至少在Linux下它工作的很好.<br><img src="https://pan.daliansky.net/d/blog/SoundInputDeviceSelect.png" alt="SoundInputDeviceSelect"><br>测试结果已经出来了,我想要知道耳麦的有效节点是什么,使用组合键<code>CTRL+ALT+t</code>打开终端,输入命令:<code>dmesg</code>看看它会有什么变化,结果我就看到了下面的文字:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">[ 5.040591] snd_hda_codec_realtek hdaudioC0D0: autoconfig <span class="keyword">for</span> ALC3246: line_outs=1 (0x14/0x0/0x0/0x0/0x0) <span class="built_in">type</span>:speaker</span><br><span class="line">[ 5.040593] snd_hda_codec_realtek hdaudioC0D0: speaker_outs=0 (0x0/0x0/0x0/0x0/0x0)</span><br><span class="line">[ 5.040595] snd_hda_codec_realtek hdaudioC0D0: hp_outs=1 (0x21/0x0/0x0/0x0/0x0)</span><br><span class="line">[ 5.040595] snd_hda_codec_realtek hdaudioC0D0: mono: mono_out=0x0</span><br><span class="line">[ 5.040596] snd_hda_codec_realtek hdaudioC0D0: inputs:</span><br><span class="line">[ 5.040598] snd_hda_codec_realtek hdaudioC0D0: Headset Mic=0x19</span><br><span class="line">[ 5.040599] snd_hda_codec_realtek hdaudioC0D0: Headphone Mic=0x1a</span><br><span class="line">[ 5.040600] snd_hda_codec_realtek hdaudioC0D0: Internal Mic=0x12</span><br></pre></td></tr></table></figure><p>我不想看到其它的输出信息,我只需要得到我想要的信息,于是将命令改为:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">sky@sky-Inspiron-7560:~$ dmesg | grep snd_hda_codec_realtek</span><br><span class="line">[ 5.040591] snd_hda_codec_realtek hdaudioC0D0: autoconfig <span class="keyword">for</span> ALC3246: line_outs=1 (0x14/0x0/0x0/0x0/0x0) <span class="built_in">type</span>:speaker</span><br><span class="line">[ 5.040593] snd_hda_codec_realtek hdaudioC0D0: speaker_outs=0 (0x0/0x0/0x0/0x0/0x0)</span><br><span class="line">[ 5.040595] snd_hda_codec_realtek hdaudioC0D0: hp_outs=1 (0x21/0x0/0x0/0x0/0x0)</span><br><span class="line">[ 5.040595] snd_hda_codec_realtek hdaudioC0D0: mono: mono_out=0x0</span><br><span class="line">[ 5.040596] snd_hda_codec_realtek hdaudioC0D0: inputs:</span><br><span class="line">[ 5.040598] snd_hda_codec_realtek hdaudioC0D0: Headset Mic=0x19</span><br><span class="line">[ 5.040599] snd_hda_codec_realtek hdaudioC0D0: Headphone Mic=0x1a</span><br><span class="line">[ 5.040600] snd_hda_codec_realtek hdaudioC0D0: Internal Mic=0x12</span><br></pre></td></tr></table></figure><p>得到的输出结果跟上面的相同,于是我发现了在Linux下我的声卡的有效节点分别为:</p><ul><li>0x14 Speaker out</li><li>0x21 HP out</li><li>0x19 Headset Mic in</li><li>0x1a Headphone Mic in</li><li>0x12 Internal Mic in</li></ul><p>暂且不讨论我的声卡是几节点,我发现通过linux完全可以得出声卡的有效节点,而且这种方式好像也不需要使用什么专用的工具,只是在linux下面通过内部命令<code>dmesg</code>无意中就被我发现了声卡中最挠头的找有效节点的打怪秘籍,这种方法在整个Hackintosh社区里还没见有人用过.看来这跟我之前使用linux经常会通过<code>dmesg</code>排错的使用习惯是分不开的,这里要由衷地给自己点一个大大的</p><h1 id="赞"><a class="markdownIt-Anchor" href="#赞"></a> 赞</h1><p>在这个特别的日子里<code>11.11</code>,没有陪女朋友的小伙伴们,都可以使用我刚get到的新技能愉快地打怪升级啦!</p><p>暂更于此,做个记号 2017年11月11日</p><hr><p>继续更新</p><p>先将节点整理成一个表格,这个表格里会包括之前整理出的数据</p><table><thead><tr><th>有效节点</th><th>10进制</th><th>设备名称</th></tr></thead><tbody><tr><td>0x14</td><td>20</td><td>Speaker out</td></tr><tr><td>0x21</td><td>33</td><td>HP out</td></tr><tr><td>0x19</td><td>25</td><td>Headset Mic in</td></tr><tr><td>0x1a</td><td>26</td><td>Headphone Mic in</td></tr><tr><td>0x12</td><td>18</td><td>Internal Mic in</td></tr></tbody></table><p>之所以加上转换后的10进制,就是为了以后制作pathmap做准备</p><h1 id="整理有效路径"><a class="markdownIt-Anchor" href="#整理有效路径"></a> 整理有效路径</h1><p>使用codecgraph生成pathmap图<br>命令如下:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ codecgraph codec\<span class="comment">#0</span></span><br><span class="line">Codec: Realtek ALC3246</span><br><span class="line">Generating codec<span class="comment">#0.svg</span></span><br></pre></td></tr></table></figure><p>如果出现<code>error: dot executable not found (did you install graphviz?)</code>的错误提示的话,那么还需要执行下面的动作,打开终端,输入命令:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/usr/bin/ruby -e <span class="string">"<span class="variable">$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)</span>"</span> <span class="comment"># 安装brew</span></span><br></pre></td></tr></table></figure><p>安装<code>brew</code>的过程中会提醒你安装<code>Xcode Command Tools</code>,请选择<code>yes</code>.<br>安装完<code>brew</code>之后,继续执行:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew install graphviz <span class="comment"># 安装codecgraph所需要的依赖程序</span></span><br></pre></td></tr></table></figure><p>这个生成的codec#0.svg就是声卡的pathmap,使用<code>Sketch.app</code>打开它<br><img src="https://pan.daliansky.net/d/blog/codec.png" alt="codec"><br>是不是看了头老大?没错,我刚开始看的时候也是一头的雾水,看多了后就会总结出经验来<br>还记得我们在前面整理出的有效节点吧?!<br>还是以我的声卡为例,上文中我已经整理出5个节点,按照顺序来:<br>0x14,这个是Speaker的节点,也就是喇叭,我们也俗称为外放,如果想让它正确地发声,就需要看看跟它连接的节点都有哪些,在图片里找到0x14位于图片的最下方,我把它放大下:<br><img src="https://pan.daliansky.net/d/blog/node_output.png" alt="node_output"><br>通过观察我们会发现,0x14与0x02连接,转换成10进制就是20->2,同样的,0x21与0x03连接,转换成10进制就是33->3,我们把它放到表格中</p><table><thead><tr><th>有效节点</th><th>10进制</th><th>设备名称</th><th>路径</th></tr></thead><tbody><tr><td>0x14</td><td>20</td><td>Speaker out</td><td><strong>20->2</strong></td></tr><tr><td>0x21</td><td>33</td><td>HP out</td><td><strong>33->3</strong></td></tr><tr><td>0x19</td><td>25</td><td>Headset Mic in</td><td></td></tr><tr><td>0x1a</td><td>26</td><td>Headphone Mic in</td><td></td></tr><tr><td>0x12</td><td>18</td><td>Internal Mic in</td><td></td></tr></tbody></table><p>怎么样?也没想像的那么复杂吧?两个输出设备的节点和路径已经整理出来,下一步,我们要把输入设备和节点整理出来<br><img src="https://pan.daliansky.net/d/blog/node_input.png" alt="node_input"><br>再来看图片的上半部,最右侧的0x08和0x09是两个声音输入的节点,0x23和0x22是两个混音设备,最前方是设备节点,这个就是输入设备的路径.<br>我的声卡的0x12声音输入路径包括了3个节点;为了便于理解,被我圈起来的红线部分就是0x12(Mic in)的路径(pathmap),8->35->18就是路径,照样还是要将数据放到表格里<br><img src="https://pan.daliansky.net/d/blog/node12_pathmap.png" alt="node12_pathmap"></p><table><thead><tr><th>有效节点</th><th>10进制</th><th>设备名称</th><th>路径</th></tr></thead><tbody><tr><td>0x14</td><td>20</td><td>Speaker out</td><td><strong>20->2</strong></td></tr><tr><td>0x21</td><td>33</td><td>HP out</td><td><strong>33->3</strong></td></tr><tr><td>0x19</td><td>25</td><td>Headset Mic in</td><td></td></tr><tr><td>0x1a</td><td>26</td><td>Headphone Mic in</td><td></td></tr><tr><td>0x12</td><td>18</td><td>Internal Mic in</td><td><strong>8->35->18</strong></td></tr></tbody></table><p>还记得文章前面通过linux找出来的有效节点不?我的耳麦可是支持输入的,节点也找出来了,是0x19(Headset Mic in),我需要将路径找出来,我发现0x19同时连接了两个节点:0x23和0x22,相应地路径为:8->35->25和9->34->25,顺手也把0x1a的路径也整理出来备用,将这两组数据补充进表格里</p><table><thead><tr><th>有效节点</th><th>10进制</th><th>设备名称</th><th>路径</th></tr></thead><tbody><tr><td>0x14</td><td>20</td><td>Speaker out</td><td><strong>20->2</strong></td></tr><tr><td>0x21</td><td>33</td><td>HP out</td><td><strong>33->3</strong></td></tr><tr><td>0x19</td><td>25</td><td>Headset Mic in</td><td><strong>8->35->25</strong> <strong>9->34->25</strong></td></tr><tr><td>0x1a</td><td>26</td><td>Headphone Mic in</td><td><strong>8->35->26</strong> <strong>9->34->26</strong></td></tr><tr><td>0x12</td><td>18</td><td>Internal Mic in</td><td><strong>8->35->18</strong></td></tr></tbody></table><p>至于0x1a是否有效暂且放到一边,一个包括了有效节点/设备名称/路径的表格就整理完成了,这里***需要强调的一点是:路径数值使用10进制***</p><h1 id="整理configdata"><a class="markdownIt-Anchor" href="#整理configdata"></a> 整理ConfigData</h1><blockquote><p><code>ConfigData</code>的获得有两种方法:这两种方法分别为:通过<code>codec</code>里面的<code>Pin Default</code>提取以及通过<code>PinConfigs</code>提取,然后修正<code>ConfigData</code>.下面我们将分别介绍这两种提取方法</p></blockquote><h2 id="通过pinconfigs提取configdata"><a class="markdownIt-Anchor" href="#通过pinconfigs提取configdata"></a> 通过PinConfigs提取ConfigData</h2><p>ConfigData数据位于<code>PinConfigs.kext/Contents/Info.plist</code>里,<code>PinConfigs.kext</code>作为<code>AppleALC</code>插件被加载.<br>用到的工具:<code>Plist Editor Pro.app</code><br>还是以我的ALC256为例:打开<code>Info.plist</code>后,使用组合快捷键<code>⌘+f</code>打开搜索: <code>ALC256</code> 或者 <code>283902550</code> ,它会直接定位到你需要查找的数据位置,再按<code>⌘+g</code>,将相同的字符串全部搜索完毕,直到它又跳转到第一个搜索结果的位置,结果如下图:<br><img src="https://pan.daliansky.net/d/blog/PlistEditorPro.png" alt="PlistEditorPro"><br>ALC256的ConfigData的数据有三组,分别对应的LayoutID为:13 28 56<br>将这三组ConfigData复制出来:</p><p>id:13<br><code>01271C10 01271D00 01271EA6 01271F90 01471C20 01471D00 01471E17 01471F90 01971C30 01971D10 01971E8B 01971F02 02171C50 02171D10 02171E2B 02171F02 01470c02</code></p><p>id:28<br><code>01471C50 01471D00 01471E17 01471F90 01470c02 01A71C30 01A71D00 01A71EA0 01A71F90 02171C20 02171D10 02171E21 02171F00</code></p><p>id:56<br><code>01271C10 01271D00 01271EA6 01271F90 01471C20 01471D00 01471E17 01471F90 01971C30 01971D10 01971E8B 01971F02 01A71C40 01A71D10 01A71E81 01A71F02 01D71CF0 01D71D11 01D71E11 01D71F41 02171C50 02171D10 02171E2B 02171F02 01470c02 02170c02</code></p><p>这么看起来是杂乱无章的,我们将它格式化一下,每个节点一行,四组数据:<br>id:13</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">01271C10 01271D00 01271EA6 01271F90 </span><br><span class="line">01471C20 01471D00 01471E17 01471F90 </span><br><span class="line">01971C30 01971D10 01971E8B 01971F02 </span><br><span class="line">02171C50 02171D10 02171E2B 02171F02 01470c02</span><br></pre></td></tr></table></figure><p>id:28</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">01471C50 01471D00 01471E17 01471F90 01470c02 </span><br><span class="line">01A71C30 01A71D00 01A71EA0 01A71F90 </span><br><span class="line">02171C20 02171D10 02171E21 02171F00</span><br></pre></td></tr></table></figure><p>id:56</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">01271C10 01271D00 01271EA6 01271F90 </span><br><span class="line">01471C20 01471D00 01471E17 01471F90 01470c02 </span><br><span class="line">01971C30 01971D10 01971E8B 01971F02 </span><br><span class="line">01A71C40 01A71D10 01A71E81 01A71F02 </span><br><span class="line">01D71CF0 01D71D11 01D71E11 01D71F41 </span><br><span class="line">02171C50 02171D10 02171E2B 02171F02 02170c02</span><br></pre></td></tr></table></figure><p>从中我们可以发现:<br>id:13为四行四节点,节点为:<code>0x12 0x14 0x19 0x21</code><br>id:28为三行三节点,节点为:<code>0x14 0x1A 0x21</code><br>id:56为六行六节点,节点为:<code>0x12 0x14 0x19 0x1A 0x1D 0x21</code><br>现在有个问题摆在你们的面前,我上面明明刚说过每个节点为四组数据,那为什么在0x14和0x21的节点后面又多出来一组数据呢?这组数据又有什么作用呢?原来秘密都藏在<code>codec</code>里面,它定义了某些输出设备具有<code>EAPD</code>,比如0x14节点的数据:</p><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">Node <span class="number">0x14</span> [Pin Complex] wcaps <span class="number">0x40058d</span>: Stereo Amp-Out</span><br><span class="line"> <span class="symbol">Control:</span> name=<span class="string">"Speaker Playback Switch"</span>, index=<span class="number">0</span>, device=<span class="number">0</span></span><br><span class="line"> <span class="symbol">ControlAmp:</span> chs=<span class="number">3</span>, dir=Out, idx=<span class="number">0</span>, ofs=<span class="number">0</span></span><br><span class="line"> Amp-Out <span class="symbol">caps:</span> ofs=<span class="number">0x00</span>, nsteps=<span class="number">0x00</span>, stepsize=<span class="number">0x00</span>, mute=<span class="number">1</span></span><br><span class="line"> Amp-Out <span class="symbol">vals:</span> [<span class="number">0x00</span> <span class="number">0x00</span>]</span><br><span class="line"> Pincap <span class="number">0x00010014</span>: OUT EAPD Detect</span><br><span class="line"> EAPD <span class="number">0x2</span>: EAPD</span><br><span class="line"> Pin Default <span class="number">0x90170120</span>: [Fixed] Speaker at Int N/A</span><br><span class="line"> Conn = Analog, Color = Unknown</span><br><span class="line"> DefAssociation = <span class="number">0x2</span>, Sequence = <span class="number">0x0</span></span><br><span class="line"> Misc = NO_PRESENCE</span><br><span class="line"> Pin-<span class="symbol">ctls:</span> <span class="number">0x40</span>: OUT</span><br><span class="line"> <span class="symbol">Unsolicited:</span> tag=<span class="number">00</span>, enabled=<span class="number">0</span></span><br><span class="line"> Power <span class="symbol">states:</span> D<span class="number">0</span> D1 D2 D3 EPSS</span><br><span class="line"> <span class="symbol">Power:</span> setting=D<span class="number">0</span>, actual=D<span class="number">0</span></span><br><span class="line"> <span class="symbol">Connection:</span> <span class="number">1</span></span><br><span class="line"> <span class="number">0x02</span></span><br></pre></td></tr></table></figure><p>具有<code>EAPD</code>的节点需要添加参数<code>SET_EAPD_BTLENABLE</code>,转换成数值为<code>0x70c</code>,完整的数值为:<code>Address</code>+<code>节点</code>+<code>70c</code>+<code>02</code>,即:<code>01470c02</code>,它通过<code>hda-verb</code>可以执行,比如<code>CodecCommander</code>就是调用的<code>hda-verb</code>执行的命令.更多的<code>hda-verb</code>参数请参考我之前的文章:<a href="https://blog.daliansky.net/hda-verb-parameter-detail-table.html">hda-verb参数详表</a><br>这里我教大家一个简单判断<code>EAPD</code>节点的方法:那就是它通常会位于<code>Speaker Out</code>和<code>HP Out</code>这两个输出节点上.至于其它教程提到过的<strong>关于<code>01470c02</code>是组神奇的代码,可以让外放发声</strong>的说法是错误的,它可能刚好声卡的<code>Speaker Out</code>的输出节点是<code>0x14</code>而已.如果您的<code>Speaker Out</code>输出节点是<code>0x16</code>,那么就需要把它修改为<code>01670c02</code>,当然要遵守这个公式:<code>Address</code>+<code>节点</code>+<code>71c</code>+<code>02</code></p><p>本节教程先更新到这里 11-13-2017 10:25PM</p><p>续更</p><p>另外一种找出<code>EAPD</code>节点的方法:使用工具<code>node_dump.sh</code>,它会显示出每个节点的信息,包括<code>EAPD</code>输出,详细的用法以后再补充上.</p><p>说了半天,也只说了一个<code>01470c02</code>是干什么用的,其它的四组数据都分别代表什么呢?这个话题如果展开讲的话,没个一两天是说不明白的.<br>接下来的部分就会介绍到这四组数据是怎么整理出来的.</p><h2 id="通过codec里面的pin-default提取并整理"><a class="markdownIt-Anchor" href="#通过codec里面的pin-default提取并整理"></a> 通过<code>codec</code>里面的<code>Pin Default</code>提取并整理</h2><p>将使用<code>verbit.sh</code>整理出来的<code>ALC256_dump.txt</code>重新打开:</p><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">Verbs from Linux Codec Dump <span class="symbol">File:</span> codec<span class="comment">#0</span></span><br><span class="line"></span><br><span class="line"><span class="symbol">Codec:</span> Realtek ALC3246 <span class="symbol">Address:</span> <span class="number">0</span> <span class="symbol">DevID:</span> <span class="number">283902550</span> (<span class="number">0x10ec0256</span>)</span><br><span class="line"></span><br><span class="line"> Jack Color Description Node PinDefault Original Verbs</span><br><span class="line">--------------------------------------------------------------------------------------------------------</span><br><span class="line">Digital Unknown Mic at Int N/A <span class="number">18</span> <span class="number">0x12</span> <span class="number">0x90a60170</span> <span class="number">01271</span>c7<span class="number">0</span> <span class="number">01271</span>d01 <span class="number">01271</span>ea6 <span class="number">01271</span>f9<span class="number">0</span></span><br><span class="line">Unknown Unknown Line Out at Ext N/A <span class="number">19</span> <span class="number">0x13</span> <span class="number">0x40000000</span> <span class="number">01371</span>c0<span class="number">0</span> <span class="number">01371</span>d0<span class="number">0</span> <span class="number">01371</span>e0<span class="number">0</span> <span class="number">01371</span>f4<span class="number">0</span></span><br><span class="line"> Analog Unknown Speaker at Int N/A <span class="number">20</span> <span class="number">0x14</span> <span class="number">0x90170140</span> <span class="number">01471</span>c4<span class="number">0</span> <span class="number">01471</span>d01 <span class="number">01471</span>e17 <span class="number">01471</span>f9<span class="number">0</span></span><br><span class="line"> <span class="number">1</span>/<span class="number">8</span> Black Speaker at Ext Rear <span class="number">24</span> <span class="number">0x18</span> <span class="number">0x411111f0</span> <span class="number">01</span>871cf<span class="number">0</span> <span class="number">01</span>871d11 <span class="number">01</span>871e11 <span class="number">01</span>871f41</span><br><span class="line"> <span class="number">1</span>/<span class="number">8</span> Black Speaker at Ext Rear <span class="number">25</span> <span class="number">0x19</span> <span class="number">0x411111f0</span> <span class="number">01</span>971c1<span class="number">0</span> <span class="number">01</span>971d2<span class="number">0</span> <span class="number">01</span>971e81 <span class="number">01</span>971f02</span><br><span class="line"> <span class="number">1</span>/<span class="number">8</span> Black Speaker at Ext Rear <span class="number">26</span> <span class="number">0x1a</span> <span class="number">0x411111f0</span> <span class="number">01</span>a71cf<span class="number">0</span> <span class="number">01</span>a71d11 <span class="number">01</span>a71e11 <span class="number">01</span>a71f41</span><br><span class="line"> <span class="number">1</span>/<span class="number">8</span> Black Speaker at Ext Rear <span class="number">27</span> <span class="number">0x1b</span> <span class="number">0x411111f0</span> <span class="number">01</span>b71cf<span class="number">0</span> <span class="number">01</span>b71d11 <span class="number">01</span>b71e11 <span class="number">01</span>b71f41 </span><br><span class="line"> Analog Pink Modem Hand at Ext N/A <span class="number">29</span> <span class="number">0x1d</span> <span class="number">0x40779a2d</span> <span class="number">01</span>d71c2d <span class="number">01</span>d71d9a <span class="number">01</span>d71e77 <span class="number">01</span>d71f4<span class="number">0</span></span><br><span class="line"> <span class="number">1</span>/<span class="number">8</span> Black Speaker at Ext Rear <span class="number">30</span> <span class="number">0x1e</span> <span class="number">0x411111f0</span> <span class="number">01</span>e71cf<span class="number">0</span> <span class="number">01</span>e71d11 <span class="number">01</span>e71e11 <span class="number">01</span>e71f41</span><br><span class="line"> <span class="number">1</span>/<span class="number">8</span> Black HP Out at Ext Front <span class="number">33</span> <span class="number">0x21</span> <span class="number">0x02211030</span> <span class="number">02171</span>c3<span class="number">0</span> <span class="number">02171</span>d1<span class="number">0</span> <span class="number">02171</span>e21 <span class="number">02171</span>f02</span><br><span class="line">--------------------------------------------------------------------------------------------------------</span><br></pre></td></tr></table></figure><p>将数据整理成如下的样式:</p><ul><li>[Fixed]是内部设备</li><li>[Jack]是通过插孔进行连接的外部设备</li><li>[N/A]是其它未知设备</li></ul><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">Node PinDefault Description </span><br><span class="line">----------------------------------------------------------</span><br><span class="line"><span class="number">0x12</span> <span class="number">0x90a60170</span> [Fixed] Mic at Int </span><br><span class="line"><span class="number">0x13</span> <span class="number">0x40000000</span> [N/A] Line Out at Ext N/A </span><br><span class="line"><span class="number">0x14</span> <span class="number">0x90170140</span> [Fixed] Speaker at Int </span><br><span class="line"><span class="number">0x18</span> <span class="number">0x411111f0</span> [N/A] Speaker at Ext Rear </span><br><span class="line"><span class="number">0x19</span> <span class="number">0x411111f0</span> [N/A] Speaker at Ext Rear </span><br><span class="line"><span class="number">0x1a</span> <span class="number">0x411111f0</span> [N/A] Speaker at Ext Rear </span><br><span class="line"><span class="number">0x1b</span> <span class="number">0x411111f0</span> [N/A] Speaker at Ext Rear </span><br><span class="line"><span class="number">0x1d</span> <span class="number">0x40779a2d</span> [N/A] Modem Hand at Ext N/A</span><br><span class="line"><span class="number">0x1e</span> <span class="number">0x411111f0</span> [N/A] Speaker at Ext Rear </span><br><span class="line"><span class="number">0x21</span> <span class="number">0x02211030</span> [Jack] HP Out at Ext Front </span><br><span class="line">----------------------------------------------------------</span><br></pre></td></tr></table></figure><p>将<code>PinDefault</code>进行小端转换<a href="https://zh.wikipedia.org/zh-hans/%E5%AD%97%E8%8A%82%E5%BA%8F" target="_blank" rel="noopener">little-endian</a>,这里借用一张紫米教程里面的图片进行小端转换的理解:<br><img src="https://pan.daliansky.net/d/blog/little-endian.jpg" alt="little-endian"><br>就是把<code>PinDefault</code>的数据两两对调,比如:<code>0x12</code>节点的<code>[Fixed] Mic at Int</code>原始数据为:<code>0x90a60170</code>,去掉前面的<code>0x</code>,变成<code>90 a6 01 70</code>,<br>最前面的<code>90</code>跑到了最后,最后的<code>70</code>又跑到了最前面,中间的<code>a6</code>和<code>01</code>再对调下,就变成了<code>70 01 a6 90</code>.整理后,变成如下的格式:</p><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">Node c d e f Description</span><br><span class="line"><span class="number">12</span> <span class="number">70</span> <span class="number">01</span> a6 <span class="number">90</span> [Fixed] Mic at Int </span><br><span class="line"><span class="number">13</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span> <span class="number">40</span> [N/A] Line Out at Ext N/A </span><br><span class="line"><span class="number">14</span> <span class="number">40</span> <span class="number">01</span> <span class="number">17</span> <span class="number">90</span> [Fixed] Speaker at Int </span><br><span class="line"><span class="number">18</span> f<span class="number">0</span> <span class="number">11</span> <span class="number">11</span> <span class="number">41</span> [N/A] Speaker at Ext Rear </span><br><span class="line"><span class="number">19</span> f<span class="number">0</span> <span class="number">11</span> <span class="number">11</span> <span class="number">41</span> [N/A] Speaker at Ext Rear </span><br><span class="line"><span class="number">1</span>a f<span class="number">0</span> <span class="number">11</span> <span class="number">11</span> <span class="number">41</span> [N/A] Speaker at Ext Rear </span><br><span class="line"><span class="number">1</span>b f<span class="number">0</span> <span class="number">11</span> <span class="number">11</span> <span class="number">41</span> [N/A] Speaker at Ext Rear </span><br><span class="line"><span class="number">1</span>d <span class="number">2</span>d <span class="number">9</span>a <span class="number">77</span> <span class="number">40</span> [N/A] Modem Hand at Ext N/A</span><br><span class="line"><span class="number">1</span>e f<span class="number">0</span> <span class="number">11</span> <span class="number">11</span> <span class="number">41</span> [N/A] Speaker at Ext Rear </span><br><span class="line"><span class="number">21</span> <span class="number">30</span> <span class="number">10</span> <span class="number">21</span> <span class="number">02</span> [Jack] HP Out at Ext Front</span><br></pre></td></tr></table></figure><p>下一步,我们要对数据进行修正,让它看起来更像<code>APPLE</code>.</p><h2 id="修正pindefault并生成configdata"><a class="markdownIt-Anchor" href="#修正pindefault并生成configdata"></a> 修正<code>PinDefault</code>,并生成<code>ConfigData</code></h2><p>上一节我们只是把数据进一步地整理出来,并进行了格式化,我们并没有对数据进行修正.本节我们就开始进行<code>PinDefault</code>的修正,先上一张我整理出来的表格:<br><img src="https://pan.daliansky.net/d/blog/pinconfigs.png" alt="pinconfigs"></p><ul><li>前面我提到过通过Linux找到的节点<code>0x19</code>,它在Linux下面显示的设备为<code>Headset Mic</code>,在上一节中我们整理出的<code>0x19</code>的设备为:<code>[N/A] Speaker at Ext Rear</code> , <code>PinDefault</code>值为:<code>f0 11 11 41</code>,通过上表我们得知,这个端口是被屏蔽掉的,就是不起作用的节点.</li><li>现在我们希望它能正常工作,我的想法是把它修正为:<code>[Jack] Mic at Ext</code>,一个可以正常工作的外部麦克输入设备,结合上面的表格,我将<code>f0 11 11 41</code>修改为:<code>70 20 a1 02</code>.</li><li>由于我的耳机插孔只有一个,也就是俗称的二合一插孔,我希望在上面的外麦克工作不正常的情况下,可以将耳麦和耳机输出定义成组合插孔(2in1),上表中<code>Connection Type</code>的连接类型中,正好有个<code>B=Combination</code>,它的意思就是:<code>组合</code>,我需要同时修正耳麦和耳机的数值:<ul><li><code>Mic at Ext</code> : <code>f0 11 11 41</code>-><code>70 20 ab 02</code></li><li><code>HP Out Ext</code> : <code>30 10 21 02</code>-><code>30 10 2b 02</code></li></ul></li></ul><h2 id="屏蔽无效节点f0-00-00-40"><a class="markdownIt-Anchor" href="#屏蔽无效节点f0-00-00-40"></a> 屏蔽无效节点:<code>f0 00 00 40</code></h2><p>屏蔽掉无效的节点,避免产生杂音和底噪,更详细的描述请见<code>其它问题</code></p><p><code>0x1d</code>的节点为无效节点,所以必须把它屏蔽起来,为了让它更符合<code>APPLE</code>的规范,我们使用<code>f0 00 00 40</code>来屏蔽,包括其它的不用的节点.修正后的数据为:</p><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">Node c d e f Description</span><br><span class="line"><span class="number">12</span> <span class="number">70</span> <span class="number">01</span> a6 <span class="number">90</span> [Fixed] Mic at Int </span><br><span class="line"><span class="number">13</span> f<span class="number">0</span> <span class="number">00</span> <span class="number">00</span> <span class="number">40</span> [N/A] Line Out at Ext N/A </span><br><span class="line"><span class="number">14</span> <span class="number">40</span> <span class="number">01</span> <span class="number">17</span> <span class="number">90</span> [Fixed] Speaker at Int </span><br><span class="line"><span class="number">18</span> f<span class="number">0</span> <span class="number">00</span> <span class="number">00</span> <span class="number">40</span> [N/A] Speaker at Ext Rear </span><br><span class="line"><span class="number">19</span> <span class="number">70</span> <span class="number">10</span> ab <span class="number">02</span> [Jack] Mic at Ext </span><br><span class="line"><span class="number">1</span>a f<span class="number">0</span> <span class="number">00</span> <span class="number">00</span> <span class="number">40</span> [N/A] Speaker at Ext Rear </span><br><span class="line"><span class="number">1</span>b f<span class="number">0</span> <span class="number">00</span> <span class="number">00</span> <span class="number">40</span> [N/A] Speaker at Ext Rear </span><br><span class="line"><span class="number">1</span>d f<span class="number">0</span> <span class="number">00</span> <span class="number">00</span> <span class="number">40</span> [N/A] Modem Hand at Ext N/A</span><br><span class="line"><span class="number">1</span>e f<span class="number">0</span> <span class="number">00</span> <span class="number">00</span> <span class="number">40</span> [N/A] Speaker at Ext Rear </span><br><span class="line"><span class="number">21</span> <span class="number">30</span> <span class="number">10</span> <span class="number">2</span>b <span class="number">02</span> [Jack] HP Out at Ext Front</span><br></pre></td></tr></table></figure><p>现在, 我们可以生成最终的<code>ConfigData</code>了,<br><code>ConfigData</code>的计算公式为:</p><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Final <span class="symbol">Config:</span></span><br><span class="line">Address + Node + <span class="number">71</span>c +【c】</span><br><span class="line">Address + Node + <span class="number">71</span>d +【d】</span><br><span class="line">Address + Node + <span class="number">71</span>e +【e】</span><br><span class="line">Address + Node + <span class="number">71</span>f +【f】</span><br></pre></td></tr></table></figure><p>这里的<code>c</code> <code>d</code> <code>e</code> <code>f</code>就是上面整理出来的2位数值<br>我的ALC256的<code>Address</code>值为0,现在我将节点<code>0x12</code>的<code>ConfigData</code>值通过上面的公式整理后得出:</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">01271c70 01271d01 01271ea6 01271f90</span><br></pre></td></tr></table></figure><p>相应地,其它的节点整理出来的数据如下:</p><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">01271</span>c7<span class="number">0</span> <span class="number">01271</span>d01 <span class="number">01271</span>ea6 <span class="number">01271</span>f9<span class="number">0</span></span><br><span class="line"><span class="number">01371</span>cf<span class="number">0</span> <span class="number">01371</span>d0<span class="number">0</span> <span class="number">01371</span>e0<span class="number">0</span> <span class="number">01371</span>f4<span class="number">0</span></span><br><span class="line"><span class="number">01471</span>c4<span class="number">0</span> <span class="number">01471</span>d01 <span class="number">01471</span>e17 <span class="number">01471</span>f9<span class="number">0</span> <span class="number">01470</span>c02</span><br><span class="line"><span class="number">01</span>871cf<span class="number">0</span> <span class="number">01</span>871d0<span class="number">0</span> <span class="number">01</span>871e0<span class="number">0</span> <span class="number">01</span>871f4<span class="number">0</span></span><br><span class="line"><span class="number">01</span>971c7<span class="number">0</span> <span class="number">01</span>971d1<span class="number">0</span> <span class="number">01</span>971eab <span class="number">01</span>971f02</span><br><span class="line"><span class="number">01</span>a71cf<span class="number">0</span> <span class="number">01</span>a71d0<span class="number">0</span> <span class="number">01</span>a71e0<span class="number">0</span> <span class="number">01</span>a71f4<span class="number">0</span></span><br><span class="line"><span class="number">01</span>b71cf<span class="number">0</span> <span class="number">01</span>b71d0<span class="number">0</span> <span class="number">01</span>b71e0<span class="number">0</span> <span class="number">01</span>b71f4<span class="number">0</span></span><br><span class="line"><span class="number">01</span>d71cf<span class="number">0</span> <span class="number">01</span>d71d0<span class="number">0</span> <span class="number">01</span>d71e0<span class="number">0</span> <span class="number">01</span>d71f4<span class="number">0</span></span><br><span class="line"><span class="number">01</span>e71cf<span class="number">0</span> <span class="number">01</span>e71d0<span class="number">0</span> <span class="number">01</span>e71e0<span class="number">0</span> <span class="number">01</span>e71f4<span class="number">0</span></span><br><span class="line"><span class="number">02171</span>c3<span class="number">0</span> <span class="number">02171</span>d1<span class="number">0</span> <span class="number">02171</span>e2b <span class="number">02171</span>f02 <span class="number">02170</span>c02</span><br></pre></td></tr></table></figure><p>我将编辑的过程做了段视频,方便大家理解.</p><video width="640" height="480" controls><source src="https://pan.daliansky.net/d/blog/ConfigData.mp4"></video><p>打开<code>Sublime Text.app</code>,按住鼠标中键打开块复制,将<code>c</code> <code>d</code> <code>e</code> <code>f</code>下面的数据块拷贝一份到最下面空白处,在第一列按鼠标中键一下拉到下面,输入<code>Address</code>值<code>0</code>,再把上方的<code>Node</code>下面的数据做块复制,粘贴到0后面,再输入:<code>71c</code>,再将<code>01271</code>做块复制到后面,再分别输入<code>d</code> <code>e</code> <code>f</code>即可.最后在<code>0x14</code>和<code>0x21</code>节点后面添加两组<code>EAPD</code>数据.<br>将上面整理出来的数据去掉每行的硬回车后得到的一组数据就是最终的<code>ConfigData</code><br><code>01271c70 01271d01 01271ea6 01271f90 01371cf0 01371d00 01371e00 01371f40 01471c40 01471d01 01471e17 01471f90 01470c02 01871cf0 01871d00 01871e00 01871f40 01971c70 01971d10 01971eab 01971f02 01a71cf0 01a71d00 01a71e00 01a71f40 01b71cf0 01b71d00 01b71e00 01b71f40 01d71cf0 01d71d00 01d71e00 01d71f40 01e71cf0 01e71d00 01e71e00 01e71f40 02171c30 02171d10 02171e2b 02171f02 02170c02</code></p><p>到这里,<code>ConfigData</code>的数据就算整理完了.</p><h1 id="找出适合你的id"><a class="markdownIt-Anchor" href="#找出适合你的id"></a> 找出适合你的id</h1><p>这一节里,我们就来一起动手找出最适合你的注入id<br>正确的注入id可以保证您的声卡各项功能都能正常使用,它至关重要,这里给出的方法也是为了进一步验证前面我们所做的工作.<br>到找注入id这一步,您至少已经有了这些数据:</p><ul><li>声卡基础资料:</li></ul><table><thead><tr><th>名称</th><th>解释</th></tr></thead><tbody><tr><td>Codec: Realtek ALC3246</td><td>是告诉了你的声卡型号是ALC3246(ALC256)</td></tr><tr><td>Address: 0</td><td>会告诉你生成configdata的数据的前缀是0,比如上面显示输出信息最后一行的<code>Modified Verbs in One Line:</code>后面所有的数据中,每组数据的第一位就是这个 <code>0</code> ,如果<code>Address: 2</code>,那么每组数据的第一位就是 <code>2</code> ,这个后面我们会用到它</td></tr><tr><td>DevID: 283902550 (0x10ec0256)</td><td>283902550是0x10ec0256的10进制值,0x10ec 是指vendorID(芯片供应商ID),是REALTEK的设备标识,0256是指型号,去掉前面的0,您的声卡型号就是:ALC256</td></tr></tbody></table><ul><li>整理出来的有效节点及路径</li></ul><table><thead><tr><th>有效节点</th><th>10进制</th><th>设备名称</th><th>路径</th></tr></thead><tbody><tr><td>0x14</td><td>20</td><td>Speaker out</td><td><strong>20->2</strong></td></tr><tr><td>0x21</td><td>33</td><td>HP out</td><td><strong>33->3</strong></td></tr><tr><td>0x19</td><td>25</td><td>Headset Mic in</td><td><strong>8->35->25</strong> <strong>9->34->25</strong></td></tr><tr><td>0x1a</td><td>26</td><td>Headphone Mic in</td><td><strong>8->35->26</strong> <strong>9->34->26</strong></td></tr><tr><td>0x12</td><td>18</td><td>Internal Mic in</td><td><strong>8->35->18</strong></td></tr></tbody></table><ul><li>最终的<code>ConfigData</code>数据:<br><code>01271c20 01271d01 01271ea6 01271f90 01371cf0 01371d00 01371e00 01371f40 01471c40 01471d01 01471e17 01471f90 01470c02 01871cf0 01871d00 01871e00 01871f40 01971c10 01971d10 01971e8b 01971f02 01a71cf0 01a71d00 01a71e00 01a71f40 01b71cf0 01b71d00 01b71e00 01b71f40 01d71cf0 01d71d00 01d71e00 01d71f40 01e71cf0 01e71d00 01e71e00 01e71f40 02171c30 02171d10 02171e2b 02171f02 02170c02</code></li></ul><p>下一步,我们就要将这些数据<code>放</code>进<code>AppleALC</code>相应的位置,让它发挥作用.</p><h2 id="下载applealc"><a class="markdownIt-Anchor" href="#下载applealc"></a> 下载<code>AppleALC</code></h2><p>操作步骤:</p><ol><li><p>创建<code>AppleALC</code>的本地仓库的克隆版本:</p><ul><li><p>使用<code>git</code>命令,更多<code>git</code>命令的用法请参考<a href="http://www.bootcss.com/p/git-guide/" target="_blank" rel="noopener">git使用简易指南</a>:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">mkdir ~/git <span class="comment"># 在家目录下新建立`git`目录</span></span><br><span class="line"><span class="built_in">cd</span> ~/git <span class="comment"># 进入`git`目录</span></span><br><span class="line">git <span class="built_in">clone</span> https://github.com/vit9696/AppleALC <span class="comment"># 克隆AppleALC到本地</span></span><br></pre></td></tr></table></figure></li><li><p>或者通过浏览器下载 <a href="https://github.com/vit9696/AppleALC/archive/master.zip" target="_blank" rel="noopener">AppleALC最新版</a></p></li></ul></li><li><p>打开<code>AppleALC</code>目录,进入<code>Resources</code>目录,你会发现这里面<code>躺</code>着截止到目前所支持的声卡的全部型号.我的声卡是<code>ALC256</code>,我就点击<code>ALC256</code>为便于理解,我将除了<code>ALC256</code>之外的其它型号的声卡目录全部删除了,它看起来如下图所示:<br><img src="https://pan.daliansky.net/d/blog/ALC_Folder.png" alt="ALC_Folder">我们会发现该目录下包括了一个定义文件<code>Info.plist</code>,打开<code>Info.plist</code>,你会发现,它定义了一个声卡驱动所需要的数据,<code>CodecID</code>后面的<code>598</code>是<code>ALC256</code>的<code>0x256</code>的10进制数值,<code>CodecName</code>是声卡名称的描述,这里是<code>ALC256(3246)</code>,接下来是<code>Files</code>,它分成两部分,一部分是<code>Layouts</code>,它定义声卡设备的布局,另一部分是<code>Platforms</code>,它定义声卡的平台注入,包括有效节点和路径的定义.<br><img src="https://pan.daliansky.net/d/blog/ALC256_Info.plist.png" alt="ALC256_Info.plist"></p></li></ol><p>三个<code>layout</code>开头的文件以及三个<code>Platforms</code>开头的文件,<code>Platforms</code>为路径定义文件.其中<code>layout13.xml.zlib</code> <code>layout28.xml.zlib</code> <code>layout56.xml.zlib</code>就是注入的id,只是你的声卡需要注入的是哪个ID才能获得最佳效果,还需要分析其它的数据.</p><h2 id="如何找出适合你的id"><a class="markdownIt-Anchor" href="#如何找出适合你的id"></a> 如何找出适合你的id</h2><p>通过制作几十个声卡仿冒的驱动,我发现找出注入的id还是有些窍门的,比如说我可以通过<code>PinConfigs.kext</code>的<code>Info.plist</code>,将同一型号的声卡的<code>ConfigData</code>都找出来,方法:</p><ul><li>根据上面整理的声卡基础资料将<code>Address</code>不为<code>0</code>的排除出去</li><li>剩下的<code>LayoutID</code>里,再通过<code>ConfigData</code>将有效节点的数据留下,无效的排除,这样剩下来的<code>LayoutID</code>也就没几个了</li><li>最后,通过<code>PlatformsID</code>,找出有效节点及路径,最终确定注入的id</li><li>需要注意的是,某些型号的声卡的注入id可以是唯一的,也可以是多个,这些都需要通过分析数据进行确认</li></ul><blockquote><p>这里插句题外话:之前给群友做声卡仿冒的时候,<code>ALC269</code>和<code>ALC887</code>我都是直接绕路走的,或者让群友用<code>VoodooHDA</code>,或者直接拒绝.现在可以使用排除法,很快就能找到注入的id</p></blockquote><p>更新于:11-21-2017 22:30</p><h1 id="如何修改layout和platforms数据"><a class="markdownIt-Anchor" href="#如何修改layout和platforms数据"></a> 如何修改<code>layout</code>和<code>Platforms</code>数据</h1><blockquote><p>上文中我们提到了通过<code>PlatformsID</code>,找出有效节点及路径,最终确定注入的id</p></blockquote><p>如何确认路径是否正确,我应该怎么做呢?先打开<code>Platforms</code>文件,需要用到的工具:<code>zlib转换器.app</code>.<br>操作方法:</p><ul><li><p>打开<code>zlib转换器.app</code>,把需要解压缩的后缀为.zlib的文件拖进窗口里,按下<code>CONVERT</code>按钮,就会在当前的目录下生成去掉了.zlib后缀的可以编辑的.xml文件了.相应地,当你编辑好了的.xml文件,拖进窗口里,按下<code>CONVERT</code>按钮,会在当前目录下生成.zlib后缀的文件了.</p><video width="640" height="480" controls><source src="https://pan.daliansky.net/d/blog/zlib.mp4"></video></li></ul><p>使用工具<code>PlistEdit Pro.app</code>打开<code>Platforms56.xml</code>,依次打开<code>PathMap->0->0->0</code>,这里的<code>NodeID</code>就是节点id.为便于理解,我将<code>Mic Int</code>的路径做了说明,如下图显示:<br><img src="https://pan.daliansky.net/d/blog/Platforms_edit2.png" alt="Platforms_edit2"></p><h1 id="如何新建一个注入id"><a class="markdownIt-Anchor" href="#如何新建一个注入id"></a> 如何新建一个注入id</h1><p>为什么要建立一个全新的layout-id呢?很多时候,我们其实仿冒声卡驱动,只是为了让自己的声卡驱动正常,而通常的做法是找出一个存在的ID,然后整理数据,修改路径和<code>ConfigData</code>,最后编译使用.</p><p>那如果<code>AppleALC</code>的维护者<code>vit9696</code>更新了源代码怎么办呢?你总不能再重复做一遍驱动吧?或者说你好不容易找人帮你做好了一个驱动程序,然后<code>AppleALc</code>就升级了,旧的驱动无法用到新的系统当中,这个时候你的选择是什么?继续找人帮你做驱动?或者自己动手仿冒?</p><p>其实最好的方法是:如果你的声卡不存在于<a href="https://blog.daliansky.net/AppleALC-Supported-codecs.html">AppleALC支持的Codecs列表</a>中,或者其中的某个注入id并不会很好地工作,那么你就需要新建一个注入id编译使用,测试无误后,你甚至还可以将这些修改提交给<code>vit9696</code>,他会将这些更新合并到<code>AppleALC</code>的源代码中,这样以后再有更新你只需要下载个<code>AppleALC</code>的发行版直接使用就好了.<br><img src="https://pan.daliansky.net/d/blog/ALC298_ID99_ALC295_ID13.png" alt="ALC298_ID99_ALC295_ID13"></p><p>上图中,是我给小米Pro制作的全新的ALC298注入ID:99,只要是小米Pro的机型,可以直接注入id:99来驱动你的声卡.</p><p>如果你想制作属于你的专属声卡注入ID,可添加文章最后的QQ群,进入群内一起讨论.</p><h1 id="编译applealc"><a class="markdownIt-Anchor" href="#编译applealc"></a> 编译AppleALC</h1><p>使用xcode<br>通过lilu联合编译</p><h1 id="注入id"><a class="markdownIt-Anchor" href="#注入id"></a> 注入id</h1><h1 id="测试"><a class="markdownIt-Anchor" href="#测试"></a> 测试</h1><h2 id="检查applealc是否正确加载"><a class="markdownIt-Anchor" href="#检查applealc是否正确加载"></a> 检查<code>AppleALC</code>是否正确加载</h2><p>打开终端,输入命令:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">kextstat | grep AppleALC</span><br></pre></td></tr></table></figure><p>显示内容如下:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">kextstat | grep AppleALC</span><br><span class="line"> 36 0 0xffffff7f8331b000 0xb0000 0xb0000</span><br><span class="line"> as.vit9696.AppleALC (1.2.1) </span><br><span class="line"> 7CDA2635-8BE4-36E1-B882-8CA3B90284F3 <35 7 5 4 3 2 1></span><br></pre></td></tr></table></figure><p>我们可以看到<code>AppleALC</code>驱动已经被正确加载,版本是<code>1.2.1</code>,如果没有内容输出,那么就有可能没有加载.通常这种情况是因为<code>Lilu</code>的版本引起的,可以尝试使用<code>Lilu</code> Debug版本.</p><h2 id="检查注入id是否正确"><a class="markdownIt-Anchor" href="#检查注入id是否正确"></a> 检查注入id是否正确</h2><p>打开终端,输入命令:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ioreg -l | grep layout-id</span><br></pre></td></tr></table></figure><p>显示内容如下:</p><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">~ % ioreg -l <span class="params">| grep layout-id</span></span><br><span class="line"><span class="params"> |</span> <span class="params">| |</span> <span class="params">| "layout-id" = <38000000></span></span><br><span class="line"><span class="params"> |</span> <span class="params">| |</span> <span class="params">| |</span> <span class="string">"IOAudioEngineDeviceDescription"</span> = {</span><br><span class="line"> <span class="string">"num-internal-mics"</span>=<span class="number">1</span>,</span><br><span class="line"> <span class="string">"driver digital input gain"</span>=<span class="number">0</span>,</span><br><span class="line"> <span class="string">"layout-id"</span>=<span class="number">56</span>,</span><br><span class="line"> <span class="string">"post-processing input gain"</span>=<span class="number">25</span>,</span><br><span class="line"> <span class="string">"VP-pregain"</span>=<span class="number">25</span>}</span><br></pre></td></tr></table></figure><p>为了便于讲解,我将内容做了换行处理.<br>其中的<code>"layout-id"=56</code>就是指注入id是 <code>56</code> ,而<code><38000000></code>是<code>56</code>的16进制</p><h2 id="检查pinconfigurations"><a class="markdownIt-Anchor" href="#检查pinconfigurations"></a> 检查<code>PinConfigurations</code></h2><p>使用<code>IORegistryExplorer.app</code>,找到<code>HDEF@1F,3</code>,右侧的<code>PinConfigurations</code>就是最终的四个节点的数值,同时我们发现其它的节点已经不存在了,这样的结果正是我们需要的.<br><img src="https://pan.daliansky.net/d/blog/ioreg_pinconfigurations.png" alt="ioreg_pinconfigurations"></p><h1 id="其它问题"><a class="markdownIt-Anchor" href="#其它问题"></a> 其它问题</h1><h2 id="解决耳机切换睡眠唤醒去除底噪等常见问题"><a class="markdownIt-Anchor" href="#解决耳机切换睡眠唤醒去除底噪等常见问题"></a> 解决耳机切换/睡眠唤醒/去除底噪等常见问题</h2><blockquote><p>经常会有群友在使用<code>AppleALC</code>声卡仿冒驱动程序驱动了声卡后,出现最多的问题就是外放正常,耳机不正常,具体表现为:耳机在插入一半的时候有声音,完全插入后却没有声音的现象;另一种最常见的现象是开机声音正常,睡眠唤醒后无声/出现杂音/有电流声(底噪)/单声道/只有伴奏音,没有人声等等的问题.</p><p>本节教程就让我们来一起解决这些常见问题,还你一个干净的,没有杂音的声卡驱动.</p></blockquote><p>在我们着手解决这些问题之前,需要先说说这些问题是如何产生的:</p><p>让我们打开电脑,进入<code>MacOS</code>系统后,<code>AppleALC</code>仿冒驱动会成功加载<code>AppleHDA</code>以驱动你的声卡,这个时候声卡通常工作都是正常的.为了证明<code>AppleALC</code>加载后的有效节点的状态,我们需要使用两个<a href="https://github.com/daliansky/dell7000/tree/master/hda-tools" target="_blank" rel="noopener">工具</a><code>widget_dump.sh</code>和<code>node_dump.sh</code>,使用方法:打开终端,输入命令:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">widget_dump.sh</span><br></pre></td></tr></table></figure><p>显示的输出信息如下:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line">sky@skys-MacBookPro ~ widget_dump.sh</span><br><span class="line">Pin Widget Control</span><br><span class="line"> nid = <span class="number">0x02</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x03</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x04</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x05</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x06</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x07</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x08</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x09</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x0a</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x0b</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x0c</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x0d</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x0e</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x0f</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x10</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x11</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = 0x12 --> result 0x00000020 # 内置麦克风</span><br><span class="line"> nid = <span class="number">0x13</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = 0x14 --> result 0x00000040 # 喇叭</span><br><span class="line"> nid = <span class="number">0x15</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x16</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x17</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x18</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = 0x19 --> result 0x00000000 # 耳麦</span><br><span class="line"> nid = <span class="number">0x1a</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x1b</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x1c</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x1d</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x1e</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x1f</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x20</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = 0x21 --> result 0x00000000 # 耳机</span><br><span class="line"> nid = <span class="number">0x22</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x23</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x24</span> --> result <span class="number">0x00000000</span></span><br></pre></td></tr></table></figure><p>我们可以看到,刚开机没有插入耳机的情况下,只有外放的喇叭和内置的麦克风是工作的,其它所有的节点的数据都是空白的.</p><p>当我们插入耳机后,再输入命令:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">widget_dump.sh</span><br></pre></td></tr></table></figure><p>显示的输出信息如下:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line">sky@skys-MacBookPro ~ widget_dump.sh</span><br><span class="line">Pin Widget Control</span><br><span class="line"> nid = <span class="number">0x02</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x03</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x04</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x05</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x06</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x07</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x08</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x09</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x0a</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x0b</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x0c</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x0d</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x0e</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x0f</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x10</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x11</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = 0x12 --> result 0x00000000 # 内置麦克风</span><br><span class="line"> nid = <span class="number">0x13</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = 0x14 --> result 0x00000000 # 喇叭 </span><br><span class="line"> nid = <span class="number">0x15</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x16</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x17</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x18</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = 0x19 --> result 0x00000020 # 耳麦</span><br><span class="line"> nid = <span class="number">0x1a</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x1b</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x1c</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x1d</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x1e</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x1f</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x20</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = 0x21 --> result 0x000000c0 # 耳机</span><br><span class="line"> nid = <span class="number">0x22</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x23</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x24</span> --> result <span class="number">0x00000000</span></span><br></pre></td></tr></table></figure><p>这时我们会发现,之前工作的喇叭和内置麦克风的数据已经发生了变化</p><table><thead><tr><th style="text-align:center">节点</th><th style="text-align:center">名称</th><th style="text-align:center">外放状态</th><th style="text-align:center">耳机状态</th></tr></thead><tbody><tr><td style="text-align:center">0x12</td><td style="text-align:center">内置麦克风(Mic Int)</td><td style="text-align:center">0x000000<strong>20</strong></td><td style="text-align:center">0x00000000</td></tr><tr><td style="text-align:center">0x14</td><td style="text-align:center">喇叭(Speaker Out)</td><td style="text-align:center">0x00000040</td><td style="text-align:center">0x00000000</td></tr><tr><td style="text-align:center">0x19</td><td style="text-align:center">耳麦(Mic Ext/Line In)</td><td style="text-align:center">0x00000000</td><td style="text-align:center">0x000000<strong>20</strong></td></tr><tr><td style="text-align:center">0x21</td><td style="text-align:center">耳机(HP Out)</td><td style="text-align:center">0x00000000</td><td style="text-align:center">0x000000c0</td></tr></tbody></table><p>通过上面的表格,我们可以发现内部设备和外部设备正常工作的情况下会自动切换.</p><p><strong>widget_dump.sh是调用<code>hda-verb</code>这个外部命令执行的,<code>hda-verb</code>依赖于<code>CodecCommander</code>,所以请确认你已经加载了<code>CodecCommander</code></strong></p><h3 id="codeccommander-编解码器指挥官"><a class="markdownIt-Anchor" href="#codeccommander-编解码器指挥官"></a> CodecCommander <em>编解码器指挥官</em></h3><p><code>CodecCommander</code>用于更新在扬声器或耳机节点上使用给定放大器的HDA(高清晰度音频)编解码器上的EAPD(外部放大器)状态(两者,甚至在某些情况下甚至是额外的)。 在OSX中,EAPD在休眠状态下关闭,因此唤醒机器后音频仍然不起作用。</p><p>通常情况下,这个外部放大器出现在笔记本电脑和ITX板上,在使用ALC269,ALC665和类似编解码器的机器上最常见。 当机器进入睡眠状态时,功放处于关机状态,在唤醒之后,即使音频正常工作,扬声器/耳机仍然没有声音,因为功放需要发送一个编解码器命令才能启动。</p><p>最典型的两条命令是:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">0x19 SET_PIN_WIDGET_CONTROL 0x24</span><br><span class="line">0x21 SET_UNSOLICITED_ENABLE 0x82</span><br></pre></td></tr></table></figure><p>其中:<code>SET_PIN_WIDGET_CONTROL</code>是作用于<code>Mic Ext</code>节点,<code>SET_UNSOLICITED_ENABLE</code>是作用于<code>HP Out</code>节点</p><p><img src="https://pan.daliansky.net/d/blog/Pin-ctls.png" alt="Pin-ctls"></p><h4 id="pin-widget-control"><a class="markdownIt-Anchor" href="#pin-widget-control"></a> Pin Widget Control</h4><p>关于<code>Pin Widget Control</code>的描述请参阅<a href="https://www.intel.com/content/dam/www/public/us/en/documents/product-specifications/high-definition-audio-specification.pdf" target="_blank" rel="noopener">英特尔HDA规范 7.3.3.13</a></p><p>Enable VRef</p><table><thead><tr><th></th><th>Verb ID</th><th>Payload (8 Bits)</th><th>Response (32 Bits)</th></tr></thead><tbody><tr><td>Get</td><td>F07h</td><td>0</td><td>Bits 31:8 are 0<br>Bits 7:0 are PinCntl</td></tr><tr><td>Set</td><td>707h</td><td>Bits 7:0 are PinCntl</td><td>0</td></tr></tbody></table><p>PinCntl定义:</p><table><thead><tr><th>7</th><th>6</th><th>5</th><th>4:3</th><th>2</th><th>1:0</th></tr></thead><tbody><tr><td>H-Phn Enable</td><td>Out Enable</td><td>In Enable</td><td>Rsvd</td><td>VrefEn[2]</td><td>VRefEn[1:0]/EPT</td></tr></tbody></table><p>VRefEn 值:</p><table><thead><tr><th>VRefEn Encoding</th><th>VREF Signal Level</th></tr></thead><tbody><tr><td>000b</td><td>Hi-Z</td></tr><tr><td>001b</td><td>50%</td></tr><tr><td>010b</td><td>Ground (0 V)</td></tr><tr><td>011b</td><td>Reserved</td></tr><tr><td>100b</td><td>80%</td></tr><tr><td>101b</td><td>100%</td></tr><tr><td>110b-111b</td><td>Reserved</td></tr></tbody></table><p>SET_PIN_WIDGET_CONTROL:</p><table><thead><tr><th style="text-align:center"></th><th style="text-align:center"></th><th style="text-align:center"></th><th style="text-align:center"></th><th style="text-align:center">7654 3210</th><th style="text-align:center"></th><th style="text-align:center"></th></tr></thead><tbody><tr><td style="text-align:center">ALC256</td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td></tr><tr><td style="text-align:center">0x19</td><td style="text-align:center">707</td><td style="text-align:center">24</td><td style="text-align:center">-></td><td style="text-align:center">0010 0100</td><td style="text-align:center">-></td><td style="text-align:center">In Enable,VrefEn 80%</td></tr><tr><td style="text-align:center">0x21</td><td style="text-align:center">707</td><td style="text-align:center">C0</td><td style="text-align:center">-></td><td style="text-align:center">1100 0000</td><td style="text-align:center">-></td><td style="text-align:center">Headphone Enable,Out Enable</td></tr></tbody></table><p>SET_PIN_WIDGET_CONTROL命令最终格式为:</p><p><code>Address</code>+<code>NodeID</code>+707+<code>Pin-ctls</code></p><p>最终的命令为:<code>01970724</code></p><p>关于这部分的讨论请参阅<a href="https://www.tonymacx86.com/threads/any-fix-to-the-garbled-distorted-headphone-issue.159031/page-3" target="_blank" rel="noopener">Any fix to the Garbled/Distorted Headphone issue?</a></p><blockquote><p>原引:</p><p>RehabMan对于VrefEn和EPT的部分讨论内容:</p><p>我也尝试了节点0x19的0x20。 这也工作。 所以不知道在我的情况下是否需要VrefEn或EPT。 但是他们与巫毒有关,所以我使用了这个价值。我没有看过Voodoo是否明确地设置了这些值,或者是复位后的状态结果。</p><p>我认为我的设置0xC0到0x21也是没有必要的(仍在试验)。 节点0x19不在任何路径图上,所以我对于如何知道节点需要调整有些困惑。 尽管它在Linux转储中有连接到路径图上的其他节点。 进一步造成神秘,它被描述为Linux转储中的外部麦克风插孔。 为什么麦克风上的控件配置会影响耳机,这是一个谜。</p><p>还要注意,VrefEn和EPT之间有一些奇怪的重叠,这在规范中是不清楚的(它们似乎都使用相同的位)。 例如,将VRefEn设置为001b或010b(50%/地面)将设置标记为“保留”的EPT编码01b / 10b。 它确实说EPT是特定于“关联的数字Pin Widget”,所以也许这个重叠解释了VrefEn不适用于这样的小部件。 它还指出VRefEn的有效值取决于PinCaps,所以推测数字Pin小部件的PinCap不包含任何有效的VRefEn值。</p><p>如果你沿着这条路走下去,你应该计划阅读大量的东西,让整个过程神秘化。</p></blockquote><h4 id="unsolicited-response-未经请求的响应"><a class="markdownIt-Anchor" href="#unsolicited-response-未经请求的响应"></a> Unsolicited Response 未经请求的响应</h4><p><img src="https://pan.daliansky.net/d/blog/Unsolicited.png" alt="Unsolicited"></p><p>关于<code>Unsolicited Response</code>的描述请参阅<a href="https://www.intel.com/content/dam/www/public/us/en/documents/product-specifications/high-definition-audio-specification.pdf" target="_blank" rel="noopener">英特尔HDA规范 7.3.3.14</a></p><p>非请求响应控件确定节点是否被允许发送主动提供的响应,以及该标签将用于响应。此控制仅适用于支持主动响应的节点,如Function Group Type参数(第7.3.4.4节)和Audio Widget Capabilities参数(第7.3.4.6节)中所声明的。在获取或设置此控件之前,应该查询节点以确定它是否支持未经请求的响应。</p><p>Connection Select Control连接选择控制:</p><table><thead><tr><th></th><th>Verb ID</th><th>Payload (8 Bits)</th><th>Response (32 Bits)</th></tr></thead><tbody><tr><td>Get</td><td>F08h</td><td>0</td><td>Bits 31:8 are 0<br>EnableUnsol is bits 7:0</td></tr><tr><td>Set</td><td>708h</td><td>EnableUnsol is bits 7:0</td><td>0</td></tr></tbody></table><p>EnableUnsol 格式:</p><table><thead><tr><th>7</th><th>6</th><th>5:0</th></tr></thead><tbody><tr><td>Enable</td><td>0</td><td>Tag</td></tr></tbody></table><p>设定值是8bits的一个数。记作a7 a6 a5 a4 a3 a2 a1 a0.<br>a7=1,表示enabled。<br>a6=0,没具体应用,不用管。<br>a5-a0,存放tag,需要将tag的值用6为数的二进制值表示<br>tag=1(十进制)=000001(二进制)<br>则a7 a6 a5 a4 a3 a2 a1 a0=10000001<br>a7 a6 a5 a4=1000(二进制)=8(十进制)<br>a3 a2 a1 a0=0001(二进制)=1(十进制)<br>则设定值=81<br>最后加得到的设定值加1,即82</p><p><code>SET_UNSOLICITED_ENABLE</code>命令最终格式为:</p><p><code>Address</code>+<code>NodeID</code>+708+<code>Unsolicited</code></p><p>最终的命令为:</p><p><code>02170882</code></p><p>目前<code>CodecCommander</code>所起的作用有限,我基本上都忽略了<code>CodecCommander</code>的存在,因为它并不能从根本上解决这些问题.在我完善我的<code>ALC256</code>声卡驱动期间,我还试用过<code>EAPDFix</code>,最后都不得不放弃治疗.直到我遇到了<code>ALCPlugFix</code>,它能解决几乎所有的耳机切换问题.</p><h3 id="alcplugfix能做什么"><a class="markdownIt-Anchor" href="#alcplugfix能做什么"></a> ALCPlugFix能做什么?</h3><ul><li>它可以解决耳机插拔状态的切换</li><li>它是通过使用命令:<code>hda-verb 0xNode SET_PIN_WIDGET_CONTROL 0xVerbs</code>的方式进行状态切换<ul><li><code>hda-verb</code>的由来</li><li><code>hda-verb</code>是linux下面的<code>alsa-project</code>的一条命令,它的作用是发送HD-audio命令</li></ul></li></ul><h3 id="alcplugfix如何使用"><a class="markdownIt-Anchor" href="#alcplugfix如何使用"></a> ALCPlugFix如何使用?</h3><ul><li><p>将<code>ALCPlugFix</code>同步到本地</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/daliansky/ALCPlugFix</span><br></pre></td></tr></table></figure></li><li><p>打开<code>ALCPlugFix</code>目录下面的<code>main.m</code>,将包含<code>hda-verb</code>语句的几行修改成如图所示<br><img src="https://pan.daliansky.net/d/blog/ALCPlugFix_ALC256.png" alt="ALCPlugFix_ALC256"></p></li><li><p>其中<code>0x12</code>是<code>Mic Int</code>节点,<code>0x19</code>是<code>Mic Ext</code>节点,之所以要这么修改,是因为我的<code>ALC256</code>的<code>0x19</code>节点总是无法工作,在插入耳机的时候我希望内置的<code>Mic Int</code>可以工作的同时还可以使用耳机.</p></li><li><p>将<code>XCODE</code>编译生成的<code>ALCPlugFix</code>文件复制到<code>alc_fix</code>目录,然后双击<code>install双击自动安装.command</code>,输入用户密码即可.</p></li></ul><p><a href="https://github.com/daliansky/ALCPlugFix" target="_blank" rel="noopener">ALCPlugFix</a>工具下载</p><blockquote><p>刚才我前面讲了,<code>ALCPlugFix</code>是依赖于<code>CodecCommander</code>执行的,那我为什么不介绍下<code>CodecCommander</code>的工作原理呢,其实说白了<code>CodecCommander</code>里面通常执行的也是<code>hda-verb 0x19 0x707 0x20</code>之类的语句,只是在睡醒唤醒后<code>CodecCommander</code>已经无法执行<code>hda-verb 0x19 0x707 0x20</code>这样的语句了,而<code>ALCPlugFix</code>却是以守护进程的方式存在于系统中,无论什么时候它都会监听声卡的状态,该切换时它就会发出命令切换,这样就保证了声卡总是可以工作在正确的状态下.</p></blockquote><p>基本上所有的耳机睡眠后没有声音的,只需要使用一条命令:<code>hda-verb 0x19 0x707 0x20</code>,就可以让你的耳机出声的.<strong>当然前提是你得先加载了<code>CodecCommander</code>这个驱动</strong>.估计我写完这段你们看完了还是一头雾水,我教大家一个简单的记法:<code>ALCPlugFix</code>作用于耳机,所以你需要知道自己的两个耳机节点,而<code>0x19</code>是耳麦的麦克风输入节点,只要找对了耳麦的节点,一条命令就可以搞定你的耳机切换.</p><h3 id="杂音和底噪的去除"><a class="markdownIt-Anchor" href="#杂音和底噪的去除"></a> 杂音和底噪的去除</h3><p>在着手解决这个问题之前,让我们先来搞清楚杂音和底噪产生的原因.</p><p>打开终端,输入命令:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">node_dump.sh</span><br></pre></td></tr></table></figure><p>它会输出很多的信息出来,我们只需要最后面的这组数据:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line">Configuration Default</span><br><span class="line"> nid = <span class="number">0x02</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x03</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x04</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x05</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x06</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x07</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x08</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x09</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x0a</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x0b</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x0c</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x0d</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x0e</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x0f</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x10</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x11</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = 0x12 --> result 0x90a60170 # 内置麦克风</span><br><span class="line"> nid = <span class="number">0x13</span> --> result <span class="number">0x400000f0</span></span><br><span class="line"> nid = 0x14 --> result 0x90170140 # 喇叭</span><br><span class="line"> nid = <span class="number">0x15</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x16</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x17</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x18</span> --> result <span class="number">0x400000f0</span></span><br><span class="line"> nid = 0x19 --> result 0x02ab1070 # 耳麦</span><br><span class="line"> nid = <span class="number">0x1a</span> --> result <span class="number">0x400000f0</span></span><br><span class="line"> nid = <span class="number">0x1b</span> --> result <span class="number">0x400000f0</span></span><br><span class="line"> nid = <span class="number">0x1c</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x1d</span> --> result <span class="number">0x400000f0</span></span><br><span class="line"> nid = <span class="number">0x1e</span> --> result <span class="number">0x400000f0</span></span><br><span class="line"> nid = <span class="number">0x1f</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x20</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = 0x21 --> result 0x022b1030 # 耳机</span><br><span class="line"> nid = <span class="number">0x22</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x23</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x24</span> --> result <span class="number">0x00000000</span></span><br></pre></td></tr></table></figure><p>这些数据里:<code>0x00000000</code>是无效的节点,<code>0x400000f0</code>是被屏蔽掉的节点.其它的四个有效的节点我做了备注,方便你们看清楚.这些<code>PinConfigurations</code>决定了你的声卡音质.如果你的命令输出信息里面除了有效节点和<code>0x400000f0</code>之外的其它任何格式的数据都会产生杂音和底噪.比如<code>0x40000000</code>或者<code>0x411111f0</code>,这些无效的节点就会一直在起作用,这就好比一个流行乐队里,需要一个架子鼓,一台电钢琴,两个吉他手,再加上一个歌手,如果你生硬地再加进一把小提琴,再弄个竖琴,就会不和谐,就会产生噪音.</p><p>再让我们搬出<code>widget_dump.sh</code>命令:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">widget_dump.sh</span><br></pre></td></tr></table></figure><p>输出信息如下:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line">Pin Widget Control</span><br><span class="line"> nid = <span class="number">0x02</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x03</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x04</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x05</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x06</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x07</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x08</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x09</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x0a</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x0b</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x0c</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x0d</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x0e</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x0f</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x10</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x11</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = 0x12 --> result 0x00000000 # 内置麦克风</span><br><span class="line"> nid = <span class="number">0x13</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = 0x14 --> result 0x00000000 # 喇叭 </span><br><span class="line"> nid = <span class="number">0x15</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x16</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x17</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x18</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = 0x19 --> result 0x00000020 # 耳麦</span><br><span class="line"> nid = 0x1a --> result 0x00000020 # 无效节点</span><br><span class="line"> nid = <span class="number">0x1b</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x1c</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = 0x1d --> result 0x00000020 # 无效节点</span><br><span class="line"> nid = <span class="number">0x1e</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x1f</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x20</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = 0x21 --> result 0x000000c0 # 耳机</span><br><span class="line"> nid = <span class="number">0x22</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x23</span> --> result <span class="number">0x00000000</span></span><br><span class="line"> nid = <span class="number">0x24</span> --> result <span class="number">0x00000000</span></span><br></pre></td></tr></table></figure><p>我故意在四个有效的节点之外添加了两个无效的节点,为了让大家看清楚一些,这些无效的节点就会工作,它会产生底噪,尤其是戴上耳机,关闭音源,就会听到沙沙沙的声音,也有人说它是电流声,严重时还会产生杂音,包括单声道输出等等.</p><p>既然我们知道了问题是如何产生的,那么就让我们来消除这些杂音,还原干净的声音.</p><p>让我们回到<code>整理ConfigData</code>这一章,<strong>将有效节点之外的其它节点全部使用<code>f0 00 00 40</code>进行屏蔽</strong>.</p><h2 id="声卡驱动了音量调节的图标也显示正常就是不发声怎么办"><a class="markdownIt-Anchor" href="#声卡驱动了音量调节的图标也显示正常就是不发声怎么办"></a> 声卡驱动了,音量调节的图标也显示正常,就是不发声怎么办</h2><p>如果您的声卡使用了AppleALC,也注入了正确的ID后不发声怎么办呢?这个问题就出现在有效节点和路径不正确上面.<br>所谓条条大路通罗马,我们总不能在同一棵树上吊死吧.现在可以请出<a href="https://github.com/daliansky/VoodooHDA-2.9.0-Clover" target="_blank" rel="noopener">VoodooHDA[教程]</a>万能声卡驱动程序<a href="https://github.com/daliansky/VoodooHDA-2.9.0-Clover/releases/download/V12/VoodooHDA.2.9.0.Clover-V12.pkg" target="_blank" rel="noopener">下载链接</a>了,说它万能是不正确的,如果它万能了估计就没<code>AppleALC</code>啥事儿了吧.</p><h3 id="voodoohda-clover版安装教程"><a class="markdownIt-Anchor" href="#voodoohda-clover版安装教程"></a> VoodooHDA Clover版安装教程</h3><p>你需要有现成的Clover,它只会安装VoodooHDA和其他必需的组件来正常运行。</p><h4 id="方法一通过clover-uefiesp驱动"><a class="markdownIt-Anchor" href="#方法一通过clover-uefiesp驱动"></a> 方法一:通过Clover UEFI/ESP驱动</h4><p>请点击下载:<a href="https://github.com/daliansky/VoodooHDA-2.9.0-Clover/releases/download/V12/VoodooHDA.2.9.0.Clover-V12.pkg" target="_blank" rel="noopener">VoodooHDA 2.9.0 Clover-V12.dmg</a><br>这个安装程序会自动安装到<code>/ESP/EFI/CLOVER/kexts/</code>以及下面的目录里10.14/10.13/10.12/10.11/10.10/10.9/10.8/10.7/10.6<br>安装目录取决于你安装的macOS系统决定.<br>**这个驱动将通过Clover加载而不需要安装到<code>/System/Library/Extensions/</code>,同时它也不会删除系统自带的<code>AppleHDA.kext</code>,您甚至无需备份<code>/Others/AppleALC.kext**</code></p><h4 id="方法二clover传统模式"><a class="markdownIt-Anchor" href="#方法二clover传统模式"></a> 方法二:Clover传统模式</h4><p>你也可以安装VoodooHDA.kext内核扩展程序到/EFI/Clover/kexts/10.14/10.1310.12/10.11/10.10/10.9/10.8/10.7/10.6<br>这个驱动将通过Clover加载.</p><h4 id="方法三-经典方法"><a class="markdownIt-Anchor" href="#方法三-经典方法"></a> 方法三: 经典方法</h4><p>您也可以选择10.6到10.12的Clasic方法,这将在系统库扩展上安装VoodooHDA.kext + AppleHDADisabler.kext</p><p>这将在应用程序上安装VoodooHdaSettingsLoader.app,在Library / PreferencePanes上安装VoodooHDA.prefPane<br>在这两种方法中,在<code>usr/local/bin/getdump</code>上安装getdump。</p><p>注意:对于所有OS X系统,VoodooHDA.prefPane安装在Library / PreferancesPanes中</p><h4 id="视频教程请点击下方"><a class="markdownIt-Anchor" href="#视频教程请点击下方"></a> 视频教程请点击下方</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">⟱</span><br></pre></td></tr></table></figure><p>[<img src="https://i95.servimg.com/u/f95/18/50/18/69/video_10.png" alt="Modular Image Creation"></p><h3 id="getdump用法"><a class="markdownIt-Anchor" href="#getdump用法"></a> getdump用法</h3><p>这里可以借助<code>VoodooHDA</code>自带的应用程序:<a href="https://github.com/daliansky/VoodooHDA-2.9.0-Clover-V10/raw/master/getdump" target="_blank" rel="noopener">getdump</a>,使用方法:打开终端,输入命令:</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo cp ~/Downloads/getdump /usr/<span class="built_in">local</span>/bin <span class="comment"># 将getdump命令复制到/usr/local/bin目录下</span></span><br><span class="line">sudo chmod +x /usr/<span class="built_in">local</span>/bin/getdump <span class="comment"># 为getdump添加执行权限</span></span><br><span class="line">getdump > ~/Desktop/voodoo_dump.txt</span><br></pre></td></tr></table></figure><p>用它可以生成一份<code>voodoo_dump.txt</code>的文件,里面会有两段以<code>DUMPING Playback/Record Paths</code>开头的文字描述,这里面即包括了有效节点,同时也包括了有效的路径<br><img src="https://pan.daliansky.net/d/blog/path1.png" alt="path1"><br><img src="https://pan.daliansky.net/d/blog/path2.png" alt="path2"><br>从上面的两张截图中,可以将有效的节点和路径整理出下面的表格:</p><table><thead><tr><th>有效节点</th><th>10进制</th><th>设备名称</th><th>路径</th></tr></thead><tbody><tr><td>0x14</td><td>20</td><td>Speaker out</td><td><strong>20->12->2</strong></td></tr><tr><td>0x21</td><td>33</td><td>HP out</td><td><strong>33->13->3</strong></td></tr><tr><td>0x19</td><td>25</td><td>Headset Mic in</td><td><strong>8->35->24</strong> <strong>8->35->29备用</strong></td></tr><tr><td>0x12</td><td>18</td><td>Internal Mic in</td><td><strong>9->34->18</strong> <strong>9->34->29备用</strong></td></tr></tbody></table><p>有了这个表格,再结合<code>configdata</code>,找出有效的ID,编译<code>AppleALC</code>,注入ID并使用声卡驱动.</p><h2 id="如果还不出声怎么办"><a class="markdownIt-Anchor" href="#如果还不出声怎么办"></a> 如果还不出声怎么办?</h2><p>试试打开终端,输入这两条命令:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo kextunload /System/Library/Extensions/AppleHDA.kext</span><br><span class="line">sudo kextload /System/Library/Extensions/AppleHDA.kext</span><br></pre></td></tr></table></figure><p><strong>这两条命令是重新加载AppleHDA驱动</strong></p><h1 id="hda工具下载及使用"><a class="markdownIt-Anchor" href="#hda工具下载及使用"></a> HDA工具下载及使用</h1><p>制作声卡仿冒需要用到的工具,我已经同步到仓库,您可以打包下载也可以通过git同步到本地</p><ul><li><p>下载链接:<a href="https://github.com/daliansky/dell7000/tree/master/hda-tools" target="_blank" rel="noopener">https://github.com/daliansky/dell7000/tree/master/hda-tools</a></p></li><li><p>如何安装</p><ul><li>将<code>hda-tools</code>目录下的所有文件复制到<code>/usr/local/bin</code>下,如果<code>/usr/local/bin</code>目录不存在,需要新建立,命令如下:</li></ul><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo mkdir /usr/<span class="built_in">local</span>/bin <span class="comment"># 建立/usr/local/bin子目录</span></span><br><span class="line">sudo cp ~/Downloads/hda-tools/* /usr/<span class="built_in">local</span>/bin <span class="comment"># 将hda-tools目录下所有的应用程序复制到/usr/local/bin目录下</span></span><br></pre></td></tr></table></figure></li><li><p>如何使用</p><ul><li>打开终端,输入命令,直接执行.例如:</li></ul><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">verbit.sh codec<span class="comment">#0 > codec_dump.txt # 有效节点格式化</span></span><br><span class="line">codecgraph codec<span class="comment">#0 # 自动生成pathmap图,文件位于codec#0相同目录下</span></span><br><span class="line">hda-verb 0x19 0x707 0x20 <span class="comment"># 耳机睡眠唤醒无声修正</span></span><br><span class="line">widget_dump.sh <span class="comment"># 读取SET_PIN_WIDGET_CONTROL数值</span></span><br></pre></td></tr></table></figure></li></ul><blockquote><p>未完,待续[别问我何时续更]</p></blockquote><h2 id="感谢名单"><a class="markdownIt-Anchor" href="#感谢名单"></a> 感谢名单</h2><ul><li><a href="https://www.apple.com/" target="_blank" rel="noopener">Apple</a> 的 macOS</li><li><a href="https://github.com/rehabman" target="_blank" rel="noopener">RehabMan</a>维护的项目:<a href="https://github.com/RehabMan/OS-X-Clover-Laptop-Config" target="_blank" rel="noopener">OS-X-Clover-Laptop-Config</a> <a href="https://github.com/RehabMan/Laptop-DSDT-Patch" target="_blank" rel="noopener">Laptop-DSDT-Patch</a> <a href="https://github.com/RehabMan/OS-X-USB-Inject-All" target="_blank" rel="noopener">OS-X-USB-Inject-All</a>等</li><li><a href="https://github.com/acidanthera" target="_blank" rel="noopener">Acidanthera</a> 维护的项目:<a href="https://github.com/acidanthera/OpenCorePkg" target="_blank" rel="noopener">OpenCorePkg</a> <a href="https://github.com/acidanthera/Lilu" target="_blank" rel="noopener">lilu</a> <a href="https://github.com/acidanthera/AirportBrcmFixup" target="_blank" rel="noopener">AirportBrcmFixup</a> <a href="https://github.com/acidanthera/WhateverGreen" target="_blank" rel="noopener">WhateverGreen</a> <a href="https://github.com/acidanthera/VirtualSMC" target="_blank" rel="noopener">VirtualSMC</a> <a href="https://github.com/acidanthera/AppleALC" target="_blank" rel="noopener">AppleALC</a> <a href="https://github.com/acidanthera/BrcmPatchRAM" target="_blank" rel="noopener">BrcmPatchRAM</a> <a href="https://github.com/acidanthera/MaciASL" target="_blank" rel="noopener">MaciASL</a> 等</li><li><a href="https://www.insanelymac.com/forum/profile/1364628-headkaze/" target="_blank" rel="noopener">headkaze</a> 提供的工具:<a href="https://github.com/headkaze/Hackintool" target="_blank" rel="noopener">hackintool</a> <a href="https://github.com/headkaze/PinConfigurator" target="_blank" rel="noopener">PinConfigurator</a> <a href="https://www.insanelymac.com/forum/topic/339175-brcmpatchram2-for-1015-catalina-broadcom-bluetooth-firmware-upload/" target="_blank" rel="noopener">BrcmPatchRAM</a></li><li><a href="https://github.com/CloverHackyColor" target="_blank" rel="noopener">CloverHackyColor</a>维护的项目:<a href="https://github.com/CloverHackyColor/CloverBootloader" target="_blank" rel="noopener">CloverBootloader</a> <a href="https://github.com/CloverHackyColor/CloverThemes" target="_blank" rel="noopener">CloverThemes</a></li><li>宪武整理的:<a href="https://github.com/daliansky/P-little" target="_blank" rel="noopener">P-little</a> <a href="https://github.com/daliansky/OC-little" target="_blank" rel="noopener">OC-little</a></li><li><a href="https://github.com/chris1111" target="_blank" rel="noopener">chris1111</a>维护的项目:<a href="https://github.com/chris1111/VoodooHDA-2.9.2-Clover-V15" target="_blank" rel="noopener">VoodooHDA</a> <a href="https://github.com/chris1111/Wireless-USB-Adapter-Clover" target="_blank" rel="noopener">Wireless USB Adapter Clover</a></li><li><a href="https://github.com/zxystd" target="_blank" rel="noopener">zxystd</a>开发的<a href="https://github.com/zxystd/itlwm" target="_blank" rel="noopener">itlwm</a> <a href="https://github.com/zxystd/IntelBluetoothFirmware" target="_blank" rel="noopener">IntelBluetoothFirmware</a></li><li><a href="https://github.com/lihaoyun6" target="_blank" rel="noopener">lihaoyun6</a>提供的工具:<a href="https://github.com/lihaoyun6/CPU-S" target="_blank" rel="noopener">CPU-S</a> <a href="https://github.com/lihaoyun6/macOS-Displays-icon" target="_blank" rel="noopener">macOS-Displays-icon</a> <a href="https://github.com/lihaoyun6/SidecarPatcher" target="_blank" rel="noopener">SidecarPatcher</a></li><li><a href="https://github.com/SukkaW" target="_blank" rel="noopener">sukka</a>更新维护的<a href="https://blog.skk.moe/post/from-clover-to-opencore/" target="_blank" rel="noopener">从 Clover 到 OpenCore —— Clover 迁移 OpenCore 指南</a></li><li><a href="https://github.com/xzhih" target="_blank" rel="noopener">xzhih</a>提供的工具:<a href="https://github.com/xzhih/one-key-hidpi" target="_blank" rel="noopener">one-key-hidpi</a></li><li><a href="https://github.com/williambj1" target="_blank" rel="noopener">Bat.bat</a>更新维护的<a href="https://blog.daliansky.net/OpenCore-BootLoader.html">精解OpenCore</a></li><li><a href="https://github.com/shuiyunxc" target="_blank" rel="noopener">shuiyunxc</a> 更新维护的<a href="https://shuiyunxc.gitee.io/2020/04/06/Faults/index/" target="_blank" rel="noopener">OpenCore配置错误、故障与解决办法</a></li><li><a href="https://github.com/athlonreg" target="_blank" rel="noopener">athlonreg</a>更新维护的<a href="https://blog.cloudops.ml/ocbook/" target="_blank" rel="noopener">OpenCore 0.5+ 部件补丁</a> <a href="https://github.com/athlonreg/Common-patches-for-hackintosh" target="_blank" rel="noopener">Common-patches-for-hackintosh</a></li><li><a href="github.com">github.com</a></li><li><a href="gitee.io">码云 gitee.io</a></li><li><a href="coding.net">扣钉 coding.net</a></li></ul><h2 id="参考及引用"><a class="markdownIt-Anchor" href="#参考及引用"></a> 参考及引用:</h2><ul><li><a href="https://deviwiki.com/wiki/Dell" target="_blank" rel="noopener">https://deviwiki.com/wiki/Dell</a></li><li><a href="https://deviwiki.com/wiki/Dell_Wireless_1820A_(DW1820A)" target="_blank" rel="noopener">https://deviwiki.com/wiki/Dell_Wireless_1820A_(DW1820A)</a></li><li><a href="%5Bhttps://osxlatitude.com/profile/4953-herv%C3%A9/%5D(https://osxlatitude.com/profile/4953-herv%C3%A9/)">Hervé</a> 更新的Broadcom 4350:<a href="https://osxlatitude.com/forums/topic/12169-bcm4350-cards-registry-of-cardslaptops-interop/" target="_blank" rel="noopener">https://osxlatitude.com/forums/topic/12169-bcm4350-cards-registry-of-cardslaptops-interop/</a></li><li><a href="%5Bhttps://osxlatitude.com/profile/4953-herv%C3%A9/%5D(https://osxlatitude.com/profile/4953-herv%C3%A9/)">Hervé</a> 更新的DW1820A支持机型列表:<a href="https://osxlatitude.com/forums/topic/11322-broadcom-bcm4350-cards-under-high-sierramojave/" target="_blank" rel="noopener">https://osxlatitude.com/forums/topic/11322-broadcom-bcm4350-cards-under-high-sierramojave/</a></li><li><a href="https://osxlatitude.com/profile/129953-nickhx/" target="_blank" rel="noopener">nickhx</a> 提供的蓝牙驱动:<a href="https://osxlatitude.com/forums/topic/11540-dw1820a-for-7490-help/?do=findComment&comment=92833" target="_blank" rel="noopener">https://osxlatitude.com/forums/topic/11540-dw1820a-for-7490-help/?do=findComment&comment=92833</a></li><li><a href="https://blog.xjn819.com/" target="_blank" rel="noopener">xjn819</a>: <a href="https://blog.xjn819.com/?p=543" target="_blank" rel="noopener">使用OpenCore引导黑苹果</a> <a href="https://blog.xjn819.com/?p=317" target="_blank" rel="noopener">300系列主板正确使用AptioMemoryFix.efi的姿势(重写版)</a></li><li><a href="https://www.insanelymac.com/" target="_blank" rel="noopener">insanelymac.com</a></li><li><a href="https://www.tonymacx86.com/" target="_blank" rel="noopener">tonymacx86.com</a></li><li><a href="http://bbs.pcbeta.com" target="_blank" rel="noopener">远景论坛</a></li><li><a href="https://applelife.ru/" target="_blank" rel="noopener">applelife.ru</a></li><li><a href="https://www.olarila.com/" target="_blank" rel="noopener">olarila.com</a></li></ul></div><div><div id="wechat_subscriber" style="display:block;padding:10px 0;margin:20px auto;width:100%;text-align:center"><a href="https://hackintosher.taobao.com"><img id="wechat_subscriber_qcode" src="/uploads/WeChatandShop.png" alt="黑果小兵 wechat" style="max-width:90%"></a><div>微信扫一扫,订阅/直达【黑果小兵的部落阁】</div></div></div><div class="updated"><svg xmlns="http://www.w3.org/2000/svg" width="130" height="20"><lineargradient id="b" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></lineargradient><clippath id="a"><rect width="130" height="20" rx="3" fill="#fff"/></clippath><g clip-path="url(#a)"><path fill="#555" d="M0 0h55v20H0z"/><path fill="#97CA00" d="M55 0h75v20H55z"/><path fill="url(#b)" d="M0 0h130v20H0z"/></g><g fill="#fff" text-anchor="middle" font-family="Menlo,monospace" font-size="110"><text x="285" y="150" fill="#010101" fill-opacity=".3" textlength="450" transform="scale(.1)">更新日期</text><text x="285" y="140" textlength="450" transform="scale(.1)">更新日期</text><text x="915" y="150" fill="#010101" fill-opacity=".3" textlength="650" transform="scale(.1)">2023-09-20</text><text x="915" y="140" textlength="650" transform="scale(.1)">2023-09-20</text></g></svg></div><div><div><div style="text-align:center;color:#ccc;font-size:14px">-------------本文结束<i class="fa fa-apple"></i>感谢您的阅读-------------</div></div></div><div><div style="padding:10px 0;margin:20px auto;width:90%;text-align:center"><button id="rewardButton" disable="enable" onclick='var qr=document.getElementById("QR");"none"===qr.style.display?qr.style.display="block":qr.style.display="none"'><span>打赏</span></button><div>如果文章对您有帮助,就请站长喝杯咖啡吧 ´◡`</div><div id="QR" style="display:none"><div id="wechat" style="display:inline-block"><img id="wechat_qr" src="/images/wechatpay.jpg" alt="黑果小兵 微信支付"><p>微信支付</p></div><div id="alipay" style="display:inline-block"><img id="alipay_qr" src="/images/alipay.jpg" alt="黑果小兵 支付宝"><p>支付宝</p></div></div></div></div><div><div><ul class="qq-qun"><div><p></p><h2>QQ群列表:</h2><p></p><p>630724380 <a href="https://qm.qq.com/cgi-bin/qm/qr?k=JyGkfKK7U3Xq3TDtpqKOTq_gW7SBg4Uh&jump_from=webapi" target="_blank" rel="noopener">黑果小兵黑苹果技术群7</a> 2000人 新开群<br>713810838 <a href="https://qm.qq.com/cgi-bin/qm/qr?k=e8E-1Ge2lCoBSTlj8Y4zMxX7l7-V63Iv&jump_from=webapi" target="_blank" rel="noopener">黑果小兵黑苹果技术群8</a> 2000人 新开群<br>688324116 <a href="https://qm.qq.com/cgi-bin/qm/qr?k=Fp4HZ5e8A61oCu0GMS5YUqP6COc43-AO&jump_from=webapi" target="_blank" rel="noopener">一起黑苹果</a> 2000人<br>331686786 <a href="https://qm.qq.com/cgi-bin/qm/qr?k=No8zvDfvDicT-GfSApw1RMBI-3MQ7zM3&jump_from=webapi" target="_blank" rel="noopener">一起吃苹果</a> 2000人<br>257995340 <a href="https://qm.qq.com/cgi-bin/qm/qr?k=acztqL9efoqAOoptc_3moZ9b3Sgczu9_&jump_from=webapi" target="_blank" rel="noopener">一起啃苹果</a> 2000人群 远景报备群<br>875482673 <a href="https://qm.qq.com/cgi-bin/qm/qr?k=aZNyoRum_er2mruqmnbX_93ncHNgsyak&jump_from=webapi" target="_blank" rel="noopener">黑果小兵黑苹果技术群</a> 2000人<br>1058822256 <a href="https://qm.qq.com/cgi-bin/qm/qr?k=1sIT0BDaejgr9t1Hlw16cMnw_Z96zleV&jump_from=webapi" target="_blank" rel="noopener">黑果小兵黑苹果技术群2</a> 2000人<br>819662911 <a href="https://qm.qq.com/cgi-bin/qm/qr?k=aJx9xO7vAmyslCuOdK0bRMmDLpvOCeRw&jump_from=webapi" target="_blank" rel="noopener">黑果小兵黑苹果技术群3</a> 2000人<br>954098809 <a href="https://qm.qq.com/cgi-bin/qm/qr?k=iu042k0X5snr--dzAxOzcsvD9Zft9yx7&jump_from=webapi" target="_blank" rel="noopener">黑果小兵黑苹果技术群4</a> 2000人<br>1161377948 <a href="https://qm.qq.com/cgi-bin/qm/qr?k=kBV9vCnz-NqtXXJiwnUhaLyJN1D7G0n6&jump_from=webapi" target="_blank" rel="noopener">黑果小兵黑苹果技术群5</a> 2000人<br>553283949 <a href="https://qm.qq.com/cgi-bin/qm/qr?k=kr_hZc5pKK4TCDRaFPwRlfAiB4528InP&jump_from=webapi" target="_blank" rel="noopener">黑果小兵黑苹果技术群6</a> 2000人<br>701278330 <a href="https://qm.qq.com/cgi-bin/qm/qr?k=x57TlUmxz88oXGDWjMOOsWokYi8klE11&jump_from=webapi" target="_blank" rel="noopener">黑苹果无线网卡交流群</a> 1000人群 DW1820A技术支持群<br>891434070 <a href="https://qm.qq.com/cgi-bin/qm/qr?k=TUAxSUUtw_T1N62V0kF1sWvMcDr_eoxc&jump_from=webapi" target="_blank" rel="noopener">Catalina黑苹果交流群</a> 2000人群 远景报备群<br>939122730 <a href="https://qm.qq.com/cgi-bin/qm/qr?k=g_rpf7m0LJllE6WHY9c0gVvCTBm1MtuN&jump_from=webapi" target="_blank" rel="noopener">Catalina黑苹果交流II群</a> 2000人群<br>891677227 <a href="https://qm.qq.com/cgi-bin/qm/qr?k=xsuIOzF7RXYaRTTbJ5o_UjzohRDUx5UY&jump_from=webapi" target="_blank" rel="noopener">黑果小兵高级群</a> 2000人群<br>943307869 <a href="https://qm.qq.com/cgi-bin/qm/qr?k=aoSvqrbysdjPo0Wa_XvvPuMG9NMEtOie&jump_from=webapi" target="_blank" rel="noopener">黑果小兵高级群II</a> 2000人群<br>419298796 <a href="https://qm.qq.com/cgi-bin/qm/qr?k=4gWtT2-pOWZYIGwIpVaTNft2aOJP-5qs&jump_from=webapi" target="_blank" rel="noopener">零刻黑苹果技术交流群</a> 500人群 非专用机型请勿加入<br>275356796 <a href="https://qm.qq.com/cgi-bin/qm/qr?k=H7hFwiVkZq71L7se6rz3hE9QcacqL-dV&jump_from=webapi" target="_blank" rel="noopener">morefine黑苹果技术交流群</a> 500人群 非专用机型请勿加入<br>869792897 <a href="https://qm.qq.com/cgi-bin/qm/qr?k=MTDHb2QgLH3gkaymtdFCpk77J5ufWJpH&jump_from=webapi" target="_blank" rel="noopener">minisforum U820黑苹果技术群</a> 500人群 非专用机型请勿加入<br>942112153 <a href="https://qm.qq.com/cgi-bin/qm/qr?k=N5cjw5ksrnmk-RMQ4fPCOo5D_Dxiu47B&jump_from=webapi" target="_blank" rel="noopener">天逸510s Mini黑苹果交流群</a> 1000人群 非专用机型请勿加入<br>673294583 <a href="https://qm.qq.com/cgi-bin/qm/qr?k=GgcMJM5-98yB-fc6zyGcTI3OuesrSBRk&jump_from=webapi" target="_blank" rel="noopener">小新Pro黑苹果技术群</a> 2000人群 非专用机型请勿加入<br>946132482 <a href="https://qm.qq.com/cgi-bin/qm/qr?k=r-m99xC-BPIRdVkEjU6duvqXMJ-1FOwA&jump_from=webapi" target="_blank" rel="noopener">小新Pro黑苹果</a> 500人群 非专用机型请勿加入<br>158976808 <a href="https://qm.qq.com/cgi-bin/qm/qr?k=c9DeeyUg9x4dZlOpIVmj4R4g38p-YCZ1&jump_from=webapi" target="_blank" rel="noopener">DELL黑苹果交流群</a> 1000人群 非专用机型请勿加入<br>247451054 <a href="https://qm.qq.com/cgi-bin/qm/qr?k=h7fvRnWmdaMK2D0qVQLzJsjCC9PwB5h3&jump_from=webapi" target="_blank" rel="noopener">小米Pro黑苹果高级群</a> 2000人群 非专用机型请勿加入<br>943181023 <a href="https://qm.qq.com/cgi-bin/qm/qr?k=OGO_GSX9ZhtbQ_HNns57Vdxm5pR1wH6V&jump_from=webapi" target="_blank" rel="noopener">联想小新Air黑苹果交流群</a> 500人群 非专用机型请勿加入<br></p><p></p><h2>Telegram群:</h2><p></p><p>黑果小兵的部落阁 <a href="http://t.me/daliansky" target="_blank">http://t.me/daliansky</a><br>黑果小兵的部落阁 #安装问题讨论 <a href="https://t.me/Hackintosh_Installer" target="_blank">https://t.me/Hackintosh_Installer</a></p><p></p><h2>淘宝店铺:</h2><p></p><p>黑果小兵的部落阁 <a href="https://hackintosher.taobao.com" target="_blank">https://hackintosher.taobao.com</a></p></div></ul></div></div><div><ul class="post-copyright"><li class="post-copyright-author"><strong>本文作者: </strong>黑果小兵</li><li class="post-copyright-link"><strong>本文链接:</strong> <a href="https://blog.daliansky.net/Use-AppleALC-sound-card-to-drive-the-correct-posture-of-AppleHDA.html" title="使用AppleALC声卡仿冒驱动AppleHDA的正确姿势">https://blog.daliansky.net/Use-AppleALC-sound-card-to-drive-the-correct-posture-of-AppleHDA.html</a></li><li class="post-copyright-license"><strong>版权声明: </strong>本博客所有文章除特别声明外,均采用 <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" rel="noopener" target="_blank"><i class="fa fa-fw fa-creative-commons"></i>BY-NC-SA</a> 许可协议。转载请注明出处!</li></ul></div><footer class="post-footer"><div class="post-tags"><a href="/tags/AppleALC/" rel="tag"><i class="fa fa-tag"></i> AppleALC</a> <a href="/tags/AppleHDA/" rel="tag"><i class="fa fa-tag"></i> AppleHDA</a> <a href="/tags/声卡仿冒/" rel="tag"><i class="fa fa-tag"></i> 声卡仿冒</a></div><div class="post-nav"><div class="post-nav-next post-nav-item"><a href="/Clover-Patched-Desktop-AppleHDA-Realtek-ALC-Audio.html" rel="next" title="使用CloverALC给AppleHDA打补丁,适用于台式机"><i class="fa fa-chevron-left"></i> 使用CloverALC给AppleHDA打补丁,适用于台式机</a></div><span class="post-nav-divider"></span><div class="post-nav-prev post-nav-item"><a href="/Use-HIDPI-to-solve-sleep-wake-up-black-screen,-Huaping-and-connect-the-external-monitor-the-correct-posture.html" rel="prev" title="使用HIDPI解决睡眠唤醒黑屏、花屏及连接外部显示器的正确姿势">使用HIDPI解决睡眠唤醒黑屏、花屏及连接外部显示器的正确姿势 <i class="fa fa-chevron-right"></i></a></div></div></footer></div></article></div></div><div id="gitalk-container"></div></div><div class="sidebar-toggle"><div class="sidebar-toggle-line-wrap"><span class="sidebar-toggle-line sidebar-toggle-line-first"></span> <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span> <span class="sidebar-toggle-line sidebar-toggle-line-last"></span></div></div><aside id="sidebar" class="sidebar"><div id="sidebar-dimmer"></div><div class="sidebar-inner"><ul class="sidebar-nav motion-element"><li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap">文章目录</li><li class="sidebar-nav-overview" data-target="site-overview-wrap">站点概览</li></ul><div class="site-overview-wrap sidebar-panel"><div class="site-overview"><div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person"><a href="/"><img class="site-author-image" itemprop="image" src="/images/avatar.png" alt="黑果小兵"></a><p class="site-author-name" itemprop="name">黑果小兵</p><p class="site-description motion-element" itemprop="description">黑果小兵</p></div><nav class="site-state motion-element"><div class="site-state-item site-state-posts"><a href="/archives/"><span class="site-state-item-count">127</span> <span class="site-state-item-name">日志</span></a></div><div class="site-state-item site-state-categories"><a href="/categories/index.html"><span class="site-state-item-count">26</span> <span class="site-state-item-name">分类</span></a></div><div class="site-state-item site-state-tags"><a href="/tags/index.html"><span class="site-state-item-count">289</span> <span class="site-state-item-name">标签</span></a></div></nav><div class="feed-link motion-element"><a href="/atom.xml" rel="alternate"><i class="fa fa-rss"></i> RSS</a></div><div class="links-of-author motion-element"><span class="links-of-author-item"><a href="https://github.com/daliansky" title="GitHub → https://github.com/daliansky" rel="noopener" target="_blank"><i class="fa fa-fw fa-github"></i></a> </span><span class="links-of-author-item"><a href="http://www.jianshu.com/u/df9143008845" title="简书 → http://www.jianshu.com/u/df9143008845" rel="noopener" target="_blank"><i class="fa fa-fw fa-heartbeat"></i></a> </span><span class="links-of-author-item"><a href="http://shang.qq.com/wpa/qunwpa?idkey=db511a29e856f37cbb871108ffa77a6e79dde47e491b8f2c8d8fe4d3c310de91" title="QQ → http://shang.qq.com/wpa/qunwpa?idkey=db511a29e856f37cbb871108ffa77a6e79dde47e491b8f2c8d8fe4d3c310de91" rel="noopener" target="_blank"><i class="fa fa-fw fa-qq"></i></a></span></div><div class="links-of-blogroll motion-element links-of-blogroll-block"><div class="links-of-blogroll-title"><i class="fa fa-fw fa-link"></i> Links</div><ul class="links-of-blogroll-list"><li class="links-of-blogroll-item"><a href="https://blog.tlhub.cn" title="https://blog.tlhub.cn" rel="noopener" target="_blank">Athlonreg</a></li><li class="links-of-blogroll-item"><a href="http://www.sqlsec.com" title="http://www.sqlsec.com" rel="noopener" target="_blank">国光</a></li></ul></div></div></div><div class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active"><div class="post-toc"><div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-1"><a class="nav-link" href="#大纲写作中"><span class="nav-number">1.</span> <span class="nav-text">大纲,写作中</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#前言"><span class="nav-number">2.</span> <span class="nav-text">前言</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#提取codec"><span class="nav-number">3.</span> <span class="nav-text">提取codec</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#通过clover提取codec"><span class="nav-number">3.1.</span> <span class="nav-text">通过CLOVER提取codec</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#通过linux提取codec"><span class="nav-number">3.2.</span> <span class="nav-text">通过linux提取codec</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#制作ubuntu-linux启动u盘"><span class="nav-number">3.2.1.</span> <span class="nav-text">制作Ubuntu Linux启动U盘:</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#制作ubuntu-linux安装盘"><span class="nav-number">3.2.1.1.</span> <span class="nav-text">制作Ubuntu Linux安装盘</span></a></li></ol></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#提取codec-2"><span class="nav-number">3.3.</span> <span class="nav-text">提取codec</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#整理有效节点"><span class="nav-number">4.</span> <span class="nav-text">整理有效节点</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#通过linux找出有效的节点"><span class="nav-number">5.</span> <span class="nav-text">通过Linux找出有效的节点</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#赞"><span class="nav-number">6.</span> <span class="nav-text">赞</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#整理有效路径"><span class="nav-number">7.</span> <span class="nav-text">整理有效路径</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#整理configdata"><span class="nav-number">8.</span> <span class="nav-text">整理ConfigData</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#通过pinconfigs提取configdata"><span class="nav-number">8.1.</span> <span class="nav-text">通过PinConfigs提取ConfigData</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#通过codec里面的pin-default提取并整理"><span class="nav-number">8.2.</span> <span class="nav-text">通过codec里面的Pin Default提取并整理</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#修正pindefault并生成configdata"><span class="nav-number">8.3.</span> <span class="nav-text">修正PinDefault,并生成ConfigData</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#屏蔽无效节点f0-00-00-40"><span class="nav-number">8.4.</span> <span class="nav-text">屏蔽无效节点:f0 00 00 40</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#找出适合你的id"><span class="nav-number">9.</span> <span class="nav-text">找出适合你的id</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#下载applealc"><span class="nav-number">9.1.</span> <span class="nav-text">下载AppleALC</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#如何找出适合你的id"><span class="nav-number">9.2.</span> <span class="nav-text">如何找出适合你的id</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#如何修改layout和platforms数据"><span class="nav-number">10.</span> <span class="nav-text">如何修改layout和Platforms数据</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#如何新建一个注入id"><span class="nav-number">11.</span> <span class="nav-text">如何新建一个注入id</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#编译applealc"><span class="nav-number">12.</span> <span class="nav-text">编译AppleALC</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#注入id"><span class="nav-number">13.</span> <span class="nav-text">注入id</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#测试"><span class="nav-number">14.</span> <span class="nav-text">测试</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#检查applealc是否正确加载"><span class="nav-number">14.1.</span> <span class="nav-text">检查AppleALC是否正确加载</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#检查注入id是否正确"><span class="nav-number">14.2.</span> <span class="nav-text">检查注入id是否正确</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#检查pinconfigurations"><span class="nav-number">14.3.</span> <span class="nav-text">检查PinConfigurations</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#其它问题"><span class="nav-number">15.</span> <span class="nav-text">其它问题</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#解决耳机切换睡眠唤醒去除底噪等常见问题"><span class="nav-number">15.1.</span> <span class="nav-text">解决耳机切换/睡眠唤醒/去除底噪等常见问题</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#codeccommander-编解码器指挥官"><span class="nav-number">15.1.1.</span> <span class="nav-text">CodecCommander 编解码器指挥官</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#pin-widget-control"><span class="nav-number">15.1.1.1.</span> <span class="nav-text">Pin Widget Control</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#unsolicited-response-未经请求的响应"><span class="nav-number">15.1.1.2.</span> <span class="nav-text">Unsolicited Response 未经请求的响应</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#alcplugfix能做什么"><span class="nav-number">15.1.2.</span> <span class="nav-text">ALCPlugFix能做什么?</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#alcplugfix如何使用"><span class="nav-number">15.1.3.</span> <span class="nav-text">ALCPlugFix如何使用?</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#杂音和底噪的去除"><span class="nav-number">15.1.4.</span> <span class="nav-text">杂音和底噪的去除</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#声卡驱动了音量调节的图标也显示正常就是不发声怎么办"><span class="nav-number">15.2.</span> <span class="nav-text">声卡驱动了,音量调节的图标也显示正常,就是不发声怎么办</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#voodoohda-clover版安装教程"><span class="nav-number">15.2.1.</span> <span class="nav-text">VoodooHDA Clover版安装教程</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#方法一通过clover-uefiesp驱动"><span class="nav-number">15.2.1.1.</span> <span class="nav-text">方法一:通过Clover UEFI/ESP驱动</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#方法二clover传统模式"><span class="nav-number">15.2.1.2.</span> <span class="nav-text">方法二:Clover传统模式</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#方法三-经典方法"><span class="nav-number">15.2.1.3.</span> <span class="nav-text">方法三: 经典方法</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#视频教程请点击下方"><span class="nav-number">15.2.1.4.</span> <span class="nav-text">视频教程请点击下方</span></a></li></ol></li><li class="nav-item nav-level-3"><a class="nav-link" href="#getdump用法"><span class="nav-number">15.2.2.</span> <span class="nav-text">getdump用法</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#如果还不出声怎么办"><span class="nav-number">15.3.</span> <span class="nav-text">如果还不出声怎么办?</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#hda工具下载及使用"><span class="nav-number">16.</span> <span class="nav-text">HDA工具下载及使用</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#感谢名单"><span class="nav-number">16.1.</span> <span class="nav-text">感谢名单</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#参考及引用"><span class="nav-number">16.2.</span> <span class="nav-text">参考及引用:</span></a></li></ol></li></ol></div></div></div></div></aside></div></main><footer id="footer" class="footer"><div class="footer-inner"><div class="copyright"><a href="http://www.beian.miit.gov.cn" rel="noopener" target="_blank">辽ICP备15000696号-3 </a>© 2016 – <span itemprop="copyrightYear">2024</span> <span class="with-love" id="animate"><i class="fa fa-apple"></i> </span><span class="author" itemprop="copyrightHolder">黑果小兵</span> <span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-area-chart"></i> </span><span title="站点总字数">859k</span> <span class="post-meta-divider">|</span> <span class="post-meta-item-icon"><i class="fa fa-coffee"></i> </span><span title="站点阅读时长">26:03</span></div><div class="busuanzi-count"><script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script><span class="site-uv" title="总访客量"><i class="fa fa-user"></i> <span class="busuanzi-value" id="busuanzi_value_site_uv"></span> </span><span class="site-pv" title="总访问量"><i class="fa fa-eye"></i> <span class="busuanzi-value" id="busuanzi_value_site_pv"></span></span></div></div></footer><div class="back-to-top"><i class="fa fa-arrow-up"></i> <span id="scrollpercent"><span>0</span>%</span></div></div><script>"[object Function]"!==Object.prototype.toString.call(window.Promise)&&(window.Promise=null)</script><script src="/lib/jquery/index.js?v=2.1.3"></script><script src="/lib/velocity/velocity.min.js?v=1.2.1"></script><script src="/lib/velocity/velocity.ui.min.js?v=1.2.1"></script><script src="https://fastly.jsdelivr.net/npm/@fancyapps/[email protected]/dist/jquery.fancybox.min.js"></script><script src="//fastly.jsdelivr.net/gh/theme-next/[email protected]/reading_progress.min.js"></script><script src="/js/src/utils.js?v=6.6.0"></script><script src="/js/src/motion.js?v=6.6.0"></script><script src="/js/src/scrollspy.js?v=6.6.0"></script><script src="/js/src/post-details.js?v=6.6.0"></script><script src="/js/src/bootstrap.js?v=6.6.0"></script><script src="//fastly.jsdelivr.net/npm/[email protected]/dist/gitalk.min.js"></script><link rel="stylesheet" href="//fastly.jsdelivr.net/npm/[email protected]/dist/gitalk.css"><script src="//fastly.jsdelivr.net/npm/[email protected]/src/md5.min.js"></script><script>var gitalk=new Gitalk({clientID:"0da3e792a21a77938da6",clientSecret:"4d2869563000629ee6dbed48fbbf878aea151cb6",repo:"daliansky.github.io",owner:"daliansky",admin:["daliansky"],id:md5(location.pathname),distractionFreeMode:"true",proxy:"https://gitalk.daliansky.workers.dev/?https://github.com/login/oauth/access_token"});gitalk.render("gitalk-container")</script><script>// Popup Window;
var isfetched = false;
var isXml = true;
// Search DB path;
var search_path = "search.xml";
if (search_path.length === 0) {
search_path = "search.xml";
} else if (/json$/i.test(search_path)) {
isXml = false;
}
var path = "/" + search_path;
// monitor main search box;
var onPopupClose = function (e) {
$('.popup').hide();
$('#local-search-input').val('');
$('.search-result-list').remove();
$('#no-result').remove();
$(".local-search-pop-overlay").remove();
$('body').css('overflow', '');
}
function proceedsearch() {
$("body")
.append('<div class="search-popup-overlay local-search-pop-overlay"></div>')
.css('overflow', 'hidden');
$('.search-popup-overlay').click(onPopupClose);
$('.popup').toggle();
var $localSearchInput = $('#local-search-input');
$localSearchInput.attr("autocapitalize", "none");
$localSearchInput.attr("autocorrect", "off");
$localSearchInput.focus();
}
// search function;
var searchFunc = function(path, search_id, content_id) {
'use strict';
// start loading animation
$("body")
.append('<div class="search-popup-overlay local-search-pop-overlay">' +
'<div id="search-loading-icon">' +
'<i class="fa fa-spinner fa-pulse fa-5x fa-fw"></i>' +
'</div>' +
'</div>')
.css('overflow', 'hidden');
$("#search-loading-icon").css('margin', '20% auto 0 auto').css('text-align', 'center');
$.ajax({
url: path,
dataType: isXml ? "xml" : "json",
async: true,
success: function(res) {
// get the contents from search data
isfetched = true;
$('.popup').detach().appendTo('.header-inner');
var datas = isXml ? $("entry", res).map(function() {
return {
title: $("title", this).text(),
content: $("content",this).text(),
url: $("url" , this).text()
};
}).get() : res;
var input = document.getElementById(search_id);
var resultContent = document.getElementById(content_id);
var inputEventFunction = function() {
var searchText = input.value.trim().toLowerCase();
var keywords = searchText.split(/[\s\-]+/);
if (keywords.length > 1) {
keywords.push(searchText);
}
var resultItems = [];
if (searchText.length > 0) {
// perform local searching
datas.forEach(function(data) {
var isMatch = false;
var hitCount = 0;
var searchTextCount = 0;
var title = data.title.trim();
var titleInLowerCase = title.toLowerCase();
var content = data.content.trim().replace(/<[^>]+>/g,"");
var contentInLowerCase = content.toLowerCase();
var articleUrl = decodeURIComponent(data.url);
var indexOfTitle = [];
var indexOfContent = [];
// only match articles with not empty titles
if(title != '') {
keywords.forEach(function(keyword) {
function getIndexByWord(word, text, caseSensitive) {
var wordLen = word.length;
if (wordLen === 0) {
return [];
}
var startPosition = 0, position = [], index = [];
if (!caseSensitive) {
text = text.toLowerCase();
word = word.toLowerCase();
}
while ((position = text.indexOf(word, startPosition)) > -1) {
index.push({position: position, word: word});
startPosition = position + wordLen;
}
return index;
}
indexOfTitle = indexOfTitle.concat(getIndexByWord(keyword, titleInLowerCase, false));
indexOfContent = indexOfContent.concat(getIndexByWord(keyword, contentInLowerCase, false));
});
if (indexOfTitle.length > 0 || indexOfContent.length > 0) {
isMatch = true;
hitCount = indexOfTitle.length + indexOfContent.length;
}
}
// show search results
if (isMatch) {
// sort index by position of keyword
[indexOfTitle, indexOfContent].forEach(function (index) {
index.sort(function (itemLeft, itemRight) {
if (itemRight.position !== itemLeft.position) {
return itemRight.position - itemLeft.position;
} else {
return itemLeft.word.length - itemRight.word.length;
}
});
});
// merge hits into slices
function mergeIntoSlice(text, start, end, index) {
var item = index[index.length - 1];
var position = item.position;
var word = item.word;
var hits = [];
var searchTextCountInSlice = 0;
while (position + word.length <= end && index.length != 0) {
if (word === searchText) {
searchTextCountInSlice++;
}
hits.push({position: position, length: word.length});
var wordEnd = position + word.length;
// move to next position of hit
index.pop();
while (index.length != 0) {
item = index[index.length - 1];
position = item.position;
word = item.word;
if (wordEnd > position) {
index.pop();
} else {
break;
}
}
}
searchTextCount += searchTextCountInSlice;
return {
hits: hits,
start: start,
end: end,
searchTextCount: searchTextCountInSlice
};
}
var slicesOfTitle = [];
if (indexOfTitle.length != 0) {
slicesOfTitle.push(mergeIntoSlice(title, 0, title.length, indexOfTitle));
}
var slicesOfContent = [];
while (indexOfContent.length != 0) {
var item = indexOfContent[indexOfContent.length - 1];
var position = item.position;
var word = item.word;
// cut out 100 characters
var start = position - 20;
var end = position + 80;
if(start < 0){
start = 0;
}
if (end < position + word.length) {
end = position + word.length;
}
if(end > content.length){
end = content.length;
}
slicesOfContent.push(mergeIntoSlice(content, start, end, indexOfContent));
}
// sort slices in content by search text's count and hits' count
slicesOfContent.sort(function (sliceLeft, sliceRight) {
if (sliceLeft.searchTextCount !== sliceRight.searchTextCount) {
return sliceRight.searchTextCount - sliceLeft.searchTextCount;
} else if (sliceLeft.hits.length !== sliceRight.hits.length) {
return sliceRight.hits.length - sliceLeft.hits.length;
} else {
return sliceLeft.start - sliceRight.start;
}
});
// select top N slices in content
var upperBound = parseInt('1');
if (upperBound >= 0) {
slicesOfContent = slicesOfContent.slice(0, upperBound);
}
// highlight title and content
function highlightKeyword(text, slice) {
var result = '';
var prevEnd = slice.start;
slice.hits.forEach(function (hit) {
result += text.substring(prevEnd, hit.position);
var end = hit.position + hit.length;
result += '<b class="search-keyword">' + text.substring(hit.position, end) + '</b>';
prevEnd = end;
});
result += text.substring(prevEnd, slice.end);
return result;
}
var resultItem = '';
if (slicesOfTitle.length != 0) {
resultItem += "<li><a href='" + articleUrl + "' class='search-result-title'>" + highlightKeyword(title, slicesOfTitle[0]) + "</a>";
} else {
resultItem += "<li><a href='" + articleUrl + "' class='search-result-title'>" + title + "</a>";
}
slicesOfContent.forEach(function (slice) {
resultItem += "<a href='" + articleUrl + "'>" +
"<p class=\"search-result\">" + highlightKeyword(content, slice) +
"...</p>" + "</a>";
});
resultItem += "</li>";
resultItems.push({
item: resultItem,
searchTextCount: searchTextCount,
hitCount: hitCount,
id: resultItems.length
});
}
})
};
if (keywords.length === 1 && keywords[0] === "") {
resultContent.innerHTML = '<div id="no-result"><i class="fa fa-search fa-5x" /></div>'
} else if (resultItems.length === 0) {
resultContent.innerHTML = '<div id="no-result"><i class="fa fa-frown-o fa-5x" /></div>'
} else {
resultItems.sort(function (resultLeft, resultRight) {
if (resultLeft.searchTextCount !== resultRight.searchTextCount) {
return resultRight.searchTextCount - resultLeft.searchTextCount;
} else if (resultLeft.hitCount !== resultRight.hitCount) {
return resultRight.hitCount - resultLeft.hitCount;
} else {
return resultRight.id - resultLeft.id;
}
});
var searchResultList = '<ul class=\"search-result-list\">';
resultItems.forEach(function (result) {
searchResultList += result.item;
})
searchResultList += "</ul>";
resultContent.innerHTML = searchResultList;
}
}
if ('auto' === 'auto') {
input.addEventListener('input', inputEventFunction);
} else {
$('.search-icon').click(inputEventFunction);
input.addEventListener('keypress', function (event) {
if (event.keyCode === 13) {
inputEventFunction();
}
});
}
// remove loading animation
$(".local-search-pop-overlay").remove();
$('body').css('overflow', '');
proceedsearch();
}
});
}
// handle and trigger popup window;
$('.popup-trigger').click(function(e) {
e.stopPropagation();
if (isfetched === false) {
searchFunc(path, 'local-search-input', 'local-search-result');
} else {
proceedsearch();
};
});
$('.popup-btn-close').click(onPopupClose);
$('.popup').click(function(e){
e.stopPropagation();
});
$(document).on('keyup', function (event) {
var shouldDismissSearchPopup = event.which === 27 &&
$('.search-popup').is(':visible');
if (shouldDismissSearchPopup) {
onPopupClose();
}
});</script><script src="/js/src/js.cookie.js?v=6.6.0"></script><script src="/js/src/scroll-cookie.js?v=6.6.0"></script><script src="/live2dw/lib/L2Dwidget.min.js?094cbace49a39548bed64abff5988b05"></script><script>L2Dwidget.init({pluginRootPath:"live2dw/",pluginJsPath:"lib/",pluginModelPath:"assets/",model:{scale:1.2,hHeadPos:.5,vHeadPos:.618,jsonPath:"/live2dw/assets/tororo.model.json"},display:{superSample:2,width:150,height:300,position:"right",hOffset:0,vOffset:-20},mobile:{show:!1,scale:.5},react:{opacityDefault:.7,opacityOnHover:.2},log:!1,tagMode:!1})</script></body></html>