← macOS knowledge

仮想オーディオデバイスの実装方式
— AudioServerPlugIn と AudioDriverKit

調査日: 2026-07-08(2026-07-09 に AudioServerPlugIn / AudioDriverKit の対比を主旨として再調査)

この知見の出どころ

本メモは、macOS 向けの仮想オーディオデバイス(ループバックケーブル)Cable+1(cable_plus_one)の開発を通じて判明したことを、Apple 公式ドキュメント・WWDC・BlackHole 等の一次情報とあわせて整理したものです。実装方式の判断記録(GDR)やセットアップ手順は GitHub を参照:
github.com/yoshinag/cable_plus_one

0. 要点(TL;DR)

1. 2 つの実装方式

AudioServerPlugIn(HAL プラグイン)

Core Audio の HAL(Hardware Abstraction Layer)にロードされる userspace プラグイン。実体は coreaudiod プロセス内で動くバンドルで、/Library/Audio/Plug-Ins/HAL に配置する。HAL がデバイス列挙やタイミング等の面倒を引き受けてくれる。

AudioDriverKit(DriverKit 拡張 / dext)

DriverKit ベースのシステム拡張(dext, C++)。macOS Big Sur 以降、HAL は「DriverKit Extension の上に構築されたオーディオサーバープラグイン」をサポートするようになり、AudioDriverKit はオーディオサーバープラグインと DriverKit 拡張を 1 つのパッケージに統合できるのが売り。userspace で動く点は AudioServerPlugIn と同じだが、coreaudiod 内部ではなく独立したプロセスとして systemextensionsd に管理される。

2. 対比表

観点 AudioServerPlugIn(HAL) AudioDriverKit(dext)
登場時期 OS X 10.9 頃〜(現行の標準) macOS Big Sur(11)〜
実行形態 coreaudiod にロードされる in-process プラグイン 独立した DriverKit システム拡張プロセス
実行空間 userspace userspace
配置場所 /Library/Audio/Plug-Ins/HAL アプリ同梱のシステム拡張として登録
インストール時の再起動 不要(coreaudiod 再起動のみ) 拡張の承認フローが必要
entitlement 不要 DriverKit 系 entitlement が必須
仮想デバイス ○ Apple 公認 ✕ 配布用 entitlement が下りない
実ハードウェア △ 可能だが今後は DriverKit 推奨 ◎ 本来の用途
代表例 BlackHole / Soundflower / Loopback / BackgroundMusic USB / PCI オーディオIF ベンダのドライバ

3. なぜ仮想デバイスに AudioDriverKit が使えないのか

Apple は WWDC21「Create audio drivers with DriverKit」(session 10190) で、サンプルの仮想オーディオドライバについて次のように明言している。

“…creates a virtual audio driver that is not associated with a hardware device, and so entitlements will not be granted for that kind of use case. …if a virtual audio driver or device is all that is needed, the audio server plug-in driver model should continue to be used.”

— WWDC21 Session 10190 / Apple Developer Forums thread 682035

4. entitlement と配布の制約(DriverKit 側)

そもそも entitlement とは

entitlement は「このコードに特定の権限を与える」ことを宣言する署名済みの鍵と値のセット。単に .entitlements ファイルに書けば効くのではなく、Apple が発行する provisioning profile に埋め込まれ、コード署名で封緘されて初めて有効になる。つまり強い権限ほど「自己申告」では通らず、Apple の承認(プロファイル発行)が必要になる。DriverKit はカーネル相当の権限を userspace に開放する仕組みなので、この承認モデルが厳格に効いてくる。

AudioDriverKit(dext)に必要な entitlement

DriverKit 拡張は、役割の異なる 3 種類の entitlement を組み合わせて成立する。

種類 キー 役割
基本 com.apple.developer.driverkit すべての DriverKit 拡張に必要な土台の entitlement。
transport com.apple.developer.driverkit.transport.usb 実ハードウェアを掌握するための鍵。デバイスの接続方式(USB / PCI …)ごとに異なる。仮想デバイスには掴むべきハードウェアが無く、ここが根本的に噛み合わない。
family com.apple.developer.driverkit.family.audio OS にオーディオサービスとして機能を公開するための entitlement(macOS 12.1 で追加。旧 allow-any-userclient-access を置換)。

加えて、dext を同梱してインストールするホストアプリ側には com.apple.developer.system-extension.install が必要になる。

development と distribution で扱いが違う

対比: AudioServerPlugIn は entitlement 不要

AudioServerPlugIn は coreaudiod にロードされる HAL プラグインであり、システム拡張ではないため 上記の DriverKit / system-extension entitlement を一切必要としない。署名して公証した .driver バンドルを /Library/Audio/Plug-Ins/HAL に置くだけで配布できる。「entitlement の承認フローに一切乗らない」ことが、仮想オーディオデバイスで AudioServerPlugIn が唯一の現実解になっている最大の理由である。

5. 配布形態ごとの実現性

配布形態 AudioDriverKit AudioServerPlugIn
個人利用(SIP 無効 + developer mode) ✅ 可能 ✅ 可能
個人利用(SIP 有効 + paid アカウント development 署名) ✅ 可能(実機確認済み) ✅ 可能(entitlement 不要)
OSS ソース公開 ✅ 制約なし ✅ 制約なし
ビルド済みバイナリの一般配布 ❌ 不可(entitlement が下りない) ✅ 可能(Developer ID + 公証のみ)
利用者が clone してすぐ使える ❌(各自 paid アカウント or SIP 無効化が必要) ✅(公証済みリリースを置けば)

6. Cable+1 プロジェクトでの選択と含意

まとめ

仮想オーディオデバイスなら AudioServerPlugIn が正解(再起動不要・entitlement 不要・公証だけで配布可)。AudioDriverKit は実ハードウェア向けで、仮想デバイスには配布用 entitlement が付与されない。DriverKit で仮想デバイスを作れても、行き着けるのは「自分の環境で動かす」までである。

7. 出典