tap/src/main.rs

66 lines
1.8 KiB
Rust

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),
}
}