"""GStreamer ALSA capture graphs for the shared audio daemon.""" from __future__ import annotations import shutil GST_LAUNCH = shutil.which("gst-launch-1.0") or "gst-launch-1.0" GST_GROUP_SIZE = 5 def shared_audio_cmd( cameras: list[tuple[str, int]], rate: int, fds: list[int], ) -> list[str]: if len(cameras) != len(fds): raise ValueError("cameras and fds length mismatch") cmd: list[str] = [GST_LAUNCH, "-q"] caps = f"audio/x-raw,format=S16LE,rate={int(rate)},channels=2" for (_ident, card), fd in zip(cameras, fds): cmd += [ "alsasrc", f"device=hw:{int(card)},0", "do-timestamp=false", "!", caps, "!", "queue", "max-size-buffers=2", "max-size-bytes=0", "max-size-time=0", "leaky=downstream", "!", "fdsink", f"fd={int(fd)}", "sync=false", ] return cmd def grouped_audio( cameras: list[tuple[str, int]], fds: list[int], group_size: int = GST_GROUP_SIZE, ) -> list[tuple[list[tuple[str, int]], list[int]]]: if group_size < 1: raise ValueError("group_size must be >= 1") out = [] for i in range(0, len(cameras), group_size): out.append((cameras[i:i + group_size], fds[i:i + group_size])) return out