操作
リファクタ #373
完了機能 #342: [Phase 2] リアルタイム音声エンジン(ferrhythm-audio)
ferrhythm-audio: WASAPI 出力バックエンドの follow-up(COM uninit・RT診断ログ)
リファクタ #373:
ferrhythm-audio: WASAPI 出力バックエンドの follow-up(COM uninit・RT診断ログ)
説明
目的¶
#354(WASAPI 出力バックエンド)のレビューで洗い出した、非ブロッカーの技術的負債(#341 スパイク踏襲の既知事項)を解消する。いずれも crates/ferrhythm-audio/src/wasapi.rs(#[cfg(windows)])のホストネイティブコード。
スコープ¶
-
COM uninitialize 未呼び出し: レンダスレッドが
CoInitializeExした後、スレッド終了時にCoUninitializeを呼んでいない。出力の start/stop を繰り返す(デバイス切替等)と毎回新スレッドが COM 初期化したままになる。スレッド終了パスでCoUninitializeを呼ぶ。 -
RT ループ内の診断
eprintln!: ドリフト検出時のeprintln!(約 1 秒境界かつドリフト検出時のみ発火)は現状 RT スレッド上で syscall/ロックを起こす。頂点コミット(スパイク)踏襲だが、本番では RT パス外(例: ドリフト量をロックフリーに記録し非 RT スレッドで収集、またはカウンタのみ)へ退避するか検討。
補足¶
- #354 本体の機能・テストに影響なし(非ブロッカー、ホスト検証での品質向上)。優先度低め。
- 検証は
cargo check/clippy --target x86_64-pc-windows-gnu+ Windows ホストでの連続再生・デバイス切替。
担当¶
Codex 委譲(source-only)、ホスト検証はユーザー。
関連: #354
エージェント ちゃん さんが14日前に更新
- 関連している 機能 #354: WASAPI/ASIO デバイス出力バックエンド を追加
エージェント ちゃん さんが14日前に更新
- ステータス を 未着手 から 実装中 に変更
- 進捗率 を 0 から 10 に変更
実装に着手しました。
- ブランチ:
feature/373-wasapi-com-rt-followup - 対応方針: COM を RAII ガード(Drop で
CoUninitialize)でスレッド終了時に確実に解放し、RT ループ内のドリフト検出eprintln!をロックフリーな atomic 記録(DriftStats/非 RT 収集用drift_snapshot())へ退避する。
エージェント ちゃん さんが14日前に更新
- ステータス を 実装中 から 完了 に変更
- 進捗率 を 10 から 100 に変更
対応が完了しました。
概要¶
#354(WASAPI 出力バックエンド)レビューで洗い出した非ブロッカーの技術的負債2点(COM uninit 未呼び出し、RT ループ内診断 eprintln!)を解消。
変更点¶
-
COM ライフタイム:
DropでCoUninitializeを呼ぶComApartmentRAII ガードを導入。CoInitializeEx成功時のみ生成(COM 規約遵守)し、render_thread先頭で宣言して全 COM オブジェクト解放後にドロップされる順序を保証。start/stop 繰り返し(デバイス切替)での COM リークを解消。 -
RT パス診断ログ: ドリフト検出時の
eprintln!をロックフリーなDriftStats(relaxed atomic store のみ)へ退避し、WasapiOutput::drift_snapshot()で非 RT スレッドから収集可能に。RT パスからログ I/O を完全排除。 - 変更ファイル:
crates/ferrhythm-audio/src/wasapi.rs、device.rs、lib.rsの 3 件。
テスト¶
-
cargo test -p ferrhythm-audio: 成功(33件、新規 drift 2件含む) -
cargo clippy --all-targets/cargo fmt --all -- --check: 成功 -
cargo check/cargo clippy --target x86_64-pc-windows-gnu(wasapi.rs 含む): 成功
関連 MR¶
- !16 (feature/373-wasapi-com-rt-followup → develop)
残課題 / 補足¶
- Windows ホストでの実機検証が未実施(コンテナ実行不可): ① start/stop 連続・デバイス切替時に COM リークがないこと、② 実機レンダーループで
drift_snapshot()にドリフトが記録されること。 - エラー即 break パスの
eprintln!(GetCurrentPadding/write 失敗)はループ終了直前の最終診断のためスコープ外として据え置き。
操作