66 lines
1.8 KiB
Rust
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),
|
|
}
|
|
}
|