diff --git a/system/hardware/base.py b/system/hardware/base.py index 31df1babe0f21b..16ed9621c17c1a 100644 --- a/system/hardware/base.py +++ b/system/hardware/base.py @@ -43,6 +43,10 @@ def get_device_type(self): def get_sound_card_online(self): pass + @abstractmethod + def is_sound_playing(self): + pass + @abstractmethod def get_imei(self, slot) -> str: pass diff --git a/system/hardware/pc/hardware.py b/system/hardware/pc/hardware.py index 564f9e483add9d..2c83eb35f49f38 100644 --- a/system/hardware/pc/hardware.py +++ b/system/hardware/pc/hardware.py @@ -1,4 +1,5 @@ import random +import subprocess from cereal import log from system.hardware.base import HardwareBase, ThermalConfig @@ -17,6 +18,9 @@ def get_device_type(self): def get_sound_card_online(self): return True + def is_sound_playing(self): + return "RUNNING" in subprocess.check_output(["pactl", "list", "short", "sinks"]).decode('utf8') + def reboot(self, reason=None): print("REBOOT!") diff --git a/system/hardware/tici/hardware.py b/system/hardware/tici/hardware.py index e2fd20c1be58ab..98252787bdeea3 100644 --- a/system/hardware/tici/hardware.py +++ b/system/hardware/tici/hardware.py @@ -96,6 +96,9 @@ def get_sound_card_online(self): return (os.path.isfile('/proc/asound/card0/state') and open('/proc/asound/card0/state').read().strip() == 'ONLINE') + def is_sound_playing(self): + return "RUNNING" in subprocess.check_output(["pactl", "list", "short", "sinks"]).decode('utf8') + def reboot(self, reason=None): subprocess.check_output(["sudo", "reboot"]) diff --git a/system/micd.py b/system/micd.py index d2a5a2849f2b3a..27b6cb5f19a9da 100755 --- a/system/micd.py +++ b/system/micd.py @@ -5,6 +5,7 @@ from cereal import messaging from common.filter_simple import FirstOrderFilter from common.realtime import Ratekeeper +from system.hardware import HARDWARE from system.swaglog import cloudlog RATE = 10 @@ -27,7 +28,8 @@ def update(self): # https://www.engineeringtoolbox.com/sound-pressure-d_711.html sound_pressure = np.sqrt(np.mean(self.measurements ** 2)) # RMS of amplitudes sound_pressure_level = 20 * np.log10(sound_pressure / REFERENCE_SPL) if sound_pressure > 0 else 0 # dB - self.spl_filter.update(sound_pressure_level) + if not HARDWARE.is_sound_playing(): + self.spl_filter.update(sound_pressure_level) else: sound_pressure = 0 sound_pressure_level = 0