diff --git a/crates/punktfunk-host/Cargo.toml b/crates/punktfunk-host/Cargo.toml index 74f7dd4b..3ce257c7 100644 --- a/crates/punktfunk-host/Cargo.toml +++ b/crates/punktfunk-host/Cargo.toml @@ -53,6 +53,12 @@ utoipa-scalar = { version = "0.3", features = ["axum"] } tower = { version = "0.5", features = ["util"] } http-body-util = "0.1" +# Opus stereo encode for the host->client audio plane. The `opus` crate vendors libopus via +# `audiopus_sys` (cmake-built from source — no system lib, no vcpkg), so it builds on Windows MSVC +# too (needs CMake + NASM, both on the box). Both platforms that have an audio-capture backend. +[target.'cfg(any(target_os = "linux", target_os = "windows"))'.dependencies] +opus = "0.3" + [target.'cfg(target_os = "linux")'.dependencies] # `screencast` gates the ScreenCast portal module; `remote_desktop` adds the RemoteDesktop # portal we use for libei input on KWin/GNOME; `tokio` is the default runtime. @@ -81,8 +87,6 @@ wayland-backend = "0.3" serde_json = "1" # Builds/validates the xkb keymap uploaded to the virtual keyboard + tracks modifier state. xkbcommon = "0.8" -# Opus encode for the GameStream audio stream (links system libopus). -opus = "0.3" # The safe `opus` crate is stereo-only; surround (5.1/7.1) needs the libopus *multistream* # encoder (`opus_multistream_encoder_*`). `audiopus_sys` is the sys layer `opus` already # vendors (same libopus link), so this adds bindings, not a second copy of the library. diff --git a/crates/punktfunk-host/src/m3.rs b/crates/punktfunk-host/src/m3.rs index 48021b87..0ca94453 100644 --- a/crates/punktfunk-host/src/m3.rs +++ b/crates/punktfunk-host/src/m3.rs @@ -1340,7 +1340,7 @@ fn input_thread( /// The audio thread: desktop capture → Opus (48 kHz stereo, 5 ms, CBR — same tuning as the /// GameStream path) → `AUDIO_MAGIC` datagrams. QUIC already encrypts; no extra layer. /// The capturer comes from (and returns to) the persistent slot — see [`AudioCapSlot`]. -#[cfg(target_os = "linux")] +#[cfg(any(target_os = "linux", target_os = "windows"))] fn audio_thread(conn: quinn::Connection, stop: Arc, audio_cap: AudioCapSlot) { use crate::audio::{CHANNELS, SAMPLE_RATE}; const FRAME_MS: usize = 5; @@ -1415,11 +1415,9 @@ fn audio_thread(conn: quinn::Connection, stop: Arc, audio_cap: Audio /// Stub — punktfunk/1 audio needs Linux (PipeWire capture + libopus); non-Linux dev builds /// run sessions without it, same as when the capturer fails to open. -#[cfg(not(target_os = "linux"))] +#[cfg(not(any(target_os = "linux", target_os = "windows")))] fn audio_thread(_conn: quinn::Connection, _stop: Arc, _audio_cap: AudioCapSlot) { - tracing::warn!( - "punktfunk/1 audio requires Linux (PipeWire + libopus) — session continues without it" - ); + tracing::warn!("punktfunk/1 audio requires Linux or Windows — session continues without it"); } fn synthetic_stream(