Skip to main content

flexaudio_os_windows/
lib.rs

1//! flexaudio-os-windows — Windows バックエンド: WASAPI ループバック / プロセス
2//! ループバック(windows-rs 0.54, Win11+)。
3//!
4//! 2 つの [`CaptureBackend`](flexaudio_core::backend::CaptureBackend) を提供する:
5//!
6//! - [`WasapiSystemBackend`] — render endpoint の古典 loopback
7//!   (`AUDCLNT_STREAMFLAGS_LOOPBACK`)でシステム音声出力(そのエンドポイントへ流れている
8//!   ミックス)を録る。`device_id` で出力エンドポイントを選べる(`None` で既定)。Linux の
9//!   [`PwSystemBackend`](../flexaudio_os_linux) 相当。出力エンドポイントの一覧は
10//!   [`list_output_devices`] で取れる。
11//! - [`WasapiProcessBackend`] — `ActivateAudioInterfaceAsync` + プロセスループバック
12//!   (`AUDIOCLIENT_ACTIVATION_PARAMS`)で特定 PID(そのプロセスツリー)の音声を録る。
13//!   `exclude_self` で「対象ツリーを除く全システム音」へ反転する。
14//!
15//! # `!Send` 回避
16//!
17//! WASAPI の `IAudioClient` 等の COM インターフェイスは `!Send` だが、コア契約
18//! [`CaptureBackend`] は `Send` を要求する。COM の初期化からキャプチャ、破棄までを専用
19//! スレッド 1 本の上で完結させ、バックエンド構造体が持つのは `Send` なものだけ(停止フラグ
20//! [`AtomicBool`] / [`JoinHandle`] / キャッシュ済みフォーマット)にする。COM インター
21//! フェイスはスレッド境界を跨がない。cpal / PipeWire backend と同じ作り。
22//!
23//! # 非 Windows
24//!
25//! `#![cfg(target_os = "windows")]` で非 Windows では空コンパイルになり、`windows`
26//! 依存も `Cargo.toml` の `target.'cfg(...windows)'` セクションでしか引かれない。
27
28#![cfg(target_os = "windows")]
29#![warn(missing_docs)]
30
31mod common;
32mod process;
33mod system;
34
35pub use process::WasapiProcessBackend;
36pub use system::{list_output_devices, WasapiSystemBackend};