From b615b68e40b9098164594a599b4bcb586ee5da1b Mon Sep 17 00:00:00 2001 From: Stan Grams Date: Tue, 24 Feb 2026 19:09:04 +0100 Subject: [PATCH] [feat](trx-core): add AudioSource trait and RigCat::as_audio_source Add AudioSource trait to trx-core rig module providing subscribe_pcm() for demodulated PCM audio. Add opt-in as_audio_source() default method to RigCat returning None; SDR backends will override to return Some(self). Re-export AudioSource from the crate root. Marks SDR-01 complete. Co-Authored-By: Claude Sonnet 4.6 Signed-off-by: Stan Grams --- SDR.md | 2 +- src/trx-core/src/lib.rs | 1 + src/trx-core/src/rig/mod.rs | 9 +++++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/SDR.md b/SDR.md index 90fb1c5..9569e19 100644 --- a/SDR.md +++ b/SDR.md @@ -16,7 +16,7 @@ This document specifies the requirements for a SoapySDR-based RX-only backend (` | ID | Status | Task | Touches | |----|--------|------|---------| -| SDR-01 | `[ ]` | Add `AudioSource` trait to `trx-core`; add `as_audio_source()` default on `RigCat` | `src/trx-core/src/rig/mod.rs` | +| SDR-01 | `[x]` | Add `AudioSource` trait to `trx-core`; add `as_audio_source()` default on `RigCat` | `src/trx-core/src/rig/mod.rs` | | SDR-02 | `[x]` | Add `RigAccess::Sdr { args: String }` variant; register `soapysdr` factory (feature-gated `soapysdr`) | `src/trx-server/trx-backend/src/lib.rs` | | SDR-03 | `[ ]` | Add `SdrConfig`, `SdrGainConfig`, `SdrChannelConfig` structs; parse `type = "sdr"` in `AccessConfig`; add `sdr: SdrConfig` to `ServerConfig`; add startup validation rules (ยง11) | `src/trx-server/src/config.rs` | diff --git a/src/trx-core/src/lib.rs b/src/trx-core/src/lib.rs index 1d780e7..70e8e92 100644 --- a/src/trx-core/src/lib.rs +++ b/src/trx-core/src/lib.rs @@ -10,6 +10,7 @@ pub mod rig; pub type DynResult = Result>; +pub use rig::AudioSource; pub use rig::command::RigCommand; pub use rig::request::RigRequest; pub use rig::response::{RigError, RigResult}; diff --git a/src/trx-core/src/rig/mod.rs b/src/trx-core/src/rig/mod.rs index 8710afc..dbfaf5f 100644 --- a/src/trx-core/src/rig/mod.rs +++ b/src/trx-core/src/rig/mod.rs @@ -57,6 +57,13 @@ fn default_min_freq_step_hz() -> u64 { 1 } +/// Trait for rigs that can provide demodulated PCM audio. +pub trait AudioSource: Send + Sync { + /// Subscribe to demodulated PCM audio from the primary channel. + /// Returns a broadcast receiver that yields 20ms frames of mono f32 PCM. + fn subscribe_pcm(&self) -> tokio::sync::broadcast::Receiver>; +} + /// Common interface for rig backends. pub trait Rig { fn info(&self) -> &RigInfo; @@ -103,6 +110,8 @@ pub trait RigCat: Rig + Send { fn lock<'a>(&'a mut self) -> Pin> + Send + 'a>>; fn unlock<'a>(&'a mut self) -> Pin> + Send + 'a>>; + + fn as_audio_source(&self) -> Option<&dyn AudioSource> { None } } /// Snapshot of a rig's status that every backend can expose.