Do not start audio processor when no audio cameras are configured

This commit is contained in:
George Tsiamasiotis 2024-09-25 18:18:15 +03:00
parent 9616d9a524
commit 4f3164c2ac
2 changed files with 25 additions and 19 deletions

View File

@ -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():

View File

@ -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):