[package] name = "wzp-client" version.workspace = true edition.workspace = true license.workspace = true rust-version.workspace = true description = "WarzonePhone client library — for Android (JNI) and Windows desktop" [dependencies] wzp-proto = { workspace = true } wzp-codec = { workspace = true } wzp-fec = { workspace = true } wzp-crypto = { workspace = true } wzp-transport = { workspace = true } tokio = { workspace = true } tracing = { workspace = true } tracing-subscriber = { workspace = true } async-trait = { workspace = true } bytes = { workspace = true } anyhow = "1" serde = { workspace = true } serde_json = "1" chrono = "0.4" rustls = { version = "0.23", default-features = false, features = ["ring", "std"] } cpal = { version = "0.15", optional = true } libc = "0.2" # coreaudio-rs is Apple-framework-only; gate it to macOS so enabling # the `vpio` feature from a non-macOS target builds cleanly instead of # pulling in a crate that can only link against Apple frameworks. [target.'cfg(target_os = "macos")'.dependencies] coreaudio-rs = { version = "0.11", optional = true } # Windows-only: direct WASAPI bindings for the `windows-aec` feature. # `windows` is Microsoft's official Rust COM bindings crate. We pull in # only the audio + COM subfeatures we need — the crate is organized as # a massive optional-feature tree, so enabling just these keeps compile # times reasonable (~5s for these features vs ~60s for the full crate). [target.'cfg(target_os = "windows")'.dependencies] windows = { version = "0.58", optional = true, features = [ "Win32_Foundation", "Win32_Media_Audio", "Win32_Security", "Win32_System_Com", "Win32_System_Com_StructuredStorage", "Win32_System_Threading", "Win32_System_Variant", ] } # Linux-only: WebRTC AEC3 (Audio Processing Module) bindings for the # `linux-aec` feature. The `bundled` sub-feature statically compiles the # vendored PulseAudio webrtc-audio-processing C++ sources via meson+ninja # at cargo build time, avoiding Debian Bookworm's stale system # libwebrtc-audio-processing-dev 0.3 package (which predates AEC3). # # We pull from git (not crates.io) because the crates.io tarball of # webrtc-audio-processing-sys 2.0.3 does NOT include the vendored C++ # submodule contents ("Directory does not contain a valid build tree"), # and cargo clones git deps with submodules auto-initialized since ~1.27, # so the git path gives us a complete source tree that bundled-mode can # build. Pinned to tag v2.0.3 for reproducibility. [target.'cfg(target_os = "linux")'.dependencies] webrtc-audio-processing = { git = "https://github.com/tonarino/webrtc-audio-processing", tag = "v2.0.3", optional = true, features = ["bundled"] } [features] default = [] audio = ["cpal"] # vpio enables coreaudio-rs but that dep is itself gated to macOS above, # so enabling this feature on Windows/Linux is a no-op (the audio_vpio # module is also #[cfg(target_os = "macos")] in lib.rs). vpio = ["dep:coreaudio-rs"] # windows-aec enables a direct WASAPI capture backend that opens the # microphone under AudioCategory_Communications, turning on Windows's # OS-level communications audio processing (AEC + noise suppression + # AGC). The `windows` dep is itself target-gated to Windows above, so # enabling this feature on non-Windows targets is a no-op (the # audio_wasapi module is also #[cfg(target_os = "windows")] in lib.rs). windows-aec = ["dep:windows"] # linux-aec enables a CPAL + WebRTC AEC3 capture/playback backend that # runs the WebRTC Audio Processing Module (same algo as Chrome / Zoom / # Teams) in-process, using the playback PCM as the reference signal for # echo cancellation. The webrtc-audio-processing dep is target-gated to # Linux above, so enabling this feature on non-Linux targets is a no-op # (the audio_linux_aec module is also #[cfg(target_os = "linux")] in # lib.rs). linux-aec = ["dep:webrtc-audio-processing"] [[bin]] name = "wzp-client" path = "src/cli.rs" [[bin]] name = "wzp-bench" path = "src/bench_cli.rs" [dev-dependencies] tokio = { workspace = true } wzp-relay = { path = "../wzp-relay" } wzp-crypto = { workspace = true } wzp-proto = { workspace = true } async-trait = { workspace = true }