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)