From 4f3164c2ac1a3670faee576ef92bc77584230368 Mon Sep 17 00:00:00 2001 From: George Tsiamasiotis Date: Wed, 25 Sep 2024 18:18:15 +0300 Subject: [PATCH] Do not start audio processor when no audio cameras are configured --- frigate/app.py | 26 ++++++++++++++++++-------- frigate/events/audio.py | 18 +++++++----------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/frigate/app.py b/frigate/app.py index 85267e01c..0400ef359 100644 --- a/frigate/app.py +++ b/frigate/app.py @@ -6,7 +6,7 @@ import secrets import shutil from multiprocessing import Queue from multiprocessing.synchronize import Event as MpEvent -from typing import Any +from typing import Any, Optional import psutil import uvicorn @@ -77,6 +77,8 @@ logger = logging.getLogger(__name__) class FrigateApp: + audio_process: Optional[mp.Process] = None + # TODO: Fix FrigateConfig usage, so we can properly annotate it here without mypy erroring out. def __init__(self, config: Any) -> None: self.stop_event: MpEvent = mp.Event() @@ -439,10 +441,17 @@ class FrigateApp: capture_process.start() logger.info(f"Capture process started for {name}: {capture_process.pid}") - def start_audio_processors(self) -> None: - self.audio_process = AudioProcessor(self.config, self.camera_metrics) - self.audio_process.start() - self.processes["audio_detector"] = self.audio_process.pid or 0 + def start_audio_processor(self) -> None: + audio_cameras = [ + c + for c in self.config.cameras.values() + if c.enabled and c.audio.enabled_in_config + ] + + if audio_cameras: + self.audio_process = AudioProcessor(audio_cameras, self.camera_metrics) + self.audio_process.start() + self.processes["audio_detector"] = self.audio_process.pid or 0 def start_timeline_processor(self) -> None: self.timeline_processor = TimelineProcessor( @@ -580,7 +589,7 @@ class FrigateApp: self.start_detected_frames_processor() self.start_camera_processors() self.start_camera_capture_processes() - self.start_audio_processors() + self.start_audio_processor() self.start_storage_maintainer() self.init_external_event_processor() self.start_stats_emitter() @@ -626,8 +635,9 @@ class FrigateApp: ).execute() # stop the audio process - self.audio_process.terminate() - self.audio_process.join() + if self.audio_process: + self.audio_process.terminate() + self.audio_process.join() # ensure the capture processes are done for camera, metrics in self.camera_metrics.items(): diff --git a/frigate/events/audio.py b/frigate/events/audio.py index 298fafc78..f4b382eba 100644 --- a/frigate/events/audio.py +++ b/frigate/events/audio.py @@ -16,7 +16,7 @@ from frigate.camera import CameraMetrics from frigate.comms.config_updater import ConfigSubscriber from frigate.comms.detections_updater import DetectionPublisher, DetectionTypeEnum from frigate.comms.inter_process import InterProcessRequestor -from frigate.config import CameraConfig, CameraInput, FfmpegConfig, FrigateConfig +from frigate.config import CameraConfig, CameraInput, FfmpegConfig from frigate.const import ( AUDIO_DURATION, AUDIO_FORMAT, @@ -68,18 +68,14 @@ def get_ffmpeg_command(ffmpeg: FfmpegConfig) -> list[str]: class AudioProcessor(util.Process): def __init__( self, - config: FrigateConfig, + cameras: list[CameraConfig], camera_metrics: dict[str, CameraMetrics], ): super().__init__(name="frigate.audio_manager", daemon=True) self.logger = logging.getLogger(self.name) self.camera_metrics = camera_metrics - self.audio_cameras = [ - c - for c in config.cameras.values() - if c.enabled and c.audio.enabled_in_config - ] + self.cameras = cameras def run(self) -> None: stop_event = threading.Event() @@ -88,11 +84,11 @@ class AudioProcessor(util.Process): threading.current_thread().name = "process:audio_manager" signal.signal(signal.SIGTERM, lambda sig, frame: sys.exit()) - if len(self.audio_cameras) == 0: + if len(self.cameras) == 0: return try: - for camera in self.audio_cameras: + for camera in self.cameras: audio_thread = AudioEventMaintainer( camera, self.camera_metrics, @@ -101,7 +97,7 @@ class AudioProcessor(util.Process): audio_threads.append(audio_thread) audio_thread.start() - self.logger.info(f"Audio process started (pid: {self.pid})") + self.logger.info(f"Audio processor started (pid: {self.pid})") while True: signal.pause() @@ -116,7 +112,7 @@ class AudioProcessor(util.Process): for thread in audio_threads: if thread.is_alive(): self.logger.warning(f"Thread {thread.name} is still alive") - self.logger.info("Exiting audio process") + self.logger.info("Exiting audio processor") class AudioEventMaintainer(threading.Thread):