Criando Layout de Áudio

Versão suportada do AppleALC: 1.7.6

Sobre

O AppleALC é uma extensão de kernel de código aberto que permite áudio nativo no macOS para codecs não oficialmente suportados, sem nenhuma modificação no sistema de arquivos. Basicamente um configurador para o AppleHDA e seus controladores em geral.

Começando

Requisitos:

  • Xubuntu com o kernel Linux podemos reconhecer qual é o chip de áudio instalado na máquina, capturar os PingConfigs(Verbs) e gerar um layout gráfico das conexões de áudio. [macOS]

  • Etcher é um gravador para criar pendrives inicializáveis e será necessário para executar o Xubuntu na máquina. [macOS]

  • Xcode a ferramenta de desenvolvedores da Apple será necessária para criarmos nosso próprio layout-id do AppleALC. [macOS]

  • Pacote de Ferramentas nesse pacote será incluso o Verbit, GetCodec e o Conversor Decimal. [Xubuntu]

  • PinConfigurator será necessário para ajustar os verbs gerados pelo script do Verbit. [macOS]

  • AppleALC & MacKernelSDK & Lilu extensões necessárias para injetar layouts personalizados no AppleHDA.

Criando o Live-USB com Xubuntu

Insira um pendrive com pelo menos 4GB de armazenamento na máquina, abra o Etcher e na opção Flash from file selecione a imagem baixada do Xubuntu (utilize a versão em inglês para evitar problemas no script getcodec)

Inicie o pendrive pela BIOS, selecione Try Xubuntu without installing. Em tradução literal, testar o Xubuntu sem instalar.

Descobrindo o Modelo do Codec

Pesquise por Emulador de Terminal no Xubuntu, iremos executar o seguinte comando para descobrir o codec de áudio:

cd ~/Desktop && mkdir Codec && for c in /proc/asound/card*/codec#*; do f="${c/\/*card/card}"; cat "$c" > Codec/${f//\//-}.txt; done && exit

Esse comando irá criar uma pasta na área de trabalho com o nome Codec, dentro irá conter alguns arquivos gerados, abra o arquivo referente ao seu codec de áudio, renomeie o arquivo para codec.txt.

Notas: Remova a linha "AFG Function Id: 0x1 (unsol 0)" do arquivo, se não for removida irá resultar em erro no CodecGraph, devemos descartar o arquivo que contém o codec HDMI, remova da pasta. O codec HDMI não será necessário nesse tutorial.

Gerando Caminhos Gráficos

Extraia e coloque todos os arquivos do Pacote de Ferramentas dentro da pasta Codec localizada na área de trabalho. Deve estar exatamente como na imagem abaixo.

Abra o Emulador de Terminal novamente e execute o comando abaixo:

cd ~/Desktop/Codec && chmod +x getcodec && ./getcodec

Após executar esse comando, o script irá gerar algumas pastas e separar tudo em seu devido local, na pasta convertidos, teremos todos os arquivos essenciais para continuar o processo.

Ajustando PinConfigs

Geralmente nossos PinConfigs são gerados de maneira incorreta pelo Verbit, no arquivo verbs.txt localizado na pasta convertidos é possível ver na aba de Modified Verbs que o microfone está totalmente desconfigurado, e isso pode acontecer com qualquer dispositivo do seu hardware, você terá que organizar corretamente.

Este dispositivo possui apenas uma Saida de Áudio(HP Out at Ext Rear) e duas Entradas de Linha(Mic at Ext Rear e Line In at Ext Rear). Só é necessário os seguintes dispositivos nessa máquina: HP Out at Ext Rear (Fones de ouvido na porta externa traseira); Line In at Ext Rear (Entrada de linha na porta externa traseira); Mic at Ext Rear (Microfone na porta externa traseira);

Devemos listar apenas estes dispositivos nas configurações. Cada hardware vária de um pra outro, selecione os que estão disponíveis no seu hardware.

Alterações executadas:

Notas: Note que tudo deve estar totalmente alinhado, quando convertido o valor decimal para hexadecimal, adicionar 0x0 na frente.

Dicas:

  • Converter valor para decimalprintf "%d\n" 0x18

  • Converter valor para hexadecimal printf "%x\n" 24

Leitura de Conexões do Codec

A partir daqui já não será mais necessário o uso do Xubuntu, salve toda pasta e informações em algum lugar para acessar no macOS posteriormente. Com os valores do Node como por exemplo, 20, 24 e 26 iremos traçar as conexões corretamente. Abra o arquivo codec-decimal.txt.svg no navegador.

Tradução das conexões

Amplificador

Entrada de Áudio

Saída de Aúdio

Seletor de Áudio

Mixer de áudio

Complexo de Pinos

Triângulo

Circulo vermelho

Circulo azul

Paralelogramo

Hexágono

Retângulo

Na imagem acima, é possível ver um exemplo de conexão, quando o dispositivo é de saída (fones de ouvido e alto falante) devemos informar o complexo de pino até a saída de áudio. E quando o dispositivo é de entrada (microfone e linha de entrada) devemos informar a entrada de áudio até o complexo de pino.

NodeID Fones de Ouvido (Linha de saída)

20 > 12 > 2

NodeID 2 contendo 1 amplificador.

Note que em alguns dispositivos é necessário adicionar a configuração Amp junto ao Mixer de Áudio.

NodeID Microfone (Linha de entrada)

9 > 34 > 24

NodeID 9 contendo 1 amplificador

NodeID Line In (Linha de entrada)

8 > 35 > 26

NodeID 8 contendo 1 amplificador

Notas: Arquivos SVG podem ser abertos em navegadores de internet, já que muitos visualizadores de imagem não são compativeis com esse tipo de formato.

Corrigindo PinConfigs

Com o software PinConfigurator, podemos corrigir nossos Verbs gerados e ajustados anteriormente. Adicione o NodeID do dispositivo em ordem crescente, de acordo com nossos Modified Verbs. Selecione Add no canto inferior esquerdo, e adicione o dispositivo a lista.

Na imagem foi adicionado o NodeID do fone de ouvido, devemos remover o 0x0 do PinDefault, sendo assim o valor hexadecimal 0x01214410 deve ficar 1214410. O resto das configurações será automaticamente carregada pelo PinConfigurator.

Veja com atenção as informações:

Port (Jack é para dispositivos externos e Jack + Internal é para dispositivos internos e externos, alguns microfones necessitam disso). Misc (Jack Detect Override serve apenas para dispositivos externos, se seu dispositivo for interno, desmarque todas as opções, evite deixar as opções Reserved marcadas). Group (os dispositivos nunca podem ficar no mesmo grupo, adicione em forma crescente cada dispositivo).

Com o microfone externo é um pouco diferente, já que a Apple nunca disponibilizou uma conexão de microfone externo em seus dispositivos, não há compatibilidade com o AppleHDA, o segredo é alterar o Device para Line In, assim o microfone será reconhecido perfeitamente. Lembre-se de alterar o Group em todos os dispositivos.

Com o Line In não há tantos problemas, foi necessário apenas alterar o Group para 3.

Selecione Get ConfigData, e salve os Verbs gerados em algum local.

Baixando o Código Fonte do AppleALC

Agora estamos no final dessa jornada, baixe a última versão GM do Xcode que seu macOS suporta, fique de olho na ultima versão suportada do seu macOS. Com ele instalado podemos continuar e criar nossos layouts e compilar nossa versão corrigida do AppleALC.

Precisaremos do código fonte do AppleALC/MacKernelSDK e a última versão de debug do Lilu.

Extraia todos os arquivos e renomeie o AppleALC-master para AppleALC e coloque o Lilu.kext e a pasta MacKernelSDK no diretório, como na imagem.

Configurando o AppleALC com Xcode

Agora devemos iniciar o arquivo AppleALC.xcodeproj

Com o modelo do seu Codec em mãos, abra a pasta Resources, que está localizada na parte superior esquerda, e procure a pasta com o nome do seu Codec.

Como podemos ver há diversos layouts e Platforms na pasta, cada arquivo conversa um com o outro, o layout11 se conecta com o Platform11 e vice versa. A partir do layout 11 é que podemos criar arquivos novos, pois segundo os desenvolvedores da extensão, os valores de 1 à 10 são reservados ao Mirone. Agora da pra entender o por quê dos layouts informados na Wiki do AppleALC não funcionarem corretamente, porque foram feitos para uma máquina específica. Os codecs possuem um esquema diferente de hardware para hardware.

Não vamos nos aprofundar em questão dos layouts, pois são muito complexos. Abra a pasta Resources/Modelo do Codec com o Finder; copie e cole o layout que melhor se adaptou na sua máquina (caso não tenha funcionado nenhum dispositivo, realize o teste com algum layout que possua um hardware parecido com o seu) e crie o novo layout, o número deve ser seguido em ordem crescente dos que já existem, realize o mesmo com o Platforms.

Volte ao Xcode novamente e abra o arquivo Info.plist, na aba Files>Layouts crie um novo Item com comentário, ID e Path corretos. Com o Files>Plaftorms deve ser feito a mesma coisa. Siga o exemplo da imagem anexada.

Abra o arquivo layoutXX.xml criado anteriormente, quando o arquivo for aberto, irá aparecer apenas códigos, não se assuste, isso é um arquivo XML. Você deve converter o Type para Property List XML, como pode ser visto no canto superior direito da imagem abaixo. Após a opção ser selecionada não irá carregar o modo gráfico de primeira, abra outro arquivo e volte novamente, caso não esteja aparecendo o modo gráfico, selecione outro tipo de Property List, em alguns casos é necessário reiniciar o software e abrir novamente. Adicione no LayoutID o número de layout que você criou anteriormente no seu layoutXX.xml e PlatformsXX.xml, no caso das imagens o número selecionado foi o 18, realize o mesmo com o PathMapID.

Abra o arquivo PlatformsXX.xml também criado anteriormente, selecione o Type para Property List XML, abra outro arquivo e volte para ele novamente, assim iremos poder ver o arquivo em modo gráfico. O Platforms é o encaminhador de conexões, nele é que iremos informar as conexões corretas dos dispositivos de áudio.

Altere o PathMapID para o ID selecionado anteriormente, no nosso caso é o 18.

Você irá ver que possuimos diversos Items dentro do PathMap, ali dentro que devemos informar as conexões de NodeIDs corretamente.

Abaixo podemos ver um exemplo perfeito de conexão do Fone de Ouvido. Onde o Complexo de Pino NodeID 20 (geralmente a porta verde onde é colocado o plug P2) se conecta ao Mixer de Áudio Node ID 12, (Note que possuimos uma opção Amp junto ao Mixer de Áudio, as vezes é necessário o uso dele para funcionar a opção de silenciar o som. Deve ser utilizado o Amp Output quando estamos utilizando dispositivos de sáida). E por fim conectando a Saída de Áudio NodeID 2, também possuindo um Amp Output por conta do Amplificador encontrado anteriormente.

Lista de configurações de Amps

Em diversos notebooks devemos adicionar o alto falante próximo ao fone de ouvido, assim, quando o fone de ouvido for conectado o som deve passar do alto falante e sair no fone de ouvido.

Agora que terminamos de configurar as conexões dos dispositivos de saída, iremos configurar os de entrada. No caso iremos configurar um Microfone Externo, marcado nos PinConfigs como dispositivo Line In. Como foi mencionado na Leitura de Conexões do Codec, o jeito correto de conectar um dispositivo de entrada é selecionando a Entrada de Áudio até o Complexo de Pino, sendo assim a Entrada de Áudio NodeID 9 contendo um Amp Input se conectando ao Mixer de Áudio NodeID 34 e por fim fazendo conexão com o Complexo de Pino NodeID 24, note que a configuração possui o método Boost 1, que significa que o áudio deve ser amplificado 1x, utilize este método quando o áudio estiver baixo em um dispositivo Input or Output.

O dispositivo de Entrada de Áudio (Line In Blue) não irá ser mencionado, pois possui a mesma configuração que o Microfone.

Com tudo salvo e devidamente configurado, agora podemos começar a configurar o PinConfigs.kext localizado na pasta Resources do AppleALC. Abra com o Finder e com o clique direito no arquivo selecione a opção "Mostrar conteúdo do pacote", abra o arquivo Resources/Info.plist com o Xcode.

Note que possuimos diversos Items na opção HDAConfigDefault, todos estes items seguem uma fila exata de cada codec, no caso desse tutorial, foi utilizado o ALC662, foi possível ver que o último layout existente era o layout-id 17 com seus respectivos arquivos. Com o atalho Command + F pesquise pelo modelo do seu codec de áudio. Copie e cole o Item do layout que foi selecionado e copiado para criar um novo layout, no caso o layout 15 apresentava maior compatibilidade. Esse novo Item deve ficar abaixo do último layout.

Adicione um novo título ao Codec, altere o LayoutID com o seu respectivo ID e adicione o ConfigData gerado pelo PinConfigurator anteriormente, por fim salve as alterações.

Compilando o AppleALC

Estamos prontos para compilar o projeto, com o atalho Command + Shift + < iremos alterar o esquema do projeto, na aba Run altere o Build Configuration para Release, e feche com o botão close. Clique no botão Run (▶️ ) para começar a compilar. Se tudo estiver configurado corretamente não irá aparecer nenhum erro ou ícone vermelho.

O arquivo está pronto, basta ir na pasta Products e com o clique direito no arquivo AppleALC.kext selecione a opção Show in Finder, irá abrir uma pasta com o arquivo AppleALC-X.X.X-RELEASE.zip, e lá dentro estará o AppleALC.kext, adicione essa kext na pasta de Kexts do seu bootloader, reinicie a máquina e teste seu áudio!

Tenha um bom Brakintosh! :)

Problemas

Poderá ocorrer de não funcionar algum dispositivo do seu hardware, realize a leitura corretamente do seu NodeID para certificar que está tudo correto, e realize o processo todo novamente. Tudo depende de você e do seu esforço para fazer funcionar 100% todos os dispositivos.

Contato

github.com/ryahpalma

linkedin.com/in/ryahpalma

Amps I/O

Amp Output correto para dispositivos de saída de áudio (Fone de ouvido & Alto falante) basta copiar o código, selecionar o NodeID e colar o código.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Channels</key>
	<array>
		<dict>
			<key>Bind</key>
			<integer>1</integer>
			<key>Channel</key>
			<integer>1</integer>
		</dict>
		<dict>
			<key>Bind</key>
			<integer>2</integer>
			<key>Channel</key>
			<integer>2</integer>
		</dict>
	</array>
	<key>MuteInputAmp</key>
	<true/>
	<key>PublishMute</key>
	<true/>
	<key>PublishVolume</key>
	<true/>
	<key>VolumeInputAmp</key>
	<false/>
</dict>
</plist>

Last updated