| @@ -400,33 +400,59 @@ func goStreamCallback(xi *C.short, xq *C.short, numSamples C.uint, reset C.uint, | |||||
| if atomic.LoadUint32(&src.stopping) != 0 { | if atomic.LoadUint32(&src.stopping) != 0 { | ||||
| return | return | ||||
| } | } | ||||
| n := int(numSamples) | |||||
| if n <= 0 { | |||||
| return | |||||
| } | |||||
| src.mu.Lock() | |||||
| defer src.mu.Unlock() | |||||
| if reset != 0 { | if reset != 0 { | ||||
| src.mu.Lock() | |||||
| src.head = 0 | src.head = 0 | ||||
| src.size = 0 | src.size = 0 | ||||
| src.resets++ | src.resets++ | ||||
| src.mu.Unlock() | |||||
| if src.cond != nil { | |||||
| src.cond.Broadcast() | |||||
| } | |||||
| } | |||||
| n := int(numSamples) | |||||
| if n <= 0 { | |||||
| return | |||||
| } | } | ||||
| iq := make([]complex64, n) | |||||
| xiSlice := unsafe.Slice((*int16)(unsafe.Pointer(xi)), n) | xiSlice := unsafe.Slice((*int16)(unsafe.Pointer(xi)), n) | ||||
| xqSlice := unsafe.Slice((*int16)(unsafe.Pointer(xq)), n) | xqSlice := unsafe.Slice((*int16)(unsafe.Pointer(xq)), n) | ||||
| const scale = 1.0 / 32768.0 | const scale = 1.0 / 32768.0 | ||||
| for i := 0; i < n; i++ { | |||||
| incoming := n | |||||
| if incoming > src.capSamples { | |||||
| offset := incoming - src.capSamples | |||||
| xiSlice = xiSlice[offset:] | |||||
| xqSlice = xqSlice[offset:] | |||||
| incoming = src.capSamples | |||||
| src.dropped += uint64(offset) | |||||
| } | |||||
| over := src.size + incoming - src.capSamples | |||||
| if over > 0 { | |||||
| src.head = (src.head + over) % src.capSamples | |||||
| src.size -= over | |||||
| src.dropped += uint64(over) | |||||
| } | |||||
| start := (src.head + src.size) % src.capSamples | |||||
| first := min(incoming, src.capSamples-start) | |||||
| for i := 0; i < first; i++ { | |||||
| re := float32(float64(xiSlice[i]) * scale) | re := float32(float64(xiSlice[i]) * scale) | ||||
| im := float32(float64(xqSlice[i]) * scale) | im := float32(float64(xqSlice[i]) * scale) | ||||
| iq[i] = complex(re, im) | |||||
| src.buf[start+i] = complex(re, im) | |||||
| } | } | ||||
| src.mu.Lock() | |||||
| if first < incoming { | |||||
| for i := first; i < incoming; i++ { | |||||
| re := float32(float64(xiSlice[i]) * scale) | |||||
| im := float32(float64(xqSlice[i]) * scale) | |||||
| src.buf[i-first] = complex(re, im) | |||||
| } | |||||
| } | |||||
| src.size += incoming | |||||
| src.lastSample = time.Now() | src.lastSample = time.Now() | ||||
| src.appendRing(iq) | |||||
| src.mu.Unlock() | |||||
| if src.cond != nil { | |||||
| src.cond.Broadcast() | |||||
| } | |||||
| } | } | ||||
| func cErr(err C.sdrplay_api_ErrT) error { | func cErr(err C.sdrplay_api_ErrT) error { | ||||