From 0201222bca2643864f9789b51b56f2d2887440fd Mon Sep 17 00:00:00 2001 From: pstruebi Date: Mon, 22 Sep 2025 13:20:22 +0200 Subject: [PATCH] add immediate rendering and assitive listening flags --- src/auracast/auracast_config.py | 1 + src/auracast/multicast.py | 10 +++++++++- src/auracast/server/multicast_frontend.py | 14 ++++++++++++++ src/auracast/server/multicast_server.py | 6 ++++++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/auracast/auracast_config.py b/src/auracast/auracast_config.py index dfeb1f9..2971dea 100644 --- a/src/auracast/auracast_config.py +++ b/src/auracast/auracast_config.py @@ -39,6 +39,7 @@ class AuracastGlobalConfig(BaseModel): # When true, include a zero-length LTV with type 0x09 in the subgroup metadata # so receivers may render earlier than the presentation delay for lower latency. immediate_rendering: bool = False + assisted_listening_stream: bool = False # "Audio input. " # "'device' -> use the host's default sound input device, " diff --git a/src/auracast/multicast.py b/src/auracast/multicast.py index 0adcc19..5fe774c 100644 --- a/src/auracast/multicast.py +++ b/src/auracast/multicast.py @@ -188,7 +188,15 @@ async def init_broadcast( # Broadcast Audio Immediate Rendering flag (type 0x09), zero-length value le_audio.Metadata.Entry(tag = le_audio.Metadata.Tag.BROADCAST_AUDIO_IMMEDIATE_RENDERING_FLAG, data=b"") ] - if global_config.immediate_rendering #TODO: verify this + if global_config.immediate_rendering + else [] + ) + + ( + [ + # Broadcast Audio Immediate Rendering flag (type 0x09), zero-length value + le_audio.Metadata.Entry(tag = le_audio.Metadata.Tag.ASSISTED_LISTENING_STREAM, data=b"") + ] + if global_config.assisted_listening_stream else [] ) ) diff --git a/src/auracast/server/multicast_frontend.py b/src/auracast/server/multicast_frontend.py index 1c78900..63acda2 100644 --- a/src/auracast/server/multicast_frontend.py +++ b/src/auracast/server/multicast_frontend.py @@ -267,6 +267,18 @@ else: type="password", help="Optional: Set a broadcast code to protect your stream. Leave empty for an open (uncoded) broadcast." ) + # Flags: Assistive Listening and Immediate Rendering (one row) + col_flags1, col_flags2, col_placeholder = st.columns([1, 1, 2]) + with col_flags1: + assisted_listening = st.checkbox( + "Assistive listening", + value=bool(saved_settings.get('assisted_listening_stream', False)) + ) + with col_flags2: + immediate_rendering = st.checkbox( + "Immediate rendering", + value=bool(saved_settings.get('immediate_rendering', False)) + ) # Gain slider for Webapp mode if audio_mode == "Webapp": mic_gain = st.slider("Microphone Gain", 0.0, 2.0, 1.0, 0.1, help="Adjust microphone volume sent to Auracast") @@ -406,6 +418,8 @@ else: auracast_sampling_rate_hz=q['rate'], octets_per_frame=q['octets'], transport='', # is set in backend + assisted_listening_stream=assisted_listening, + immediate_rendering=immediate_rendering, bigs = [ auracast_config.AuracastBigConfig( code=(stream_passwort.strip() or None), diff --git a/src/auracast/server/multicast_server.py b/src/auracast/server/multicast_server.py index ba33fe1..217ff40 100644 --- a/src/auracast/server/multicast_server.py +++ b/src/auracast/server/multicast_server.py @@ -141,6 +141,8 @@ async def initialize(conf: auracast_config.AuracastConfigGroup): 'gain': [getattr(big, 'input_gain', 1.0) for big in conf.bigs], 'auracast_sampling_rate_hz': conf.auracast_sampling_rate_hz, 'octets_per_frame': conf.octets_per_frame, + 'immediate_rendering': getattr(conf, 'immediate_rendering', False), + 'assisted_listening_stream': getattr(conf, 'assisted_listening_stream', False), 'timestamp': datetime.utcnow().isoformat() }) global_config_group = conf @@ -255,6 +257,8 @@ async def _autostart_from_settings(): input_device_name = settings.get('input_device') rate = settings.get('auracast_sampling_rate_hz') octets = settings.get('octets_per_frame') + immediate_rendering = settings.get('immediate_rendering', False) + assisted_listening_stream = settings.get('assisted_listening_stream', False) channel_names = settings.get('channel_names') or ["Broadcast0"] program_info = settings.get('program_info') or channel_names languages = settings.get('languages') or ["deu"] @@ -307,6 +311,8 @@ async def _autostart_from_settings(): auracast_sampling_rate_hz=rate, octets_per_frame=octets, transport=TRANSPORT1, + immediate_rendering=immediate_rendering, + assisted_listening_stream=assisted_listening_stream, bigs=bigs, ) # Initialize and start