listen-lib accepts device name

master
Bel LaPointe 2023-12-20 21:54:15 -05:00
parent f97f746ab9
commit e27a8f8f56
2 changed files with 66 additions and 9 deletions

View File

@ -3,14 +3,68 @@ use signal_hook::{iterator::Signals, consts::signal::SIGINT};
use std::thread; use std::thread;
pub fn main(callback: impl FnMut(Vec<f32>)) { pub fn main(callback: impl FnMut(Vec<f32>)) {
new_listener().listen(callback); new_listener(None).unwrap().listen(callback);
}
pub fn main_with(callback: impl FnMut(Vec<f32>), device_name: String) {
new_listener(Some(device_name)).unwrap().listen(callback);
}
pub fn devices() -> Vec<String> {
match _devices() {
Ok(devices) => devices.
iter().
map(|device| device.name()).
filter(|device_name| device_name.is_ok()).
map(|device_name| device_name.unwrap()).
collect(),
Err(_) => vec![],
}
}
fn _devices() -> Result<Vec<cpal::Device>, String> {
match cpal::default_host().devices() {
Ok(devices) => Ok(devices.collect()),
Err(msg) => Err(format!("failed to get devices: {}", msg)),
}
} }
struct Listener { struct Listener {
device_name: String,
} }
fn new_listener() -> Listener { fn new_listener(device_name: Option<String>) -> Result<Listener, String> {
Listener{} let device_name = match device_name {
Some(device_name) => {
let devices: Vec<_> = _devices()?.
iter().
map(|device| device.name()).
filter(|device_name| device_name.is_ok()).
map(|device_name| device_name.unwrap()).
filter(|a_device_name| *a_device_name == device_name).
collect();
match devices.first() {
Some(_) => Ok(device_name),
None => Err(format!("device like {} not found", device_name)),
}
},
None => {
let host = cpal::default_host();
match host.default_input_device() {
Some(device) => {
match device.name() {
Ok(device_name) => Ok(device_name),
Err(msg) => Err(format!("failed to get default input device name: {}", msg)),
}
},
None => Err(format!("failed to get any input device")),
}
},
};
match device_name {
Ok(device_name) => Ok(Listener{device_name: device_name}),
Err(msg) => Err(msg),
}
} }
impl Listener { impl Listener {
@ -18,16 +72,19 @@ impl Listener {
let (send, recv) = std::sync::mpsc::sync_channel(100); let (send, recv) = std::sync::mpsc::sync_channel(100);
thread::spawn(move || { self._listen(send); }); thread::spawn(move || { self._listen(send); });
loop { loop {
match recv.recv() { match recv.recv_timeout(std::time::Duration::new(1, 0)) {
Ok(msg) => cb(msg), Ok(msg) => cb(msg),
Err(_) => return, Err(_) => break,
}; };
} }
} }
fn _listen(self, send: std::sync::mpsc::SyncSender<Vec<f32>>) { fn _listen(self, send: std::sync::mpsc::SyncSender<Vec<f32>>) {
let host = cpal::default_host(); let devices = _devices().unwrap();
let device = host.default_input_device().unwrap(); let devices = devices.iter().
filter(|device| device.name().unwrap() == self.device_name).
collect::<Vec<_>>();
let device = devices.first().unwrap();
let cfg = device.supported_input_configs() let cfg = device.supported_input_configs()
.unwrap() .unwrap()
.filter(|x| x.sample_format() == cpal::SampleFormat::F32) .filter(|x| x.sample_format() == cpal::SampleFormat::F32)
@ -65,7 +122,6 @@ impl Listener {
eprintln!("sig {}", sig); eprintln!("sig {}", sig);
break; break;
} }
stream.pause().unwrap(); let _ = stream.pause();
} }
} }

View File

@ -26,4 +26,5 @@ fn main() {
listen_lib::main(|data| { listen_lib::main(|data| {
send.send(data).unwrap(); send.send(data).unwrap();
}); });
eprintln!("/listen lib main...");
} }