プロジェクト

全般

プロフィール

調査 #341

完了

[Phase 1b] 音声レイテンシ実測スパイク(WASAPI 排他+自前ミキサ)

調査 #341: [Phase 1b] 音声レイテンシ実測スパイク(WASAPI 排他+自前ミキサ)

エージェント ちゃん さんが15日前に追加. 14日前に更新.

ステータス:
完了
優先度:
通常
担当者:
対象バージョン:
開始日:
2026/06/21
期日:
進捗率:

100%

予定工数:

説明

目的

最大リスクの音声往復遅延を早期に潰す。最小の WASAPI 排他・イベント駆動出力+素朴ミキサ+symphonia デコードで「入力→発音」往復遅延を実測し、目標 ms を満たすか確認する。

スコープ

  • 使い捨てスパイク(製品コードに混ぜない/別 bin or example として隔離)
  • アーキ核「オーディオサンプルクロック=唯一の時刻源」が成立するかを検証

検証(Windows ホスト)

ユーザーがホストで実測。「入力→発音」往復遅延が目標 ms 以内かを確認

依存

Phase 0(Phase 1 と並走可)

エージェント ちゃん さんが15日前に更新 操作 #1

  • ステータス未着手 から 実装中 に変更
  • 進捗率0 から 10 に変更

実装に着手しました。

  • ブランチ: feature/341-audio-latency-spike
  • 対応方針: WASAPI 排他・イベント駆動出力+自前ロックフリーミキサ+symphonia デコードの使い捨てスパイクを workspace 外の独立クレート spikes/audio-latency/ として隔離。サンプルクロックを唯一の時刻源とし、キーボード Raw Input+専コン/ゲームパッド(hidapi/gilrs)入力からの「入力→発音」遅延を実測値として報告(閾値判定なし)。実測はユーザーが Windows ホストで実施。

エージェント ちゃん さんが14日前に更新 操作 #2

調査結果 : WASAPI排他+自前ミキサで音声往復遅延は一桁ms、アーキ核が実機で成立

使い捨てスパイク(spikes/audio-latency/)を Windows ホストで実測。

デバイス(WASAPI 排他・イベント駆動 / 48000Hz・16bit・stereo)

  • 最小周期 2.667ms(128フレーム)= GetStreamLatency 2.667ms(一桁ms下限)

入力→発音予約(ソフト側 / n=39)

  • mean 1.115ms / min 0.014ms / max 2.454ms(最大でも1バッファ周期 2.667ms 未満)
  • ばらつきはレンダー起床周期への量子化で、判定は入力QPCを直接使うため判定精度には非影響

サンプルクロック健全性

  • RenderClock と IAudioClock のドリフトログ 0件 → 「サンプルクロック=唯一の時刻源」成立

入力・デコード

  • キーボード(Raw Input)・ゲームパッド(gilrs) 両経路で発火
  • キー音は synth click + 実BMS WAV(symphonia)両方で発音

結論: ソフト→デバイス出力経路 ≈ 平均3.8ms/最悪5.1ms(アナログ尾・パッドHW遅延除く)。最大リスクの音声往復遅延を retire し、Phase 2(RTミキサ本実装)へ進行可。

未計測(任意): 鍵盤→耳の真の音響往復(電気ループバック/マイク実測)、専コン自体のUSB遅延。アーキ判断には不要。


実装・検証メモ

  • 配置: spikes/audio-latency/(独自 [workspace]・root workspace/CI から完全隔離・使い捨て)
  • コンテナ検証: 純DSPコア(clock/mixer/decode/report) cargo test 17/17・clippy/fmt 緑、cargo check --target x86_64-pc-windows-gnu エラー0(Windowsネイティブ FFI の型検査をコンテナで実施)
  • 実機検証: 排他モード許可後、上記の通り正常動作・サマリ取得

エージェント ちゃん さんが14日前に更新 操作 #3

  • ステータス実装中 から 完了 に変更
  • 進捗率10 から 100 に変更

対応が完了しました。

概要

最大リスクの「入力→発音」音声往復遅延を早期に検証する使い捨てスパイク(Phase 1b)。WASAPI 排他・イベント駆動出力+自前ロックフリーミキサ+symphonia デコードで実測し、アーキ核「オーディオサンプルクロック=唯一の時刻源」が実機で成立することを確認。

変更点

  • spikes/audio-latency/独立クレートを新設(独自 [workspace]・root workspace / CI から完全隔離・使い捨て)。
  • 純DSPコア(Linuxテスト可): clock/mixer/decode/report/command
  • Windows専用(ホスト検証): wasapi(排他イベント駆動初期化・float32/PCM16交渉・バッファアライメント再試行・サンプルクロック駆動レンダーループ・IAudioClock ドリフト照合)/ rawinput(Raw Input・Spaceエッジ/Esc終了)/ controller(gilrs ゲームパッド/専コン+optional hidapi)。
  • 変更ファイル: spikes/audio-latency/ 配下 13 件(Cargo.toml/.lock/README/.gitignore + src 9)。
  • 本スパイクは Phase 2(RTミキサ)の参照用に当面残置(削除は後日判断)。

テスト

  • cargo test(純モジュール, コンテナ) : 成功(17/17)
  • cargo clippy / cargo fmt --all -- --check : 成功(warning 0)
  • cargo check --target x86_64-pc-windows-gnu : 成功(エラー0)
  • 実機(Windowsホスト): 排他イベント駆動 48000Hz/16bit・最小周期 2.667ms・入力→予約 mean 1.115ms(n=39)・ドリフト0件・キーボード/パッド両発火・synth+実BMS WAV 発音を確認。

関連 MR

  • !12 (feature/341-audio-latency-spike → develop, マージ済)

他の形式にエクスポート: PDF Atom