OpenCoreで起動音を鳴らす

OpenCoreでMacの起動音が出るようにしました。起動画面をGUI化した際にインストールしたリソースファイルに起動音のファイルも入っていました。これとAudioDxe.efiを用意し、config.plistに幾つかの設定をすることで、起動音が鳴りました。

今回は、こちらの記事の続きです。

少し前のMacでは起動音が出ましたが、煩わしいので消している人も多かったです。でも、最近のMacでは復活するという噂もあります。そうなると、起動音があっても良いのかなと思い、OpenCoreで試してみることにしました。今回も以下のガイドに従っています。

dortania.github.io
Add GUI and Boot-chime · GitBook
https://dortania.github.io/OpenCore-Desktop-Guide/extras/gui.html#setting-up-a-boot-chime

制限

起動音は、macOSが起動する前に鳴らすので、macOSのドライバーは使えません。コミュニティの皆さんが頑張って作ってくれたドライバーで音を出します。なのでマザーボード上の音源チップからのみ音が出せます。つまり、以下の制限があります。

  • USBオーディオからは起動音を出せません、
  • GPUオーディオからは出せる場合もありますしダメな場合もあります。

実際のMacは電源を入れると即座に音が出ます。ファームウェアが音を出しているのでタイミングが早いです。でもHackintoshで起動音の出るタイミングは、電源を入れて、BIOSのスプラッシュ画面が出て、OpenCoreのメニュー選択画面になったところです。電源投入から少し待たされます。ここまで来て、制御がようやくOpenCoreに引き渡されるので、仕方がないところです。

設定手順

音声ファイルを用意する

メニューGUI化の時にアイコンファイルを入手したのと同様に、以下から音声ファイルを手に入れます。

このうち、OCEFIAudio_VoiceOver_Boot.wavが起動音のファイルです。これをOC/Resources/Audioの中に入れておきます。

ドライバーを用意する

AudioDxe.efiをOC/Driversの中に入れておきます。AudioDxe.efiはOpenCoreの配布ファイルに含まれています。

config.plistを設定する

config.plistをProperTreeで開いて、設定作業を行います。まずはSnapshot機能でAudioDxe.efiを登録しておきます。次に以下の設定を行います。

  • NVRAM -> Add -> 7C436110-AB2A-4BBB-A880-FE41995C9F82 -> SystemAudioVolume を0x46にする。10進数では70です。
  • UEFI -> Audio -> AudioSupportをTrueにする
  • UEFI -> Audio -> MinimumVolumeを50にする
  • UEFI -> Audio -> PlayChimeをTrueにする
  • UEFI -> Audio -> VolumeAmplifierを143にする

数字のところはボリュームの設定なので適当で良いようです。ただ、適切な範囲や大小関係の制約はあるようです。

ここまではガイドの例に合わせて設定するだけなので簡単です。問題は、ハードウェアごとに調整しなければならない3個のパラメータです。UEFI -> AudioのAudioDevice、AudioCodec、AudioOutです。

AudioDeviceを設定する

PciRoot(0x0)/Pci(0x1f,0x3)に設定しました。オーディオチップに割り当てられたPCIeのパスを指定します。すでにconfig.plistのDevicePropertiesで、マザーボード搭載コーデックのレイアウト IDが指定してあれば、そこのPciRoot以下の数値です。下の例ならPciRoot(0x0)/Pci(0x1f,0x3)です。

<key>DeviceProperties</key>
<dict>
    <key>Add</key>
    <dict>
        <key>PciRoot(0x0)/Pci(0x1f,0x3)</key>
        <dict>
            <key>layout-id</key>
            <data>AQAAAA==</data>
        </dict>

HackintoolのPCIeボタンからAudio deviceを探して調べることもできます。

またgfxutilというツールを使っても良いです。これを起動すると出てくるHDEFの行に、チップのPCIeパスが書いてあります。

% ./gfxutil | grep HDEF
00:1f.3 8086:a348 /PCI0@0/HDEF@1F,3 = PciRoot(0x0)/Pci(0x1F,0x3)

AudioCodecを設定する

0に設定しました。オーディオチップのアドレスIOHDACodecAddressを設定します。これはioregコマンドやIORegistoryExplorerなどで調べることができます。ガイドに従って、以下のようにioregコマンドをタイプしたところ、

% ioreg -rxn IOHDACodecDevice | grep IOHDACodecAddress
  |   "IOHDACodecAddress" = 0x0
  |   "IOHDACodecAddress" = 0x2

上のように、0番と2番の二つの選択肢がありました。ここでアドレスが1個しか出てこなければ、迷うことなくその数値(たぶん0です)をAudioCodecに書いておけば良いです。ちなみに0番と2番が出てきたマザーボードはASUS ROG MAXIMUS XI HERO Z390です。一方で、ASUS ROG STRIX Z490-Gのマシンでは、IOHDACodecAddressは一個(0番)だけでした。

今回は2個の候補が出てきてしまったので、このどちらかを指定します。どちらかが、マザーボードに搭載されているコーデックです。ちなみにこのマザーボードのコーデックはRealtek ALC1220です。いろいろ調べる方法はあるようですが、ここでは以下のようにしました。まずは、grepの条件を緩めて、前後の情報を表示しました。

% ioreg -rxn IOHDACodecDevice | grep IOHDACodec
+-o IOHDACodecDevice@1F,3,0  <class IOHDACodecDevice, id 0x10000059d, registered, matched, active, busy 0 (1024 ms), retain 27>
  |   "IOHDACodecVendorID" = 0x10ec1220
  |   "IOHDACodecRevisionID" = 0x100101
  |   "IOHDACodecAddress" = 0x0
  +-o IOHDACodecDriver  <class IOHDACodecDriver, id 0x1000005a5, !registered, !matched, active, busy 0 (1022 ms), retain 25>
    +-o IOHDACodecFunction@1F,3,0,1  <class IOHDACodecFunction, id 0x1000005a7, registered, matched, active, busy 0 (1022 ms), retain 27>
+-o IOHDACodecDevice@1F,3,2  <class IOHDACodecDevice, id 0x10000059e, registered, matched, active, busy 0 (138 ms), retain 27>
  |   "IOHDACodecVendorID" = 0xffffffff8086280b
  |   "IOHDACodecRevisionID" = 0x100000
  |   "IOHDACodecAddress" = 0x2
  +-o IOHDACodecDriver  <class IOHDACodecDriver, id 0x1000005a6, !registered, !matched, active, busy 0 (135 ms), retain 25>
    +-o IOHDACodecFunction@1F,3,2,1  <class IOHDACodecFunction, id 0x1000005a8, registered, matched, active, busy 0 (135 ms), retain 25>

これを見ると、下のIOHDACodecAddressが2番のもののVendorIDに8086という数値が見えます。これはインテル社のものです。一方で、0番には、VendorIDに10ecという数値が見えます。Vendor IDは世界的に決められている番号なので「vendor id 10ec」でGoogle検索すると、メーカの名前が分かります。これは、Realtek Semiconductor Co., Ltd.のIDだそうです。

ということで、これがRealtekのチップらしいので、AudioCodecには0番を指定すれば良いようでした。

AudioOutを設定する

0に設定しました。こちらは苦労しました。この番号で、オーディオピンの番号を指定するようです。バックパネルにアナログ5本、SPDIFが1本、さらにはマザーボード上にケースのヘッドフォン端子に接続するオーディオ用ヘッダピンもあります。これのいずれかを番号で指定するようです。0番から順番に試すしかないようです。手元のマシンで0番を試したところ、それがバックパネルのスピーカ出力でした。

まとめ

OpenCoreで起動音を出せるように設定しました。ほとんどの作業は、バニラガイドに書いてある通りで簡単ですが、AudioDevice、AudioCodec、AudioOutの設定は、環境に合わせて変更する必要があります。特にAudioOutは手探りでした。起動音は、最後まで鳴る時もありますが、どういうわけか中途で音が出なくなることもあります。起動音がなると、さらに本物のMacっぽくなって良いのですが、ちょっと煩いかもしれません。しばらく楽しむけど、常用はしないと思います。

2件のコメント

  1. ども、Boot macOSさん、お疲れさまです。。。
    OPENCOREの選択画面をグラフィカルにするからのスピンアウト記事ありがとうございます。w

    >HackintoolのSoundのGカラムの数字がこれに相当するとのことでした。
    Gカラム数字というか最近は私がぼけGさんになってきてます!実際に私も内部スピーカたるAudioOut:0で動いたんですけど、事後処理でHacintoolを見たもんですから、あぁ順番(オーダー)的に並んでるんでこれじゃねぇか?と誤判断で投稿してたみたいですね。。。忘れっぽいのに加えぼけGさんになりつつあって困ります。w

    X230でHacinTookみたらGカラムの順番(オーダー)も崩壊してて、わけかかな状態でしたぁ。。。
    たぶん、起動後のPin-configurationは、AudioDxe.efi読み込んだ時と必ずしも合致する値としてReferできないかもですね?AudioDxe.efiがDeviceProperyを見にいってれば、まぁそうなんでしょうけど、EFI Shellからで、なんかチェックするようなコマンドでも自前でこしらえないと、分かんないのかもですねぇ。

    私んとこの零号機Haswellは、カタリナさんから、Wakeして3秒で即KPの持病が発病してましたから、AppleALC.kextで対策された結果、蟹さんオーディオとIntel HDMI Audioのぶら下がり方がちゃうのかもしれません。(たしかHDMIオーディオと蟹さんオーディオが一緒に存在しているとWakeでKPするちゅう問題でHDMIオーディオを無理やり失踪させると問題ないとかいう感じでしたから、このあたりが分離されてぶら下がり方の違いがあんのかなと思ったりしてますね。)

    AudioOutの事前にチェック方法がいまのところわかんないんので、LineOutとかに接続してる人は、0から順に一個づつ+1で見つけるしかないみたいですぇ。。。AudioDxe.efiがDevicePropertyを見ていないとすれば、CodecIDのデフォルトのPinconfigなのかなぁ。。。
    ソースコードを読まないとだめっぽい感じ濃厚ですねぇ。。。

    あと、ResourceフォルダーにOCEFIAudio_VoiceOver_Boot.wav以外のAudioファイルを一通り入れてると、Misc>PickerAudioAssistをチェックオ〜ンして起動すると、2フレーズ喋ることを観測しましたぁ。
    Jarvisみたくお姉さん風な声で、”うぇるかむとぅおぉーぷんこぉー”というのと、Pickerから選択して起動中に、”ろーでぃんぐ・とぅりぃー・まぇっくおーえす”って喋る芸ができますねぇ。、微妙にカッチョよくなります。。。w
    ちょうしこいて、日本語で喋らせたいと思って、英語で喋るから日本語もOK牧場のはずなんですけど、Localeの設定はどこじゃい?また、NVRAM か?それともconfig.plstに書くのは不明。。。今のところNo Ideaですねぇ。。。

    さらに、Big Surでは、オーディオ関連でリマスタがかかったとの記事読んだので、このじゃーん音もリマスタかかってるんじゃねぇ?と思って、OCEFIAudio_VoiceOver_Boot.wavを発掘して引っ張り出してやろう作戦を実行したら、撃沈されてます。。。
    どっかのResourceフォルダーにあるんじゃろぉ?と思ってVoiceOverとか/S/L/CoreSystemとかを探しまわってもない!ですねぇ。。。

    一応、ヘッダーからはこの辺にいるらしいこと書いてありますけど、ProbootをDiskutil mount Probootしても、居ないし、BridgeOS関連のパーッケージかリソースフォルダー?なのか一体どこから発掘してよいのやら不明で頓挫。。。
    https://github.com/acidanthera/OpenCorePkg/blob/master/Include/Apple/Protocol/AppleVoiceOver.h
    These files can be found either on BridgeOS volume:
    /System/Library/PrivateFrameworks/BridgeAccessibilitySupport.framework/AXEFIAudio_[ru]_[VoiceOverOn].aiff
    Here language code (ru) can be both full (ru_RU) and short (ru).
    For unlocalised files language code can be missing entirely, e.g. AXEFIAudio_Beep.aiff.
    Or in /Volumes/Preboot/…/System/Library/Caches/com.apple.corestorage/EFILoginLocalizations/sound.efires
    For preboot the file format is sound_SCREFIAudio.VoiceOverOn.
    Files marked with * are only present on BridgeOS.

    無駄に、この機能は楽しめるというかツボあって面白かったです。w

    1. AudioOutの追加情報ありがとうございます。選択肢は多いし、起動の一瞬しか確認できないしで、探すのは面倒ですね。0番が一番一般的なスピーカー出力なのは、なんとなく納得なので、とりあえずはそれを試しましょうというように書き直しておきました。

返信を残す

メールアドレスが公開されることはありません。