黑苹果 Catalina 15 声卡定制

article/2025/11/9 16:26:37

文章目录

  • 黑苹果 Catalina 15 声卡定制
    • 说明
      • a). 定制流程步骤
      • b). 环境信息
    • 一: `Clover`提取声卡`codec`
      • a). 通过Linux提取
      • b). Clover引导界面按`F8`提取
      • c). 重命名文件名为`codec.txt`
    • 二: 推导`ConfigData` & `节点路径`
      • a). 执行`python3 verbit.py codec.txt` 生成`configdata`
      • b). 推导节点路径
    • 三: 修改`AppleALC`源码
      • a). 在`AppleALC-master/Resources/PinConfigs.kext/Contents/Info.plist`中修改`congfigdata`并找到要修改`节点路径的文件`
      • b). 节点路径修改
      • c). 编译`AppleALC`, 并将结果放入EFI中Clover对应的目录
    • 四: 在Colver中注入`步骤三`->`a).`->`1.`中得到的LayoutID
    • 五: 最终效果
    • 六: 脚本源代码
      • `FindNodePath.py`
      • `verbit.py`

黑苹果 Catalina 15 声卡定制

说明

​ 使用黑苹果一段时间, 声卡驱动问题较多(如: 机箱前置扬声器无效), 本文总结网上一些定制方法, 简化操作。由于d对中间某些原理不是完全了解, 本方法定制的驱动在我的机器使用了几个月没有异常, 其他机器仅供参考,。水平有限,欢迎指出错误。

a). 定制流程步骤

1.提取codec信息
2.推导configdata & 节点路径
3.修改AppleALC文件
AppleALC-master/Resources/ALC892/Info.plist
同上目录/layoutXX.xml
同上目录/PlatformsXX.xml
AppleALC-master/Resources/PinConfigs.kext/Contents/Info.plist
4.编译驱动
5.放入clover目录并注入ID

b). 环境信息

  • 系统 macOS Catalina 15.x
  • AppleALC v1.4.3
  • xcode(AppStore下载即可)
  • python3.5或以上(安装XCode后默认会下载, 或去官网下载安装包)
  • Clover Configurator
  • PlistEdit Pro

一: Clover提取声卡codec

参见: https://blog.daliansky.net/Use-AppleALC-sound-card-to-drive-the-correct-posture-of-AppleHDA.html

a). 通过Linux提取

b). Clover引导界面按F8提取

在这里插入图片描述

c). 重命名文件名为codec.txt

二: 推导ConfigData & 节点路径

high-definition-audio-specification.pdf中178页有详细规范描述,可以参考

​ 按黑果小兵和简书上教程, 有些信息好像不必要(如: EAPD节点最后添加一个XXX70C02 & 修正configdata)

如果无效, 请手动修正configdata

verbit.sh分析Clover提取的codec一直报错& codecgraph一直没有安装成功,因此琢磨了自己的脚本, 不一定完全正确,但是有用就够了

https://blog.daliansky.net/Use-AppleALC-sound-card-to-drive-the-correct-posture-of-AppleHDA.html#more

https://www.jianshu.com/p/29a74f0664f1

a). 执行python3 verbit.py codec.txt 生成configdata

在这里插入图片描述

​ 脚本生成结果为markdown格式, 粘贴进在线markdown网站, 如:https://www.mdeditor.com/

在这里插入图片描述

​ 空格隔开每组数据, 因此本例中configdata为:

01471c10 01471d40 01471e01 01471f01 01871c20 01871d90 01871ea1 01871f01 01971c30 01971d90 01971ea1 01971f02 01a71c2f 01a71d30 01a71e81 01a71f01 01b71c50 01b71d40 01b71e21 01b71f02

b). 推导节点路径

​ 本脚本参考简书 https://www.jianshu.com/p/29a74f0664f1 手动推导原理 而写,简化操作

执行python3 FindNodePath.py codec.txt输入节点如: 0x14

在这里插入图片描述

在已选节点不重复的前提下,优先选择数字小(不知道是不是必须满足, 尽量找不一样的和短的)

节点路径十进制路径
0x140x14 → 0x0c → 0x0220→12 → 2
0x180x09 → 0x22 → 0x189→ 34 → 24
0x190x08 → 0x23 → 0x198→ 35 → 25
0x1a0x09 → 0x22 → 0x1a9→ 34→ 26
0x1b0x1b → 0x0d → 0x0327→ 13→ 3

三: 修改AppleALC源码

我们只需要修改2个文件PinConfigs.kext/Contents/Info.plist(放configdata)和AppleALC-master/Resources/ALC892/PlatformsXX.xml(放节点路径信息), 但是额外两个文件信息来推导PlatformsXX.xml

a). 在AppleALC-master/Resources/PinConfigs.kext/Contents/Info.plist中修改congfigdata并找到要修改节点路径的文件

  1. 根据codecID(codec.txt开头Vendor Id对应数据转换为10进制)搜索, 定位到第一个找到的位置

    记住该LayoutID的值 ,用来查找后面的文件

在这里插入图片描述
2. 定位到AppleALC-master/Resources/ALC892(你的声卡型号)/Info.plist

  • 根据之前的LayoutID,在Files->Layouts下面找到ID值和之前LayoutID值一样的节点,记下Layout.xml的路径
  • 根据之前的LayoutID,在Files->Platforms下面找到ID值和之前LayoutID值一样的节点,记下Platform.xml的路径

在这里插入图片描述
3. 根据上一步找到的layout1.xml记录下PathMapID

在这里插入图片描述
4. 根据步骤2中找到的Platform.xml和步骤3中的PathMapID定位到了我们要修改的节点路径地方了

在这里插入图片描述

b). 节点路径修改

  • 大致位置顺序

在这里插入图片描述

  • 输入和输出类详细

​ 输入类型的如麦克风第一个节点含有AMP,可以在原有配置上复制过来一个再修改数字就是了

在这里插入图片描述

​ 输出类型的如HeadPhone除第一个节点外其他都含有AMP,可以在原有配置上复制过来一个再修改数字就是了

在这里插入图片描述

c). 编译AppleALC, 并将结果放入EFI中Clover对应的目录

需要下载LiluDEBUG版本的 放入AppleALC目录

四: 在Colver中注入步骤三->a).->1.中得到的LayoutID

在这里插入图片描述
HDMI接口休眠再唤醒声卡驱动可能会导致系统死机, 可以用该补丁

636F6D2E 6170706C 65005F5F 6B65726E 656C5F5F 00替换为6E6F742E 6170706C 65005F5F 6B65726E 656C5F5F 00

在这里插入图片描述

五: 最终效果

节点路径不同分组和位置, 会影响最终的结果, 请按需求自己尝试放位置和组

在这里插入图片描述

六: 脚本源代码

FindNodePath.py

#!/usr/bin/python3
"""@Python:   Version 3.5@File:     FindNodePath.py@Author:   Leo@Date:     2019/11/8@license: BSD, see LICENSE for more details.@Desc:  根据codec.txt找到给定节点所有可能的正反向路径
"""import sys
import reclass Node(object):"""name: 节点字符串, 如: 0x14desc: 节点类型描述parent_list: 父节点对象列表,如: [<Node 1>, <Node 2>, ...]child_name_list: 子节点字符串列表, 如: ['0x13', '0x14', ...]child_obj_list: 子节点对象列表,如: [<Node 1>, <Node 2>, ...]"""def __init__(self, name, desc):self.name = nameself.desc = descself.parent_list = []self.child_name_list = []self.child_obj_list = []def add_parent(self, node):self.parent_list.append(node)def get_parent_paths(self):if len(self.parent_list) == 0:print('\033[33m节点: %s 未检索到父节点, 因此无反向路径\033[0m' % self.name)returnpaths = []def find_path(node, path):if node.name in path:   # 回路, 抛弃该路径returnpath.append(node.name)if len(node.parent_list) == 0:path.reverse()paths.append(path)returnfor parent in node.parent_list:_path_list_copy = list(path)find_path(parent, _path_list_copy)find_path(self, [])paths.sort(key=lambda x: len(x))    # 排序,最短的放前面打印print('\033[32m节点: %s 找到以下反向路径(输入类: 如mic, line in), 共 %d 条路径, 仅显示路径长度小等于4的路径' %(self.name, len(paths)))for _ in paths:if len(_) <= 4:print(' → '.join(_))print('\033[0m')def get_child_paths(self):if len(self.child_obj_list) == 0:print('\033[33m节点: %s 未检索到子节点, 因此无正向路径\033[0m' % self.name)returnpaths = []def find_path(node, path):if node.name in path:   # 回路, 抛弃该路径returnpath.append(node.name)if len(node.child_obj_list) == 0:paths.append(path)returnfor child in node.child_obj_list:_path_list_copy = list(path)find_path(child, _path_list_copy)find_path(self, [])paths.sort(key=lambda x: len(x))    # 排序,最短的放前面打印print('\033[32m节点: %s 找到以下正向路径(输出类, 如: Line Out, HeadPhone), 共 %d 条路径, 仅显示路径长度小等于4的路径' %(self.name, len(paths)))for _ in paths:if len(_) <= 4:     # 仅显示路径长度小等于4的路径print(' → '.join(_))print('\033[0m')def __repr__(self):return '<Node %s>' % self.namenodes = {}def init_nodes():"""读取codec.txt每行文本, 初始化节点对象, 并建立父子关系列表1. 找到有一个节点初始化一个节点对象放入 nodes 里, 如: {'0x14': <Node 0x14>}在每个节点段里面找到该节点连接的子节点信息, 并填充当前节点的子节点信息2. 所有节点都读取完毕, 遍历每一个节点, 根据该节点的子节点列表, 为每一个子节点列表中添加一个父节点(该节点自身):return: None"""try:f = open(sys.argv[1])except (IndexError, IOError):print('请提供正确的文件路径名!')f = None    # Bypass pycharm warning "Local variable 'f' might be referenced before assignment"exit(1)line = f.readline()current_node = Nonewhile line != '':match = re.match(r'Node (\w+) (\[.+\])', line, re.IGNORECASE)if match:current_node = Node(match.group(1).lower(), match.group(2))nodes[match.group(1)] = current_nodeprint('Debug: 找到节点 %s %s' % (current_node.name, current_node.desc))line = f.readline()continuematch = re.match(r'\s+Connection: \d+', line, re.IGNORECASE)if match:line = f.readline()if 'In-driver Connection' in line:  # HDMI codecline = f.readline()current_node.child_name_list = re.findall(r'\w+', line)print('\t\t节点 %s 下连接到以下节点 %s' % (current_node.name, ' '.join(current_node.child_name_list)))line = f.readline()continueline = f.readline()# 初始化各节点的子节点for node in nodes.values():for child_name in node.child_name_list:child_name = child_name.lower()child_node = nodes[child_name]node.child_obj_list.append(child_node)# 为子节点添加父节点child_node.add_parent(node)init_nodes()
_name = input('\n\033[33m请输入节点名称, 如0x10\033[0m\n:').lower()
try:_node = nodes[_name]_node.get_parent_paths()_node.get_child_paths()
except KeyError:print('找不到节点: %s , 节点名称输入是否有误?' % _name)exit(1)

verbit.py

#!/bin/python3
"""HackintoshTools verbit.py~~~~~@Description:整理提取到的codec.txt节点信息, 生成configdata参考: https://github.com/daliansky/Dell-Inspiron-7560-Hackintosh/blob/master/hda-tools/verbit.sh@CreateTime: 2019/12/16 8:15 下午@Author: leo@License: MIT
"""import os
import sys
import re
import tracebackBASE_DIR = os.path.dirname(__file__)
CODEC_TXT = ' '.join(sys.argv[1:])try:with open(CODEC_TXT, 'r') as f:content = f.read()NAME = re.findall(r'^Codec: (.+)$', content, re.MULTILINE)[0]ADDRESS = re.findall(r'Address: (\d+)$', content, re.MULTILINE)[0]
except IOError:print('ERROR: 打开codec文件失败, 路径: %s' % CODEC_TXT)exit(1)
except IndexError:print('ERROR: codec文件格式是否不正确?')exit(1)class Node(object):__slots__ = ['Jack', 'Color', 'Description', 'Node', 'PinDefault', 'Verbs']def __getattr__(self, item):if item == 'Verbs':return '%s%s71c%s %s%s71d%s %s%s71e%s %s%s71f%s' % (ADDRESS, self.Node, self.PinDefault[-2:],ADDRESS, self.Node, self.PinDefault[-4:-2],ADDRESS, self.Node, self.PinDefault[-6:-4],ADDRESS, self.Node, self.PinDefault[-8:-6])def init_nodes(text: str) -> [Node]:"""分析codec.txt, 提取有效节点信息(含有Jack, Color, ... 等信息的节点)a). 先将文本分割为以Node 0x...隔开的段, 并剔除不包含"Pin Default"的段Node 0x02 [Audio Output] wcaps 0x41d: Stereo Amp-Out...------------------------------------------------------Node  0x03 [Audio Output] wcaps 0x41d: Stereo Amp-Out...------------------------------------------------------b). 依次解析每个文本段, 并初始化Node对象, 放入一个列表中, 所有解析完毕, 返回该数组:param text: str , codec.txt 文本内容:return [Node<1>, Node<2>, ...]"""# 先添加一个特殊前缀'----------', 再切割, 以防止切割后Node 0x丢失text = re.sub(r'^Node 0x', '----------Node 0x', text, flags=re.MULTILINE)node_texts = re.split(r'----------', text)node_texts = [_ for _ in node_texts if 'Pin Default ' in _]node_list = []for node_text in node_texts:node = Node()try:node.Node = re.findall(r'^Node 0x(\w+) ', node_text, re.MULTILINE)[0]node.Jack = re.findall(r'Conn = (.+),', node_text)[0]node.Color = re.findall(r'Color = (\w+)', node_text)[0]node.PinDefault, node.Description = re.findall(r'Pin Default (\w+): (.+)$', node_text, re.MULTILINE)[0]if '[N/A]' in node.Description:print('WARN: 忽略无效节点信息: Node 0x%s\n%s' % (node.Node, node.Description))continueprint('INFO: 找到节点信息: Node 0x%s\n%s' % (node.Node, node.Description))node_list.append(node)except IndexError:print('ERROR: 搜索节点信息出错, 错误信息如下:\n%s\n 文本内容如下:\n%s' % (traceback.format_exc(), node_text))return node_listnodes = init_nodes(content)
markdwon = '|%s|\n|%s\n' % ('|'.join(Node.__slots__), ':---:|' * len(Node.__slots__))
for _node in nodes:markdwon += '|%s|%s|%s|0x%s|%s|%s|\n' % (_node.Jack, _node.Color, _node.Description,_node.Node, _node.PinDefault, _node.Verbs)
print('\n\n\n%s' % markdwon)

http://chatgpt.dhexx.cn/article/tRo3ffs7.shtml

相关文章

Virtualbox设置固定IP

Virtualbox桥接实现静态固定IP内外网访问 super_kancy 2018-10-20 11:55:28 6024 收藏 7 展开 桥接实现静态固定IP内外网访问 第一步、安装好一个虚拟机linux01 第二步、配置网卡&#xff0c;选择桥接网卡模式&#xff0c;并且指定桥接的具体的网卡 第三步、正常启动虚拟机lin…

怎么把计算机跟打印机ip固定,打印机设置固定IP的详细图文教程

在电脑上设置打印机共享很多时候不是在右键菜单上共享一下那么简单&#xff0c;共享的过程中往往会遇到很多问题&#xff0c;这一大堆问题都是windows的安全机制导致的。解决了&#xff0c;共享就能无往不利。设置共享前&#xff0c;首先要给连着打印机的电脑设置固定IP&#x…

CentOS7设置固定IP地址详解

修改虚拟机的ip地址为固定ip地址 针对虚拟机&#xff08;CentOS7&#xff09;&#xff0c;我们通常不会直接在VMware里操作&#xff0c;而是使用finalshell或者其他的软件连接虚拟机后操作&#xff0c;以下内容会教给大家如何设置虚拟机的固定ip。 1.先查看一下虚拟机的网络连…

计算机网吧设置固定IP就断网,怎么解决局域网设置固定IP上不了网的问题

人们使用电脑时候最不想看到的事情之一就是上不了网了&#xff0c;无论是工作还是玩游戏时候都很不爽。通常小型局域网&#xff0c;路由器自动拔号&#xff0c;电脑IP都是自动获取。我把自己的改成固定IP了&#xff0c;结果上不去网&#xff0c;改回自动就能上&#xff0c;怎么…

ubuntu18.04 如何设置固定IP

常用的服务器若不定时得出现服务器ip变动得问题&#xff0c;这种对使用人员来说有点不太方便&#xff0c;如何设置固定ip可参考下文&#xff1a; 1、更改网络配置文件 sudo vi /etc/network/interfaces 编辑文件中的内容为&#xff1a; 其中&#xff0c;eno1代表网卡的名称&…

Hyper-V虚拟机设置固定IP

最近在学习Docker,需要安装一下linux虚拟机,发现Hyper-V搭建还真的挺方便的,我是Windows10自带的,不用在下载软件了。 由于想要使用Docker私有仓库,在虚拟机中运行registry后,发现本地一直push不上去,网络不通,报错如下: docker push dial tcp 172.17.116.18:5000: connect: …

虚拟机net模式设置固定ip

虚拟机net模式设置固定ip 前言&#xff1a; 自己装的虚拟机&#xff0c;通过net模式可以固定ip就像是一台服务器一样&#xff0c;不过只限于主机和虚拟机之间。当主机有网时&#xff0c;虚拟机就可以联网。 这里记录一下配置过程。 环境&#xff1a;VMware15 centOS7 一、设置…

linux虚拟机设置固定IP

linux虚拟机设置固定IP ubuntu虚拟机(桥接模式)设置固定IP 方法很简单&#xff0c;直接在系统设置里面配置就可以了 1.先使用ifconfig查看掩码 2.点击设置 3.点击network再点击set 4. 第一个为虚拟机ip,为避免冲突,建议设置210以上的ip 5.重启,ifconfig查看ip 不同版本系…

【虚拟机搭建-VMware设置固定IP】VMWare中CentOS如何设置固定IP【不成功手把手教学】

1、背景2、虚拟机安装3、windows配置3.1、虚拟网卡配置3.2、VMware的NAT和DHCP自动开启 4、VMWare网络介绍4.1、桥接模式&#xff08;Bridged&#xff09;4.2、NAT模式4.3、主机模式(Host-only Adapter) 5、为什么使用NAT模式6、VMware设置固定IP6.1、VMware网络配置6.2、虚拟机…

ubuntu设置固定ip地址的方法

ubuntu设置固定ip的方法 问题&#xff1a;在连接虚拟机上的mysql数据库时&#xff0c;发现连接不上了。 检查了数据库的连接信息后&#xff0c;发现并没有问题&#xff0c;然后去虚拟机上查看ip地址&#xff0c;发现是ip地址发生了变化&#xff0c;下面教大家如何设置固定的ip地…

Linux中设置固定ip的方法

[TOC]一、Linux中设置固定ip的方法 1&#xff1a;使用ifconfig命令查看当前网络状态&#xff1b; 2&#xff1a;使用ping命令查看网络是否正常连接&#xff1b; 3&#xff1a;vi /etc/sysconfig/network-scprits/ifcfg-ens33 (这个文件名称 可能会不同&#xff09; 4&#xff…

虚拟机Ubuntu设置固定IP与主机相互通讯

虚拟机Ubuntu设置固定IP与主机相互通讯 1. 写在最前1.1 最好了解的预备知识1.2 虚拟机与主机三种连接方式1.3 写在最前 2. VMware 虚拟机Ubuntu系统与主机共享IP2.1 配置VMware桥接网卡2.2 设置虚拟机为固定IP2.3 Vmware 虚拟机与主机互相通讯 3. VirtualBox虚拟机Ubuntu系统与…

家用电脑设置固定IP无法上网,自动获取即可上网

问题&#xff1a; 家用电脑通常是直插网线&#xff0c;网络设置为自动获取&#xff0c;当改为固定IP时则无法上网&#xff0c;针对此问题解决方法如下&#xff1a; 打开cmd命令窗口&#xff0c;输入ipconfig /all 将本地网络适配器IPV4地址修改同网段内如下&#xff0c;切记与…

win系统连接交换机并设置固定ip地址

进入网络和共享中心&#xff0c;选择以太网2. 选择进入Internet协议版本4&#xff08;TCP/IPv4&#xff09; 进行设置相应的ip地址&#xff0c;然后点击确定&#xff0c;完成固定ip的设置。

Linux虚拟机设置固定IP地址

在宿主机&#xff08;实际使用的计算机&#xff09;上使用xshell等工具连接虚拟机上的linux时&#xff0c;总会因为IP地址的变动而不停的修改xshell等工具的连接&#xff0c;为了避免这些麻烦&#xff0c;将虚拟机上的Linux的IP地址设置成为固定IP成了我们的最佳选择。 首先&a…

deepin设置固定IP地址

无论是ubuntu&#xff0c;还是国产的deepin的&#xff0c;其实设置固定IP地址的方法就是差不多的。可以在命令行模式下设置&#xff0c;也可以在界面上设置&#xff0c;显然&#xff0c;后者更简单。步骤如下&#xff1a; 1.点击新增一个网络 2.填好IP地址&#xff0c;保存就行…

计算机IP怎么设置成固定的,如何给电脑设置固定IP地址

1)Windows 2000/BP参数设置&#xff1a; 右击桌面网上邻居→选择“属性”→在网卡对应的“本地连接”选择“属性”→“常规”→“Internet协议(TCP/IP)”&#xff0c;查看其“属性”&#xff1a; 若路由器为默认设置&#xff0c;那么主机网络参数设置为&#xff1a; IP&#xf…

设置固定IP后无法上网

1.打开网络和internet设置 2.依次点击&#xff0c;查看状态 3.截图保存状态 4.按截图填入子网掩码&#xff0c;网关&#xff0c;DNS服务器等ip 5.改完后会断网&#xff0c;需要你检测修复&#xff0c;会检测出一个问题&#xff0c;修复后就可以上网了 6.虽然可以上网&#xff0…

CentOS7设置固定IP

CentOS7设置固定IP 第一步&#xff1a;虚拟机设置NAT网络模式 第二步&#xff1a;查看虚拟网络的网关等信息 第三步&#xff1a;先查看虚拟机上用的是哪个网卡端口 一般会是这个ens33这个网卡 第四步&#xff1a;修改网络配置文件 进入/etc/sysconfig/network-scripts中修…

记录电脑设置固定IP

总是记不住固定ip的时候dns该写什么&#xff0c;每次都百度查一圈&#xff0c;我还是自己写一个流程方便自己查看吧。 1、打开设置然后点击网络和Internet 2、点击更改适配器选项 3、右键以太网选择属性 4、双击选择Internet协议版本4&#xff08;TCP/IPv4&#xff09; 5、选…