← Whispering

fix: Add error handling for device selection and initialization

35895c4fbb58789f2d001337d2e5ff36e0421bb1 · Claude · Jan 25, 2026 23:23

- Add try/except around device index selection in bridge.py
- Add bounds checking for mic and monitor list access
- Add error handling for mic_list and monitor_list initialization in main.py
- Log errors when device detection fails

+26 −11 · 2 files changed

  • src/whispering_ui/bridge.py +15 −9
  • src/whispering_ui/main.py +11 −2
diff --git a/src/whispering_ui/bridge.py b/src/whispering_ui/bridge.py
index a04f02b..2de28cc 100644
--- a/src/whispering_ui/bridge.py
+++ b/src/whispering_ui/bridge.py
@@ -89,17 +89,23 @@ class ProcessingBridge:
         self.ai_processor = self._create_ai_processor()
 
         # Get device index (mic or monitor based on mode)
-        if self.state.monitor_enabled and self.state.monitor_list:
-            # Use monitor device for speaker capture
-            if self.state.monitor_index == 0:
-                # First monitor in list
-                mic_index = self.state.monitor_list[0][0]
+        mic_index = None
+        try:
+            if self.state.monitor_enabled and self.state.monitor_list:
+                # Use monitor device for speaker capture
+                if self.state.monitor_index == 0 or self.state.monitor_index > len(self.state.monitor_list):
+                    # First monitor in list (or fallback if index out of range)
+                    mic_index = self.state.monitor_list[0][0]
+                else:
+                    mic_index = self.state.monitor_list[self.state.monitor_index - 1][0]
+            elif self.state.mic_index == 0 or not self.state.mic_list:
+                mic_index = core.get_default_device_index()
             else:
-                mic_index = self.state.monitor_list[self.state.monitor_index - 1][0]
-        elif self.state.mic_index == 0:
+                idx = min(self.state.mic_index - 1, len(self.state.mic_list) - 1)
+                mic_index = self.state.mic_list[idx][0]
+        except (IndexError, TypeError) as e:
+            print(f"[WARN] Device selection error: {e}, falling back to default")
             mic_index = core.get_default_device_index()
-        else:
-            mic_index = self.state.mic_list[self.state.mic_index - 1][0]
 
         # Get channel selection constant
         channel_select = core.CHANNEL_MIX
diff --git a/src/whispering_ui/main.py b/src/whispering_ui/main.py
index cef2853..0d73c38 100644
--- a/src/whispering_ui/main.py
+++ b/src/whispering_ui/main.py
@@ -57,8 +57,17 @@ def main():
     state.auto_stop_minutes = settings.get("auto_stop_minutes", 5)
 
     # Initialize microphone and monitor lists
-    state.mic_list = core.get_mic_names()
-    state.monitor_list = core.get_monitor_names()
+    try:
+        state.mic_list = core.get_mic_names()
+    except Exception as e:
+        print(f"Error getting mic list: {e}")
+        state.mic_list = []
+
+    try:
+        state.monitor_list = core.get_monitor_names()
+    except Exception as e:
+        print(f"Error getting monitor list: {e}")
+        state.monitor_list = []
 
     # Check AI availability
     try: