プロジェクト

全般

プロフィール

リファクタ #373

完了

機能 #342: [Phase 2] リアルタイム音声エンジン(ferrhythm-audio)

ferrhythm-audio: WASAPI 出力バックエンドの follow-up(COM uninit・RT診断ログ)

リファクタ #373: ferrhythm-audio: WASAPI 出力バックエンドの follow-up(COM uninit・RT診断ログ)

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

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

100%

予定工数:

説明

目的

#354(WASAPI 出力バックエンド)のレビューで洗い出した、非ブロッカーの技術的負債(#341 スパイク踏襲の既知事項)を解消する。いずれも crates/ferrhythm-audio/src/wasapi.rs#[cfg(windows)])のホストネイティブコード。

スコープ

  1. COM uninitialize 未呼び出し: レンダスレッドが CoInitializeEx した後、スレッド終了時に CoUninitialize を呼んでいない。出力の start/stop を繰り返す(デバイス切替等)と毎回新スレッドが COM 初期化したままになる。スレッド終了パスで CoUninitialize を呼ぶ。
  2. RT ループ内の診断 eprintln!: ドリフト検出時の eprintln!(約 1 秒境界かつドリフト検出時のみ発火)は現状 RT スレッド上で syscall/ロックを起こす。頂点コミット(スパイク)踏襲だが、本番では RT パス外(例: ドリフト量をロックフリーに記録し非 RT スレッドで収集、またはカウンタのみ)へ退避するか検討。

補足

  • #354 本体の機能・テストに影響なし(非ブロッカー、ホスト検証での品質向上)。優先度低め。
  • 検証は cargo check/clippy --target x86_64-pc-windows-gnu + Windows ホストでの連続再生・デバイス切替。

担当

Codex 委譲(source-only)、ホスト検証はユーザー。

関連: #354


関連するチケット 1 (0件未完了1件完了)

関連している Ferrhythm - 機能 #354: WASAPI/ASIO デバイス出力バックエンド完了いづ さん2026/06/21

操作

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

  • 関連している 機能 #354: WASAPI/ASIO デバイス出力バックエンド を追加

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

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

実装に着手しました。

  • ブランチ: feature/373-wasapi-com-rt-followup
  • 対応方針: COM を RAII ガード(Drop で CoUninitialize)でスレッド終了時に確実に解放し、RT ループ内のドリフト検出 eprintln! をロックフリーな atomic 記録(DriftStats/非 RT 収集用 drift_snapshot())へ退避する。

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

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

対応が完了しました。

概要

#354(WASAPI 出力バックエンド)レビューで洗い出した非ブロッカーの技術的負債2点(COM uninit 未呼び出し、RT ループ内診断 eprintln!)を解消。

変更点

  • COM ライフタイム: DropCoUninitialize を呼ぶ ComApartment RAII ガードを導入。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.rsdevice.rslib.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 失敗)はループ終了直前の最終診断のためスコープ外として据え置き。

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