From c49b77d0f650e4e88d177e514a50ceeb3e00af1b Mon Sep 17 00:00:00 2001 From: Jan Svabenik Date: Thu, 19 Mar 2026 14:28:13 +0100 Subject: [PATCH] Route WFM stereo through explicit hybrid GPU/CPU demod path --- internal/recorder/demod.go | 6 +++++- internal/recorder/demod_helpers.go | 22 ++++++++++++++++++++++ internal/recorder/demod_live.go | 6 +++++- 3 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 internal/recorder/demod_helpers.go diff --git a/internal/recorder/demod.go b/internal/recorder/demod.go index 23741af..7230caf 100644 --- a/internal/recorder/demod.go +++ b/internal/recorder/demod.go @@ -69,7 +69,11 @@ func (m *Manager) demodAndWrite(dir string, ev detector.Event, iq []complex64, f } } if audio == nil { - log.Printf("gpudemod: CPU demod fallback used for event %d (%s)", ev.ID, name) + if name == "WFM_STEREO" { + log.Printf("gpudemod: WFM_STEREO using CPU stereo/RDS post-process for event %d", ev.ID) + } else { + log.Printf("gpudemod: CPU demod fallback used for event %d (%s)", ev.ID, name) + } shifted := dsp.FreqShift(iq, m.sampleRate, offset) cutoff := bw / 2 if cutoff < 200 { diff --git a/internal/recorder/demod_helpers.go b/internal/recorder/demod_helpers.go new file mode 100644 index 0000000..3f7421f --- /dev/null +++ b/internal/recorder/demod_helpers.go @@ -0,0 +1,22 @@ +package recorder + +import "sdr-visual-suite/internal/demod/gpudemod" + +func gpuModeFor(name string) (gpudemod.DemodType, bool) { + switch name { + case "NFM": + return gpudemod.DemodNFM, true + case "WFM", "WFM_STEREO": + return gpudemod.DemodWFM, true + case "AM": + return gpudemod.DemodAM, true + case "USB": + return gpudemod.DemodUSB, true + case "LSB": + return gpudemod.DemodLSB, true + case "CW": + return gpudemod.DemodCW, true + default: + return 0, false + } +} diff --git a/internal/recorder/demod_live.go b/internal/recorder/demod_live.go index d27ef3c..e0f6cdd 100644 --- a/internal/recorder/demod_live.go +++ b/internal/recorder/demod_live.go @@ -82,7 +82,11 @@ func (m *Manager) DemodLive(centerHz float64, bw float64, mode string, seconds i } } if audio == nil { - log.Printf("gpudemod: CPU live demod fallback used (%s)", name) + if name == "WFM_STEREO" { + log.Printf("gpudemod: WFM_STEREO live path using CPU stereo/RDS post-process") + } else { + log.Printf("gpudemod: CPU live demod fallback used (%s)", name) + } shifted := dsp.FreqShift(segment, m.sampleRate, offset) cutoff := bw / 2 if cutoff < 200 {