Inject Talker Alias on HBP bridge/repeat via standalone DMRA packets
and embedded LC in forwarded DMRD voice (FLCO 4–7) for MMDVMHost/
DMRGateway. UTF-8 encoding (format 2) and LC/TA superframe alternation
for the full stream; clear embed state on VTERM.
When LOGGER.ENABLED is false, setup_logging attaches only a NullHandler
so legacy configs without the key keep current behavior. Document the
option in EN/ES configuration guides and example YAML templates.
Use a flat OBP STATUS dict like legacy routerOBP, iterate it in
stream_trimmer_loop, stop HBP STATUS[stream_id] writes, cap BCSQ log
dedup with a bounded deque, and sweep stale voice-announcement entries.
Add reopen_file_handlers() and register SIGUSR2 after logging setup in
main and parrot. Document create/postrotate/kill -USR2 in monitoring
guide (EN/ES). SIGUSR2 only reopens file handlers; does not reload YAML.
Skip options_config_for_system when static TS/timer fingerprint matches the last
successful RPTO apply to avoid log spam and redundant work.
Document why make_single_bridge must not rebuild 9990–9999 when the bridge
already exists: it drops the ECHO ACTIVE row and breaks the parrot path.
When BRIDGES[tg] existed without TS1/TS2 rows for a MASTER, make_static_tg
only updated existing rows and that hotspot never received traffic. Append
inactive legs like make_stat_bridge / legacy UA re-add.
- Compute rate from elapsed time since stream START (not packets/START).
- Drop duplicate frames by CRC even when seq is 0 (retransmissions).
- Remove _log_trace helper and TRACE calls for BCSQ/BCKA/ACL skips.
- on_obp_bcsq_received: clear forward STATUS only; do not send_bridge_event
- Loop-control loser: report END,TX instead of END,RX (no LH 0s / global OBP pop)
- Sync TARGET_SOCK from actual peer when RELAX_CHECKS accepts DMRD/DMRE
- Fallback TARGET_IP/PORT for BCSQ send; warn if no destination
- Resend BCSQ every 2s while loop-control loser (UDP loss)
- Emit END,RX on first loser transition for monitor
- Robust _bcsq TG key matching in to_target
- Emit END,TX for OBP forward destinations when source stream times out in trimmer
- After VTERM END,RX, sweep remaining forward legs so monitor state stays consistent
- Log MAX HOPS drops at DEBUG to avoid per-packet warning floods
- Drop obsolete OBP_BRIDGE_MESH_OWNER_BYPASS_BCSQ comments from example yaml
Match bridge_master/hblink behaviour: BRIDGES table iteration for
to_target, OBP VTERM/_fin timing, stream seq/crc handling, and
document related GLOBAL options.
- Match BRIDGES source rules with effective TS1 for OpenBridge (has_source).
- Normalize DMRE receive slot to 1 for OPENBRIDGE before STATUS/dmrd_received.
- Dedupe OBP (SYSTEM, TS) per packet like legacy sysIgnore (TG + reflector lists).
- Run dynamic-bridge deactivate for dst 4000 before ACL (group/unit/vcsbk; master+peer)
- Send PRIVATE VOICE,END,RX to report; set slot RX_START on private stream start; fix slot STATUS setdefault
- dmrd_received: return early for private call to 4000 (legacy parity)
- Replace _broadcast_active with _broadcast_active_tgs (set)
- Serialize only same-TG broadcasts; different TGs run in parallel
- Add _mark_slots_busy/_mark_slots_free for TS conflict prevention
- Add ffmpeg system dependency note in requirements.txt
Voice words and ondemand files for en_GB, es_ES, cy_GB, de_DE, el_GR, fr_FR, pt_PT, th_TH, CW, etc.
Remove Audio from .gitignore to track these assets.
- Use DefaultVoiceProvider when Audio dir exists (was gated by ANNOUNCEMENT_LANGUAGES)
- Create Audio dir at startup when voice config present
- ANNOUNCEMENT_LANGUAGES optional (ident only); each item has own LANGUAGE
- ident: fallback to per-system ANNOUNCEMENT_LANGUAGE when empty
- disconnected_voice: use system language directly
- Clarify ENABLED, ANNOUNCEMENT_LANGUAGES in adn-voice.example.yaml
- Add Audio/.gitkeep, update .gitignore to keep folder structure
- Port playback.py to clean architecture: PlaybackUseCases, parrot_main.py, adn-parrot.py
- Fix critical PEER auth bug: RPTACK/MSTNAK data offsets were off by 1 (5→6) preventing PEER login
- Extract config normalization to shared config_normalizer.py (used by both main and parrot)