| @@ -8,7 +8,6 @@ import ( | |||||
| "sdr-visual-suite/internal/classifier" | "sdr-visual-suite/internal/classifier" | ||||
| "sdr-visual-suite/internal/demod" | "sdr-visual-suite/internal/demod" | ||||
| "sdr-visual-suite/internal/demod/gpudemod" | |||||
| "sdr-visual-suite/internal/detector" | "sdr-visual-suite/internal/detector" | ||||
| "sdr-visual-suite/internal/dsp" | "sdr-visual-suite/internal/dsp" | ||||
| ) | ) | ||||
| @@ -31,40 +30,11 @@ func (m *Manager) demodAndWrite(dir string, ev detector.Event, iq []complex64, f | |||||
| var inputRate int | var inputRate int | ||||
| gpu := m.gpuEngine() | gpu := m.gpuEngine() | ||||
| if gpu != nil { | 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 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 | audio = gpuAudio | ||||
| inputRate = gpuRate | 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) | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -8,7 +8,6 @@ import ( | |||||
| "time" | "time" | ||||
| "sdr-visual-suite/internal/demod" | "sdr-visual-suite/internal/demod" | ||||
| "sdr-visual-suite/internal/demod/gpudemod" | |||||
| "sdr-visual-suite/internal/dsp" | "sdr-visual-suite/internal/dsp" | ||||
| ) | ) | ||||
| @@ -48,36 +47,11 @@ func (m *Manager) DemodLive(centerHz float64, bw float64, mode string, seconds i | |||||
| var inputRate int | var inputRate int | ||||
| gpu := m.gpuEngine() | gpu := m.gpuEngine() | ||||
| if gpu != nil { | 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 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 | audio = gpuAudio | ||||
| inputRate = gpuRate | 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) | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -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 | |||||
| } | |||||