diff --git a/listen-lib/src/lib.rs b/listen-lib/src/lib.rs index 5a08253..562fce6 100644 --- a/listen-lib/src/lib.rs +++ b/listen-lib/src/lib.rs @@ -3,14 +3,68 @@ use signal_hook::{iterator::Signals, consts::signal::SIGINT}; use std::thread; pub fn main(callback: impl FnMut(Vec)) { - new_listener().listen(callback); + new_listener(None).unwrap().listen(callback); +} + +pub fn main_with(callback: impl FnMut(Vec), device_name: String) { + new_listener(Some(device_name)).unwrap().listen(callback); +} + +pub fn devices() -> Vec { + 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, String> { + match cpal::default_host().devices() { + Ok(devices) => Ok(devices.collect()), + Err(msg) => Err(format!("failed to get devices: {}", msg)), + } } struct Listener { + device_name: String, } -fn new_listener() -> Listener { - Listener{} +fn new_listener(device_name: Option) -> Result { + 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 { @@ -18,16 +72,19 @@ impl Listener { let (send, recv) = std::sync::mpsc::sync_channel(100); thread::spawn(move || { self._listen(send); }); loop { - match recv.recv() { + match recv.recv_timeout(std::time::Duration::new(1, 0)) { Ok(msg) => cb(msg), - Err(_) => return, + Err(_) => break, }; } } fn _listen(self, send: std::sync::mpsc::SyncSender>) { - let host = cpal::default_host(); - let device = host.default_input_device().unwrap(); + let devices = _devices().unwrap(); + let devices = devices.iter(). + filter(|device| device.name().unwrap() == self.device_name). + collect::>(); + let device = devices.first().unwrap(); let cfg = device.supported_input_configs() .unwrap() .filter(|x| x.sample_format() == cpal::SampleFormat::F32) @@ -65,7 +122,6 @@ impl Listener { eprintln!("sig {}", sig); break; } - stream.pause().unwrap(); + let _ = stream.pause(); } } - diff --git a/rust-whisper-baked/src/main.rs b/rust-whisper-baked/src/main.rs index f3f61eb..7306e9a 100644 --- a/rust-whisper-baked/src/main.rs +++ b/rust-whisper-baked/src/main.rs @@ -26,4 +26,5 @@ fn main() { listen_lib::main(|data| { send.send(data).unwrap(); }); + eprintln!("/listen lib main..."); }