package main import ( "fmt" "sdr-wideband-suite/internal/demod/gpudemod" "sdr-wideband-suite/internal/detector" "sdr-wideband-suite/internal/telemetry" ) func extractForStreamingProduction( extractMgr *extractionManager, allIQ []complex64, sampleRate int, centerHz float64, signals []detector.Signal, aqCfg extractionConfig, coll *telemetry.Collector, ) ([][]complex64, []int, error) { out := make([][]complex64, len(signals)) rates := make([]int, len(signals)) jobs, err := buildStreamingJobs(sampleRate, centerHz, signals, aqCfg) if err != nil { return nil, nil, err } runner := extractMgr.get(len(allIQ), sampleRate) if runner == nil { return nil, nil, fmt.Errorf("streaming production path unavailable: no batch runner") } results, err := runner.StreamingExtractGPU(allIQ, jobs) if err != nil { return nil, nil, err } var oracleResults []gpudemod.StreamingExtractResult if useStreamingOraclePath { if streamingOracleRunner == nil || streamingOracleRunner.SampleRate != sampleRate { streamingOracleRunner = gpudemod.NewCPUOracleRunner(sampleRate) } oracleResults, _ = streamingOracleRunner.StreamingExtract(allIQ, jobs) } for i, res := range results { out[i] = res.IQ rates[i] = res.Rate observeStreamingResult(coll, "streaming.production", res) if i < len(oracleResults) { observeStreamingComparison(coll, oracleResults[i], res) } } return out, rates, nil }