Add microphone picker and device management features
- Implement `list_input_devices` to retrieve and filter input-capable audio devices. - Create `MicPickerDialog` for selecting and saving microphone settings. - Add `set_env_value` function to update .env file with selected microphone index. - Update UI components to integrate microphone selection functionality. - Enhance tests for microphone device handling and environment variable management.
This commit is contained in:
@@ -126,6 +126,27 @@ def record_utterance(
|
||||
return pcm
|
||||
|
||||
|
||||
def list_input_devices() -> list[dict]:
|
||||
"""Every input-capable device sounddevice can see, as
|
||||
{"index", "name", "hostapi"}.
|
||||
|
||||
On Windows in particular, the *same* physical (or virtual) device is
|
||||
normally listed once per host API — MME, DirectSound, WASAPI, WDM-KS —
|
||||
all sharing (or near enough sharing) one name. That makes the name alone
|
||||
an unreliable, often ambiguous way to pick a device (sounddevice matches
|
||||
a string device as a substring and refuses to guess between ties), so the
|
||||
tray's mic picker saves the numeric index instead, which this list exists
|
||||
to let it show alongside a human-readable label."""
|
||||
import sounddevice as sd
|
||||
|
||||
devices = []
|
||||
for index, info in enumerate(sd.query_devices()):
|
||||
if info.get("max_input_channels", 0) > 0:
|
||||
hostapi = sd.query_hostapis(info["hostapi"])["name"]
|
||||
devices.append({"index": index, "name": info["name"], "hostapi": hostapi})
|
||||
return devices
|
||||
|
||||
|
||||
def open_input_stream():
|
||||
"""Real sounddevice input stream, imported lazily so pure-logic tests
|
||||
(record_utterance with a fake stream) don't need PortAudio installed."""
|
||||
|
||||
Reference in New Issue
Block a user