First step of the Windows x86_64 desktop build: stop pulling
coreaudio-rs into the Windows dependency graph so the project can at
least run `cargo check --target x86_64-pc-windows-msvc`. Software AEC
is already disabled in engine.rs so there's nothing else to stub — the
macOS-specific VPIO path is skipped via #[cfg(target_os = "macos")] on
both sides and Windows falls through to the plain CPAL
AudioCapture/AudioPlayback branch that already existed.
crates/wzp-client/Cargo.toml
- coreaudio-rs optional dep moved under [target.'cfg(target_os = "macos")']
- `vpio` feature now uses `dep:coreaudio-rs` syntax and the gated dep
- Enabling `vpio` on Windows/Linux is a no-op at resolution time
crates/wzp-client/src/lib.rs
- `pub mod audio_vpio` is now #[cfg(all(feature = "vpio", target_os = "macos"))]
- Previously `vpio` alone was enough to try to compile the Core Audio
bindings, which would fail on non-Apple targets the moment the
feature flag was flipped on
desktop/src-tauri/Cargo.toml
- [target.'cfg(not(target_os = "android"))'] removed — was leaking
vpio into Windows/Linux via the catch-all.
- macOS: wzp-client with features = ["audio", "vpio"]
- Windows: wzp-client with features = ["audio"]
- Linux: wzp-client with features = ["audio"]
- Android: wzp-client with default-features = false (unchanged)
- Dropped the unused direct coreaudio-rs = "0.11" dep on macOS —
wzp-desktop's own sources never call Core Audio directly.
Verified via `cargo tree --target x86_64-pc-windows-msvc -p wzp-desktop`
that the Windows target now resolves wzp-client with cpal but without
coreaudio-rs. macOS target still resolves with coreaudio (direct via
vpio feature and transitively via cpal). macOS `cargo check` still
builds cleanly.
Cross-compile from macOS hit a cargo-xwin + llvm-lib setup issue in
ring's build.rs, so the actual `cargo check --target
x86_64-pc-windows-msvc` did not complete locally. Build verification
belongs on the user's Windows x86_64 host where MSVC is present
natively.
See tasks #23 (this one), #24 (Voice Capture DSP / WASAPI Communications
for OS-level AEC on Windows), and #25 (aarch64-pc-windows-msvc support).
94 lines
3.9 KiB
TOML
94 lines
3.9 KiB
TOML
[package]
|
|
name = "wzp-desktop"
|
|
version = "0.1.0"
|
|
edition = "2024"
|
|
description = "WarzonePhone Desktop — encrypted VoIP client"
|
|
default-run = "wzp-desktop"
|
|
|
|
# Library target — required for Tauri mobile (Android/iOS link the app as a cdylib)
|
|
# and also used by the desktop binary below.
|
|
#
|
|
# `staticlib` was DROPPED from crate-type because rust-lang/rust#104707
|
|
# documents that having staticlib alongside cdylib leaks non-exported
|
|
# symbols from staticlibs into the cdylib. Bionic's private `__init_tcb`
|
|
# / `pthread_create` symbols end up bound LOCALLY inside our .so instead
|
|
# of resolved dynamically against libc.so at dlopen time — which crashes
|
|
# at launch as soon as tao tries to std::thread::spawn() from the JNI
|
|
# onCreate callback. The legacy wzp-android crate uses ["cdylib", "rlib"]
|
|
# and runs fine on the same phone with the same NDK + Rust toolchain.
|
|
#
|
|
# iOS Tauri builds that actually need staticlib can re-add it behind a
|
|
# target cfg if we ever ship on iOS.
|
|
[lib]
|
|
name = "wzp_desktop_lib"
|
|
crate-type = ["cdylib", "rlib"]
|
|
|
|
[[bin]]
|
|
name = "wzp-desktop"
|
|
path = "src/main.rs"
|
|
|
|
[build-dependencies]
|
|
tauri-build = { version = "2", features = [] }
|
|
# cc is no longer needed — all C++ moved to crates/wzp-native (built with
|
|
# cargo-ndk and loaded via libloading at runtime). wzp-desktop's .so on
|
|
# Android is now pure Rust.
|
|
|
|
[dependencies]
|
|
tauri = { version = "2", features = [] }
|
|
tauri-plugin-shell = "2"
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
tokio = { version = "1", features = ["full"] }
|
|
tracing = "0.1"
|
|
tracing-subscriber = "0.3"
|
|
anyhow = "1"
|
|
rustls = { version = "0.23", default-features = false, features = ["ring", "std"] }
|
|
|
|
# WarzonePhone crates — protocol layer is platform-independent
|
|
wzp-proto = { path = "../../crates/wzp-proto" }
|
|
wzp-codec = { path = "../../crates/wzp-codec" }
|
|
wzp-fec = { path = "../../crates/wzp-fec" }
|
|
wzp-crypto = { path = "../../crates/wzp-crypto" }
|
|
wzp-transport = { path = "../../crates/wzp-transport" }
|
|
|
|
# wzp-client pulls in CPAL on every desktop target and, additionally on
|
|
# macOS, VoiceProcessingIO (coreaudio-rs behind the "vpio" feature). The
|
|
# vpio feature MUST NOT be enabled on Windows / Linux because coreaudio-rs
|
|
# is Apple-framework-only and will fail to build. Task #24 will add a
|
|
# matching Windows Voice Capture DSP path behind its own feature; until
|
|
# then, Windows desktops use plain CPAL with AEC disabled.
|
|
|
|
# macOS: CPAL + VoiceProcessingIO (hardware AEC via Core Audio).
|
|
[target.'cfg(target_os = "macos")'.dependencies]
|
|
wzp-client = { path = "../../crates/wzp-client", features = ["audio", "vpio"] }
|
|
|
|
# Windows: CPAL only. Windows AEC (WASAPI Communications / MF Voice
|
|
# Capture DSP) lands in a follow-up task. See task #24.
|
|
[target.'cfg(target_os = "windows")'.dependencies]
|
|
wzp-client = { path = "../../crates/wzp-client", features = ["audio"] }
|
|
|
|
# Linux: same as Windows for now — plain CPAL.
|
|
[target.'cfg(target_os = "linux")'.dependencies]
|
|
wzp-client = { path = "../../crates/wzp-client", features = ["audio"] }
|
|
|
|
# Android: no CPAL, no vpio — audio goes through the standalone wzp-native
|
|
# cdylib that we dlopen via libloading at runtime. See the wzp_native
|
|
# module in src/.
|
|
[target.'cfg(target_os = "android")'.dependencies]
|
|
wzp-client = { path = "../../crates/wzp-client", default-features = false }
|
|
# libloading: runtime dlopen of libwzp_native.so — the standalone cdylib
|
|
# crate that owns all C++ (Oboe bridge). Keeps wzp-desktop's .so free of
|
|
# any C/C++ static archives that would otherwise leak bionic's internal
|
|
# pthread_create into our cdylib and trigger the __init_tcb crash.
|
|
libloading = "0.8"
|
|
# jni + ndk-context: called from android_audio.rs to invoke
|
|
# AudioManager.setSpeakerphoneOn on the JVM side at runtime, so the
|
|
# Oboe playout stream (opened with Usage::VoiceCommunication) can route
|
|
# between earpiece and loud speaker without restarting.
|
|
jni = "0.21"
|
|
ndk-context = "0.1"
|
|
|
|
[features]
|
|
default = ["custom-protocol"]
|
|
custom-protocol = ["tauri/custom-protocol"]
|