BridgeDevs EN
Journal 開発記 · VoluBridge

Development Story

「音量調節できない」を、Macらしく解決したかった。

VoluBridge は、外部モニターやUSB DACを使うMac環境で、 音量キーが効かない不便さと、従来の仮想オーディオが抱える遅延への違和感から生まれました。

DDCの限界 FIFOの遅延 PLL同期

01

きっかけは、外部モニターの音量キーでした。

新しいMacに外部モニターを接続したとき、最初にぶつかったのは単純な問題でした。 HDMIやDisplayPortの出力では、macOSの音量キーが効かないことがあります。 仕事、動画、会議、通知音。どれもMacの操作としては自然に調整したいのに、 実際にはモニター側のOSDやDAC本体のノブに手を伸ばす必要がありました。

特につらいのは、音量の解像度です。モニターによっては「0」は無音、 「1」にした瞬間に大きすぎる。細かな音量調整ができないだけで、 日常の作業環境は思った以上に扱いづらくなります。

02

DDC制御では、届かない環境がありました。

最初に考える解決策は、モニター本体をDDCで制御することです。 ただしDDCは、モニター、ケーブル、ドック、接続経路の相性に左右されます。 ドック経由では効かない場合があり、そもそも音量段階が粗いモニターでは、 「Mac側で細かく調整したい」という根本的な不満が残ります。

そこでVoluBridgeは、モニター本体を外から操作するのではなく、 CoreAudioの音声経路に入り、macOS側の音量操作として外部出力を扱う方向へ進みました。

03

一般的な仮想オーディオには、隠れた遅延がありました。

CoreAudio側から扱うなら、仮想オーディオドライバという形になります。 しかし一般的なFIFO型の仮想オーディオでは、安定性を得るために音声をバッファへ溜めます。 Producerが書いた位置とRenderが読む位置の距離は、表面から見えにくい追加遅延になります。

VoluBridgeRTで重視したのは、この距離を曖昧な「在庫」として放置しないことでした。 位相差を見える値として扱い、必要なMarginに近づけて制御する。 低遅延は単にバッファを小さくすることではなく、ProducerとRenderの関係を制御することだと考えました。

04

発想の中心は、バッファではなく時計を合わせること。

VoluBridgeRTは、固定的に1ブロック待つ設計ではなく、 Snapで読み書き位置を目標距離へ合わせ、PLLで長時間のクロックドリフトに追従します。 ずれたら大きく貯め直すのではなく、時間軸の進み方を少しずつ合わせる設計です。

これにより、仮想経路を通しても固定的な追加遅延を常態化させず、 HDMIモニター、DisplayPort、USB DACのような外部出力を、 Macの操作体系へ自然に統合することを目指しています。

05

便利さだけでなく、状態が見える道具へ。

音量キーが効くだけなら、VoluBridgeは単なる便利ツールで終わっていたかもしれません。 しかしオーディオ経路は、音が出ない、途切れる、遅れるといった問題が起きたときに、 原因の切り分けが難しい領域です。

そのため、VUメーター、FFT、RT診断、Actual / Target / Underflowなどの表示を統合しました。 音がどこまで届いているか、内部の余裕がどれくらいあるかを見えるようにすることで、 日常利用でも、低遅延を追い込む運用でも、判断できる道具にしたかったからです。

06

VoluBridgeは、外部オーディオを特別扱いしないためのブリッジです。

目指しているのは、外部モニターやDACを使っていても、 内蔵スピーカーのように自然に音量を扱えることです。 いつものキーで調整でき、必要なら音を整えられ、問題が起きたら状態を確認できる。

VoluBridgeRT.driverが音声ブリッジの本体として動き、 VoluBridge.appはその設定と診断を担うコントローラーです。 見えないところで動くドライバと、必要なときに使うアプリ。 その組み合わせで、Macの外部オーディオを日常の操作へ戻していきます。

← Journalの記事一覧へ