Liluとプラグイン:(2) AppleALCの使い方

Lilu.kextとLiluプラグイン.kextを設定するためのとても詳細なガイドがtonymacx86にありましたのご紹介します。今回はAppleALCの使い方の部分の抄訳です。原文は下のリンクを見てください。

Liluの開発にも携わっているjaymonkeyさんが書いてくださったガイドです。かなり長いです。前回は、WhatEverGreenを紹介しました。

AirportBrcmFixupに関しても後ほど紹介したいと思います。

(ここから抄訳)


AppleALCとは

AppleALCはLiluのプラグインです。ネイティブでないオーディオコーデックに対してHigh Definition Audio (HDA)を有効にするために、AppleHDA kextに動的にパッチを当てます。WhatEverGreen (以下WEG) と同様に、オーディオを有効にするために従来使用していた多くのパッチとkextを置き換えてくれます。なのでAppleALCを使用する前には、既にあるAppleHDAを有効にするパッチ、ダミーのkext、DSDTへの変更などを取り除いておき、AppleHDAをオリジナルの状態のkextに戻しておく必要があります。

Nvidia HDMIオーディオ

AppleALCはほとんどのNvidia GPUでHDMIオーディオを有効にします。必要な作業は、LiluとAppleALCをインストールする事だけです。もしHDMIをサポートしたNvidiaカードが使われていたら、AppleALCはこれを検出して、HDMIオーディオコントローラを有効にします。サポートされたNvidiaデバイスはこちらのページを見てください。Nvidiaデバイスのこのリストの最後にあります。

オンボードオーディオコーデック

AppleALCは、Raltek (ALC)、Conexant、IDTなどの多くのビルトイン(オンボードの)オーディソコーデックをサポートします。大抵の場合、やるべきことは、LiluとAppleALCをインストールして、config.plistに簡単な変更を加えるだけです。が、その作業の前に、AppleALCがどのように機能するか知っておくと良いです。

AppleALCはどのように動くのか

AppleALCの動作は従来の、AppleHDAに予めパッチを当てたり、ダミーを使ったりする方法と少し違います。AppleALCはコネクター、レイアウト、プラットフォームパッチの大規模なデータベースと理解できます。ロードされる際に、LiluとAppleALCは使用されているオーディオコーデックのタイプを自動的に検出し、データベースからパッチを探して、ApleHDAに動的にパッチを当てます。

AppleALCが使うパッチは、インデックス識別子により定義されています。バックワード互換性のために、パッチセットのインデックス識別子はlayout-idと呼ばれるプロパティ値で定義されています。layout-idはhackintoshのコミュニティで昔から使われてきた値で、パッチを当てたバージョンのAppleHDA(もしくはダミーHDA kextの)のレイアウトを選択する値です。

AppleALCのwake verb

追加の機能として、AppleALCはほとんどのコーデックのwake verbの面倒を見てくれます。なので、Codec Commanderをインストールしたり使用する必要はありません。(訳注:コンピュータがスリープするとオーディオアンプもoffになります。スリープから目覚めるときに、アンプがonにならなくて、スリープ復帰後に音が出ない問題が発生する事があります。wake verbはスリープ復帰時にアンプをonにするための特別なデータのようです。これを流す事でアンプがonになるようです。〜という理解で正しいでしょうか?間違っているようでしたらコメントで指摘してください。)

LiluとAppleALCのインタラクション

(訳注:この節の内容は理解できませんでした。すみません)

Liluがロードされると、Liluはlayout-idの値を見つけて、その値をAppleALCに渡します。この値を継承して、AppleALCはalc-layout-idという名前の新しいデバイスプロパティを作ります。AppleALCは次に、layout-idの値を新しいターゲットID(通常は7)に設定し、AppleHDAのターゲットレイアウトに(Liluのパッチエンジンを使って)パッチします。この時、指定した(alc-layout-idで指定された)コーデックのための、コネクターID情報、infoファイル、プラットフォームファイルが使われます。

この方法により、AppleALCはMojaveのドロップドレイアウトIDを無視します。(詳細はこの記事のオーディオの節を見てください)。というのは、インジェクトされたlayout-id値は、AppleALCのコーデックパッチデータベースのインデックスとしてのみ使われるからです。AppleALCはこのlayout-idによる再マップする枠組みを、Mojaveだけでなく、全てのバージョンのmacOSで使います。

サポートされているコーデックを確認

使用しようとしているコーデックをAppleALCがサポートしているかどうかは、ソースコードのResoucesフォルダの中で名前を探せば確認できます。コーデックがサポートされていなかったら、公式のAppleALCヘルプスレッドに投稿して、次のバージョンで入れてもらうよう依頼してください。そのコーデックの詳細(このスレッドの#1投稿を見てください)を投稿します。達人の誰かが、その投稿を見て、手助けを申し出てくれるでしょう。おそらく、Linuxを使ってコーデックのダンプを用意する必要があります。このガイドの対象外の話題なので、ここでは詳細に関して説明しませんが、あなたの投稿を見た誰かがダンプの取り方を説明するリンクを示してくれるはずです。

もし、使用しようとしているコーデックが、既にAppleALCでサポートされていたら、どのレイヤーがサポートされているかを、対応するコーデックフォルダにある、info.plistフィイルを開いて知ることができます。これから、どのレイヤーIDが使用可能なのかがわかり、また、コメントかそのうちのどれを使うべきかを知ることができます。

一例として、私の2017年版HP Spectre X360ラップトップの場合は、Realtek ALC295コーデックを搭載しています。そこで、ALC295フォルダの中のinfo.plistを開きます。以下に示します。

この例では、Mironeさんのパッチが必要なパッチであり、これがレイアウト3であることがわかります。このように、コメントを読めば、システムに必要なレイアウトの記述を簡単に見つけられます。もし、全ての使用可能なレイアウトID値のリストが不明な場合、一つ一つ試して動く値を探します。また、Hackintoolを使ってどのレイアウトがサポートされているのか(下の方法で詳細を説明します)知ることもできます。

AppleALCの設定

AppleALC.kextをインストールした後ですべきことは、layout-idを設定することです。2つの方法があります。

方法1:Audio Injectで設定する(古い方法)

Liluはconfig.plist内のレガシーなパラメータであるClover/Device/Audio/Injectからlayout-id値をCloverに問い合わせる機能があります。なのでInjectのString値を正しいlayout IDに設定すれば良いです。以下のようにします。

<key>Devices</key>
<dict>
    <key>Audio</key>
    <dict>
        <key>AFGLowPowerState</key>
        <true/>
        <key>Inject</key>
        <string>3</string>
        <key>ResetHDA</key>
        <true/>
    </dict>

LiluがClover/Devices/Audio/Injectからlayout-idを取得するというレガシーな方法をサポートしなくなる可能性があることは注意すべきです。なので、次に示す方法2が良いです。

方法2:Device Propertiesを使う(おすすめ)

AppleALCとLiluをインストールした後、config.plistを編集して、Devices/Audio/Injectを”No”にします。そしてLayout-idをカスタムDevice Propertyとして設定します。ここで、Audio Device Propertyコードを作成するために、Hackintoolを使います。HackintoolのAudioアイコンをクリックすると、検出されたコーデックタイプが表示されます。ここで設定したいHDAオーディオデバイスを選びます。するとAudio Infoに詳細な情報が出て、ドロップメニューでLayoutを選べるようになります。ドロップメニューには検出されたコーデックに適用可能なlayout IDのみが表示されます。

項目選択が終了したらPatchアイコンを押し、Patch機能を呼び出します。もしオーディオデバイスがシステム情報のPCIデバイスセクションの中で正しい名前で表示されたかったら、Advanced optionsの中のSpoof Audioオプションを選択します。この時Advancedページの他の項目は全てチェックを外します。

次に、Generalをクリックして、Device / PropertiesとAudio Deviceオプション以外のチェックを全部外して、Generate Patchをクリックします。

ここに現れたコードをコードを、config.plistの該当する部分にコピーペーストします。以下のようになります。(訳注:Z390チップセット搭載マザボのALC1220を対象に同じ操作をしたのですが、心当たりのないmodel名になっていたり、hda-gfxという項目があったりしました。model名は適当に編集して、hda-gfxの項目は削除して良いのだと思います。)

    <key>Devices</key>
    <dict>
        <key>Properties</key>
        <dict>   

            <key>PciRoot(0x0)/Pci(0x1f,0x3)</key>
            <dict>
                <key>AAPL,slot-name</key>
                <string>Internal</string>
                <key>device-id</key>
                <data>
                cKEAAA==
                </data>
                <key>device_type</key>
                <string>Audio device</string>
                <key>layout-id</key>
                <data>
                AwAAAA==
                </data>
                <key>model</key>
                <string>Sunrise Point-LP HD Audio</string>
            </dict>

        </dict>
    </dict>

config.plistの変更が完了したら、再起動してオーディオが動いているかどうかテストします。もし動いていなければ、他の有効なlayout-IDを試してください。

もし、全ての有効な値を試してもオーディオがまだ動かない場合は、新しいパッチセットが必要なコーデックを使っているのかもしれません。サポートされていないコーデックに関しては、AppeleALCのヘルプスレッドを利用してください。

AppleALCのトラブル対策

AppleALCがロードされていることを確認する

AppleALCが正しくロードされて初期化されていることは、IORegisteryExplorerで確認できます。これはこちらのリンクからダウンロードできます。

IORegisteryExplorerを動かして、HDEFという文字を検索ボックスrに入れます。ioregディレクトリーツリーにHDEFデバイスが見えるはずです。上の例では、次のように見えます。

HDEFが見えないようでしたら、LiluとAppleACLのインストール手順を確認してください。以下のACPI HDA/Codec Rename 問題も見てください。

上のスクリーンショットでは、AppleALCが動的に新しいプロパティalc-layout-idを作り出している事がわかります。ここでの3という値は、config.plistで設定した値です。同様に、layout-idという項目は7とあります。これは、AppleALCがぱちを当てようとしている対象のAppleHDAでのレイアウトで、macOSが使っているものです。

もし、HDEFの中にlac-layout-idが見つからない場合、AppleALCが正しくロードされていない、もしくは初期化されていないのかもしれません。この原因は、kextが正しくインストールされていないからです。kextを削除して、インストールを再度試みてください。

HPET 問題 (High Precision Event Timer)

上記のステップが正常でもなお音が出ない場合、HPETによってIRQの衝突が発生している可能性があります。

macOSにおいて、HPETは基本的に必要な仕組みです。これが正しく働く必要があります。このフォーラム(訳注:tonymacx86のフォーラム)のほとんどのガイドでは、BIOSでHPETを有効に設定していることを前提としています。しかしながら、いくつかのマザーボードとラップトップでは、HPETに関するネイティブなDSDTコードがIRQ衝突を引き起こし、AppleHDAの正しい初期化を妨げたり、雑音を出す事があります。

この問題を確認する一つの方法は、ターミナルで次のコマンドを入力する事です。

kextstat | grep 'Lilu\|AppleALC\|AppleHDA'

この結果、Lilu, AppleALC, AppleHDA kextがリストアップされるはずです。

MonkeyPro-2018:~ Jay$ kextstat | grep 'Lilu\|AppleALC\|AppleHDA'
   20    4 0xffffff7f81041000 0x22000    0x22000    as.vit9696.Lilu (1.2.8) 54014689-C8DA-318B-84F4-944BBA7AD2AC <8 6 5 3 2 1>
   23    0 0xffffff7f811bd000 0xdf000    0xdf000    as.vit9696.AppleALC (1.3.3) B60FCBAF-6BC2-36EF-A1E6-D5BE2863C35B <20 13 8 6 5 3 2 1>
  138    1 0xffffff7f830a7000 0x1d000    0x1d000    com.apple.driver.AppleHDAController (282.10) 70256EC9-AF38-31BD-A3C5-9C0E30B64AA3 <137 113 107 13 8 7 6 5 3 1>
  157    0 0xffffff7f8323a000 0xb7000    0xb7000    com.apple.driver.AppleHDA (282.10) B2208DA8-8CD9-36D8-BD59-C6D9A5379585 <156 138 137 124 113 107 7 6 5 3 1>
  159    0 0xffffff7f830c6000 0x2000     0x2000     com.apple.driver.AppleHDAHardwareConfigDriver (282.10) C4F674A0-5828-3D97-82BF-A81C8B8BDDBA <5 3>

この例から分かるように、AppleHDA、AppleHDAController、 AppleHDAHardwareConfigDriverとインストールされています。ここで重要なのは、 AppleHDAです。

もしAppleHDA (com.apple.driver.AppleHDA)が出力に現れていなかったら、HPETオプションが正しく有効になっているかどうかを確認してください。もし有効になっていてもAppleHDAが現れなければ、DSDTのHPETコードにパッチを当てる必要があります。

これを行う最も簡単は方法は、CloverのACPI/DSDT/Fixesの中の FixHPETをtrueにする事です。

<key>ACPI</key>
<dict>
    <key>DSDT</key>
    <dict>
        <key>Fixes</key>
        <dict>
            <key>FixHPET</key>
            <true/>

この方法はほとんどのユーザで有効です。でも、もしCloverのHPETフィックスでもまだAppleHDAがロードされない場合、DSDTに直接パッチを当てる必要があるかもしれないです。RehabManさんがこのパッチを作ってくれていて、MaciASLを使って適用できます。

#Maintained by: RehabMan
# HPET fix to avoid AppleIntelCPUPowerManagement panic
into method label _STA parent_hid PNP0103 remove_entry;
into device name_hid PNP0103 code_regex Name\s\(_STA\,\s+0x0F\) remove_matched;
into device name_hid PNP0103 insert
begin
Name (_STA, 0x0F)\n
end;

into method label _CRS parent_hid PNP0103 remove_entry;
into device name_hid PNP0103 insert
begin
Method (_CRS, 0, NotSerialized)\n
{\n
    Return (BUF0)\n
}\n
end;

このパッチをDSDTに当てるためには、MaciASLを使い、Patchボタンを押し、上記のコードをパッチエディターにコピーペーストします。そしてApplyボタンをクリックして、DSDTを保存します。詳しい情報は、Rehabmanさんのガイドを見てください。また、DSDTにパッチを当てた場合は、Cloverのfixは無効にしておきましょう。

ACPI HDA/Codec 改名問題

WhatEverGreenと同様に、 AppleALCとLiluはDSDTの中のACPIの名称を適切に自動的に改名してくれます。しかし時々失敗することもあり、手作業で改名する必要があります。この改名が正しく実施されているかどうかは、IORegistryExplorerを開いて、HDEFを検索してみればわかります。

もしHDEFがioregに存在すれば、これ以上の作業は不要です。しかい、もし存在していなければ、ここまで述べた作業が正しく行われているかどうかを確認してください。それでも解決しなければ、HDEF名称変更を手作業で行ってみる必要があります。

まずは、バニラな状態のDSDTをMaciASLで開いて、HDEFで検索して、元々のHDAデバイスの名前を確認します。もし検索結果がなければ、HDASで検索します。それがなければAZALで検索します。

もしHDAデバイスがHDEFと名付けられていたら、デバイスを改名する必要はありません。もしHDASと呼ばれていたら、次のコードをconfig.plistのACPI/Pachesに追加します。

<dict>
    <key>Comment</key>
    <string>change HDAS to HDEF</string>
    <key>Disabled</key>
    <false/>
    <key>Find</key>
    <data>
    SERBUw==
    </data>
    <key>Replace</key>
    <data>
    SERFRg==
    </data>
</dict>

もしAZALでしたら、以下のパッチを追加します。

<dict>
    <key>Comment</key>
    <string>change AZAL to HDEF</string>
    <key>Disabled</key>
    <false/>
    <key>Find</key>
    <data>
    QVpBTA==
    </data>
    <key>Replace</key>
    <data>
    SERFRg==
    </data>
</dict>

4件のコメント

  1. この記事を参考にして、voodooから移行できました。ありがとうございます!
    Voodooでは小さかった音量も直りました。

    1. お役に立ててよかったです。Voodooは成功率が高いですが、音が割れたりなど色々不具合がありますよね。

  2. ども、boot macOSさん、

    >hda-gfxという項目があったりしました。model名は適当に編集して、
    >hda-gfxの項目は削除して良いのだと思います。

    hda-gfxというのはiGPUのHDMIに関するKeyですね、iGPUを有効化してHeadlessモードで使ってる場合とか、デバイスが見えてるんでHackintoolちゃんは親切に0x8086 0x1458A0C3にIntelのコーデック用として出力してるのかと。。。

    ちなみに、
    hda-gfx
    Intel HDMI Codec

    とか編集してこれを入れてると私のZ390環境でHeadless状態でこれを入れてるとWake時にHDMI Driver関連でKernal Panic起こしちゃいますね。

    ノートPCとかiGPUのみを表示環境で使って実際ににHDMI接続経由で外部ディスプレイに出しつつ音も出したいなどの特定環境下では必要になるかも?です。

  3. >LiluとAppleALCのインタラクション
    >(訳注:この節の内容は理解できませんでした。すみません)
    たしかに、原文読んでもなんだかわけわかな難しい節ですね。。。
    ただ、AppleALCの助けて書き込みとかで、自分がどのLayout-IDを指定したら良いのか教えてくれみたいな内容のときとか、分かんない時は1か7使えや!言ってる人いたような記憶がありますね。

    HDEのDSDTとか自分でこしらえて、ACPI>patchedに入れてると、起動時にLiluがAppleALCと連携して7へマップするよってことを言いたいのかも?て気もします。そんなこんなでこの7と1なんかは多分なにかしらの使えるLayout-IDだから、7を先ずは試してみれば?っていう話に繋がるんかなぁとか思って読ませてもらいました。

    それとMojaveのドロップドレイアウトIDのとこは、たしかMojaveになったとき、ALCで音が出なくなって、いろいろ調べてLayout-ID変えた気もします。。。その時の記憶ではMojaveになったら、今までの古い?Layout-IDがAppleがドロップしちゃったんで使えなくなった時代のこと言ってをなんか説明してるんでしょうね?

    私はALC1220使ってますけど、今でも該当するマザボのLayout-IDは人によってまちまちで16使えやという人もいれば、10が良いと信じてるという人もいる感じで、それ使ってれば万事OKだと言い切れないのも悩み。。。

    ちなみに私はケースの前面に無理やりiMac 2007のスピーカーパーツをヤフオクで入手してツイータにはフィルムコンデンサでなんちゃって2Wayとして取り付けて、せっかく付いてるマザボのUSB3.0-DAC-UPポートのにPAM8403 2X3Wミニ 5V デジタル アンプ基板をつなげて、ちょっとましな内蔵スピーカーとして使ってます。。。
    https://www.amazon.co.jp/VKLSVAN-PAM8403-2X3Wミニ-アンプ基板-オーディオ/dp/B081GY23F9/ref=sr_1_4?__mk_ja_JP=カタカナ&keywords=PAM8403&qid=1581115846&s=industrial&sr=1-4

    そうすると青のオーディオジャック(出力装置として内情スピーカーとして表示される)で接続して普段は内蔵スピーカでBGMとか鳴らして、ここぞという時にフロントパネルオーディオのHead Phoneジャックを入れて使いたい、でもその時内蔵スピーカーがHead Phoneジャックに入れたときに自動でOFFになって切り替わるっていうレイアウトにしたい場合は16でも10でも7でもなく、だれも推奨してない1でした。。。

    そんなこんなで変態的なというかサラウンドとか組んでる人は、ソースコードのResoucesフォルダとか覗きに行って、どんなLayout-IDが使えるかをあらかじめ調べていろいろ試してみないといけなくなるケースもありますね。

    あとは、てきとうModで内蔵スピーカーをつけてるんで、音が微妙に好みにもってけないんで、EQで調整してなんとかして自分好みの音に持ってくためにこれをCatalinaに入れて使ってます。。。

    音楽好き必須!アンプ要らずでMacの音質を簡単に向上させるのにオススメの無料イコライザーアプリ「eqMac2」
    https://shoji014.com/eqmac2/
    ※Catalinaで使う場合は、このアプリをFinderから選択して、このパッケージの内容を表示>Contents>ResouceフォルダからeqMac2Driver.kextを/Libraly/Extentionに手動で放り込めば使えるっぽいです。

    VoodooHDAはWindowsと共存して古いサウンドブラスターを使い人とか、なんらかの事態(新しいMacが出たときのOSUpdateとか。。。)ALCが突然動かなくなった時など、緊急で一時的にもVoodooHDAに変えたら動くっていうこともあるし、意外とまだ使う機会もあったりしますね。

    VoodooHDAもPlistにちゃんとPinConfigrationを自分でこしらえて作れるくらいの人だと、2.9のバージョンだと音が出るという意味での品質上の問題はないっぽい気もします。
    ただPin-configrationは、理解力がある人じゃないと苦闘するんで、私も楽ちんなAppleALCに今では依存しちゃってますね。

匿名 へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です