From fb74001e0939ac4d17c27c5e138376a83f389e12 Mon Sep 17 00:00:00 2001 From: Jan Svabenik Date: Sat, 21 Mar 2026 00:23:28 +0100 Subject: [PATCH] Refine streaming audio pipeline and UI --- cmd/sdrd/dsp_loop.go | 35 +- cmd/sdrd/helpers.go | 35 +- cmd/sdrd/hub.go | 172 +++++++- cmd/sdrd/main.go | 14 +- cmd/sdrd/types.go | 7 + cmd/sdrd/ws_handlers.go | 94 ++++- internal/config/config.go | 25 +- internal/demod/fm.go | 14 - internal/dsp/fir_stateful.go | 112 ++++++ internal/dsp/resample.go | 294 ++++++++++++++ internal/dsp/resample_test.go | 248 ++++++++++++ internal/recorder/recorder.go | 13 + internal/recorder/streamer.go | 721 ++++++++++++++++++++++++---------- sdr-visual-suite.rar | Bin 280293 -> 446395 bytes web/app.js | 294 +++++++++++++- web/style.css | 12 + 16 files changed, 1808 insertions(+), 282 deletions(-) create mode 100644 internal/dsp/fir_stateful.go create mode 100644 internal/dsp/resample.go create mode 100644 internal/dsp/resample_test.go diff --git a/cmd/sdrd/dsp_loop.go b/cmd/sdrd/dsp_loop.go index ecea970..6215219 100644 --- a/cmd/sdrd/dsp_loop.go +++ b/cmd/sdrd/dsp_loop.go @@ -97,7 +97,10 @@ func runDSP(ctx context.Context, srcMgr *sourceManager, cfg config.Config, det * MaxDiskMB: cfg.Recorder.MaxDiskMB, OutputDir: cfg.Recorder.OutputDir, ClassFilter: cfg.Recorder.ClassFilter, - RingSeconds: cfg.Recorder.RingSeconds, + RingSeconds: cfg.Recorder.RingSeconds, + DeemphasisUs: cfg.Recorder.DeemphasisUs, + ExtractionTaps: cfg.Recorder.ExtractionTaps, + ExtractionBwMult: cfg.Recorder.ExtractionBwMult, }, cfg.CenterHz, buildDecoderMap(cfg)) } if upd.det != nil { @@ -180,20 +183,25 @@ func runDSP(ctx context.Context, srcMgr *sourceManager, cfg config.Config, det * } var spectrum []float64 if useGPU && gpuEngine != nil { + // GPU FFT: apply window to a COPY — allIQ must stay unmodified + // for extractForStreaming which needs raw IQ for signal extraction. + gpuBuf := make([]complex64, len(iq)) if len(window) == len(iq) { for i := 0; i < len(iq); i++ { v := iq[i] w := float32(window[i]) - iq[i] = complex(real(v)*w, imag(v)*w) + gpuBuf[i] = complex(real(v)*w, imag(v)*w) } + } else { + copy(gpuBuf, iq) } - out, err := gpuEngine.Exec(iq) + out, err := gpuEngine.Exec(gpuBuf) if err != nil { if gpuState != nil { gpuState.set(false, err) } useGPU = false - spectrum = fftutil.SpectrumWithPlan(iq, nil, plan) + spectrum = fftutil.SpectrumWithPlan(gpuBuf, nil, plan) } else { spectrum = fftutil.SpectrumFromFFT(out) } @@ -322,11 +330,28 @@ func runDSP(ctx context.Context, srcMgr *sourceManager, cfg config.Config, det * } } + // Cleanup streamPhaseState for disappeared signals + if len(streamPhaseState) > 0 { + sigIDs := make(map[int64]bool, len(signals)) + for _, s := range signals { + sigIDs[s.ID] = true + } + for id := range streamPhaseState { + if !sigIDs[id] { + delete(streamPhaseState, id) + } + } + } + // GPU-extract signal snippets with phase-continuous FreqShift and // IQ overlap for FIR halo. Heavy work on GPU, only demod runs async. displaySignals = det.StableSignals() if rec != nil && len(displaySignals) > 0 && len(allIQ) > 0 { - streamSnips, streamRates := extractForStreaming(extractMgr, allIQ, cfg.SampleRate, cfg.CenterHz, displaySignals, streamPhaseState, streamOverlap) + aqCfg := extractionConfig{ + firTaps: cfg.Recorder.ExtractionTaps, + bwMult: cfg.Recorder.ExtractionBwMult, + } + streamSnips, streamRates := extractForStreaming(extractMgr, allIQ, cfg.SampleRate, cfg.CenterHz, displaySignals, streamPhaseState, streamOverlap, aqCfg) items := make([]recorder.StreamFeedItem, 0, len(displaySignals)) for j, ds := range displaySignals { if ds.ID == 0 || ds.Class == nil { diff --git a/cmd/sdrd/helpers.go b/cmd/sdrd/helpers.go index 24cad26..ae1f777 100644 --- a/cmd/sdrd/helpers.go +++ b/cmd/sdrd/helpers.go @@ -214,7 +214,13 @@ type streamIQOverlap struct { tail []complex64 } -const streamOverlapLen = 512 // must be >= FIR tap count (101) with margin +// extractionConfig holds audio quality settings for signal extraction. +type extractionConfig struct { + firTaps int // AQ-3: FIR tap count (default 101) + bwMult float64 // AQ-5: BW multiplier (default 1.2) +} + +const streamOverlapLen = 512 // must be >= FIR tap count with margin // extractForStreaming performs GPU-accelerated extraction with: // - Per-signal phase-continuous FreqShift (via PhaseStart in ExtractJob) @@ -229,6 +235,7 @@ func extractForStreaming( signals []detector.Signal, phaseState map[int64]*streamExtractState, overlap *streamIQOverlap, + aqCfg extractionConfig, ) ([][]complex64, []int) { out := make([][]complex64, len(signals)) rates := make([]int, len(signals)) @@ -236,6 +243,12 @@ func extractForStreaming( return out, rates } + // AQ-3: Use configured overlap length (must cover FIR taps) + overlapNeeded := streamOverlapLen + if aqCfg.firTaps > 0 && aqCfg.firTaps+64 > overlapNeeded { + overlapNeeded = aqCfg.firTaps + 64 + } + // Prepend overlap from previous frame so FIR kernel has real halo data var gpuIQ []complex64 overlapLen := len(overlap.tail) @@ -248,19 +261,25 @@ func extractForStreaming( overlapLen = 0 } - // Save tail for next frame - if len(allIQ) > streamOverlapLen { - overlap.tail = append(overlap.tail[:0], allIQ[len(allIQ)-streamOverlapLen:]...) + // Save tail for next frame (sized to cover configured FIR taps) + if len(allIQ) > overlapNeeded { + overlap.tail = append(overlap.tail[:0], allIQ[len(allIQ)-overlapNeeded:]...) } else { overlap.tail = append(overlap.tail[:0], allIQ...) } decimTarget := 200000 + // AQ-5: BW multiplier for extraction (wider = better S/N for weak signals) + bwMult := aqCfg.bwMult + if bwMult <= 0 { + bwMult = 1.0 + } + // Build jobs with per-signal phase jobs := make([]gpudemod.ExtractJob, len(signals)) for i, sig := range signals { - bw := sig.BWHz + bw := sig.BWHz * bwMult // AQ-5: widen extraction BW sigMHz := sig.CenterHz / 1e6 isWFM := (sigMHz >= 87.5 && sigMHz <= 108.0) || (sig.Class != nil && (sig.Class.ModType == "WFM" || sig.Class.ModType == "WFM_STEREO")) @@ -352,7 +371,11 @@ func extractForStreaming( if cutoff > float64(sampleRate)/2-1 { cutoff = float64(sampleRate)/2 - 1 } - taps := dsp.LowpassFIR(cutoff, sampleRate, 101) + firTaps := 101 + if aqCfg.firTaps > 0 { + firTaps = aqCfg.firTaps + } + taps := dsp.LowpassFIR(cutoff, sampleRate, firTaps) filtered := dsp.ApplyFIR(shifted, taps) decim := sampleRate / decimTarget if decim < 1 { diff --git a/cmd/sdrd/hub.go b/cmd/sdrd/hub.go index 382b398..70f1954 100644 --- a/cmd/sdrd/hub.go +++ b/cmd/sdrd/hub.go @@ -1,8 +1,10 @@ package main import ( + "encoding/binary" "encoding/json" "log" + "math" "time" "sdr-visual-suite/internal/detector" @@ -57,11 +59,15 @@ func (h *hub) remove(c *client) { } func (h *hub) broadcast(frame SpectrumFrame) { - b, err := json.Marshal(frame) - if err != nil { - log.Printf("marshal frame: %v", err) - return + // Pre-encode JSON for legacy clients (only if needed) + var jsonBytes []byte + // Pre-encode binary for binary clients at various decimation levels + // We cache per unique maxBins value to avoid re-encoding + type binCacheEntry struct { + bins int + data []byte } + var binCache []binCacheEntry h.mu.Lock() clients := make([]*client, 0, len(h.clients)) @@ -71,15 +77,165 @@ func (h *hub) broadcast(frame SpectrumFrame) { h.mu.Unlock() for _, c := range clients { - select { - case c.send <- b: - default: - h.remove(c) + // Frame rate limiting + if c.targetFps > 0 && c.frameSkip > 1 { + c.frameN++ + if c.frameN%c.frameSkip != 0 { + continue + } + } + + if c.binary { + // Find or create cached binary encoding for this bin count + bins := c.maxBins + if bins <= 0 || bins >= len(frame.Spectrum) { + bins = len(frame.Spectrum) + } + var encoded []byte + for _, entry := range binCache { + if entry.bins == bins { + encoded = entry.data + break + } + } + if encoded == nil { + encoded = encodeBinaryFrame(frame, bins) + binCache = append(binCache, binCacheEntry{bins: bins, data: encoded}) + } + select { + case c.send <- encoded: + default: + h.remove(c) + } + } else { + // JSON path (legacy) + if jsonBytes == nil { + var err error + jsonBytes, err = json.Marshal(frame) + if err != nil { + log.Printf("marshal frame: %v", err) + return + } + } + select { + case c.send <- jsonBytes: + default: + h.remove(c) + } } } + h.frameCnt++ if time.Since(h.lastLogTs) > 2*time.Second { h.lastLogTs = time.Now() log.Printf("broadcast frames=%d clients=%d", h.frameCnt, len(clients)) } } + +// --------------------------------------------------------------------------- +// Binary spectrum protocol v4 +// --------------------------------------------------------------------------- +// +// Hybrid approach: spectrum data as compact binary, signals + debug as JSON. +// +// Layout (32-byte header): +// [0:1] magic: 0x53 0x50 ("SP") +// [2:3] version: uint16 LE = 4 +// [4:11] timestamp: int64 LE (Unix millis) +// [12:19] center_hz: float64 LE +// [20:23] bin_count: uint32 LE (supports FFT up to 4 billion) +// [24:27] sample_rate_hz: uint32 LE (Hz, max ~4.29 GHz) +// [28:31] json_offset: uint32 LE (byte offset where JSON starts) +// +// [32 .. 32+bins*2-1] spectrum: int16 LE, dB × 100 +// [json_offset ..] JSON: {"signals":[...],"debug":{...}} + +const binaryHeaderSize = 32 + +func encodeBinaryFrame(frame SpectrumFrame, targetBins int) []byte { + spectrum := frame.Spectrum + srcBins := len(spectrum) + if targetBins <= 0 || targetBins > srcBins { + targetBins = srcBins + } + + var decimated []float64 + if targetBins < srcBins && targetBins > 0 { + decimated = decimateSpectrum(spectrum, targetBins) + } else { + decimated = spectrum + targetBins = srcBins + } + + // JSON-encode signals + debug (full fidelity) + jsonPart, _ := json.Marshal(struct { + Signals []detector.Signal `json:"signals"` + Debug *SpectrumDebug `json:"debug,omitempty"` + }{ + Signals: frame.Signals, + Debug: frame.Debug, + }) + + specBytes := targetBins * 2 + jsonOffset := uint32(binaryHeaderSize + specBytes) + totalSize := int(jsonOffset) + len(jsonPart) + buf := make([]byte, totalSize) + + // Header + buf[0] = 0x53 // 'S' + buf[1] = 0x50 // 'P' + binary.LittleEndian.PutUint16(buf[2:4], 4) // version 4 + binary.LittleEndian.PutUint64(buf[4:12], uint64(frame.Timestamp)) + binary.LittleEndian.PutUint64(buf[12:20], math.Float64bits(frame.CenterHz)) + binary.LittleEndian.PutUint32(buf[20:24], uint32(targetBins)) + binary.LittleEndian.PutUint32(buf[24:28], uint32(frame.SampleHz)) + binary.LittleEndian.PutUint32(buf[28:32], jsonOffset) + + // Spectrum (int16, dB × 100) + off := binaryHeaderSize + for i := 0; i < targetBins; i++ { + v := decimated[i] * 100 + if v > 32767 { + v = 32767 + } else if v < -32767 { + v = -32767 + } + binary.LittleEndian.PutUint16(buf[off:off+2], uint16(int16(v))) + off += 2 + } + + // JSON signals + debug + copy(buf[jsonOffset:], jsonPart) + + return buf +} + +// decimateSpectrum reduces bins via peak-hold within each group. +func decimateSpectrum(spectrum []float64, targetBins int) []float64 { + src := len(spectrum) + out := make([]float64, targetBins) + ratio := float64(src) / float64(targetBins) + for i := 0; i < targetBins; i++ { + lo := int(float64(i) * ratio) + hi := int(float64(i+1) * ratio) + if hi > src { + hi = src + } + if lo >= hi { + if lo < src { + out[i] = spectrum[lo] + } + continue + } + peak := spectrum[lo] + for j := lo + 1; j < hi; j++ { + if spectrum[j] > peak { + peak = spectrum[j] + } + } + out[i] = peak + } + return out +} + + diff --git a/cmd/sdrd/main.go b/cmd/sdrd/main.go index ed2f03a..3c7f450 100644 --- a/cmd/sdrd/main.go +++ b/cmd/sdrd/main.go @@ -8,6 +8,7 @@ import ( "os" "os/signal" "path/filepath" + "runtime/debug" "sync" "syscall" "time" @@ -24,6 +25,14 @@ import ( ) func main() { + // Reduce GC target to limit peak memory. Default GOGC=100 lets heap + // grow to 2× live set before collecting. GOGC=50 triggers GC at 1.5×, + // halving the memory swings at a small CPU cost. + debug.SetGCPercent(50) + // Soft memory limit — GC will be more aggressive near this limit. + // 1 GB is generous for 5 WFM-stereo signals + FFT + recordings. + debug.SetMemoryLimit(1024 * 1024 * 1024) + var cfgPath string var mockFlag bool flag.StringVar(&cfgPath, "config", "config.yaml", "path to config YAML") @@ -100,7 +109,10 @@ func main() { MaxDiskMB: cfg.Recorder.MaxDiskMB, OutputDir: cfg.Recorder.OutputDir, ClassFilter: cfg.Recorder.ClassFilter, - RingSeconds: cfg.Recorder.RingSeconds, + RingSeconds: cfg.Recorder.RingSeconds, + DeemphasisUs: cfg.Recorder.DeemphasisUs, + ExtractionTaps: cfg.Recorder.ExtractionTaps, + ExtractionBwMult: cfg.Recorder.ExtractionBwMult, }, cfg.CenterHz, decodeMap) defer recMgr.Close() diff --git a/cmd/sdrd/types.go b/cmd/sdrd/types.go index 7ef59dc..b4be0af 100644 --- a/cmd/sdrd/types.go +++ b/cmd/sdrd/types.go @@ -33,6 +33,13 @@ type client struct { send chan []byte done chan struct{} closeOnce sync.Once + + // Per-client settings (set via initial config message) + binary bool // send binary spectrum frames instead of JSON + maxBins int // target bin count (0 = full resolution) + targetFps int // target frame rate (0 = full rate) + frameSkip int // skip counter: send every N-th frame + frameN int // current frame counter } type hub struct { diff --git a/cmd/sdrd/ws_handlers.go b/cmd/sdrd/ws_handlers.go index d5eb2da..f71b575 100644 --- a/cmd/sdrd/ws_handlers.go +++ b/cmd/sdrd/ws_handlers.go @@ -27,7 +27,25 @@ func registerWSHandlers(mux *http.ServeMux, h *hub, recMgr *recorder.Manager) { log.Printf("ws upgrade failed: %v (origin: %s)", err, r.Header.Get("Origin")) return } - c := &client{conn: conn, send: make(chan []byte, 32), done: make(chan struct{})} + + // Parse query params for remote clients: ?binary=1&bins=2048&fps=5 + q := r.URL.Query() + c := &client{conn: conn, send: make(chan []byte, 64), done: make(chan struct{})} + if q.Get("binary") == "1" || q.Get("binary") == "true" { + c.binary = true + } + if v, err := strconv.Atoi(q.Get("bins")); err == nil && v > 0 { + c.maxBins = v + } + if v, err := strconv.Atoi(q.Get("fps")); err == nil && v > 0 { + c.targetFps = v + // frameSkip: if server runs at ~15fps and client wants 5fps → skip 3 + c.frameSkip = 15 / v + if c.frameSkip < 1 { + c.frameSkip = 1 + } + } + h.add(c) defer func() { h.remove(c) @@ -47,24 +65,56 @@ func registerWSHandlers(mux *http.ServeMux, h *hub, recMgr *recorder.Manager) { if !ok { return } - _ = conn.SetWriteDeadline(time.Now().Add(200 * time.Millisecond)) - if err := conn.WriteMessage(websocket.TextMessage, msg); err != nil { + // Binary frames can be large (130KB+) — need more time + deadline := 500 * time.Millisecond + if !c.binary { + deadline = 200 * time.Millisecond + } + _ = conn.SetWriteDeadline(time.Now().Add(deadline)) + msgType := websocket.TextMessage + if c.binary { + msgType = websocket.BinaryMessage + } + if err := conn.WriteMessage(msgType, msg); err != nil { return } case <-ping.C: _ = conn.SetWriteDeadline(time.Now().Add(5 * time.Second)) if err := conn.WriteMessage(websocket.PingMessage, nil); err != nil { - log.Printf("ws ping error: %v", err) return } + case <-c.done: + return } } }() + // Read loop: handle config messages from client + keep-alive for { - _, _, err := conn.ReadMessage() + _, msg, err := conn.ReadMessage() if err != nil { return } + // Try to parse as client config update + var cfg struct { + Binary *bool `json:"binary,omitempty"` + Bins *int `json:"bins,omitempty"` + FPS *int `json:"fps,omitempty"` + } + if json.Unmarshal(msg, &cfg) == nil { + if cfg.Binary != nil { + c.binary = *cfg.Binary + } + if cfg.Bins != nil && *cfg.Bins > 0 { + c.maxBins = *cfg.Bins + } + if cfg.FPS != nil && *cfg.FPS > 0 { + c.targetFps = *cfg.FPS + c.frameSkip = 15 / *cfg.FPS + if c.frameSkip < 1 { + c.frameSkip = 1 + } + } + } } }) @@ -90,9 +140,12 @@ func registerWSHandlers(mux *http.ServeMux, h *hub, recMgr *recorder.Manager) { return } - subID, ch := streamer.SubscribeAudio(freq, bw, mode) - if ch == nil { - http.Error(w, "no active stream for this frequency", http.StatusNotFound) + // LL-3: Subscribe BEFORE upgrading WebSocket. + // SubscribeAudio now returns AudioInfo and never immediately closes + // the channel — it queues pending listeners instead. + subID, ch, audioInfo, err := streamer.SubscribeAudio(freq, bw, mode) + if err != nil { + http.Error(w, err.Error(), http.StatusServiceUnavailable) return } @@ -109,12 +162,13 @@ func registerWSHandlers(mux *http.ServeMux, h *hub, recMgr *recorder.Manager) { log.Printf("ws/audio: client connected freq=%.1fMHz mode=%s", freq/1e6, mode) - // Send audio stream info as first text message + // LL-2: Send actual audio info (channels, sample rate from session) info := map[string]any{ "type": "audio_info", - "sample_rate": 48000, - "channels": 1, - "format": "s16le", + "sample_rate": audioInfo.SampleRate, + "channels": audioInfo.Channels, + "format": audioInfo.Format, + "demod": audioInfo.DemodName, "freq": freq, "mode": mode, } @@ -139,13 +193,25 @@ func registerWSHandlers(mux *http.ServeMux, h *hub, recMgr *recorder.Manager) { for { select { - case pcm, ok := <-ch: + case data, ok := <-ch: if !ok { log.Printf("ws/audio: stream ended freq=%.1fMHz", freq/1e6) return } + if len(data) == 0 { + continue + } _ = conn.SetWriteDeadline(time.Now().Add(500 * time.Millisecond)) - if err := conn.WriteMessage(websocket.BinaryMessage, pcm); err != nil { + // Tag protocol: first byte is message type + // 0x00 = AudioInfo JSON (send as TextMessage, strip tag) + // 0x01 = PCM audio (send as BinaryMessage, strip tag) + tag := data[0] + payload := data[1:] + msgType := websocket.BinaryMessage + if tag == 0x00 { + msgType = websocket.TextMessage + } + if err := conn.WriteMessage(msgType, payload); err != nil { log.Printf("ws/audio: write error: %v", err) return } diff --git a/internal/config/config.go b/internal/config/config.go index 3fde881..110b038 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -54,6 +54,11 @@ type RecorderConfig struct { OutputDir string `yaml:"output_dir" json:"output_dir"` ClassFilter []string `yaml:"class_filter" json:"class_filter"` RingSeconds int `yaml:"ring_seconds" json:"ring_seconds"` + + // Audio quality settings (AQ-2, AQ-3, AQ-5) + DeemphasisUs float64 `yaml:"deemphasis_us" json:"deemphasis_us"` // De-emphasis time constant in µs. 50=Europe, 75=US/Japan, 0=disabled. Default: 50 + ExtractionTaps int `yaml:"extraction_fir_taps" json:"extraction_fir_taps"` // FIR tap count for extraction filter. Default: 101, max 301 + ExtractionBwMult float64 `yaml:"extraction_bw_mult" json:"extraction_bw_mult"` // BW multiplier for extraction. Default: 1.2 (20% wider than detected) } type DecoderConfig struct { @@ -136,7 +141,10 @@ func Default() Config { AutoDecode: false, MaxDiskMB: 0, OutputDir: "data/recordings", - RingSeconds: 8, + RingSeconds: 8, + DeemphasisUs: 50, + ExtractionTaps: 101, + ExtractionBwMult: 1.2, }, Decoder: DecoderConfig{}, WebAddr: ":8080", @@ -271,6 +279,21 @@ func applyDefaults(cfg Config) Config { if cfg.Recorder.RingSeconds <= 0 { cfg.Recorder.RingSeconds = 8 } + if cfg.Recorder.DeemphasisUs == 0 { + cfg.Recorder.DeemphasisUs = 50 + } + if cfg.Recorder.ExtractionTaps <= 0 { + cfg.Recorder.ExtractionTaps = 101 + } + if cfg.Recorder.ExtractionTaps > 301 { + cfg.Recorder.ExtractionTaps = 301 + } + if cfg.Recorder.ExtractionTaps%2 == 0 { + cfg.Recorder.ExtractionTaps++ // must be odd + } + if cfg.Recorder.ExtractionBwMult <= 0 { + cfg.Recorder.ExtractionBwMult = 1.2 + } return cfg } diff --git a/internal/demod/fm.go b/internal/demod/fm.go index 18d1be1..224dec0 100644 --- a/internal/demod/fm.go +++ b/internal/demod/fm.go @@ -138,20 +138,6 @@ func RDSBasebandDecimated(iq []complex64, sampleRate int) RDSBasebandResult { return RDSBasebandResult{Samples: out, SampleRate: res.SampleRate} } -func deemphasis(x []float32, sampleRate int, tau float64) []float32 { - if len(x) == 0 || sampleRate <= 0 { - return x - } - alpha := math.Exp(-1.0 / (float64(sampleRate) * tau)) - out := make([]float32, len(x)) - var y float64 - for i, v := range x { - y = alpha*y + (1-alpha)*float64(v) - out[i] = float32(y) - } - return out -} - func init() { Register(NFM{}) Register(WFM{}) diff --git a/internal/dsp/fir_stateful.go b/internal/dsp/fir_stateful.go new file mode 100644 index 0000000..92aec67 --- /dev/null +++ b/internal/dsp/fir_stateful.go @@ -0,0 +1,112 @@ +package dsp + +// StatefulFIRReal is a real-valued FIR filter that preserves its delay line +// between calls to Process(). This eliminates click/pop artifacts at frame +// boundaries in streaming audio pipelines. +type StatefulFIRReal struct { + taps []float64 + delay []float64 + pos int // write position in circular delay buffer +} + +// NewStatefulFIRReal creates a stateful FIR filter with the given taps. +func NewStatefulFIRReal(taps []float64) *StatefulFIRReal { + t := make([]float64, len(taps)) + copy(t, taps) + return &StatefulFIRReal{ + taps: t, + delay: make([]float64, len(taps)), + } +} + +// Process filters the input through the FIR with persistent state. +// Allocates a new output slice. For zero-alloc hot paths, use ProcessInto. +func (f *StatefulFIRReal) Process(x []float32) []float32 { + out := make([]float32, len(x)) + f.ProcessInto(x, out) + return out +} + +// ProcessInto filters into a pre-allocated output buffer. +func (f *StatefulFIRReal) ProcessInto(x []float32, out []float32) []float32 { + if len(x) == 0 || len(f.taps) == 0 { + return out[:0] + } + n := len(f.taps) + for i := 0; i < len(x); i++ { + copy(f.delay[1:], f.delay[:n-1]) + f.delay[0] = float64(x[i]) + + var acc float64 + for k := 0; k < n; k++ { + acc += f.delay[k] * f.taps[k] + } + out[i] = float32(acc) + } + return out[:len(x)] +} + +// Reset clears the delay line. +func (f *StatefulFIRReal) Reset() { + for i := range f.delay { + f.delay[i] = 0 + } +} + +// StatefulFIRComplex is a complex-valued FIR filter with persistent state. +type StatefulFIRComplex struct { + taps []float64 + delayR []float64 + delayI []float64 +} + +// NewStatefulFIRComplex creates a stateful complex FIR filter. +func NewStatefulFIRComplex(taps []float64) *StatefulFIRComplex { + t := make([]float64, len(taps)) + copy(t, taps) + return &StatefulFIRComplex{ + taps: t, + delayR: make([]float64, len(taps)), + delayI: make([]float64, len(taps)), + } +} + +// Process filters complex IQ through the FIR with persistent state. +// Allocates a new output slice. For zero-alloc hot paths, use ProcessInto. +func (f *StatefulFIRComplex) Process(iq []complex64) []complex64 { + out := make([]complex64, len(iq)) + f.ProcessInto(iq, out) + return out +} + +// ProcessInto filters complex IQ into a pre-allocated output buffer. +// out must be at least len(iq) long. Returns the used portion of out. +func (f *StatefulFIRComplex) ProcessInto(iq []complex64, out []complex64) []complex64 { + if len(iq) == 0 || len(f.taps) == 0 { + return out[:0] + } + n := len(f.taps) + for i := 0; i < len(iq); i++ { + copy(f.delayR[1:], f.delayR[:n-1]) + copy(f.delayI[1:], f.delayI[:n-1]) + f.delayR[0] = float64(real(iq[i])) + f.delayI[0] = float64(imag(iq[i])) + + var accR, accI float64 + for k := 0; k < n; k++ { + w := f.taps[k] + accR += f.delayR[k] * w + accI += f.delayI[k] * w + } + out[i] = complex(float32(accR), float32(accI)) + } + return out[:len(iq)] +} + +// Reset clears the delay line. +func (f *StatefulFIRComplex) Reset() { + for i := range f.delayR { + f.delayR[i] = 0 + f.delayI[i] = 0 + } +} diff --git a/internal/dsp/resample.go b/internal/dsp/resample.go new file mode 100644 index 0000000..50735d0 --- /dev/null +++ b/internal/dsp/resample.go @@ -0,0 +1,294 @@ +package dsp + +import "math" + +// --------------------------------------------------------------------------- +// Rational Polyphase Resampler +// --------------------------------------------------------------------------- +// +// Converts sample rate by a rational factor L/M (upsample by L, then +// downsample by M) using a polyphase FIR implementation. The polyphase +// decomposition avoids computing intermediate upsampled samples that +// would be discarded, making it efficient even for large L/M. +// +// The resampler is stateful: it preserves its internal delay line and +// phase index between calls to Process(), enabling click-free streaming +// across frame boundaries. +// +// Usage: +// +// r := dsp.NewResampler(51200, 48000, 64) // 64 taps per phase +// for each frame { +// out := r.Process(audio) // or r.ProcessStereo(interleaved) +// } +// +// --------------------------------------------------------------------------- + +// Resampler performs rational polyphase sample rate conversion. +type Resampler struct { + l int // upsample factor + m int // downsample factor + tapsPerPh int // taps per polyphase arm + polyBank [][]float64 // polyBank[phase][tap] + delay []float64 // delay line, length = tapsPerPh + // outTime is the position (in upsampled-rate units) of the next output + // sample, relative to the next input sample to be consumed. It is + // always in [0, L). Between calls it persists so that the fractional + // position is perfectly continuous. + outTime int +} + +// NewResampler creates a polyphase resampler converting from inRate to +// outRate. tapsPerPhase controls the filter quality (16 = basic, 32 = +// good, 64 = high quality). The total prototype filter length is +// L * tapsPerPhase. +func NewResampler(inRate, outRate, tapsPerPhase int) *Resampler { + if inRate <= 0 || outRate <= 0 { + inRate, outRate = 1, 1 + } + if tapsPerPhase < 4 { + tapsPerPhase = 4 + } + + g := gcd(inRate, outRate) + l := outRate / g // upsample factor + m := inRate / g // downsample factor + + // Prototype lowpass: cutoff at min(1/L, 1/M) * Nyquist of the + // upsampled rate, with some margin for the transition band. + protoLen := l * tapsPerPhase + if protoLen%2 == 0 { + protoLen++ // ensure odd length for symmetric filter + } + + // Normalized cutoff: passband edge relative to upsampled rate + fc := 0.45 / float64(max(l, m)) // 0.45 instead of 0.5 for transition margin + proto := windowedSinc(protoLen, fc, float64(l)) + + // Decompose prototype into L polyphase arms + actualTapsPerPh := (protoLen + l - 1) / l + bank := make([][]float64, l) + for p := 0; p < l; p++ { + arm := make([]float64, actualTapsPerPh) + for t := 0; t < actualTapsPerPh; t++ { + idx := p + t*l + if idx < protoLen { + arm[t] = proto[idx] + } + } + bank[p] = arm + } + + return &Resampler{ + l: l, + m: m, + tapsPerPh: actualTapsPerPh, + polyBank: bank, + delay: make([]float64, actualTapsPerPh), + outTime: 0, + } +} + +// Process resamples a mono float32 buffer and returns the resampled output. +// State is preserved between calls for seamless streaming. +// +// The key insight: we conceptually interleave L-1 zeros between each input +// sample (upsampled rate = L * Fs_in), then pick every M-th sample from +// the filtered result (output rate = L/M * Fs_in). +// +// outTime tracks the sub-sample position of the next output within the +// current input sample's L phases. When outTime wraps past L, we consume +// the next input sample. This single counter gives exact, chunk-independent +// output. +func (r *Resampler) Process(in []float32) []float32 { + if len(in) == 0 { + return nil + } + if r.l == r.m { + out := make([]float32, len(in)) + copy(out, in) + return out + } + + L := r.l + M := r.m + taps := r.tapsPerPh + estOut := int(float64(len(in))*float64(L)/float64(M)) + 4 + out := make([]float32, 0, estOut) + + inPos := 0 + t := r.outTime + + for inPos < len(in) { + // Consume input samples until outTime < L + for t >= L { + t -= L + if inPos >= len(in) { + r.outTime = t + return out + } + copy(r.delay[1:], r.delay[:taps-1]) + r.delay[0] = float64(in[inPos]) + inPos++ + } + + // Produce output at phase = t + arm := r.polyBank[t] + var acc float64 + for k := 0; k < taps; k++ { + acc += r.delay[k] * arm[k] + } + out = append(out, float32(acc)) + + // Advance to next output position + t += M + } + + r.outTime = t + return out +} + +// Reset clears the delay line and phase state. +func (r *Resampler) Reset() { + for i := range r.delay { + r.delay[i] = 0 + } + r.outTime = 0 +} + +// OutputRate returns the effective output sample rate given an input rate. +func (r *Resampler) OutputRate(inRate int) int { + return inRate * r.l / r.m +} + +// Ratio returns L and M. +func (r *Resampler) Ratio() (int, int) { + return r.l, r.m +} + +// --------------------------------------------------------------------------- +// StereoResampler — two synchronised mono resamplers +// --------------------------------------------------------------------------- + +// StereoResampler wraps two Resampler instances sharing the same L/M ratio +// for click-free stereo resampling with independent delay lines. +type StereoResampler struct { + left *Resampler + right *Resampler +} + +// NewStereoResampler creates a pair of synchronised resamplers. +func NewStereoResampler(inRate, outRate, tapsPerPhase int) *StereoResampler { + return &StereoResampler{ + left: NewResampler(inRate, outRate, tapsPerPhase), + right: NewResampler(inRate, outRate, tapsPerPhase), + } +} + +// Process takes interleaved stereo [L0,R0,L1,R1,...] and returns +// resampled interleaved stereo. +func (sr *StereoResampler) Process(in []float32) []float32 { + nFrames := len(in) / 2 + if nFrames == 0 { + return nil + } + left := make([]float32, nFrames) + right := make([]float32, nFrames) + for i := 0; i < nFrames; i++ { + left[i] = in[i*2] + if i*2+1 < len(in) { + right[i] = in[i*2+1] + } + } + + outL := sr.left.Process(left) + outR := sr.right.Process(right) + + // Interleave — use shorter length if they differ by 1 sample + n := len(outL) + if len(outR) < n { + n = len(outR) + } + out := make([]float32, n*2) + for i := 0; i < n; i++ { + out[i*2] = outL[i] + out[i*2+1] = outR[i] + } + return out +} + +// Reset clears both delay lines. +func (sr *StereoResampler) Reset() { + sr.left.Reset() + sr.right.Reset() +} + +// OutputRate returns the resampled output rate. +func (sr *StereoResampler) OutputRate(inRate int) int { + return sr.left.OutputRate(inRate) +} + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +func gcd(a, b int) int { + for b != 0 { + a, b = b, a%b + } + if a < 0 { + return -a + } + return a +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} + +// windowedSinc generates a windowed-sinc prototype lowpass filter. +// fc is the normalised cutoff (0..0.5 of the upsampled rate). +// gain is the scaling factor (= L for polyphase interpolation). +func windowedSinc(length int, fc float64, gain float64) []float64 { + out := make([]float64, length) + mid := float64(length-1) / 2.0 + for n := 0; n < length; n++ { + x := float64(n) - mid + // Sinc + var s float64 + if math.Abs(x) < 1e-12 { + s = 2 * math.Pi * fc + } else { + s = math.Sin(2*math.Pi*fc*x) / x + } + // Kaiser window (beta=6 gives ~-60dB sidelobe, good for audio) + w := kaiserWindow(n, length, 6.0) + out[n] = s * w * gain + } + return out +} + +// kaiserWindow computes the Kaiser window value for sample n of N total. +func kaiserWindow(n, N int, beta float64) float64 { + mid := float64(N-1) / 2.0 + x := (float64(n) - mid) / mid + return bessel0(beta*math.Sqrt(1-x*x)) / bessel0(beta) +} + +// bessel0 is the zeroth-order modified Bessel function of the first kind. +func bessel0(x float64) float64 { + // Series expansion — converges rapidly for typical beta values + sum := 1.0 + term := 1.0 + for k := 1; k < 30; k++ { + term *= (x / (2 * float64(k))) * (x / (2 * float64(k))) + sum += term + if term < 1e-12*sum { + break + } + } + return sum +} diff --git a/internal/dsp/resample_test.go b/internal/dsp/resample_test.go new file mode 100644 index 0000000..5a263e9 --- /dev/null +++ b/internal/dsp/resample_test.go @@ -0,0 +1,248 @@ +package dsp + +import ( + "math" + "testing" +) + +func TestGCD(t *testing.T) { + tests := []struct { + a, b, want int + }{ + {48000, 51200, 3200}, + {48000, 44100, 300}, + {48000, 48000, 48000}, + {48000, 96000, 48000}, + {48000, 200000, 8000}, + } + for _, tt := range tests { + got := gcd(tt.a, tt.b) + if got != tt.want { + t.Errorf("gcd(%d, %d) = %d, want %d", tt.a, tt.b, got, tt.want) + } + } +} + +func TestResamplerRatio(t *testing.T) { + tests := []struct { + inRate, outRate int + wantL, wantM int + }{ + {51200, 48000, 15, 16}, // SDR typical + {44100, 48000, 160, 147}, + {48000, 48000, 1, 1}, // identity + {96000, 48000, 1, 2}, // simple downsample + } + for _, tt := range tests { + r := NewResampler(tt.inRate, tt.outRate, 32) + l, m := r.Ratio() + if l != tt.wantL || m != tt.wantM { + t.Errorf("NewResampler(%d, %d): ratio = %d/%d, want %d/%d", + tt.inRate, tt.outRate, l, m, tt.wantL, tt.wantM) + } + } +} + +func TestResamplerIdentity(t *testing.T) { + r := NewResampler(48000, 48000, 32) + in := make([]float32, 1000) + for i := range in { + in[i] = float32(math.Sin(2 * math.Pi * 440 * float64(i) / 48000)) + } + out := r.Process(in) + if len(out) != len(in) { + t.Fatalf("identity resampler: len(out) = %d, want %d", len(out), len(in)) + } + for i := range in { + if math.Abs(float64(out[i]-in[i])) > 1e-4 { + t.Errorf("sample %d: got %f, want %f", i, out[i], in[i]) + break + } + } +} + +func TestResamplerOutputLength(t *testing.T) { + tests := []struct { + inRate, outRate, inLen int + }{ + {51200, 48000, 5120}, + {51200, 48000, 10240}, + {44100, 48000, 4410}, + {96000, 48000, 9600}, + {200000, 48000, 20000}, + } + for _, tt := range tests { + r := NewResampler(tt.inRate, tt.outRate, 32) + in := make([]float32, tt.inLen) + for i := range in { + in[i] = float32(math.Sin(2 * math.Pi * 1000 * float64(i) / float64(tt.inRate))) + } + out := r.Process(in) + expected := float64(tt.inLen) * float64(tt.outRate) / float64(tt.inRate) + // Allow ±2 samples tolerance for filter delay + edge effects + if math.Abs(float64(len(out))-expected) > 3 { + t.Errorf("Resampler(%d→%d) %d samples: got %d output, expected ~%.0f", + tt.inRate, tt.outRate, tt.inLen, len(out), expected) + } + } +} + +func TestResamplerStreamContinuity(t *testing.T) { + // Verify that processing in chunks gives essentially the same result + // as one block (state preservation works for seamless streaming). + // + // With non-M-aligned chunks the output count may differ by ±1 per + // chunk due to sub-phase boundary effects. This is harmless for + // audio streaming. We verify: + // 1. M-aligned chunks give bit-exact results + // 2. Arbitrary chunks give correct audio (small value error near boundaries) + inRate := 51200 + outRate := 48000 + freq := 1000.0 + + totalSamples := inRate + signal := make([]float32, totalSamples) + for i := range signal { + signal[i] = float32(math.Sin(2 * math.Pi * freq * float64(i) / float64(inRate))) + } + + // --- Test 1: M-aligned chunks must be bit-exact --- + g := gcd(inRate, outRate) + M := inRate / g // 16 + chunkAligned := M * 200 // 3200, divides evenly + + r1 := NewResampler(inRate, outRate, 32) + oneBlock := r1.Process(signal) + + r2 := NewResampler(inRate, outRate, 32) + var aligned []float32 + for i := 0; i < len(signal); i += chunkAligned { + end := i + chunkAligned + if end > len(signal) { + end = len(signal) + } + aligned = append(aligned, r2.Process(signal[i:end])...) + } + if len(oneBlock) != len(aligned) { + t.Fatalf("M-aligned: length mismatch one=%d aligned=%d", len(oneBlock), len(aligned)) + } + for i := range oneBlock { + if oneBlock[i] != aligned[i] { + t.Fatalf("M-aligned: sample %d differs: %f vs %f", i, oneBlock[i], aligned[i]) + } + } + + // --- Test 2: Arbitrary chunks — audio must be within ±1 sample count --- + r3 := NewResampler(inRate, outRate, 32) + chunkArbitrary := inRate / 15 // ~3413, not M-aligned + var arb []float32 + for i := 0; i < len(signal); i += chunkArbitrary { + end := i + chunkArbitrary + if end > len(signal) { + end = len(signal) + } + arb = append(arb, r3.Process(signal[i:end])...) + } + // Length should be close (within ~number of chunks) + nChunks := (len(signal) + chunkArbitrary - 1) / chunkArbitrary + if abs(len(arb)-len(oneBlock)) > nChunks { + t.Errorf("arbitrary chunks: length %d vs %d (diff %d, max allowed %d)", + len(arb), len(oneBlock), len(arb)-len(oneBlock), nChunks) + } + + // Values should match where they overlap (skip boundaries) + minLen := len(oneBlock) + if len(arb) < minLen { + minLen = len(arb) + } + maxDiff := 0.0 + for i := 64; i < minLen-64; i++ { + diff := math.Abs(float64(oneBlock[i] - arb[i])) + if diff > maxDiff { + maxDiff = diff + } + } + // Interior samples that haven't drifted should be very close + t.Logf("arbitrary chunks: maxDiff=%e len_one=%d len_arb=%d", maxDiff, len(oneBlock), len(arb)) +} + +func abs(x int) int { + if x < 0 { + return -x + } + return x +} + +func TestResamplerTonePreservation(t *testing.T) { + // Resample a 1kHz tone and verify the frequency is preserved + inRate := 51200 + outRate := 48000 + freq := 1000.0 + + in := make([]float32, inRate) // 1 second + for i := range in { + in[i] = float32(math.Sin(2 * math.Pi * freq * float64(i) / float64(inRate))) + } + + r := NewResampler(inRate, outRate, 32) + out := r.Process(in) + + // Measure frequency by zero crossings in the output (skip first 100 samples for filter settle) + crossings := 0 + for i := 101; i < len(out); i++ { + if (out[i-1] <= 0 && out[i] > 0) || (out[i-1] >= 0 && out[i] < 0) { + crossings++ + } + } + // Each full cycle has 2 zero crossings + measuredFreq := float64(crossings) / 2.0 * float64(outRate) / float64(len(out)-101) + if math.Abs(measuredFreq-freq) > 10 { // within 10 Hz + t.Errorf("tone preservation: measured %.1f Hz, want %.1f Hz", measuredFreq, freq) + } +} + +func TestStereoResampler(t *testing.T) { + inRate := 51200 + outRate := 48000 + + // Generate stereo: 440Hz left, 880Hz right + nFrames := inRate / 2 // 0.5 seconds + in := make([]float32, nFrames*2) + for i := 0; i < nFrames; i++ { + in[i*2] = float32(math.Sin(2 * math.Pi * 440 * float64(i) / float64(inRate))) + in[i*2+1] = float32(math.Sin(2 * math.Pi * 880 * float64(i) / float64(inRate))) + } + + sr := NewStereoResampler(inRate, outRate, 32) + out := sr.Process(in) + + expectedFrames := float64(nFrames) * float64(outRate) / float64(inRate) + if math.Abs(float64(len(out)/2)-expectedFrames) > 3 { + t.Errorf("stereo output: %d frames, expected ~%.0f", len(out)/2, expectedFrames) + } + + // Verify it's properly interleaved (left and right should have different content) + if len(out) >= 200 { + leftSum := 0.0 + rightSum := 0.0 + for i := 50; i < 100; i++ { + leftSum += math.Abs(float64(out[i*2])) + rightSum += math.Abs(float64(out[i*2+1])) + } + if leftSum < 0.1 || rightSum < 0.1 { + t.Errorf("stereo channels appear silent: leftEnergy=%.3f rightEnergy=%.3f", leftSum, rightSum) + } + } +} + +func BenchmarkResampler51200to48000(b *testing.B) { + in := make([]float32, 51200/15) // one DSP frame at 51200 Hz / 15fps + for i := range in { + in[i] = float32(math.Sin(2 * math.Pi * 1000 * float64(i) / 51200)) + } + r := NewResampler(51200, 48000, 32) + b.ResetTimer() + for i := 0; i < b.N; i++ { + r.Process(in) + } +} diff --git a/internal/recorder/recorder.go b/internal/recorder/recorder.go index 00c119e..7afe41c 100644 --- a/internal/recorder/recorder.go +++ b/internal/recorder/recorder.go @@ -28,6 +28,11 @@ type Policy struct { OutputDir string `yaml:"output_dir" json:"output_dir"` ClassFilter []string `yaml:"class_filter" json:"class_filter"` RingSeconds int `yaml:"ring_seconds" json:"ring_seconds"` + + // Audio quality (AQ-2, AQ-3, AQ-5) + DeemphasisUs float64 `yaml:"deemphasis_us" json:"deemphasis_us"` + ExtractionTaps int `yaml:"extraction_fir_taps" json:"extraction_fir_taps"` + ExtractionBwMult float64 `yaml:"extraction_bw_mult" json:"extraction_bw_mult"` } type Manager struct { @@ -358,3 +363,11 @@ func (m *Manager) ActiveStreams() int { } return m.streamer.ActiveSessions() } + +// HasListeners returns true if any live-listen subscribers are active or pending. +func (m *Manager) HasListeners() bool { + if m == nil || m.streamer == nil { + return false + } + return m.streamer.HasListeners() +} diff --git a/internal/recorder/streamer.go b/internal/recorder/streamer.go index 9bbaa8f..aa72271 100644 --- a/internal/recorder/streamer.go +++ b/internal/recorder/streamer.go @@ -4,6 +4,7 @@ import ( "bufio" "encoding/binary" "encoding/json" + "errors" "fmt" "log" "math" @@ -20,7 +21,7 @@ import ( ) // --------------------------------------------------------------------------- -// streamSession — one open recording for one signal +// streamSession — one open demod session for one signal // --------------------------------------------------------------------------- type streamSession struct { @@ -33,20 +34,24 @@ type streamSession struct { startTime time.Time lastFeed time.Time + // listenOnly sessions have no WAV file and no disk I/O. + // They exist solely to feed audio to live-listen subscribers. + listenOnly bool + + // Recording state (nil/zero for listen-only sessions) dir string wavFile *os.File wavBuf *bufio.Writer wavSamples int64 - sampleRate int // actual output audio sample rate + segmentIdx int + + sampleRate int // actual output audio sample rate (always streamAudioRate) channels int demodName string - segmentIdx int // --- Persistent DSP state for click-free streaming --- // Overlap-save: tail of previous extracted IQ snippet. - // Prepended to the next snippet so FIR filters and FM discriminator - // have history — eliminates transient clicks at frame boundaries. overlapIQ []complex64 // De-emphasis IIR state (persists across frames) @@ -56,6 +61,33 @@ type streamSession struct { // Stereo decode: phase-continuous 38kHz oscillator stereoPhase float64 + // Polyphase resampler (replaces integer-decimate hack) + monoResampler *dsp.Resampler + stereoResampler *dsp.StereoResampler + + // AQ-4: Stateful FIR filters for click-free stereo decode + stereoLPF *dsp.StatefulFIRReal // 15kHz lowpass for L+R + stereoBPHi *dsp.StatefulFIRReal // 53kHz LP for bandpass high + stereoBPLo *dsp.StatefulFIRReal // 23kHz LP for bandpass low + stereoLRLPF *dsp.StatefulFIRReal // 15kHz LP for demodulated L-R + stereoAALPF *dsp.StatefulFIRReal // Anti-alias LP for pre-decim (mono path) + + // Stateful pre-demod anti-alias FIR (eliminates cold-start transients + // and avoids per-frame FIR recomputation) + preDemodFIR *dsp.StatefulFIRComplex + preDemodDecim int // cached decimation factor + preDemodRate int // cached snipRate this FIR was built for + preDemodCutoff float64 // cached cutoff + + // AQ-2: De-emphasis config (µs, 0 = disabled) + deemphasisUs float64 + + // Scratch buffers — reused across frames to avoid GC pressure. + // Grown as needed, never shrunk. + scratchIQ []complex64 // for pre-demod FIR output + decimate input + scratchAudio []float32 // for stereo decode intermediates + scratchPCM []byte // for PCM encoding + // live-listen subscribers audioSubs []audioSub } @@ -65,8 +97,18 @@ type audioSub struct { ch chan []byte } +// AudioInfo describes the audio format of a live-listen subscription. +// Sent to the WebSocket client as the first message. +type AudioInfo struct { + SampleRate int `json:"sample_rate"` + Channels int `json:"channels"` + Format string `json:"format"` // always "s16le" + DemodName string `json:"demod"` +} + const ( streamAudioRate = 48000 + resamplerTaps = 32 // taps per polyphase arm — good quality ) // --------------------------------------------------------------------------- @@ -91,15 +133,26 @@ type Streamer struct { nextSub int64 feedCh chan streamFeedMsg done chan struct{} + + // pendingListens are subscribers waiting for a matching session. + pendingListens map[int64]*pendingListen +} + +type pendingListen struct { + freq float64 + bw float64 + mode string + ch chan []byte } func newStreamer(policy Policy, centerHz float64) *Streamer { st := &Streamer{ - sessions: make(map[int64]*streamSession), - policy: policy, - centerHz: centerHz, - feedCh: make(chan streamFeedMsg, 2), - done: make(chan struct{}), + sessions: make(map[int64]*streamSession), + policy: policy, + centerHz: centerHz, + feedCh: make(chan streamFeedMsg, 2), + done: make(chan struct{}), + pendingListens: make(map[int64]*pendingListen), } go st.worker() return st @@ -119,58 +172,77 @@ func (st *Streamer) updatePolicy(policy Policy, centerHz float64) { st.policy = policy st.centerHz = centerHz - // If recording was just disabled, close all active sessions - // so WAV headers get fixed and meta.json gets written. + // If recording was just disabled, close recording sessions + // but keep listen-only sessions alive. if wasEnabled && !policy.Enabled { for id, sess := range st.sessions { - for _, sub := range sess.audioSubs { - close(sub.ch) + if sess.listenOnly { + continue } - sess.audioSubs = nil - closeSession(sess, &st.policy) - delete(st.sessions, id) + if len(sess.audioSubs) > 0 { + // Convert to listen-only: close WAV but keep session + convertToListenOnly(sess) + } else { + closeSession(sess, &st.policy) + delete(st.sessions, id) + } + } + } +} + +// HasListeners returns true if any sessions have audio subscribers +// or there are pending listen requests. Used by the DSP loop to +// decide whether to feed snippets even when recording is disabled. +func (st *Streamer) HasListeners() bool { + st.mu.Lock() + defer st.mu.Unlock() + return st.hasListenersLocked() +} + +func (st *Streamer) hasListenersLocked() bool { + if len(st.pendingListens) > 0 { + return true + } + for _, sess := range st.sessions { + if len(sess.audioSubs) > 0 { + return true } - log.Printf("STREAM: recording disabled — closed %d sessions", len(st.sessions)) } + return false } -// FeedSnippets is called from the DSP loop with pre-extracted IQ snippets -// (GPU-accelerated FreqShift+FIR+Decimate already done). It copies the snippets -// and enqueues them for async demod in the worker goroutine. +// FeedSnippets is called from the DSP loop with pre-extracted IQ snippets. +// Feeds are accepted if: +// - Recording is enabled (policy.Enabled && RecordAudio/RecordIQ), OR +// - Any live-listen subscribers exist (listen-only mode) +// +// IMPORTANT: The caller (Manager.FeedSnippets) already copies the snippet +// data, so items can be passed directly without another copy. func (st *Streamer) FeedSnippets(items []streamFeedItem) { st.mu.Lock() - enabled := st.policy.Enabled && (st.policy.RecordAudio || st.policy.RecordIQ) + recEnabled := st.policy.Enabled && (st.policy.RecordAudio || st.policy.RecordIQ) + hasListeners := st.hasListenersLocked() st.mu.Unlock() - if !enabled || len(items) == 0 { - return - } - // Copy snippets (GPU buffers may be reused) - copied := make([]streamFeedItem, len(items)) - for i, item := range items { - snipCopy := make([]complex64, len(item.snippet)) - copy(snipCopy, item.snippet) - copied[i] = streamFeedItem{ - signal: item.signal, - snippet: snipCopy, - snipRate: item.snipRate, - } + if (!recEnabled && !hasListeners) || len(items) == 0 { + return } select { - case st.feedCh <- streamFeedMsg{items: copied}: + case st.feedCh <- streamFeedMsg{items: items}: default: - // Worker busy — drop frame rather than blocking DSP loop } } -// processFeed runs in the worker goroutine. Receives pre-extracted snippets -// and does the lightweight demod + stereo + de-emphasis with persistent state. +// processFeed runs in the worker goroutine. func (st *Streamer) processFeed(msg streamFeedMsg) { st.mu.Lock() defer st.mu.Unlock() - if !st.policy.Enabled || (!st.policy.RecordAudio && !st.policy.RecordIQ) { + recEnabled := st.policy.Enabled && (st.policy.RecordAudio || st.policy.RecordIQ) + hasListeners := st.hasListenersLocked() + + if !recEnabled && !hasListeners { return } @@ -185,26 +257,36 @@ func (st *Streamer) processFeed(msg streamFeedMsg) { if sig.ID == 0 || sig.Class == nil { continue } - if sig.SNRDb < st.policy.MinSNRDb { - continue - } - if !st.classAllowed(sig.Class) { + if len(item.snippet) == 0 || item.snipRate <= 0 { continue } - if len(item.snippet) == 0 || item.snipRate <= 0 { + + // Decide whether this signal needs a session + needsRecording := recEnabled && sig.SNRDb >= st.policy.MinSNRDb && st.classAllowed(sig.Class) + needsListen := st.signalHasListenerLocked(sig) + + if !needsRecording && !needsListen { continue } sess, exists := st.sessions[sig.ID] if !exists { - s, err := st.openSession(sig, now) - if err != nil { - log.Printf("STREAM: open failed signal=%d %.1fMHz: %v", - sig.ID, sig.CenterHz/1e6, err) - continue + if needsRecording { + s, err := st.openRecordingSession(sig, now) + if err != nil { + log.Printf("STREAM: open failed signal=%d %.1fMHz: %v", + sig.ID, sig.CenterHz/1e6, err) + continue + } + st.sessions[sig.ID] = s + sess = s + } else { + s := st.openListenSession(sig, now) + st.sessions[sig.ID] = s + sess = s } - st.sessions[sig.ID] = s - sess = s + // Attach any pending listeners + st.attachPendingListeners(sess) } // Update metadata @@ -221,37 +303,45 @@ func (st *Streamer) processFeed(msg streamFeedMsg) { sess.class = sig.Class } - // Demod with persistent state (overlap-save, stereo, de-emphasis) + // Demod with persistent state audio, audioRate := sess.processSnippet(item.snippet, item.snipRate) if len(audio) > 0 { if sess.wavSamples == 0 && audioRate > 0 { sess.sampleRate = audioRate } - appendAudio(sess, audio) - st.fanoutAudio(sess, audio) + // Encode PCM once into scratch buffer, reuse for both WAV and fanout + pcmLen := len(audio) * 2 + pcm := sess.growPCM(pcmLen) + for k, s := range audio { + v := int16(clip(s * 32767)) + binary.LittleEndian.PutUint16(pcm[k*2:], uint16(v)) + } + if !sess.listenOnly && sess.wavBuf != nil { + n, err := sess.wavBuf.Write(pcm) + if err != nil { + log.Printf("STREAM: write error signal=%d: %v", sess.signalID, err) + } else { + sess.wavSamples += int64(n / 2) + } + } + st.fanoutPCM(sess, pcm, pcmLen) } - // Segment split - if st.policy.MaxDuration > 0 && now.Sub(sess.startTime) >= st.policy.MaxDuration { + // Segment split (recording sessions only) + if !sess.listenOnly && st.policy.MaxDuration > 0 && now.Sub(sess.startTime) >= st.policy.MaxDuration { segIdx := sess.segmentIdx + 1 oldSubs := sess.audioSubs - oldOverlap := sess.overlapIQ - oldDeemphL := sess.deemphL - oldDeemphR := sess.deemphR - oldStereo := sess.stereoPhase + oldState := sess.captureDSPState() sess.audioSubs = nil closeSession(sess, &st.policy) - s, err := st.openSession(sig, now) + s, err := st.openRecordingSession(sig, now) if err != nil { delete(st.sessions, sig.ID) continue } s.segmentIdx = segIdx s.audioSubs = oldSubs - s.overlapIQ = oldOverlap - s.deemphL = oldDeemphL - s.deemphR = oldDeemphR - s.stereoPhase = oldStereo + s.restoreDSPState(oldState) st.sessions[sig.ID] = s } } @@ -261,16 +351,65 @@ func (st *Streamer) processFeed(msg streamFeedMsg) { if seen[id] { continue } - if now.Sub(sess.lastFeed) > 3*time.Second { - closeSession(sess, &st.policy) + gracePeriod := 3 * time.Second + if sess.listenOnly { + gracePeriod = 5 * time.Second + } + if now.Sub(sess.lastFeed) > gracePeriod { + for _, sub := range sess.audioSubs { + close(sub.ch) + } + sess.audioSubs = nil + if !sess.listenOnly { + closeSession(sess, &st.policy) + } delete(st.sessions, id) } } } +func (st *Streamer) signalHasListenerLocked(sig *detector.Signal) bool { + if sess, ok := st.sessions[sig.ID]; ok && len(sess.audioSubs) > 0 { + return true + } + for _, pl := range st.pendingListens { + if math.Abs(sig.CenterHz-pl.freq) < 200000 { + return true + } + } + return false +} + +func (st *Streamer) attachPendingListeners(sess *streamSession) { + for subID, pl := range st.pendingListens { + if math.Abs(sess.centerHz-pl.freq) < 200000 { + sess.audioSubs = append(sess.audioSubs, audioSub{id: subID, ch: pl.ch}) + delete(st.pendingListens, subID) + + // Send updated audio_info now that we know the real session params. + // Prefix with 0x00 tag byte so ws/audio handler sends as TextMessage. + infoJSON, _ := json.Marshal(AudioInfo{ + SampleRate: sess.sampleRate, + Channels: sess.channels, + Format: "s16le", + DemodName: sess.demodName, + }) + tagged := make([]byte, 1+len(infoJSON)) + tagged[0] = 0x00 // tag: audio_info + copy(tagged[1:], infoJSON) + select { + case pl.ch <- tagged: + default: + } + + log.Printf("STREAM: attached pending listener %d to signal %d (%.1fMHz %s ch=%d)", + subID, sess.signalID, sess.centerHz/1e6, sess.demodName, sess.channels) + } + } +} + // CloseAll finalises all sessions and stops the worker goroutine. func (st *Streamer) CloseAll() { - // Stop accepting new feeds and wait for worker to finish close(st.feedCh) <-st.done @@ -281,9 +420,15 @@ func (st *Streamer) CloseAll() { close(sub.ch) } sess.audioSubs = nil - closeSession(sess, &st.policy) + if !sess.listenOnly { + closeSession(sess, &st.policy) + } delete(st.sessions, id) } + for _, pl := range st.pendingListens { + close(pl.ch) + } + st.pendingListens = nil } // ActiveSessions returns the number of open streaming sessions. @@ -294,13 +439,21 @@ func (st *Streamer) ActiveSessions() int { } // SubscribeAudio registers a live-listen subscriber for a given frequency. -func (st *Streamer) SubscribeAudio(freq float64, bw float64, mode string) (int64, <-chan []byte) { +// +// LL-2: Returns AudioInfo with correct channels and sample rate. +// LL-3: Returns error only on hard failures (nil streamer etc). +// +// If a matching session exists, attaches immediately. Otherwise, the +// subscriber is held as "pending" and will be attached when a matching +// signal appears in the next DSP frame. +func (st *Streamer) SubscribeAudio(freq float64, bw float64, mode string) (int64, <-chan []byte, AudioInfo, error) { ch := make(chan []byte, 64) st.mu.Lock() defer st.mu.Unlock() st.nextSub++ subID := st.nextSub + // Try to find a matching session var bestSess *streamSession bestDist := math.MaxFloat64 for _, sess := range st.sessions { @@ -310,19 +463,48 @@ func (st *Streamer) SubscribeAudio(freq float64, bw float64, mode string) (int64 bestSess = sess } } + if bestSess != nil && bestDist < 200000 { bestSess.audioSubs = append(bestSess.audioSubs, audioSub{id: subID, ch: ch}) - } else { - log.Printf("STREAM: audio subscriber %d has no matching session (freq=%.1fMHz)", subID, freq/1e6) - close(ch) + info := AudioInfo{ + SampleRate: bestSess.sampleRate, + Channels: bestSess.channels, + Format: "s16le", + DemodName: bestSess.demodName, + } + log.Printf("STREAM: subscriber %d attached to signal %d (%.1fMHz %s)", + subID, bestSess.signalID, bestSess.centerHz/1e6, bestSess.demodName) + return subID, ch, info, nil + } + + // No matching session yet — add as pending listener + st.pendingListens[subID] = &pendingListen{ + freq: freq, + bw: bw, + mode: mode, + ch: ch, } - return subID, ch + info := AudioInfo{ + SampleRate: streamAudioRate, + Channels: 1, + Format: "s16le", + DemodName: "NFM", + } + log.Printf("STREAM: subscriber %d pending (freq=%.1fMHz)", subID, freq/1e6) + return subID, ch, info, nil } // UnsubscribeAudio removes a live-listen subscriber. func (st *Streamer) UnsubscribeAudio(subID int64) { st.mu.Lock() defer st.mu.Unlock() + + if pl, ok := st.pendingListens[subID]; ok { + close(pl.ch) + delete(st.pendingListens, subID) + return + } + for _, sess := range st.sessions { for i, sub := range sess.audioSubs { if sub.id == subID { @@ -338,19 +520,9 @@ func (st *Streamer) UnsubscribeAudio(subID int64) { // Session: stateful extraction + demod // --------------------------------------------------------------------------- -// processSnippet takes a pre-extracted IQ snippet (from GPU or CPU -// extractSignalIQBatch) and demodulates it with persistent state. -// -// The overlap-save operates on the EXTRACTED snippet level: we prepend -// the tail of the previous snippet so that: -// - FM discriminator has iq[i-1] for the first sample -// - The ~50-sample transient from FreqShift phase reset and FIR startup -// falls into the overlap region and gets trimmed from the output -// -// Stateful components (across frames): -// - overlapIQ: tail of previous extracted snippet -// - stereoPhase: 38kHz oscillator for L-R decode -// - deemphL/R: de-emphasis IIR accumulators +// processSnippet takes a pre-extracted IQ snippet and demodulates it with +// persistent state. Uses stateful FIR + polyphase resampler for exact 48kHz +// output with zero transient artifacts. func (sess *streamSession) processSnippet(snippet []complex64, snipRate int) ([]float32, int) { if len(snippet) == 0 || snipRate <= 0 { return nil, 0 @@ -361,7 +533,7 @@ func (sess *streamSession) processSnippet(snippet []complex64, snipRate int) ([] demodName := sess.demodName if isWFMStereo { - demodName = "WFM" // mono FM demod, then stateful stereo post-process + demodName = "WFM" } d := demod.Get(demodName) if d == nil { @@ -371,18 +543,16 @@ func (sess *streamSession) processSnippet(snippet []complex64, snipRate int) ([] return nil, 0 } - // --- Minimal overlap: prepend last sample from previous snippet --- - // The FM discriminator computes atan2(iq[i] * conj(iq[i-1])), so the - // first output sample needs iq[-1] from the previous frame. - // FIR halo is already handled by extractForStreaming's IQ-level overlap, - // so we only need 1 sample here. + // --- FM discriminator overlap: prepend 1 sample from previous frame --- + // The FM discriminator needs iq[i-1] to compute the first output. + // All FIR filtering is now stateful, so no additional overlap is needed. var fullSnip []complex64 trimSamples := 0 - if len(sess.overlapIQ) > 0 { - fullSnip = make([]complex64, len(sess.overlapIQ)+len(snippet)) - copy(fullSnip, sess.overlapIQ) - copy(fullSnip[len(sess.overlapIQ):], snippet) - trimSamples = len(sess.overlapIQ) + if len(sess.overlapIQ) == 1 { + fullSnip = make([]complex64, 1+len(snippet)) + fullSnip[0] = sess.overlapIQ[0] + copy(fullSnip[1:], snippet) + trimSamples = 1 } else { fullSnip = snippet } @@ -392,7 +562,7 @@ func (sess *streamSession) processSnippet(snippet []complex64, snipRate int) ([] sess.overlapIQ = []complex64{snippet[len(snippet)-1]} } - // --- Decimate to demod-preferred rate with anti-alias --- + // --- Stateful anti-alias FIR + decimation to demod rate --- demodRate := d.OutputSampleRate() decim1 := int(math.Round(float64(snipRate) / float64(demodRate))) if decim1 < 1 { @@ -403,8 +573,17 @@ func (sess *streamSession) processSnippet(snippet []complex64, snipRate int) ([] var dec []complex64 if decim1 > 1 { cutoff := float64(actualDemodRate) / 2.0 * 0.8 - aaTaps := dsp.LowpassFIR(cutoff, snipRate, 101) - filtered := dsp.ApplyFIR(fullSnip, aaTaps) + + // Lazy-init or reinit stateful FIR if parameters changed + if sess.preDemodFIR == nil || sess.preDemodRate != snipRate || sess.preDemodCutoff != cutoff { + taps := dsp.LowpassFIR(cutoff, snipRate, 101) + sess.preDemodFIR = dsp.NewStatefulFIRComplex(taps) + sess.preDemodRate = snipRate + sess.preDemodCutoff = cutoff + sess.preDemodDecim = decim1 + } + + filtered := sess.preDemodFIR.ProcessInto(fullSnip, sess.growIQ(len(fullSnip))) dec = dsp.Decimate(filtered, decim1) } else { dec = fullSnip @@ -416,13 +595,15 @@ func (sess *streamSession) processSnippet(snippet []complex64, snipRate int) ([] return nil, 0 } - // --- Trim the overlap sample(s) from audio --- - audioTrim := trimSamples / decim1 - if decim1 <= 1 { - audioTrim = trimSamples - } - if audioTrim > 0 && audioTrim < len(audio) { - audio = audio[audioTrim:] + // --- Trim the 1-sample FM discriminator overlap --- + if trimSamples > 0 { + audioTrim := trimSamples / decim1 + if audioTrim < 1 { + audioTrim = 1 // at minimum trim 1 audio sample + } + if audioTrim > 0 && audioTrim < len(audio) { + audio = audio[audioTrim:] + } } // --- Stateful stereo decode --- @@ -432,53 +613,25 @@ func (sess *streamSession) processSnippet(snippet []complex64, snipRate int) ([] audio = sess.stereoDecodeStateful(audio, actualDemodRate) } - // --- Resample towards 48kHz --- - outputRate := actualDemodRate - if actualDemodRate > streamAudioRate { - decim2 := actualDemodRate / streamAudioRate - if decim2 < 1 { - decim2 = 1 - } - outputRate = actualDemodRate / decim2 - - aaTaps := dsp.LowpassFIR(float64(outputRate)/2.0*0.9, actualDemodRate, 63) - + // --- Polyphase resample to exact 48kHz --- + if actualDemodRate != streamAudioRate { if channels > 1 { - nFrames := len(audio) / channels - left := make([]float32, nFrames) - right := make([]float32, nFrames) - for i := 0; i < nFrames; i++ { - left[i] = audio[i*2] - if i*2+1 < len(audio) { - right[i] = audio[i*2+1] - } - } - left = dsp.ApplyFIRReal(left, aaTaps) - right = dsp.ApplyFIRReal(right, aaTaps) - outFrames := nFrames / decim2 - if outFrames < 1 { - return nil, 0 - } - resampled := make([]float32, outFrames*2) - for i := 0; i < outFrames; i++ { - resampled[i*2] = left[i*decim2] - resampled[i*2+1] = right[i*decim2] + if sess.stereoResampler == nil { + sess.stereoResampler = dsp.NewStereoResampler(actualDemodRate, streamAudioRate, resamplerTaps) } - audio = resampled + audio = sess.stereoResampler.Process(audio) } else { - audio = dsp.ApplyFIRReal(audio, aaTaps) - resampled := make([]float32, 0, len(audio)/decim2+1) - for i := 0; i < len(audio); i += decim2 { - resampled = append(resampled, audio[i]) + if sess.monoResampler == nil { + sess.monoResampler = dsp.NewResampler(actualDemodRate, streamAudioRate, resamplerTaps) } - audio = resampled + audio = sess.monoResampler.Process(audio) } } - // --- De-emphasis (50µs Europe) --- - if isWFM && outputRate > 0 { - const tau = 50e-6 - alpha := math.Exp(-1.0 / (float64(outputRate) * tau)) + // --- De-emphasis (configurable: 50µs Europe, 75µs US/Japan, 0=disabled) --- + if isWFM && sess.deemphasisUs > 0 && streamAudioRate > 0 { + tau := sess.deemphasisUs * 1e-6 + alpha := math.Exp(-1.0 / (float64(streamAudioRate) * tau)) if channels > 1 { nFrames := len(audio) / channels yL, yR := sess.deemphL, sess.deemphR @@ -499,28 +652,44 @@ func (sess *streamSession) processSnippet(snippet []complex64, snipRate int) ([] } } - return audio, outputRate + return audio, streamAudioRate } // stereoDecodeStateful: phase-continuous 38kHz oscillator for L-R extraction. +// AQ-4: Uses persistent FIR filter state across frames for click-free stereo. +// Reuses session scratch buffers to minimize allocations. func (sess *streamSession) stereoDecodeStateful(mono []float32, sampleRate int) []float32 { if len(mono) == 0 || sampleRate <= 0 { return nil } + n := len(mono) + + // Lazy-init stateful filters on first call + if sess.stereoLPF == nil { + lp := dsp.LowpassFIR(15000, sampleRate, 101) + sess.stereoLPF = dsp.NewStatefulFIRReal(lp) + sess.stereoBPHi = dsp.NewStatefulFIRReal(dsp.LowpassFIR(53000, sampleRate, 101)) + sess.stereoBPLo = dsp.NewStatefulFIRReal(dsp.LowpassFIR(23000, sampleRate, 101)) + sess.stereoLRLPF = dsp.NewStatefulFIRReal(lp) + } - lp := dsp.LowpassFIR(15000, sampleRate, 101) - lpr := dsp.ApplyFIRReal(mono, lp) - - bpHi := dsp.LowpassFIR(53000, sampleRate, 101) - bpLo := dsp.LowpassFIR(23000, sampleRate, 101) - hi := dsp.ApplyFIRReal(mono, bpHi) - lo := dsp.ApplyFIRReal(mono, bpLo) - bpf := make([]float32, len(mono)) - for i := range mono { - bpf[i] = hi[i] - lo[i] + // Reuse scratch for intermediates: need 4*n float32 for bpf, lr, hi, lo + // plus 2*n for output. We'll use scratchAudio for bpf+lr (2*n) and + // allocate hi/lo from the stateful FIR ProcessInto. + scratch := sess.growAudio(n * 4) + bpf := scratch[:n] + lr := scratch[n : 2*n] + hiBuf := scratch[2*n : 3*n] + loBuf := scratch[3*n : 4*n] + + lpr := sess.stereoLPF.Process(mono) // allocates — but could use ProcessInto too + + sess.stereoBPHi.ProcessInto(mono, hiBuf) + sess.stereoBPLo.ProcessInto(mono, loBuf) + for i := 0; i < n; i++ { + bpf[i] = hiBuf[i] - loBuf[i] } - lr := make([]float32, len(mono)) phase := sess.stereoPhase inc := 2 * math.Pi * 38000 / float64(sampleRate) for i := range bpf { @@ -529,38 +698,84 @@ func (sess *streamSession) stereoDecodeStateful(mono []float32, sampleRate int) } sess.stereoPhase = math.Mod(phase, 2*math.Pi) - lr = dsp.ApplyFIRReal(lr, lp) + lr = sess.stereoLRLPF.Process(lr) - out := make([]float32, len(lpr)*2) - for i := range lpr { + out := make([]float32, n*2) + for i := 0; i < n; i++ { out[i*2] = 0.5 * (lpr[i] + lr[i]) out[i*2+1] = 0.5 * (lpr[i] - lr[i]) } return out } +// dspStateSnapshot captures persistent DSP state for segment splits. +type dspStateSnapshot struct { + overlapIQ []complex64 + deemphL float64 + deemphR float64 + stereoPhase float64 + monoResampler *dsp.Resampler + stereoResampler *dsp.StereoResampler + stereoLPF *dsp.StatefulFIRReal + stereoBPHi *dsp.StatefulFIRReal + stereoBPLo *dsp.StatefulFIRReal + stereoLRLPF *dsp.StatefulFIRReal + stereoAALPF *dsp.StatefulFIRReal + preDemodFIR *dsp.StatefulFIRComplex + preDemodDecim int + preDemodRate int + preDemodCutoff float64 +} + +func (sess *streamSession) captureDSPState() dspStateSnapshot { + return dspStateSnapshot{ + overlapIQ: sess.overlapIQ, + deemphL: sess.deemphL, + deemphR: sess.deemphR, + stereoPhase: sess.stereoPhase, + monoResampler: sess.monoResampler, + stereoResampler: sess.stereoResampler, + stereoLPF: sess.stereoLPF, + stereoBPHi: sess.stereoBPHi, + stereoBPLo: sess.stereoBPLo, + stereoLRLPF: sess.stereoLRLPF, + stereoAALPF: sess.stereoAALPF, + preDemodFIR: sess.preDemodFIR, + preDemodDecim: sess.preDemodDecim, + preDemodRate: sess.preDemodRate, + preDemodCutoff: sess.preDemodCutoff, + } +} + +func (sess *streamSession) restoreDSPState(s dspStateSnapshot) { + sess.overlapIQ = s.overlapIQ + sess.deemphL = s.deemphL + sess.deemphR = s.deemphR + sess.stereoPhase = s.stereoPhase + sess.monoResampler = s.monoResampler + sess.stereoResampler = s.stereoResampler + sess.stereoLPF = s.stereoLPF + sess.stereoBPHi = s.stereoBPHi + sess.stereoBPLo = s.stereoBPLo + sess.stereoLRLPF = s.stereoLRLPF + sess.stereoAALPF = s.stereoAALPF + sess.preDemodFIR = s.preDemodFIR + sess.preDemodDecim = s.preDemodDecim + sess.preDemodRate = s.preDemodRate + sess.preDemodCutoff = s.preDemodCutoff +} + // --------------------------------------------------------------------------- // Session management helpers // --------------------------------------------------------------------------- -func (st *Streamer) openSession(sig *detector.Signal, now time.Time) (*streamSession, error) { +func (st *Streamer) openRecordingSession(sig *detector.Signal, now time.Time) (*streamSession, error) { outputDir := st.policy.OutputDir if outputDir == "" { outputDir = "data/recordings" } - demodName := "NFM" - if sig.Class != nil { - if n := mapClassToDemod(sig.Class.ModType); n != "" { - demodName = n - } - } - channels := 1 - if demodName == "WFM_STEREO" { - channels = 2 - } else if d := demod.Get(demodName); d != nil { - channels = d.Channels() - } + demodName, channels := resolveDemod(sig) dirName := fmt.Sprintf("%s_%.0fHz_stream%d", now.Format("2006-01-02T15-04-05"), sig.CenterHz, sig.ID) @@ -580,28 +795,113 @@ func (st *Streamer) openSession(sig *detector.Signal, now time.Time) (*streamSes } sess := &streamSession{ - signalID: sig.ID, - centerHz: sig.CenterHz, - bwHz: sig.BWHz, - snrDb: sig.SNRDb, - peakDb: sig.PeakDb, - class: sig.Class, - startTime: now, - lastFeed: now, - dir: dir, - wavFile: f, - wavBuf: bufio.NewWriterSize(f, 64*1024), - sampleRate: streamAudioRate, - channels: channels, - demodName: demodName, - } - - log.Printf("STREAM: opened signal=%d %.1fMHz %s dir=%s", + signalID: sig.ID, + centerHz: sig.CenterHz, + bwHz: sig.BWHz, + snrDb: sig.SNRDb, + peakDb: sig.PeakDb, + class: sig.Class, + startTime: now, + lastFeed: now, + dir: dir, + wavFile: f, + wavBuf: bufio.NewWriterSize(f, 64*1024), + sampleRate: streamAudioRate, + channels: channels, + demodName: demodName, + deemphasisUs: st.policy.DeemphasisUs, + } + + log.Printf("STREAM: opened recording signal=%d %.1fMHz %s dir=%s", sig.ID, sig.CenterHz/1e6, demodName, dirName) return sess, nil } +func (st *Streamer) openListenSession(sig *detector.Signal, now time.Time) *streamSession { + demodName, channels := resolveDemod(sig) + + sess := &streamSession{ + signalID: sig.ID, + centerHz: sig.CenterHz, + bwHz: sig.BWHz, + snrDb: sig.SNRDb, + peakDb: sig.PeakDb, + class: sig.Class, + startTime: now, + lastFeed: now, + listenOnly: true, + sampleRate: streamAudioRate, + channels: channels, + demodName: demodName, + deemphasisUs: st.policy.DeemphasisUs, + } + + log.Printf("STREAM: opened listen-only signal=%d %.1fMHz %s", + sig.ID, sig.CenterHz/1e6, demodName) + return sess +} + +func resolveDemod(sig *detector.Signal) (string, int) { + demodName := "NFM" + if sig.Class != nil { + if n := mapClassToDemod(sig.Class.ModType); n != "" { + demodName = n + } + } + channels := 1 + if demodName == "WFM_STEREO" { + channels = 2 + } else if d := demod.Get(demodName); d != nil { + channels = d.Channels() + } + return demodName, channels +} + +// growIQ returns a complex64 slice of at least n elements, reusing sess.scratchIQ. +func (sess *streamSession) growIQ(n int) []complex64 { + if cap(sess.scratchIQ) >= n { + return sess.scratchIQ[:n] + } + sess.scratchIQ = make([]complex64, n, n*5/4) + return sess.scratchIQ +} + +// growAudio returns a float32 slice of at least n elements, reusing sess.scratchAudio. +func (sess *streamSession) growAudio(n int) []float32 { + if cap(sess.scratchAudio) >= n { + return sess.scratchAudio[:n] + } + sess.scratchAudio = make([]float32, n, n*5/4) + return sess.scratchAudio +} + +// growPCM returns a byte slice of at least n bytes, reusing sess.scratchPCM. +func (sess *streamSession) growPCM(n int) []byte { + if cap(sess.scratchPCM) >= n { + return sess.scratchPCM[:n] + } + sess.scratchPCM = make([]byte, n, n*5/4) + return sess.scratchPCM +} + +func convertToListenOnly(sess *streamSession) { + if sess.wavBuf != nil { + _ = sess.wavBuf.Flush() + } + if sess.wavFile != nil { + fixStreamWAVHeader(sess.wavFile, sess.wavSamples, sess.sampleRate, sess.channels) + sess.wavFile.Close() + } + sess.wavFile = nil + sess.wavBuf = nil + sess.listenOnly = true + log.Printf("STREAM: converted signal=%d to listen-only", sess.signalID) +} + func closeSession(sess *streamSession, policy *Policy) { + if sess.listenOnly { + return + } if sess.wavBuf != nil { _ = sess.wavBuf.Flush() } @@ -642,36 +942,18 @@ func closeSession(sess *streamSession, policy *Policy) { } } -func appendAudio(sess *streamSession, audio []float32) { - if sess.wavBuf == nil || len(audio) == 0 { - return - } - buf := make([]byte, len(audio)*2) - for i, s := range audio { - v := int16(clip(s * 32767)) - binary.LittleEndian.PutUint16(buf[i*2:], uint16(v)) - } - n, err := sess.wavBuf.Write(buf) - if err != nil { - log.Printf("STREAM: write error signal=%d: %v", sess.signalID, err) - return - } - sess.wavSamples += int64(n / 2) -} - -func (st *Streamer) fanoutAudio(sess *streamSession, audio []float32) { +func (st *Streamer) fanoutPCM(sess *streamSession, pcm []byte, pcmLen int) { if len(sess.audioSubs) == 0 { return } - pcm := make([]byte, len(audio)*2) - for i, s := range audio { - v := int16(clip(s * 32767)) - binary.LittleEndian.PutUint16(pcm[i*2:], uint16(v)) - } + // Tag + copy for all subscribers: 0x01 prefix = PCM audio + tagged := make([]byte, 1+pcmLen) + tagged[0] = 0x01 + copy(tagged[1:], pcm[:pcmLen]) alive := sess.audioSubs[:0] for _, sub := range sess.audioSubs { select { - case sub.ch <- pcm: + case sub.ch <- tagged: default: } alive = append(alive, sub) @@ -694,6 +976,9 @@ func (st *Streamer) classAllowed(cls *classifier.Classification) bool { return false } +// ErrNoSession is returned when no matching signal session exists. +var ErrNoSession = errors.New("no active or pending session for this frequency") + // --------------------------------------------------------------------------- // WAV header helpers // --------------------------------------------------------------------------- diff --git a/sdr-visual-suite.rar b/sdr-visual-suite.rar index e5251ff30c9d2d8b28ec4cc49ca0bee7bf64f0dd..ea51e378dbc8c19417a43ee777ac3f9cc5a175b9 100644 GIT binary patch delta 204983 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

EqqQtrqp8mTOWT9+zmUzXuH+ll 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 bO9H||kVO8^iW9v5t~jCk^j;eU6$tn*GuA66 delta 37673 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%0DmU%YCOY3R_l(_5AxIf!=WnKfo!WcIs`8U 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 diff --git a/web/app.js b/web/app.js index 544d04c..b722952 100644 --- a/web/app.js +++ b/web/app.js @@ -117,7 +117,149 @@ const listenModeSelect = qs('listenMode'); let latest = null; let currentConfig = null; let liveAudio = null; +let liveListenWS = null; // WebSocket-based live listen let stats = { buffer_samples: 0, dropped: 0, resets: 0, last_sample_ago_ms: -1 }; + +// --------------------------------------------------------------------------- +// LiveListenWS — WebSocket-based gapless audio streaming via /ws/audio +// --------------------------------------------------------------------------- +class LiveListenWS { + constructor(freq, bw, mode) { + this.freq = freq; + this.bw = bw; + this.mode = mode; + this.ws = null; + this.audioCtx = null; + this.sampleRate = 48000; + this.channels = 1; + this.playing = false; + this.queue = []; // buffered PCM chunks + this.nextTime = 0; // next scheduled playback time + this.started = false; + this._onStop = null; + } + + start() { + const proto = location.protocol === 'https:' ? 'wss:' : 'ws:'; + const url = `${proto}//${location.host}/ws/audio?freq=${this.freq}&bw=${this.bw}&mode=${this.mode || ''}`; + this.ws = new WebSocket(url); + this.ws.binaryType = 'arraybuffer'; + this.playing = true; + + this.ws.onmessage = (ev) => { + if (typeof ev.data === 'string') { + // audio_info JSON message (initial or updated when session attached) + try { + const info = JSON.parse(ev.data); + if (info.sample_rate || info.channels) { + const newRate = info.sample_rate || 48000; + const newCh = info.channels || 1; + // If channels or rate changed, reinit AudioContext + if (newRate !== this.sampleRate || newCh !== this.channels) { + this.sampleRate = newRate; + this.channels = newCh; + if (this.audioCtx) { + this.audioCtx.close().catch(() => {}); + this.audioCtx = null; + } + this.started = false; + this.nextTime = 0; + } + this._initAudio(); + } + } catch (e) { /* ignore */ } + return; + } + // Binary PCM data (s16le) + if (!this.audioCtx || !this.playing) return; + this._playChunk(ev.data); + }; + + this.ws.onclose = () => { + this.playing = false; + if (this._onStop) this._onStop(); + }; + this.ws.onerror = () => { + this.playing = false; + if (this._onStop) this._onStop(); + }; + + // If no audio_info arrives within 500ms, init with defaults + setTimeout(() => { + if (!this.audioCtx && this.playing) this._initAudio(); + }, 500); + } + + stop() { + this.playing = false; + if (this.ws) { + this.ws.close(); + this.ws = null; + } + if (this.audioCtx) { + this.audioCtx.close().catch(() => {}); + this.audioCtx = null; + } + this.queue = []; + this.nextTime = 0; + this.started = false; + } + + onStop(fn) { this._onStop = fn; } + + _initAudio() { + if (this.audioCtx) return; + this.audioCtx = new (window.AudioContext || window.webkitAudioContext)({ + sampleRate: this.sampleRate + }); + this.nextTime = 0; + this.started = false; + } + + _playChunk(buf) { + const ctx = this.audioCtx; + if (!ctx) return; + + const samples = new Int16Array(buf); + const nFrames = Math.floor(samples.length / this.channels); + if (nFrames === 0) return; + + const audioBuffer = ctx.createBuffer(this.channels, nFrames, this.sampleRate); + for (let ch = 0; ch < this.channels; ch++) { + const channelData = audioBuffer.getChannelData(ch); + for (let i = 0; i < nFrames; i++) { + channelData[i] = samples[i * this.channels + ch] / 32768; + } + } + + const source = ctx.createBufferSource(); + source.buffer = audioBuffer; + source.connect(ctx.destination); + + // Schedule gapless playback with drift correction. + // We target a small jitter buffer (~100ms ahead of real time). + // If nextTime falls behind currentTime, we resync with a small + // buffer to avoid audible gaps. + const now = ctx.currentTime; + const targetLatency = 0.1; // 100ms jitter buffer + + if (!this.started || this.nextTime < now) { + // First chunk or buffer underrun — resync + this.nextTime = now + targetLatency; + this.started = true; + } + + // If we've drifted too far ahead (>500ms of buffered audio), + // drop this chunk to reduce latency. This prevents the buffer + // from growing unbounded when the server sends faster than realtime. + if (this.nextTime > now + 0.5) { + return; // drop — too much buffered + } + + source.start(this.nextTime); + this.nextTime += audioBuffer.duration; + } +} let gpuInfo = { available: false, active: false, error: '' }; let zoom = 1; @@ -1331,12 +1473,46 @@ function tuneToFrequency(centerHz) { function connect() { clearTimeout(wsReconnectTimer); const proto = location.protocol === 'https:' ? 'wss' : 'ws'; - const ws = new WebSocket(`${proto}://${location.host}/ws`); + + // Remote optimization: detect non-localhost and opt into binary + decimation + const hn = location.hostname; + const isLocal = ['localhost', '127.0.0.1', '::1'].includes(hn) + || hn.startsWith('192.168.') + || hn.startsWith('10.') + || /^172\.(1[6-9]|2\d|3[01])\./.test(hn) + || hn.endsWith('.local') + || hn.endsWith('.lan'); + const params = new URLSearchParams(location.search); + const wantBinary = params.get('binary') === '1' || !isLocal; + const bins = parseInt(params.get('bins') || (isLocal ? '0' : '2048'), 10); + const fps = parseInt(params.get('fps') || (isLocal ? '0' : '10'), 10); + + let wsUrl = `${proto}://${location.host}/ws`; + if (wantBinary || bins > 0 || fps > 0) { + const qp = []; + if (wantBinary) qp.push('binary=1'); + if (bins > 0) qp.push(`bins=${bins}`); + if (fps > 0) qp.push(`fps=${fps}`); + wsUrl += '?' + qp.join('&'); + } + + const ws = new WebSocket(wsUrl); + ws.binaryType = 'arraybuffer'; setWsBadge('Connecting', 'neutral'); ws.onopen = () => setWsBadge('Live', 'ok'); ws.onmessage = (ev) => { - latest = JSON.parse(ev.data); + if (ev.data instanceof ArrayBuffer) { + try { + const decoded = decodeBinaryFrame(ev.data); + if (decoded) latest = decoded; + } catch (e) { + console.warn('binary frame decode error:', e); + return; + } + } else { + latest = JSON.parse(ev.data); + } markSpectrumDirty(); if (followLive) pan = 0; updateHeroMetrics(); @@ -1349,6 +1525,59 @@ function connect() { ws.onerror = () => ws.close(); } +// Decode binary spectrum frame v4 (hybrid: binary spectrum + JSON signals) +function decodeBinaryFrame(buf) { + const view = new DataView(buf); + if (buf.byteLength < 32) return null; + + // Header: 32 bytes + const magic0 = view.getUint8(0); + const magic1 = view.getUint8(1); + if (magic0 !== 0x53 || magic1 !== 0x50) return null; // not "SP" + + const version = view.getUint16(2, true); + const ts = Number(view.getBigInt64(4, true)); + const centerHz = view.getFloat64(12, true); + const binCount = view.getUint32(20, true); + const sampleRateHz = view.getUint32(24, true); + const jsonOffset = view.getUint32(28, true); + + if (buf.byteLength < 32 + binCount * 2) return null; + + // Spectrum: binCount × int16 at offset 32 + const spectrum = new Float64Array(binCount); + let off = 32; + for (let i = 0; i < binCount; i++) { + spectrum[i] = view.getInt16(off, true) / 100; + off += 2; + } + + // JSON signals + debug after the spectrum data + let signals = []; + let debug = null; + if (jsonOffset > 0 && jsonOffset < buf.byteLength) { + try { + const jsonBytes = new Uint8Array(buf, jsonOffset); + const jsonStr = new TextDecoder().decode(jsonBytes); + const parsed = JSON.parse(jsonStr); + signals = parsed.signals || []; + debug = parsed.debug || null; + } catch (e) { + // JSON parse failed — continue with empty signals + } + } + + return { + ts: ts, + center_hz: centerHz, + sample_rate: sampleRateHz, + fft_size: binCount, + spectrum_db: spectrum, + signals: signals, + debug: debug + }; +} + function renderLoop() { renderFrames += 1; const now = performance.now(); @@ -1447,7 +1676,7 @@ window.addEventListener('mousemove', (ev) => { hoveredSignal = hoverHit.signal; renderSignalPopover(hoverHit, hoverHit.signal); } else { - scheduleHideSignalPopover(); + hideSignalPopover(); } if (isDraggingSpectrum) { const dx = ev.clientX - dragStartX; @@ -1664,13 +1893,33 @@ if (liveListenEventBtn) { liveListenEventBtn.addEventListener('click', () => { const ev = eventsById.get(selectedEventId); if (!ev) return; + + // Toggle off if already listening + if (liveListenWS && liveListenWS.playing) { + liveListenWS.stop(); + liveListenWS = null; + liveListenEventBtn.textContent = 'Listen'; + liveListenEventBtn.classList.remove('active'); + if (liveListenBtn) { liveListenBtn.textContent = 'Live Listen'; liveListenBtn.classList.remove('active'); } + return; + } + const freq = ev.center_hz; const bw = ev.bandwidth_hz || 12000; const mode = (listenModeSelect?.value || ev.class?.mod_type || 'NFM'); - const sec = parseInt(listenSecondsInput?.value || '2', 10); - const url = `/api/demod?freq=${freq}&bw=${bw}&mode=${mode}&sec=${sec}`; - const audio = new Audio(url); - audio.play(); + + if (liveAudio) { liveAudio.pause(); liveAudio = null; } + + liveListenWS = new LiveListenWS(freq, bw, mode); + liveListenWS.onStop(() => { + liveListenEventBtn.textContent = 'Listen'; + liveListenEventBtn.classList.remove('active'); + if (liveListenBtn) { liveListenBtn.textContent = 'Live Listen'; liveListenBtn.classList.remove('active'); } + liveListenWS = null; + }); + liveListenWS.start(); + liveListenEventBtn.textContent = '■ Stop'; + liveListenEventBtn.classList.add('active'); }); } if (decodeEventBtn) { @@ -1729,6 +1978,15 @@ signalList.addEventListener('click', (ev) => { if (liveListenBtn) { liveListenBtn.addEventListener('click', async () => { + // Toggle: if already listening, stop + if (liveListenWS && liveListenWS.playing) { + liveListenWS.stop(); + liveListenWS = null; + liveListenBtn.textContent = 'Live Listen'; + liveListenBtn.classList.remove('active'); + return; + } + // Use selected signal if available, otherwise first in list let freq, bw, mode; if (window._selectedSignal) { @@ -1743,14 +2001,20 @@ if (liveListenBtn) { mode = first.dataset.class || ''; } if (!Number.isFinite(freq)) return; - mode = (listenModeSelect?.value === 'Auto') ? (mode || 'NFM') : listenModeSelect.value; - const sec = parseInt(listenSecondsInput?.value || '2', 10); - const url = `/api/demod?freq=${freq}&bw=${bw}&mode=${mode}&sec=${sec}`; - if (liveAudio) { - liveAudio.pause(); - } - liveAudio = new Audio(url); - liveAudio.play().catch(() => {}); + mode = (listenModeSelect?.value === 'Auto' || listenModeSelect?.value === '') ? (mode || 'NFM') : listenModeSelect.value; + + // Stop any old HTTP audio + if (liveAudio) { liveAudio.pause(); liveAudio = null; } + + liveListenWS = new LiveListenWS(freq, bw, mode); + liveListenWS.onStop(() => { + liveListenBtn.textContent = 'Live Listen'; + liveListenBtn.classList.remove('active'); + liveListenWS = null; + }); + liveListenWS.start(); + liveListenBtn.textContent = '■ Stop'; + liveListenBtn.classList.add('active'); }); } diff --git a/web/style.css b/web/style.css index 65f15f7..5b96eab 100644 --- a/web/style.css +++ b/web/style.css @@ -496,3 +496,15 @@ body.mode-lab .hero-metrics { grid-template-columns: repeat(3, minmax(0, 1fr)); input[type="number"]::-webkit-inner-spin-button, input[type="number"]::-webkit-outer-spin-button { opacity: 0.3; } input[type="number"]:hover::-webkit-inner-spin-button { opacity: 0.7; } + +/* Active live-listen button */ +.act-btn.active { + background: var(--accent); + color: var(--bg-0); + box-shadow: 0 0 12px rgba(0, 255, 200, 0.3); + animation: listen-pulse 1.5s ease-in-out infinite; +} +@keyframes listen-pulse { + 0%, 100% { box-shadow: 0 0 8px rgba(0, 255, 200, 0.2); } + 50% { box-shadow: 0 0 16px rgba(0, 255, 200, 0.5); } +}