機能 #372
完了機能 #342: [Phase 2] リアルタイム音声エンジン(ferrhythm-audio)
ferrhythm-audio: ASIO 出力バックエンド実装(asio-sys)
説明
目的¶
#354 で用意した出力バックエンドの trait seam(OutputBackend / RunningOutput)に ASIO 実装を追加し、対応ハードで ASIO 出力を選択可能にする。
背景¶
#354 で WASAPI 排他・イベント駆動出力(共有フォールバック付き)を実装済み。その際、ユーザー確定方針により ASIO は trait seam + feature ゲートの stub のみ(crates/ferrhythm-audio/src/asio.rs、Asio::start は AudioError::Unsupported { backend: "ASIO" } を返す)を用意し、実装本体は本チケットへ分離した。asio-sys は独自 Steinberg ASIO SDK と実ドライバが必要で、Linux DevContainer では cargo check も通らない(WASAPI は x86_64-pc-windows-gnu ターゲットで型検査可能だが ASIO は不可)。
スコープ¶
-
crates/ferrhythm-audio/Cargo.tomlのasiofeature にasio-sys([target.'cfg(windows)'.dependencies],optional = true)を紐付け。 -
asio.rsのAsioをOutputBackendとして実装:ASIO ドライバ列挙/選択、バッファサイズ交渉、専用スレッドでAudioEngine::renderを駆動(WASAPI と同じ RT 規約=事前確保・ロックフリー・syscall 回避)、DeviceFormat報告。 -
#[cfg(all(windows, feature = "asio"))]背後に隔離し、feature オフ(既定・CI)ではasio-sysを一切ビルドしない。
検証¶
- feature オフ時に Linux/Windows 双方で従来通りビルドできること(コンテナ可)。
- ASIO 実機での発音・レイテンシ・連続性は Windows ホスト+ASIO 対応 IF で検証(コンテナ不可)。
担当¶
Codex 委譲(source-only)、ホスト検証はユーザー。
関連: #354(trait seam + stub を提供した親作業)
エージェント ちゃん さんが14日前に更新
- 関連している 機能 #354: WASAPI/ASIO デバイス出力バックエンド を追加
エージェント ちゃん さんが14日前に更新
- ステータス を 未着手 から 実装中 に変更
- 進捗率 を 0 から 10 に変更
実装に着手しました。
- ブランチ:
feature/372-asio-output - 対応方針: #354 の
OutputBackend/RunningOutputseam にasio-sysベースの ASIO 出力を実装。ドライバ列挙→選択、バッファサイズ交渉、ASIO のbufferSwitchコールバック(ドライバ専用 RT スレッド)上でAudioEngine::renderを駆動し、非インターリーブ+ネイティブ型(Int16/24/32LSB・Float32LSB)へ変換出力する。#[cfg(all(windows, feature = "asio"))]で隔離し、feature オフ(既定・CI)ではasio-sysを一切ビルドしない。f32→ネイティブ変換とバッファ選択は純粋ヘルパに切り出してコンテナで単体テスト、実機発音/レイテンシは Windows ホスト検証。
エージェント ちゃん さんが14日前に更新
- ステータス を 実装中 から 完了 に変更
- 進捗率 を 10 から 100 に変更
対応が完了しました。
概要¶
#354 の OutputBackend/RunningOutput trait seam に asio-sys ベースの ASIO 出力を実装し、従来のスタブを置換。#[cfg(all(windows, feature = "asio"))] で隔離し、既定/CI ビルドには asio-sys を一切載せない。Windows ホスト(Creative SB/SBX AE series ASIO)で実機発音を確認済み。
変更点¶
- ASIO ドライバ列挙→選択(
Asio { driver: Option<String> }、未指定は先頭)、サンプルレート/バッファサイズ交渉。 - ASIO の
bufferSwitchコールバック(ドライバ専用 RT スレッド)上でAudioEngine::renderを駆動(WASAPI と同じ RT 規約:事前確保・ロックフリー・syscall 回避)。インターリーブ f32 → ネイティブ型(Int16/24/32LSB・Float32LSB, LE)へ脱インターリーブ変換。 - バッファ長・
DeviceFormatはドライバが実確保したAsioStream.buffer_sizeから導出(RT コールバックの領域外スライスを防止)。 - f32→ネイティブ変換/バッファ選択を純粋ヘルパに分離しコンテナで単体テスト。Int32 は f64 中間演算で 2³¹ 丸め誤差を回避。
- 非 Windows フォールバックで
Asio型を全プラットフォーム解決可能に(Unsupported返却)。 -
examples/asio_play.rs(新規):Windows ホスト用スモークハーネス(--driver引数・CPAL_ASIO_DIR/LIBCLANG_PATH/MSVC ターゲットの手順を明記)。 - 変更ファイル:
crates/ferrhythm-audio/src/asio.rs/crates/ferrhythm-audio/Cargo.toml/crates/ferrhythm-audio/examples/asio_play.rs(新規) ほかCargo.lock。
テスト¶
-
cargo test(既定・feature off): 成功(31 passed) -
cargo test --features asio(Linux スタブ+純粋ヘルパ): 成功(38 passed) -
cargo clippy --all-targets(既定/--features asio)/cargo fmt --all -- --check: 成功(警告なし) - 実機動作確認: Windows ホストで
--driver "Creative SB/SBX AE series ASIO"にて発音確認済み。
関連 MR¶
- !15 (feature/372-asio-output → develop)