mirror of
https://github.com/DJ2LS/FreeDATA
synced 2024-05-14 08:04:33 +00:00
audio device check before starting modem
This commit is contained in:
parent
fbf6853c96
commit
4cf915c399
|
@ -17,6 +17,8 @@ export const useAudioStore = defineStore("audioStore", () => {
|
||||||
|
|
||||||
function getInputDevices() {
|
function getInputDevices() {
|
||||||
var html = "";
|
var html = "";
|
||||||
|
if (inputDevices.value.length > 0){
|
||||||
|
|
||||||
for (var key in inputDevices.value) {
|
for (var key in inputDevices.value) {
|
||||||
let selected = "";
|
let selected = "";
|
||||||
|
|
||||||
|
@ -35,20 +37,25 @@ export const useAudioStore = defineStore("audioStore", () => {
|
||||||
html += `<option value=${inputDevices.value[key]["id"]} ${selected}>${inputDevices.value[key]["name"]} | ${inputDevices.value[key]["api"]}</option>`;
|
html += `<option value=${inputDevices.value[key]["id"]} ${selected}>${inputDevices.value[key]["name"]} | ${inputDevices.value[key]["api"]}</option>`;
|
||||||
}
|
}
|
||||||
return html;
|
return html;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function getOutputDevices() {
|
function getOutputDevices() {
|
||||||
var html = "";
|
var html = "";
|
||||||
for (var key in outputDevices.value) {
|
|
||||||
let selected = "";
|
if (outputDevices.value.length > 0){
|
||||||
if (outputDevices.value[key]["id"] == settings.tx_audio) {
|
for (var key in outputDevices.value) {
|
||||||
selected = "selected";
|
|
||||||
} else {
|
let selected = "";
|
||||||
selected = "";
|
if (outputDevices.value[key]["id"] == settings.tx_audio) {
|
||||||
}
|
selected = "selected";
|
||||||
html += `<option value=${outputDevices.value[key]["id"]} ${selected}>${outputDevices.value[key]["name"]} | ${inputDevices.value[key]["api"]}</option>`;
|
} else {
|
||||||
|
selected = "";
|
||||||
|
}
|
||||||
|
html += `<option value=${outputDevices.value[key]["id"]} ${selected}>${outputDevices.value[key]["name"]} | ${outputDevices.value[key]["api"]}</option>`;
|
||||||
|
}
|
||||||
|
return html;
|
||||||
}
|
}
|
||||||
return html;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -110,18 +110,59 @@ def fetch_audio_devices(input_devices, output_devices):
|
||||||
# index of the device within the list
|
# index of the device within the list
|
||||||
# returns (id, name)
|
# returns (id, name)
|
||||||
def get_device_index_from_crc(crc, isInput: bool):
|
def get_device_index_from_crc(crc, isInput: bool):
|
||||||
in_devices = []
|
try:
|
||||||
out_devices = []
|
in_devices = []
|
||||||
|
out_devices = []
|
||||||
|
|
||||||
fetch_audio_devices(in_devices, out_devices)
|
fetch_audio_devices(in_devices, out_devices)
|
||||||
|
|
||||||
if isInput:
|
if isInput:
|
||||||
detected_devices = in_devices
|
detected_devices = in_devices
|
||||||
else:
|
else:
|
||||||
detected_devices = out_devices
|
detected_devices = out_devices
|
||||||
|
|
||||||
for i, dev in enumerate(detected_devices):
|
for i, dev in enumerate(detected_devices):
|
||||||
if dev['id'] == crc:
|
if dev['id'] == crc:
|
||||||
return (i, dev['name'])
|
return (i, dev['name'])
|
||||||
|
|
||||||
raise Exception(f"Input: {isInput} | Audio device {crc} not detected | Devices: {detected_devices}")
|
except Exception as e:
|
||||||
|
log.warning(f"Audio device {crc} not detected ", devices=detected_devices, isInput=isInput)
|
||||||
|
|
||||||
|
|
||||||
|
import sounddevice as sd
|
||||||
|
|
||||||
|
|
||||||
|
def test_audio_devices(input_id: str, output_id: str) -> list:
|
||||||
|
result = [False, False]
|
||||||
|
|
||||||
|
try:
|
||||||
|
device_index = get_device_index_from_crc(input_id, True)
|
||||||
|
if device_index is None:
|
||||||
|
raise ValueError("Invalid input device index.")
|
||||||
|
|
||||||
|
sd.check_input_settings(
|
||||||
|
device=device_index[0],
|
||||||
|
channels=1,
|
||||||
|
dtype="int16",
|
||||||
|
samplerate=48000,
|
||||||
|
)
|
||||||
|
result[0] = True
|
||||||
|
except (sd.PortAudioError, ValueError) as e:
|
||||||
|
print("Input device error:", e)
|
||||||
|
|
||||||
|
try:
|
||||||
|
device_index = get_device_index_from_crc(output_id, False)
|
||||||
|
if device_index is None:
|
||||||
|
raise ValueError("Invalid output device index.")
|
||||||
|
|
||||||
|
sd.check_output_settings(
|
||||||
|
device=device_index[0],
|
||||||
|
channels=1,
|
||||||
|
dtype="int16",
|
||||||
|
samplerate=48000,
|
||||||
|
)
|
||||||
|
result[1] = True
|
||||||
|
except (sd.PortAudioError, ValueError) as e:
|
||||||
|
print("Output device error:", e)
|
||||||
|
|
||||||
|
return result
|
||||||
|
|
|
@ -161,18 +161,20 @@ class RF:
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.log.debug("[MDM] init: starting pyaudio callback")
|
self.log.debug("[MDM] init: starting pyaudio callback")
|
||||||
# self.audio_stream.start_stream(
|
|
||||||
self.stream.start()
|
self.stream.start()
|
||||||
except Exception as audioerr:
|
except Exception as audioerr:
|
||||||
self.log.error("[MDM] init: starting pyaudio callback failed", e=audioerr)
|
self.log.error("[MDM] init: starting pyaudio callback failed", e=audioerr)
|
||||||
|
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
self.log.error("[MDM] init: can't open audio device. Exit", e=err)
|
self.log.error("[MDM] init: can't open audio device. Exit", e=err)
|
||||||
|
self.stream.stop
|
||||||
|
self.stream = lambda: None
|
||||||
|
self.stream.active = False
|
||||||
|
|
||||||
# let's stop the modem service
|
# let's stop the modem service
|
||||||
self.service_queue.put("stop")
|
self.service_queue.put("stop")
|
||||||
# simulate audio class active state for reducing cli output
|
# simulate audio class active state for reducing cli output
|
||||||
self.stream = lambda: None
|
|
||||||
self.stream.active = False
|
|
||||||
|
|
||||||
elif not TESTMODE:
|
elif not TESTMODE:
|
||||||
# placeholder area for processing audio via TCI
|
# placeholder area for processing audio via TCI
|
||||||
|
|
|
@ -2,6 +2,7 @@ import threading
|
||||||
import data_handler
|
import data_handler
|
||||||
import modem
|
import modem
|
||||||
import structlog
|
import structlog
|
||||||
|
import audio
|
||||||
|
|
||||||
class SM:
|
class SM:
|
||||||
def __init__(self, app):
|
def __init__(self, app):
|
||||||
|
@ -15,6 +16,7 @@ class SM:
|
||||||
self.modem_fft = app.modem_fft
|
self.modem_fft = app.modem_fft
|
||||||
self.modem_service = app.modem_service
|
self.modem_service = app.modem_service
|
||||||
|
|
||||||
|
|
||||||
runner_thread = threading.Thread(
|
runner_thread = threading.Thread(
|
||||||
target=self.runner, name="runner thread", daemon=True
|
target=self.runner, name="runner thread", daemon=True
|
||||||
)
|
)
|
||||||
|
@ -24,13 +26,20 @@ class SM:
|
||||||
while True:
|
while True:
|
||||||
cmd = self.modem_service.get()
|
cmd = self.modem_service.get()
|
||||||
if cmd in ['start'] and not self.modem:
|
if cmd in ['start'] and not self.modem:
|
||||||
self.log.info("starting modem....")
|
audio_test = audio.test_audio_devices(self.config['AUDIO']['rx'], self.config['AUDIO']['tx'])
|
||||||
self.modem = modem.RF(self.config, self.modem_events, self.modem_fft, self.modem_service)
|
print(self.config['AUDIO']['rx'])
|
||||||
self.data_handler = data_handler.DATA(self.config, self.modem_events)
|
print(audio_test)
|
||||||
|
if False not in audio_test:
|
||||||
|
self.log.info("starting modem....")
|
||||||
|
self.modem = modem.RF(self.config, self.modem_events, self.modem_fft, self.modem_service)
|
||||||
|
self.data_handler = data_handler.DATA(self.config, self.modem_events)
|
||||||
|
else:
|
||||||
|
self.log.warning("starting modem failed", input_test=audio_test[0], output_test=audio_test[1])
|
||||||
|
|
||||||
else:
|
else:
|
||||||
print("--------------------------------------")
|
print("--------------------------------------")
|
||||||
self.log.info("stopping modem....")
|
self.log.info("stopping modem....")
|
||||||
del self.modem
|
del self.modem
|
||||||
del self.data_handler
|
del self.data_handler
|
||||||
self.modem = False
|
self.modem = False
|
||||||
self.data_handler = False
|
self.data_handler = False
|
||||||
|
|
Loading…
Reference in a new issue