Skip to content

Commit

Permalink
Bump linux deps, simplify examples, remove nix dep (RustAudio#712)
Browse files Browse the repository at this point in the history
* bump linux dependencies, dev-dependencies, anyhow, hound, ringbuf

* update to clap v4 and simplify examples with clap_derive

* have libjack installed when running with --all-features

* don't force the patch version for libc

* allow room for version resolution with nix

* nix dependency not used anymore, remove it
  • Loading branch information
mbodmer authored Oct 23, 2022
1 parent 4b49fbd commit 97fc4ed
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 191 deletions.
2 changes: 2 additions & 0 deletions .github/workflows/cpal.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ jobs:
run: sudo apt update
- name: Install alsa
run: sudo apt-get install libasound2-dev
- name: Install libjack
run: sudo apt-get install libjack-jackd2-dev libjack-jackd2-0
- name: Install stable
uses: actions-rs/toolchain@v1
with:
Expand Down
17 changes: 8 additions & 9 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,14 @@ edition = "2021"
asio = ["asio-sys", "num-traits"] # Only available on Windows. See README for setup instructions.

[dependencies]
thiserror = "1.0.2"
dasp_sample = "0.11.0"
thiserror = "1.0"
dasp_sample = "0.11"

[dev-dependencies]
anyhow = "1.0.12"
hound = "3.4"
ringbuf = "0.2"
clap = { version = "3.1", default-features = false, features = ["std"] }
anyhow = "1.0"
hound = "3.5"
ringbuf = "0.3"
clap = { version = "4.0", features = ["derive"] }

[target.'cfg(target_os = "android")'.dev-dependencies]
ndk-glue = "0.7"
Expand All @@ -34,10 +34,9 @@ once_cell = "1.12"

[target.'cfg(any(target_os = "linux", target_os = "dragonfly", target_os = "freebsd", target_os = "netbsd"))'.dependencies]
alsa = "0.6"
nix = "0.25"
libc = "0.2.65"
libc = "0.2"
parking_lot = "0.12"
jack = { version = "0.9", optional = true }
jack = { version = "0.10", optional = true }

[target.'cfg(any(target_os = "macos", target_os = "ios"))'.dependencies]
core-foundation-sys = "0.8.2" # For linking to CoreFoundation.framework and handling device name `CFString`s.
Expand Down
67 changes: 13 additions & 54 deletions examples/beep.rs
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
extern crate anyhow;
extern crate clap;
extern crate cpal;

use clap::arg;
use anyhow;
use clap::Parser;
use cpal::{
traits::{DeviceTrait, HostTrait, StreamTrait},
SizedSample,
FromSample, Sample, SizedSample,
};
use cpal::{FromSample, Sample};

#[derive(Debug)]
#[derive(Parser, Debug)]
#[command(version, about = "CPAL beep example", long_about = None)]
struct Opt {
/// The audio device to use
#[arg(short, long, default_value_t = String::from("default"))]
device: String,

/// Use the JACK host
#[cfg(all(
any(
target_os = "linux",
Expand All @@ -20,56 +22,13 @@ struct Opt {
),
feature = "jack"
))]
#[arg(short, long)]
#[allow(dead_code)]
jack: bool,

device: String,
}

impl Opt {
fn from_args() -> Self {
let app = clap::Command::new("beep").arg(arg!([DEVICE] "The audio device to use"));
#[cfg(all(
any(
target_os = "linux",
target_os = "dragonfly",
target_os = "freebsd",
target_os = "netbsd"
),
feature = "jack"
))]
let app = app.arg(arg!(-j --jack "Use the JACK host"));
let matches = app.get_matches();
let device = matches.value_of("DEVICE").unwrap_or("default").to_string();

#[cfg(all(
any(
target_os = "linux",
target_os = "dragonfly",
target_os = "freebsd",
target_os = "netbsd"
),
feature = "jack"
))]
return Opt {
jack: matches.is_present("jack"),
device,
};

#[cfg(any(
not(any(
target_os = "linux",
target_os = "dragonfly",
target_os = "freebsd",
target_os = "netbsd"
)),
not(feature = "jack")
))]
Opt { device }
}
}

fn main() -> anyhow::Result<()> {
let opt = Opt::from_args();
let opt = Opt::parse();

// Conditionally compile with jack if the feature is specified.
#[cfg(all(
Expand Down
96 changes: 21 additions & 75 deletions examples/feedback.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,26 @@
//! Uses a delay of `LATENCY_MS` milliseconds in case the default input and output streams are not
//! precisely synchronised.
extern crate anyhow;
extern crate clap;
extern crate cpal;
extern crate ringbuf;

use anyhow::Context;
use clap::arg;
use clap::Parser;
use cpal::traits::{DeviceTrait, HostTrait, StreamTrait};
use ringbuf::RingBuffer;
use ringbuf::HeapRb;

#[derive(Debug)]
#[derive(Parser, Debug)]
#[command(version, about = "CPAL feedback example", long_about = None)]
struct Opt {
/// The input audio device to use
#[arg(short, long, value_name = "IN", default_value_t = String::from("default"))]
input_device: String,

/// The output audio device to use
#[arg(short, long, value_name = "OUT", default_value_t = String::from("default"))]
output_device: String,

/// Specify the delay between input and output
#[arg(short, long, value_name = "DELAY_MS", default_value_t = 150.0)]
latency: f32,

/// Use the JACK host
#[cfg(all(
any(
target_os = "linux",
Expand All @@ -27,75 +35,13 @@ struct Opt {
),
feature = "jack"
))]
#[arg(short, long)]
#[allow(dead_code)]
jack: bool,

latency: f32,
input_device: String,
output_device: String,
}

impl Opt {
fn from_args() -> anyhow::Result<Self> {
let app = clap::Command::new("feedback")
.arg(arg!(
-l --latency [DELAY_MS] "Specify the delay between input and output [default: 150]"))
.arg(arg!([IN] "The input audio device to use"))
.arg(arg!([OUT] "The output audio device to use"));

#[cfg(all(
any(
target_os = "linux",
target_os = "dragonfly",
target_os = "freebsd",
target_os = "netbsd"
),
feature = "jack"
))]
let app = app.arg(arg!(-j --jack "Use the JACK host"));
let matches = app.get_matches();
let latency: f32 = matches
.value_of("latency")
.unwrap_or("150")
.parse()
.context("parsing latency option")?;
let input_device = matches.value_of("IN").unwrap_or("default").to_string();
let output_device = matches.value_of("OUT").unwrap_or("default").to_string();

#[cfg(all(
any(
target_os = "linux",
target_os = "dragonfly",
target_os = "freebsd",
target_os = "netbsd"
),
feature = "jack"
))]
return Ok(Opt {
jack: matches.is_present("jack"),
latency,
input_device,
output_device,
});

#[cfg(any(
not(any(
target_os = "linux",
target_os = "dragonfly",
target_os = "freebsd",
target_os = "netbsd"
)),
not(feature = "jack")
))]
Ok(Opt {
latency,
input_device,
output_device,
})
}
}

fn main() -> anyhow::Result<()> {
let opt = Opt::from_args()?;
let opt = Opt::parse();

// Conditionally compile with jack if the feature is specified.
#[cfg(all(
Expand Down Expand Up @@ -159,7 +105,7 @@ fn main() -> anyhow::Result<()> {
let latency_samples = latency_frames as usize * config.channels as usize;

// The buffer to share samples
let ring = RingBuffer::new(latency_samples * 2);
let ring = HeapRb::<f32>::new(latency_samples * 2);
let (mut producer, mut consumer) = ring.split();

// Fill the samples with 0.0 equal to the length of the delay.
Expand Down
64 changes: 11 additions & 53 deletions examples/record_wav.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,21 @@
//!
//! The input data is recorded to "$CARGO_MANIFEST_DIR/recorded.wav".
extern crate anyhow;
extern crate clap;
extern crate cpal;
extern crate hound;

use clap::arg;
use clap::Parser;
use cpal::traits::{DeviceTrait, HostTrait, StreamTrait};
use cpal::{FromSample, Sample};
use std::fs::File;
use std::io::BufWriter;
use std::sync::{Arc, Mutex};

#[derive(Debug)]
#[derive(Parser, Debug)]
#[command(version, about = "CPAL record_wav example", long_about = None)]
struct Opt {
/// The audio device to use
#[arg(short, long, default_value_t = String::from("default"))]
device: String,

/// Use the JACK host
#[cfg(all(
any(
target_os = "linux",
Expand All @@ -25,56 +26,13 @@ struct Opt {
),
feature = "jack"
))]
#[arg(short, long)]
#[allow(dead_code)]
jack: bool,

device: String,
}

impl Opt {
fn from_args() -> Self {
let app = clap::Command::new("record_wav").arg(arg!([DEVICE] "The audio device to use"));
#[cfg(all(
any(
target_os = "linux",
target_os = "dragonfly",
target_os = "freebsd",
target_os = "netbsd"
),
feature = "jack"
))]
let app = app.arg(arg!(-j --jack "Use the JACK host"));
let matches = app.get_matches();
let device = matches.value_of("DEVICE").unwrap_or("default").to_string();

#[cfg(all(
any(
target_os = "linux",
target_os = "dragonfly",
target_os = "freebsd",
target_os = "netbsd"
),
feature = "jack"
))]
return Opt {
jack: matches.is_present("jack"),
device,
};

#[cfg(any(
not(any(
target_os = "linux",
target_os = "dragonfly",
target_os = "freebsd",
target_os = "netbsd"
)),
not(feature = "jack")
))]
Opt { device }
}
}

fn main() -> Result<(), anyhow::Error> {
let opt = Opt::from_args();
let opt = Opt::parse();

// Conditionally compile with jack if the feature is specified.
#[cfg(all(
Expand Down

0 comments on commit 97fc4ed

Please sign in to comment.