From 18583fe7bc556072e9714ec0446b0a0746ed6558 Mon Sep 17 00:00:00 2001 From: Jan Svabenik Date: Thu, 19 Mar 2026 15:02:09 +0100 Subject: [PATCH] Add shared hybrid helper for WFM stereo and RDS --- internal/recorder/demod.go | 17 +++++++++++------ internal/recorder/wfm_hybrid.go | 22 ++++++++++++++++++++++ 2 files changed, 33 insertions(+), 6 deletions(-) create mode 100644 internal/recorder/wfm_hybrid.go diff --git a/internal/recorder/demod.go b/internal/recorder/demod.go index ffecb86..09eb06a 100644 --- a/internal/recorder/demod.go +++ b/internal/recorder/demod.go @@ -36,13 +36,18 @@ func (m *Manager) demodAndWrite(dir string, ev detector.Event, iq []complex64, f } } } + var stereoHybrid *wfmHybridResult if audio == nil { if name == "WFM_STEREO" { log.Printf("gpudemod: WFM_STEREO using CPU stereo/RDS post-process for event %d", ev.ID) + res := demodWFMStereoHybrid(iq, m.sampleRate, offset, bw) + stereoHybrid = &res + audio = res.Audio + inputRate = res.AudioRate } else { log.Printf("gpudemod: CPU demod fallback used for event %d (%s)", ev.ID, name) + audio, inputRate = demodAudioCPU(d, iq, m.sampleRate, offset, bw) } - audio, inputRate = demodAudioCPU(d, iq, m.sampleRate, offset, bw) } wav := filepath.Join(dir, "audio.wav") if err := writeWAV(wav, audio, inputRate, d.Channels()); err != nil { @@ -52,14 +57,14 @@ func (m *Manager) demodAndWrite(dir string, ev detector.Event, iq []complex64, f files["audio_sample_rate"] = inputRate files["audio_channels"] = d.Channels() files["audio_demod"] = name - if name == "WFM_STEREO" { - if rds := demod.RDSBaseband(iq, m.sampleRate); len(rds) > 0 { + if name == "WFM_STEREO" && stereoHybrid != nil { + if len(stereoHybrid.RDS) > 0 { rdsPath := filepath.Join(dir, "rds.wav") - _ = writeWAV(rdsPath, rds, 2400, 1) + _ = writeWAV(rdsPath, stereoHybrid.RDS, stereoHybrid.RDSRate, 1) files["rds_baseband"] = "rds.wav" - files["rds_sample_rate"] = 2400 + files["rds_sample_rate"] = stereoHybrid.RDSRate dec := rdsdecoder{} - res := dec.Decode(rds, 2400) + res := dec.Decode(stereoHybrid.RDS, stereoHybrid.RDSRate) if res.PI != 0 { files["rds_pi"] = res.PI } diff --git a/internal/recorder/wfm_hybrid.go b/internal/recorder/wfm_hybrid.go new file mode 100644 index 0000000..48599f5 --- /dev/null +++ b/internal/recorder/wfm_hybrid.go @@ -0,0 +1,22 @@ +package recorder + +import "sdr-visual-suite/internal/demod" + +type wfmHybridResult struct { + Audio []float32 + AudioRate int + Channels int + RDS []float32 + RDSRate int +} + +func demodWFMStereoHybrid(iq []complex64, sampleRate int, offset float64, bw float64) wfmHybridResult { + audio, rate := demodAudioCPU(demod.Get("WFM_STEREO"), iq, sampleRate, offset, bw) + return wfmHybridResult{ + Audio: audio, + AudioRate: rate, + Channels: 2, + RDS: demod.RDSBaseband(iq, sampleRate), + RDSRate: 2400, + } +}