* fix(audio): resolve device by name to prevent index mismatch crash (#498)
Audio device indices can shift between sessions when USB devices are
replugged or virtual devices are added/removed. A saved device_index=24
(BRIO webcam) could later point to 'speech-dispatcher-dummy', causing
PortAudio to attempt recording from a virtual device and triggering
malloc corruption / SIGABRT.
Fix has three parts:
1. Store and match by device name, not just index
- Config already saves device_name alongside device_index
- At recording time, _resolve_device_by_name() enumerates current
devices and finds the one matching the saved name
- Falls back to stored index, then system default (with warning log)
- main.py now passes audio_device_name to SpeechRecognitionManager
2. Filter virtual devices from input device enumeration
- _is_virtual_device() detects speech-dispatcher, dummy, null sink,
monitor, and ALSA output devices
- get_audio_input_devices() skips virtual devices
- Settings dialog dropdown only shows real input devices
- Debug logging in _record_audio also skips virtual devices
3. Validate resolved device has input channels (from flatpak branch)
- Extra safety check: after resolving, verify maxInputChannels > 0
- Falls back to system default if resolved device is invalid
- Brings the validation from feature/flatpak-packaging to main
Closes#498
* style: apply black formatting to recognition_manager.py
* test: add audio_device_name kwarg to mock assertion
* test: add coverage for _is_virtual_device, _resolve_device_by_name, device name management
* test: fix StopIteration in fallback test by using return_value for mock
* ponytail: remove redundant validation and simplify _resolve_device_by_name
- Remove ~20 lines of dead validation in _record_audio() — _resolve_device_by_name
and _resolve_valid_input_device already check maxInputChannels and virtual devices
- Simplify _resolve_device_by_name to just find index by name, then delegate all
validation to _resolve_valid_input_device (which already does channel/virtual checks)
- Update tests to match the simplified delegation pattern
* style(speech): format device fallback warning
* test(speech): cover audio device fallback edges
* test(speech): cover reconnection device fallback
---------
Co-authored-by: Jatin K Malik <jatinkrmalik@users.noreply.github.com>