プロジェクト

全般

プロフィール

機能 #353

完了

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

リアルタイムミキサ本体(mock sink でテスト)

機能 #353: リアルタイムミキサ本体(mock sink でテスト)

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

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

100%

予定工数:

説明

目的

コールバック内で 確保・ロック・syscall を行わない RT ミキサ本体を実装。

スコープ

  • キー音を f32 PCM へ事前デコード(symphonia/rubato)しメモリ常駐
  • crossbeam ロックフリーキューでゲーム→音声スレッド連携
  • サンプル単位スケジューリング(sample-accurate)
  • デバイス出力は trait 境界(sink)で抽象化し、mock sink でミキシング出力を検証

検証(コンテナ)

mock sink への出力サンプルを TDD。cargo test グリーン

担当

Codex 委譲(source-only)

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

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

実装に着手しました。

  • ブランチ: feature/353-rt-mixer
  • 対応方針: ferrhythm-audio にコールバック内で無確保・無ロック・無 syscall の RT ミキサ本体を実装。サンプル単位スケジューリング・crossbeam ロックフリーキュー・Sink trait 抽象化を入れ、mock sink で TDD 検証する。WASAPI/ASIO 実体は #354 に分離。

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

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

対応が完了しました。

概要

Phase 2 音声エンジンのコアとして、コールバック内で無確保・無ロック・無 syscall のプラットフォーム非依存・コンテナ検証可能な RT ミキサ本体を ferrhythm-audio に実装。サンプル単位スケジューリング・crossbeam ロックフリーキュー・Sink trait 抽象化を備え、mock sink で TDD 検証。WASAPI/ASIO 実体出力は #354 に分離。

変更点

  • DecodedSound(f32 PCM メモリ常駐キー音)と symphonia デコード(線形リサンプル、rubato は TODO で先送り)
  • Mixer: ボイス毎の絶対開始フレームによるサンプル単位スケジューリング、加算 + クランプ、ポリフォニー上限(最古追い出し)。ボイス領域をプリアロケートしレンダリング経路で再確保しない
  • AudioEngine::render(ロックフリーキュー drain → ミックス)、CommandProducer + 共有 RenderClockSink trait + MockSink
  • BMS の高同時発音要件に合わせ EngineConfig デフォルトを 384 voices / 128 frames に設定
  • 依存追加: crossbeam-queuesymphonia
  • 変更ファイル: crates/ferrhythm-audio/src/{lib,sound,decode,clock,command,mixer,sink,engine}.rscrates/ferrhythm-audio/Cargo.toml、ルート Cargo.toml ほか計 11 件

テスト

  • cargo test -p ferrhythm-audio : 成功(25 passed / 0 failed)
  • cargo clippy -p ferrhythm-audio --all-targets / cargo fmt --all -- --check : 成功(警告・差分なし)
  • cargo check --workspace : 成功

関連 MR

  • !13 (feature/353-rt-mixer → develop)

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