mod audio_sink; mod audio_source; mod input_buffer; mod output_buffer; mod tap_packet; mod udp_connection; mod util; use crate::audio_sink::listen; use audiopus::SampleRate; use clap::{Parser, Subcommand}; use log::LevelFilter; use std::net::SocketAddr; pub const SAMPLE_RATE: SampleRate = SampleRate::Hz48000; pub const SAMPLE_RATE_RAW: usize = 48_000; pub const AUDIO_FRAME_RATE: usize = 50; pub const MONO_FRAME_SIZE: usize = SAMPLE_RATE_RAW / AUDIO_FRAME_RATE; pub const STEREO_FRAME_SIZE: usize = 2 * MONO_FRAME_SIZE; pub const CIRC_BUFFER_SIZE: usize = STEREO_FRAME_SIZE * 50; #[derive(Parser, Debug)] #[command(version, about = "Tap sounds from a audio device and send them over a UDP socket", long_about = None)] struct Opt { #[command(subcommand)] command: Tasks, } #[derive(Subcommand, Debug, Clone)] enum Tasks { /// Tap an Audio source to send over the network Tap { /// The audio device to use #[arg(short, long, default_value_t = String::from("default"))] device: String, /// Src UDP socket addr to send data from src: SocketAddr, /// UDP socket addr to connect to dest: SocketAddr, }, /// Listen to data from a tap Listen { /// The audio device to use #[arg(short, long, default_value_t = String::from("default"))] device: String, /// UDP addr to receive data on addr: SocketAddr, }, } fn main() -> Result<(), anyhow::Error> { env_logger::builder() .filter_level(LevelFilter::Info) .parse_default_env() .init(); let opt = Opt::parse(); let host = cpal::default_host(); match opt.command { Tasks::Tap { device, src, dest } => audio_source::tap(&device, src, dest, host), Tasks::Listen { device, addr } => listen(&device, addr, host), } }