OpenCoreでMacの起動音が出るようにしました。起動画面をGUI化した際にインストールしたリソースファイルに起動音のファイルも入っていました。これとAudioDxe.efiを用意し、config.plistに幾つかの設定をすることで、起動音が鳴りました。
今回は、こちらの記事の続きです。
OpenCoreのデフォルトブートメニューはシンプルすぎるので、Cloverのようにアイコンで選択するよう設定しました。0.5.7以降でこの機能が使えるようです。OpenCore GUI前の記事で、ASUSマザーボードマシンのブートローダーをCloverからOpenCoreに移行しました。そのコメントで、OpenCoreでもアイコンによる起動選択ができるようになっていることを教えていただきましたので、試しました。以下での設定が終了していることが前提です。OpenCoreの起動画面をGUI化する方法に関しては、以下のページに使い方の説明があります。これに沿って... OpenCoreの選択画面をグラフィカルにする - Boot macOS |
少し前のMacでは起動音が出ましたが、煩わしいので消している人も多かったです。でも、最近のMacでは復活するという噂もあります。そうなると、起動音があっても良いのかなと思い、OpenCoreで試してみることにしました。今回も以下のガイドに従っています。
Table of Contents
制限
起動音は、macOSが起動する前に鳴らすので、macOSのドライバーは使えません。コミュニティの皆さんが頑張って作ってくれたドライバーで音を出します。なのでマザーボード上の音源チップからのみ音が出せます。つまり、以下の制限があります。
- USBオーディオからは起動音を出せません、
- GPUオーディオからは出せる場合もありますしダメな場合もあります。
実際のMacは電源を入れると即座に音が出ます。ファームウェアが音を出しているのでタイミングが早いです。でもHackintoshで起動音の出るタイミングは、電源を入れて、BIOSのスプラッシュ画面が出て、OpenCoreのメニュー選択画面になったところです。電源投入から少し待たされます。ここまで来て、制御がようやくOpenCoreに引き渡されるので、仕方がないところです。
設定手順
音声ファイルを用意する
メニューGUI化の時にアイコンファイルを入手したのと同様に、以下から音声ファイルを手に入れます。
Contribute to acidanthera/OcBinaryData development by creating an account on GitHub. GitHub - acidanthera/OcBinaryData - GitHub |
このうち、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っぽくなって良いのですが、ちょっと煩いかもしれません。しばらく楽しむけど、常用はしないと思います。