mirror of
https://github.com/dragonpilot/dragonpilot.git
synced 2026-07-07 13:52:06 +08:00
soundd/micd: more robust setup procedure (#30640)
* just use the default device :/ * Ruff * this seems like the most reliable way * Ruff * move comments too * wait for devices * fix that * and that * ruff * add logging for avaliable devices --------- Co-authored-by: Comma Device <device@comma.ai>
This commit is contained in:
@@ -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)
|
||||
|
||||
+18
-1
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user