プロジェクト

全般

プロフィール

機能 #372

完了

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

ferrhythm-audio: ASIO 出力バックエンド実装(asio-sys)

機能 #372: ferrhythm-audio: ASIO 出力バックエンド実装(asio-sys)

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

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

100%

予定工数:

説明

目的

#354 で用意した出力バックエンドの trait seam(OutputBackend / RunningOutput)に ASIO 実装を追加し、対応ハードで ASIO 出力を選択可能にする。

背景

#354 で WASAPI 排他・イベント駆動出力(共有フォールバック付き)を実装済み。その際、ユーザー確定方針により ASIO は trait seam + feature ゲートの stub のみcrates/ferrhythm-audio/src/asio.rsAsio::startAudioError::Unsupported { backend: "ASIO" } を返す)を用意し、実装本体は本チケットへ分離した。asio-sys は独自 Steinberg ASIO SDK と実ドライバが必要で、Linux DevContainer では cargo check も通らない(WASAPI は x86_64-pc-windows-gnu ターゲットで型検査可能だが ASIO は不可)。

スコープ

  • crates/ferrhythm-audio/Cargo.tomlasio feature に asio-sys[target.'cfg(windows)'.dependencies], optional = true)を紐付け。
  • asio.rsAsioOutputBackend として実装: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 を提供した親作業)


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

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

操作

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

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

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

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

実装に着手しました。

  • ブランチ: feature/372-asio-output
  • 対応方針: #354OutputBackend/RunningOutput seam に asio-sys ベースの ASIO 出力を実装。ドライバ列挙→選択、バッファサイズ交渉、ASIO の bufferSwitch コールバック(ドライバ専用 RT スレッド)上で AudioEngine::render を駆動し、非インターリーブ+ネイティブ型(Int16/24/32LSB・Float32LSB)へ変換出力する。#[cfg(all(windows, feature = "asio"))] で隔離し、feature オフ(既定・CI)では asio-sys を一切ビルドしない。f32→ネイティブ変換とバッファ選択は純粋ヘルパに切り出してコンテナで単体テスト、実機発音/レイテンシは Windows ホスト検証。

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

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

対応が完了しました。

概要

#354OutputBackend/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)

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