{"record":{"id":"9aac7fb3986e6988","repo":"Zackriya-Solutions/meetily","slug":"no-default-output-device-found","errorCode":null,"errorMessage":"No default output device found","messagePattern":"No default output device found","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"warning","filePath":"frontend/src-tauri/src/audio/playback_monitor.rs","lineNumber":41,"sourceCode":"    #[cfg(target_os = \"windows\")]\n    {\n        get_windows_output().await\n    }\n\n    #[cfg(target_os = \"linux\")]\n    {\n        get_linux_output().await\n    }\n}\n\n#[cfg(target_os = \"macos\")]\nasync fn get_macos_output() -> Result<AudioOutputInfo> {\n    use cpal::traits::{DeviceTrait, HostTrait};\n\n    // Get default output device using cpal\n    let host = cpal::default_host();\n    let device = host.default_output_device()\n        .ok_or_else(|| anyhow::anyhow!(\"No default output device found\"))?;\n\n    let device_name = device.name().unwrap_or_else(|_| \"Unknown\".to_string());\n\n    // Get sample rate\n    let sample_rate = device.default_output_config()\n        .ok()\n        .map(|config| config.sample_rate().0);\n\n    // Heuristic: Check if device name contains bluetooth-related keywords\n    let name_lower = device_name.to_lowercase();\n    let is_bluetooth = name_lower.contains(\"airpods\")\n        || name_lower.contains(\"bluetooth\")\n        || name_lower.contains(\"wireless\")\n        || name_lower.contains(\"wh-\")  // Sony WH-* series\n        || name_lower.contains(\"beats\")\n        || name_lower.contains(\"bose\")\n        || name_lower.contains(\"jabra\")\n        || name_lower.contains(\"jbl\")","sourceCodeStart":23,"sourceCodeEnd":59,"githubUrl":"https://github.com/Zackriya-Solutions/meetily/blob/0281737d87d26352fb0adc78c8c0975f691b23d1/frontend/src-tauri/src/audio/playback_monitor.rs#L23-L59","documentation":"get_macos_output asks cpal's default host for default_output_device() and it returned None - macOS/CoreAudio reports no default output device at all. Playback monitoring uses this to detect the current output (and whether it is Bluetooth) so audio streams can be reconfigured when devices change.","triggerScenarios":"Machine has zero output devices (headless Mac mini, VM without audio hardware); the default device disappeared (Bluetooth headphones powered off, USB interface unplugged) and CoreAudio has not yet picked a successor; CoreAudio wedged after rapid device switching.","commonSituations":"AirPods turned off mid-session leaving no default; app launched before the audio subsystem is ready; running inside a VM or CI environment without audio passthrough.","solutions":["Connect or enable any output device and confirm it is selected as default in System Settings > Sound","Toggle the Bluetooth device off/on (or re-pair) so CoreAudio reselects a default","Restart coreaudiod when CoreAudio is stuck: sudo killall coreaudiod","Skip playback monitoring in headless/VM environments"],"exampleFix":"// before\nlet device = host.default_output_device()\n    .ok_or_else(|| anyhow::anyhow!(\"No default output device found\"))?;\n\n// after - degrade to a sentinel instead of failing the monitor\nlet device = match host.default_output_device() {\n    Some(d) => d,\n    None => return Ok(AudioOutputInfo {\n        name: \"No output device\".to_string(),\n        is_bluetooth: false,\n        sample_rate: None,\n        device_type: \"none\".to_string(),\n    }),\n};","handlingStrategy":"try-catch","validationCode":"// Probe for any output device before asking for the default\nuse cpal::traits::HostTrait;\nlet host = cpal::default_host();\nlet has_output = host.output_devices().map(|mut d| d.next().is_some()).unwrap_or(false);\nif !has_output {\n    // skip playback monitoring this cycle\n}","typeGuard":null,"tryCatchPattern":"Catch the anyhow error at the playback-monitor call site and downgrade to a 'no output' sample (name: \"None\", is_bluetooth: false) so monitoring degrades instead of erroring; log at debug level.","preventionTips":["Treat playback monitoring as advisory: never let its failure propagate into recording logic","Detect headless/VM environments (no output devices at startup) and disable the monitor loop","Re-probe devices on audio-device-change notifications rather than assuming a default always exists"],"tags":["audio","cpal","macos","coreaudio","device-not-found"],"backgroundTag":"audio-device-not-found","analyzedSha":"0281737d87d26352fb0adc78c8c0975f691b23d1","analyzedAt":"2026-08-16T20:57:52.567Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}