Replace OP25+PulseAudio recorder with Trunk Recorder feeding our uploader #45

Open
opened 2026-10-27 20:03:48 -04:00 by logan · 1 comment
Owner

From the 2026-10-27 architecture review. OP25 with RTL dongles follows one voice channel per dongle, so simultaneous talkgroups are never recorded. call_recorder/metadata_watcher infer call boundaries from PulseAudio silence plus 0.5s console polling, which means a two-clock time join (late starts, merged or misattributed calls).

Trunk Recorder (GPL-3.0, active, v5.2.1) records every grant at once from one wideband capture. Boundaries come from the decoder, and per-call JSON carries the talkgroup, a per-unit srcList with offsets, freq, encryption and emergency. It runs as a separate process (GPL aggregation, the same obligation we already carry for OP25).

Plan: TR container + uploadScript/plugin mapped onto C2 /upload (reusing the #44 spool) + config.json generated from the C2 system config. Keep OP25/PulseAudio only for live Discord until simplestream replaces it. Prototype on one P25 node and measure simultaneous capture and boundary accuracy against the current recorder.

Overlaps: #26 (two conventional channels on one mono stream), #29 (unpinned OP25), #33 (silent NAC drop), #40 (decode health), #22.

From the 2026-10-27 architecture review. OP25 with RTL dongles follows one voice channel per dongle, so simultaneous talkgroups are never recorded. call_recorder/metadata_watcher infer call boundaries from PulseAudio silence plus 0.5s console polling, which means a two-clock time join (late starts, merged or misattributed calls). Trunk Recorder (GPL-3.0, active, v5.2.1) records every grant at once from one wideband capture. Boundaries come from the decoder, and per-call JSON carries the talkgroup, a per-unit srcList with offsets, freq, encryption and emergency. It runs as a separate process (GPL aggregation, the same obligation we already carry for OP25). Plan: TR container + uploadScript/plugin mapped onto C2 /upload (reusing the #44 spool) + config.json generated from the C2 system config. Keep OP25/PulseAudio only for live Discord until simplestream replaces it. Prototype on one P25 node and measure simultaneous capture and boundary accuracy against the current recorder. Overlaps: #26 (two conventional channels on one mono stream), #29 (unpinned OP25), #33 (silent NAC drop), #40 (decode health), #22.
logan added the
type
feature
area/recording-audioarea/sdr-radio
priority
p1
labels 2026-10-27 20:03:48 -04:00
Author
Owner

Trial on node-002 (MTA Zone 2, P25 phase 2), 2026-11-07, branch feat/45-trunk-recorder (fixes 010a6b0, c437989, plus a commit making drb-upload.sh/run.sh executable).

Works end to end: TR locks onto 770.43125 and uploads with the talkgroup name and unit IDs.

Results:

  • Coverage: MTA voice grants span 770.4 to 774.3 MHz. With one RTL (2.4 Msps) most calls hit "no source covering Freq" (about 2 recorded vs 6 missed in 4 min). A system this wide needs 2 dongles (multi-source isn't implemented), and the second dongle is node-002's ADS-B.
  • Audio, owner listening: TR sounds noticeably worse than OP25, with a robotic undertone. It also shows the same long silent head / clipped tail OP25 has (tracked separately).

Node-002 was rolled back to OP25 at ab10626; the TR env is kept as .env.tr-test on the node. Owner verdict: not clearly better. Parked: no merge.

Node-ops finding: ~/node-26/.git/objects has root-owned dirs (likely the root-run updater), so Already up to date. as pi fails.

Trial on node-002 (MTA Zone 2, P25 phase 2), 2026-11-07, branch feat/45-trunk-recorder (fixes 010a6b0, c437989, plus a commit making drb-upload.sh/run.sh executable). Works end to end: TR locks onto 770.43125 and uploads with the talkgroup name and unit IDs. Results: - Coverage: MTA voice grants span 770.4 to 774.3 MHz. With one RTL (2.4 Msps) most calls hit "no source covering Freq" (about 2 recorded vs 6 missed in 4 min). A system this wide needs 2 dongles (multi-source isn't implemented), and the second dongle is node-002's ADS-B. - Audio, owner listening: TR sounds noticeably worse than OP25, with a robotic undertone. It also shows the same long silent head / clipped tail OP25 has (tracked separately). Node-002 was rolled back to OP25 at ab10626; the TR env is kept as .env.tr-test on the node. Owner verdict: not clearly better. Parked: no merge. Node-ops finding: ~/node-26/.git/objects has root-owned dirs (likely the root-run updater), so Already up to date. as pi fails.
logan added
priority
p3
and removed
priority
p1
labels 2026-11-08 00:48:36 -05:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: logan/node-26#45