use clap::Parser;
use auden::{buffer::*, play, plot, pool::*};
use std::path::PathBuf;
#[derive(Parser, Debug)]
struct Args {
#[arg(long)]
sample_dir: Option<PathBuf>,
#[arg(long)]
manifest: Option<PathBuf>,
#[arg(long)]
save: Option<PathBuf>,
#[arg(long)]
print: bool,
#[arg(long)]
plot: Option<PathBuf>,
#[arg(long)]
play: Option<PathBuf>,
}
pub fn main() {
env_logger::init();
let args = Args::parse();
let mut pool = SamplePool::default();
if let Some(manifest) = args.manifest {
let manifest = PoolManifest::from_file(manifest).unwrap();
pool = SamplePool::from_manifest(manifest).unwrap();
}
if let Some(dir) = args.sample_dir {
pool.add_samples(&dir).unwrap();
}
if let Some(ref save) = args.save {
pool.build_manifest().unwrap().save(save).unwrap();
}
if args.print {
log::info!("{:#?}", pool.build_manifest().unwrap());
}
if let Some(file) = args.plot {
let mut pool = SamplePool::default();
pool.add_sample(file).unwrap();
for (id, buf) in pool.samples() {
let id = format!("{id:?}");
match buf {
SharedAudioBuffer::Mono(b) => plot::mono_waveform(&id, b),
SharedAudioBuffer::Stereo(b) => plot::stereo_waveform(&id, b.l, b.r),
};
}
}
if let Some(file) = args.play {
let id = pool.add_sample(file).unwrap();
let config = cpal::StreamConfig {
channels: 2,
sample_rate: cpal::SampleRate(44100),
buffer_size: cpal::BufferSize::Fixed(1024),
};
play::Stream::launch_with_timeout(&config, std::time::Duration::from_secs(3), {
let mut i = 0;
move |output, channels| {
let sample = pool.sample(id).unwrap();
for frame in output.chunks_mut(channels) {
frame[0] = sample.left()[i];
frame[1] = sample.right()[i];
i += 1;
}
}
})
.unwrap();
}
}