From 791c2c716d7fbf2e63964ebfdcd331bcefea643d Mon Sep 17 00:00:00 2001 From: Jan Svabenik Date: Thu, 19 Mar 2026 14:15:14 +0100 Subject: [PATCH] Use synchronized GPU engine access in recorder demod paths --- internal/recorder/demod.go | 11 ++++++----- internal/recorder/demod_live.go | 7 ++++--- internal/recorder/recorder.go | 6 ++++++ 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/internal/recorder/demod.go b/internal/recorder/demod.go index 57253ff..23741af 100644 --- a/internal/recorder/demod.go +++ b/internal/recorder/demod.go @@ -29,7 +29,8 @@ func (m *Manager) demodAndWrite(dir string, ev detector.Event, iq []complex64, f offset := ev.CenterHz - m.centerHz var audio []float32 var inputRate int - if m.gpuDemod != nil { + gpu := m.gpuEngine() + if gpu != nil { var gpuMode gpudemod.DemodType var useGPU bool switch name { @@ -47,18 +48,18 @@ func (m *Manager) demodAndWrite(dir string, ev detector.Event, iq []complex64, f gpuMode, useGPU = gpudemod.DemodCW, true } if useGPU { - if gpuAudio, gpuRate, err := m.gpuDemod.DemodFused(iq, offset, bw, gpuMode); err == nil { + if gpuAudio, gpuRate, err := gpu.DemodFused(iq, offset, bw, gpuMode); err == nil { audio = gpuAudio inputRate = gpuRate - if m.gpuDemod.LastDemodUsedGPU() { + 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 := m.gpuDemod.Demod(iq, offset, bw, gpuMode); err == nil { + if gpuAudio, gpuRate, err := gpu.Demod(iq, offset, bw, gpuMode); err == nil { audio = gpuAudio inputRate = gpuRate - if m.gpuDemod.LastDemodUsedGPU() { + if gpu.LastDemodUsedGPU() { log.Printf("gpudemod: legacy GPU demod used for event %d (%s)", ev.ID, name) } } else { diff --git a/internal/recorder/demod_live.go b/internal/recorder/demod_live.go index 0c473c0..d27ef3c 100644 --- a/internal/recorder/demod_live.go +++ b/internal/recorder/demod_live.go @@ -46,7 +46,8 @@ func (m *Manager) DemodLive(centerHz float64, bw float64, mode string, seconds i var audio []float32 var inputRate int - if m.gpuDemod != nil { + gpu := m.gpuEngine() + if gpu != nil { var gpuMode gpudemod.DemodType var useGPU bool switch name { @@ -64,13 +65,13 @@ func (m *Manager) DemodLive(centerHz float64, bw float64, mode string, seconds i gpuMode, useGPU = gpudemod.DemodCW, true } if useGPU { - if gpuAudio, gpuRate, err := m.gpuDemod.DemodFused(segment, offset, bw, gpuMode); err == nil { + if gpuAudio, gpuRate, err := gpu.DemodFused(segment, offset, bw, gpuMode); err == nil { 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 := m.gpuDemod.Demod(segment, offset, bw, gpuMode); err == nil { + 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) diff --git a/internal/recorder/recorder.go b/internal/recorder/recorder.go index 6c77ef7..88a7298 100644 --- a/internal/recorder/recorder.go +++ b/internal/recorder/recorder.go @@ -120,6 +120,12 @@ func (m *Manager) initGPUDemod(sampleRate int, blockSize int) { m.initGPUDemodLocked(sampleRate, blockSize) } +func (m *Manager) gpuEngine() *gpudemod.Engine { + m.mu.RLock() + defer m.mu.RUnlock() + return m.gpuDemod +} + func (m *Manager) initGPUDemodLocked(sampleRate int, blockSize int) { if m.gpuDemod != nil { m.gpuDemod.Close()