fix: make cpal/ALSA optional — headless Linux builds work without libasound

- cpal is now behind an 'audio' feature flag (off by default)
- --live mode requires --features audio at build time
- --send-tone and --record work on headless servers without audio libs
- Linux build script no longer installs libasound2-dev

Build for headless: cargo build --release
Build with mic/speakers: cargo build --release --features audio

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Siavash Sameni
2026-03-27 16:24:44 +04:00
parent 708fb268bc
commit df80ad5343
4 changed files with 18 additions and 4 deletions

View File

@@ -18,7 +18,11 @@ tracing-subscriber = { workspace = true }
async-trait = { workspace = true } async-trait = { workspace = true }
bytes = { workspace = true } bytes = { workspace = true }
anyhow = "1" anyhow = "1"
cpal = "0.15" cpal = { version = "0.15", optional = true }
[features]
default = []
audio = ["cpal"]
[[bin]] [[bin]]
name = "wzp-client" name = "wzp-client"

View File

@@ -134,7 +134,14 @@ async fn main() -> anyhow::Result<()> {
let transport = Arc::new(wzp_transport::QuinnTransport::new(connection)); let transport = Arc::new(wzp_transport::QuinnTransport::new(connection));
if cli.live { if cli.live {
run_live(transport).await #[cfg(feature = "audio")]
{
return run_live(transport).await;
}
#[cfg(not(feature = "audio"))]
{
anyhow::bail!("--live requires the 'audio' feature (build with: cargo build --features audio)");
}
} else if cli.send_tone_secs.is_some() || cli.record_file.is_some() { } else if cli.send_tone_secs.is_some() || cli.record_file.is_some() {
run_file_mode(transport, cli.send_tone_secs, cli.record_file).await run_file_mode(transport, cli.send_tone_secs, cli.record_file).await
} else { } else {
@@ -326,6 +333,7 @@ async fn run_file_mode(
} }
/// Live mode: capture from mic, encode, send; receive, decode, play. /// Live mode: capture from mic, encode, send; receive, decode, play.
#[cfg(feature = "audio")]
async fn run_live(transport: Arc<wzp_transport::QuinnTransport>) -> anyhow::Result<()> { async fn run_live(transport: Arc<wzp_transport::QuinnTransport>) -> anyhow::Result<()> {
use wzp_client::audio_io::{AudioCapture, AudioPlayback}; use wzp_client::audio_io::{AudioCapture, AudioPlayback};

View File

@@ -6,11 +6,13 @@
//! //!
//! Targets: Android (JNI), Windows desktop, macOS/Linux (testing) //! Targets: Android (JNI), Windows desktop, macOS/Linux (testing)
#[cfg(feature = "audio")]
pub mod audio_io; pub mod audio_io;
pub mod bench; pub mod bench;
pub mod call; pub mod call;
pub mod handshake; pub mod handshake;
#[cfg(feature = "audio")]
pub use audio_io::{AudioCapture, AudioPlayback}; pub use audio_io::{AudioCapture, AudioPlayback};
pub use call::{CallConfig, CallDecoder, CallEncoder}; pub use call::{CallConfig, CallDecoder, CallEncoder};
pub use handshake::perform_handshake; pub use handshake::perform_handshake;

View File

@@ -11,7 +11,7 @@ set -euo pipefail
SSH_KEY_NAME="wz" SSH_KEY_NAME="wz"
SSH_KEY_PATH="/Users/manwe/CascadeProjects/wzp" SSH_KEY_PATH="/Users/manwe/CascadeProjects/wzp"
SERVER_NAME="wzp-builder-$(date +%s)" SERVER_NAME="wzp-builder-$(date +%s)"
SERVER_TYPE="cx23" SERVER_TYPE="cx33"
IMAGE="ubuntu-24.04" IMAGE="ubuntu-24.04"
REMOTE_USER="root" REMOTE_USER="root"
OUTPUT_DIR="target/linux-x86_64" OUTPUT_DIR="target/linux-x86_64"
@@ -56,7 +56,7 @@ done
# 3. Install build dependencies # 3. Install build dependencies
echo "[3/7] Installing build dependencies..." echo "[3/7] Installing build dependencies..."
$SSH "apt-get update -qq && apt-get install -y -qq build-essential cmake pkg-config libasound2-dev curl git > /dev/null 2>&1" $SSH "apt-get update -qq && apt-get install -y -qq build-essential cmake pkg-config curl git > /dev/null 2>&1"
# 4. Install Rust # 4. Install Rust
echo "[4/7] Installing Rust..." echo "[4/7] Installing Rust..."