cjpais/Handy · error · std::io::Error
NotFound
NotFound
Error message
No input device found
What it means
Error "No input device found" thrown in cjpais/Handy.
Source
Thrown at src-tauri/src/audio_toolkit/audio/recorder.rs:172
return Ok(()); // already open
}
// The worker exited on its own (see `is_capture_worker_dead`). Reap
// it so we rebuild the stream below instead of handing the caller
// back a recorder whose channels are already closed.
log::warn!("Capture worker exited; rebuilding microphone stream");
let _ = self.close();
}
let (sample_tx, sample_rx) = mpsc::channel::<AudioChunk>();
let (cmd_tx, cmd_rx) = mpsc::channel::<Cmd>();
let (init_tx, init_rx) = mpsc::sync_channel::<Result<(), String>>(1);
let host = crate::audio_toolkit::get_cpal_host();
let device = match device {
Some(dev) => dev,
None => host
.default_input_device()
.ok_or_else(|| Error::new(std::io::ErrorKind::NotFound, "No input device found"))?,
};
let thread_device = device.clone();
let vad = self.vad.clone();
// Move the optional level callback into the worker thread
let level_cb = self.level_cb.clone();
// Move the optional real-time audio frame callback into the worker thread
let audio_cb = self.audio_cb.clone();
let selected_channel = self.selected_channel;
let config_cache = Arc::clone(&self.config_cache);
let worker = std::thread::spawn(move || {
let stop_flag = Arc::new(AtomicBool::new(false));
let stop_flag_for_stream = stop_flag.clone();
let init_result = (|| -> Result<(cpal::Stream, u32), String> {
let config_started = Instant::now();
let device_name = thread_device.name().unwrap_or_default();
let cached_config = config_cacheView on GitHub (pinned to 98a4d80cce)
When it happens
Trigger: Thrown at src-tauri/src/audio_toolkit/audio/recorder.rs:172 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of cjpais/Handy@98a4d80cce (2026-08-16).
Data as JSON: /api/errors/81d479b8fdfbee0f.
Report an issue: GitHub.