Phospheneで構築するmacOS Tahoe向けネイティブ・ビデオ壁紙

PhospheneがAppleのプライベートフレームワークを活用し、macOSのシステム設定に直接統合される、シームレスで電力効率に優れたビデオ壁紙をどのように実現しているかを探ります。

長年、macOSユーザーはウィンドウをオーバーレイさせたり、デスクトップ環境をハックしたりするサードパーティ製アプリに頼ってビデオ壁紙を表示してきました。これらのソリューションはリソースを大量に消費し、バッテリーを消耗させ、ちらつきが発生しやすいという欠点がありました。そこで登場したのが、macOS Tahoe向けのオープンソースエンジン Phosphene です。これは、システムのネイティブな壁紙ピッカーに直接統合するという、根本的に異なるアプローチをとっています。

「ネイティブ」であることの利点

Phospheneは単なるオーバーレイアプリではありません。これは、Apple独自の「Aerial」スクリーンセーバーを支える技術と同じ、Appleのプライベートフレームワーク WallpaperExtensionKit の上に構築されています。このシステムレベルの拡張ポイントにフックすることで、Phospheneはカスタムビデオを システム設定 → 壁紙 の中に、ネイティブのオプションと並んで直接表示させることができます。

レンダリングはシステムの WallpaperAgent 内でプロセス外(out-of-process)で行われるため、メインのPhospheneアプリを終了しても壁紙は維持されます。また、OSレベルのロック画面、アイドル、スリープのライフサイクルを尊重するため、従来のオーバーレイアプリでは到底及ばないレベルの安定性を提供します。

内部構造:アーキテクチャとエンジニアリング

Phospheneは、そのワークロードを2つの異なるコンポーネントに分割しています。

  1. Phosphene.app (メニューバーUI): ライブラリ管理、メタデータ、およびトランスコーディングを処理します。VideoOptimizationService を使用して、ビデオの低解像度版や低FPS版を生成し、バッテリー残量が少ない場合や熱負荷が高い場合に、システムがより軽量なアセットに切り替えられるようにします。
  2. PhospheneExtension.appex (エンジン): これが実務を担う部分です。WallpaperAgent プロセス内で実行され、AVSampleBufferDisplayLayer を使用してフレームをレンダリングします。

「ギャップレス・ループ」問題の解決

Phospheneにおける最も印象的な技術的成果の一つは、ループへのアプローチです。標準的な AVPlayerLayer の実装では、ビデオの再開時にマイクロスタッター(微かなカクつき)や「フラッシュ」が発生することがよくあります。Phospheneは、デコードパイプラインを手動で駆動することでこれを回避しています。現在のループ用に AVAssetReader を維持しつつ、次をプリロードし、ループの境界を越えて単調増加するプレゼンテーションタイムスタンプ(PTS)オフセットを使用します。これにより、完全にシームレスでフレーム精度の高いループが実現します。

電力を考慮した再生

Phospheneは単にビデオを再生するだけでなく、システムの状態に基づいて管理します。その PlaybackPolicy は唯一の真実のソース(Single Source of Truth)として機能し、以下のような入力を集約します:

  • バッテリー駆動 vs AC電源
  • サーマル(熱)状態
  • ゲームモードのステータス
  • ウィンドウの遮蔽(デスクトップが完全に覆われている場合にレンダリングを一時停止)

このロジックにより、負荷の高い作業中に壁紙がパフォーマンスのボトルネックにならないようになっています。

プライベートフレームワークに関する注意点

Phospheneが dlopen を使用して WallpaperExtensionKit をロードし、Mirror ベースの実行時イントロスペクションに依存してXPC型と通信している点は重要です。これらはプライベートAPIであるため、プロジェクトは本質的にmacOS Tahoeの内部構造に結びついています。開発者は、Appleのプライベートエンコーダーが特定のクラス型を期待している場合にロック画面がグレーアウトするという一般的な問題を解決するために、WallpaperSnapshotXPC のスウィズル(swizzle)などの巧妙な回避策を実装しています。

はじめに

この仕組みに興味がある開発者の方は、ソースからビルドすることができます。このプロジェクトには Xcode 17以上と Swift 6 の厳密な並行性(strict concurrency)が必要です。

git clone https://github.com/kageroumado/phosphene.git
cd phosphene
open Phosphene.xcodeproj

ヘッドレスビルド(署名アイデンティティなしでのCIやローカルテストに便利)の場合は、以下を使用できます:

xcodebuild -project Phosphene.xcodeproj -scheme Phosphene -configuration Debug \
-destination 'generic/platform=macOS' \
CODE_SIGNING_ALLOWED=NO CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY='' build

Phospheneは、システムレベルの統合をリバースエンジニアリングする際の見本のようなプロジェクトです。デスクトップをカスタマイズするために使用するにせよ、macOSのプライベートフレームワークとのインターフェース方法を研究するにせよ、探索する価値のあるプロジェクトです。

ソース

kageroumado/phosphene: A video wallpaper engine for macOS Tahoe