{"record":{"id":"81d479b8fdfbee0f","repo":"cjpais/Handy","slug":"notfound","errorCode":"NotFound","errorMessage":"No input device found","messagePattern":"No input device found","errorType":"exception","errorClass":"std::io::Error","httpStatus":null,"severity":"error","filePath":"src-tauri/src/audio_toolkit/audio/recorder.rs","lineNumber":172,"sourceCode":"                return Ok(()); // already open\n            }\n            // The worker exited on its own (see `is_capture_worker_dead`). Reap\n            // it so we rebuild the stream below instead of handing the caller\n            // back a recorder whose channels are already closed.\n            log::warn!(\"Capture worker exited; rebuilding microphone stream\");\n            let _ = self.close();\n        }\n\n        let (sample_tx, sample_rx) = mpsc::channel::<AudioChunk>();\n        let (cmd_tx, cmd_rx) = mpsc::channel::<Cmd>();\n        let (init_tx, init_rx) = mpsc::sync_channel::<Result<(), String>>(1);\n\n        let host = crate::audio_toolkit::get_cpal_host();\n        let device = match device {\n            Some(dev) => dev,\n            None => host\n                .default_input_device()\n                .ok_or_else(|| Error::new(std::io::ErrorKind::NotFound, \"No input device found\"))?,\n        };\n\n        let thread_device = device.clone();\n        let vad = self.vad.clone();\n        // Move the optional level callback into the worker thread\n        let level_cb = self.level_cb.clone();\n        // Move the optional real-time audio frame callback into the worker thread\n        let audio_cb = self.audio_cb.clone();\n        let selected_channel = self.selected_channel;\n        let config_cache = Arc::clone(&self.config_cache);\n\n        let worker = std::thread::spawn(move || {\n            let stop_flag = Arc::new(AtomicBool::new(false));\n            let stop_flag_for_stream = stop_flag.clone();\n            let init_result = (|| -> Result<(cpal::Stream, u32), String> {\n                let config_started = Instant::now();\n                let device_name = thread_device.name().unwrap_or_default();\n                let cached_config = config_cache","sourceCodeStart":154,"sourceCodeEnd":190,"githubUrl":"https://github.com/cjpais/Handy/blob/98a4d80cce8ad41efec2a419b59d9e81229a35d7/src-tauri/src/audio_toolkit/audio/recorder.rs#L154-L190","documentation":"Error \"No input device found\" thrown in cjpais/Handy.","triggerScenarios":"Thrown at src-tauri/src/audio_toolkit/audio/recorder.rs:172 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":[],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"98a4d80cce8ad41efec2a419b59d9e81229a35d7","analyzedAt":"2026-08-16T20:58:09.966Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}