diff --git a/selfdrive/ui/soundd.py b/selfdrive/ui/soundd.py index d64fb0010c..9d6d24a594 100644 --- a/selfdrive/ui/soundd.py +++ b/selfdrive/ui/soundd.py @@ -10,9 +10,9 @@ from openpilot.common.basedir import BASEDIR from openpilot.common.filter_simple import FirstOrderFilter from openpilot.system import micd +from openpilot.system.hardware import TICI from openpilot.common.realtime import Ratekeeper -from openpilot.system.hardware import PC from openpilot.common.swaglog import cloudlog SAMPLE_RATE = 48000 @@ -130,16 +130,13 @@ class Soundd: # sounddevice must be imported after forking processes import sounddevice as sd - rk = Ratekeeper(20) + if TICI: + micd.wait_for_devices(sd) # wait for alsa to be initialized on device - sm = messaging.SubMaster(['controlsState', 'microphone']) + with sd.OutputStream(channels=1, samplerate=SAMPLE_RATE, callback=self.callback) as stream: + rk = Ratekeeper(20) + sm = messaging.SubMaster(['controlsState', 'microphone']) - if PC: - device = None - else: - device = "sdm845-tavil-snd-card: - (hw:0,0)" - - with sd.OutputStream(device=device, channels=1, samplerate=SAMPLE_RATE, callback=self.callback) as stream: cloudlog.info(f"soundd stream started: {stream.samplerate=} {stream.channels=} {stream.dtype=} {stream.device=}") while True: sm.update(0) diff --git a/system/micd.py b/system/micd.py index 88fb08d684..f4085becd4 100755 --- a/system/micd.py +++ b/system/micd.py @@ -3,7 +3,9 @@ import numpy as np from cereal import messaging from openpilot.common.realtime import Ratekeeper +from openpilot.common.retry import retry from openpilot.common.swaglog import cloudlog +from openpilot.system.hardware import TICI RATE = 10 FFT_SAMPLES = 4096 @@ -11,6 +13,18 @@ REFERENCE_SPL = 2e-5 # newtons/m^2 SAMPLE_RATE = 44100 +@retry(attempts=7, delay=3) +def wait_for_devices(sd): + # reload sounddevice to reinitialize portaudio + sd._terminate() + sd._initialize() + + devices = sd.query_devices() + cloudlog.info(f"sounddevice available devices: {list(devices)}") + + assert len(devices) > 0 + + def calculate_spl(measurements): # https://www.engineeringtoolbox.com/sound-pressure-d_711.html sound_pressure = np.sqrt(np.mean(measurements ** 2)) # RMS of amplitudes @@ -81,7 +95,10 @@ class Mic: # sounddevice must be imported after forking processes import sounddevice as sd - with sd.InputStream(channels=1, samplerate=SAMPLE_RATE, callback=self.callback) as stream: + if TICI: + wait_for_devices(sd) # wait for alsa to be initialized on device + + with sd.InputStream(channels=1, samplerate=SAMPLE_RATE, callback=self.callback) as stream: cloudlog.info(f"micd stream started: {stream.samplerate=} {stream.channels=} {stream.dtype=} {stream.device=}") while True: self.update()