From 5443bf3f979bf4c6a2e5d17c2e03db4c7c525d28 Mon Sep 17 00:00:00 2001 From: Jan Svabenik Date: Tue, 17 Mar 2026 19:44:50 +0100 Subject: [PATCH] Flush IQ buffer on FFT reconfig --- cmd/sdrd/main.go | 4 ++++ internal/mock/source.go | 2 ++ internal/sdr/source.go | 4 ++++ internal/sdrplay/sdrplay.go | 10 ++++++++++ 4 files changed, 20 insertions(+) diff --git a/cmd/sdrd/main.go b/cmd/sdrd/main.go index 64a9580..e8b4a18 100644 --- a/cmd/sdrd/main.go +++ b/cmd/sdrd/main.go @@ -436,6 +436,10 @@ func runDSP(ctx context.Context, src sdr.Source, cfg config.Config, det *detecto dcEnabled = upd.dcBlock iqEnabled = upd.iqBalance if cfg.FFTSize != prevFFT || cfg.UseGPUFFT != prevUseGPU { + if flushable, ok := src.(sdr.Flushable); ok { + flushable.Flush() + } + gotSamples = false if gpuEngine != nil { gpuEngine.Close() gpuEngine = nil diff --git a/internal/mock/source.go b/internal/mock/source.go index 7481025..377559e 100644 --- a/internal/mock/source.go +++ b/internal/mock/source.go @@ -61,3 +61,5 @@ func (s *Source) ReadIQ(n int) ([]complex64, error) { func (s *Source) Stats() sdr.SourceStats { return sdr.SourceStats{} } + +func (s *Source) Flush() {} diff --git a/internal/sdr/source.go b/internal/sdr/source.go index 7f77969..9ed74d8 100644 --- a/internal/sdr/source.go +++ b/internal/sdr/source.go @@ -22,4 +22,8 @@ type StatsProvider interface { Stats() SourceStats } +type Flushable interface { + Flush() +} + var ErrNotImplemented = errors.New("sdrplay support not built; build with -tags sdrplay or use --mock") diff --git a/internal/sdrplay/sdrplay.go b/internal/sdrplay/sdrplay.go index c4029a7..72d37a8 100644 --- a/internal/sdrplay/sdrplay.go +++ b/internal/sdrplay/sdrplay.go @@ -287,6 +287,16 @@ func (s *Source) Stats() sdr.SourceStats { return sdr.SourceStats{BufferSamples: s.size, Dropped: s.dropped, Resets: s.resets} } +func (s *Source) Flush() { + s.mu.Lock() + s.head = 0 + s.size = 0 + s.mu.Unlock() + if s.cond != nil { + s.cond.Broadcast() + } +} + func min(a, b int) int { if a < b { return a