From 412459bc910e097b11b5ea80b1c3b6f60f8c1fb8 Mon Sep 17 00:00:00 2001 From: Jan Svabenik Date: Thu, 19 Mar 2026 14:29:21 +0100 Subject: [PATCH] Unify recorder GPU demod fallback logic --- internal/recorder/demod.go | 34 ++------------------------------- internal/recorder/demod_live.go | 30 ++--------------------------- internal/recorder/gpu_audio.go | 26 +++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 60 deletions(-) create mode 100644 internal/recorder/gpu_audio.go diff --git a/internal/recorder/demod.go b/internal/recorder/demod.go index 7230caf..6de889a 100644 --- a/internal/recorder/demod.go +++ b/internal/recorder/demod.go @@ -8,7 +8,6 @@ import ( "sdr-visual-suite/internal/classifier" "sdr-visual-suite/internal/demod" - "sdr-visual-suite/internal/demod/gpudemod" "sdr-visual-suite/internal/detector" "sdr-visual-suite/internal/dsp" ) @@ -31,40 +30,11 @@ func (m *Manager) demodAndWrite(dir string, ev detector.Event, iq []complex64, f var inputRate int gpu := m.gpuEngine() if gpu != nil { - var gpuMode gpudemod.DemodType - var useGPU bool - switch name { - case "NFM": - gpuMode, useGPU = gpudemod.DemodNFM, true - case "WFM": - gpuMode, useGPU = gpudemod.DemodWFM, true - case "AM": - gpuMode, useGPU = gpudemod.DemodAM, true - case "USB": - gpuMode, useGPU = gpudemod.DemodUSB, true - case "LSB": - gpuMode, useGPU = gpudemod.DemodLSB, true - case "CW": - gpuMode, useGPU = gpudemod.DemodCW, true - } + gpuMode, useGPU := gpuModeFor(name) if useGPU { - if gpuAudio, gpuRate, err := gpu.DemodFused(iq, offset, bw, gpuMode); err == nil { + if gpuAudio, gpuRate, ok := tryGPUAudio(gpu, name, iq, offset, bw, gpuMode); ok { audio = gpuAudio inputRate = gpuRate - if gpu.LastDemodUsedGPU() { - log.Printf("gpudemod: fused GPU demod used for event %d (%s)", ev.ID, name) - } - } else { - log.Printf("gpudemod: fused GPU demod failed for event %d (%s): %v", ev.ID, name, err) - if gpuAudio, gpuRate, err := gpu.Demod(iq, offset, bw, gpuMode); err == nil { - audio = gpuAudio - inputRate = gpuRate - if gpu.LastDemodUsedGPU() { - log.Printf("gpudemod: legacy GPU demod used for event %d (%s)", ev.ID, name) - } - } else { - log.Printf("gpudemod: legacy GPU demod failed for event %d (%s): %v", ev.ID, name, err) - } } } } diff --git a/internal/recorder/demod_live.go b/internal/recorder/demod_live.go index e0f6cdd..e16d564 100644 --- a/internal/recorder/demod_live.go +++ b/internal/recorder/demod_live.go @@ -8,7 +8,6 @@ import ( "time" "sdr-visual-suite/internal/demod" - "sdr-visual-suite/internal/demod/gpudemod" "sdr-visual-suite/internal/dsp" ) @@ -48,36 +47,11 @@ func (m *Manager) DemodLive(centerHz float64, bw float64, mode string, seconds i var inputRate int gpu := m.gpuEngine() if gpu != nil { - var gpuMode gpudemod.DemodType - var useGPU bool - switch name { - case "NFM": - gpuMode, useGPU = gpudemod.DemodNFM, true - case "WFM": - gpuMode, useGPU = gpudemod.DemodWFM, true - case "AM": - gpuMode, useGPU = gpudemod.DemodAM, true - case "USB": - gpuMode, useGPU = gpudemod.DemodUSB, true - case "LSB": - gpuMode, useGPU = gpudemod.DemodLSB, true - case "CW": - gpuMode, useGPU = gpudemod.DemodCW, true - } + gpuMode, useGPU := gpuModeFor(name) if useGPU { - if gpuAudio, gpuRate, err := gpu.DemodFused(segment, offset, bw, gpuMode); err == nil { + if gpuAudio, gpuRate, ok := tryGPUAudio(gpu, name, segment, offset, bw, gpuMode); ok { audio = gpuAudio inputRate = gpuRate - log.Printf("gpudemod: fused GPU live demod used (%s)", name) - } else { - log.Printf("gpudemod: fused GPU live demod failed (%s): %v", name, err) - if gpuAudio, gpuRate, err := gpu.Demod(segment, offset, bw, gpuMode); err == nil { - audio = gpuAudio - inputRate = gpuRate - log.Printf("gpudemod: legacy GPU live demod used (%s)", name) - } else { - log.Printf("gpudemod: legacy GPU live demod failed (%s): %v", name, err) - } } } } diff --git a/internal/recorder/gpu_audio.go b/internal/recorder/gpu_audio.go new file mode 100644 index 0000000..7980c02 --- /dev/null +++ b/internal/recorder/gpu_audio.go @@ -0,0 +1,26 @@ +package recorder + +import ( + "log" + + "sdr-visual-suite/internal/demod/gpudemod" +) + +func tryGPUAudio(gpu *gpudemod.Engine, label string, iq []complex64, offset float64, bw float64, gpuMode gpudemod.DemodType) ([]float32, int, bool) { + if gpu == nil { + return nil, 0, false + } + if gpuAudio, gpuRate, err := gpu.DemodFused(iq, offset, bw, gpuMode); err == nil { + log.Printf("gpudemod: fused GPU demod used (%s)", label) + return gpuAudio, gpuRate, true + } else { + log.Printf("gpudemod: fused GPU demod failed (%s): %v", label, err) + } + if gpuAudio, gpuRate, err := gpu.Demod(iq, offset, bw, gpuMode); err == nil { + log.Printf("gpudemod: legacy GPU demod used (%s)", label) + return gpuAudio, gpuRate, true + } else { + log.Printf("gpudemod: legacy GPU demod failed (%s): %v", label, err) + } + return nil, 0, false +}