fuck that async shieeet

This commit is contained in:
Eray Arslan 2020-08-01 21:26:01 +03:00
parent 163016f55f
commit d6bcde04a6
2 changed files with 79 additions and 50 deletions

View File

@ -13,6 +13,8 @@ import (
"unsafe"
)
const size = 2
//export cbGo
func cbGo(dev *C.struct_bladerf,
stream *C.struct_bladerf_stream,
@ -21,16 +23,19 @@ func cbGo(dev *C.struct_bladerf,
numSamples C.size_t,
userData unsafe.Pointer) unsafe.Pointer {
data := (*[0]uint16)(samples)
cb := (*Callback)(userData)
if len(*data) > 0 {
println(data)
} else {
println(data)
for i := 0; i < 4096; i++ {
cb.results = append(
cb.results,
int16(*((*C.int16_t)(unsafe.Pointer(uintptr(samples) + (size * uintptr(i)))))),
)
}
var rv unsafe.Pointer
return rv
cb.cb(cb.results)
cb.results = nil
return C.malloc(C.size_t(size * 4096 * 2 * 1))
}
type GainMode int
@ -345,7 +350,7 @@ func GetGainMode(bladeRF *BladeRF, module IOModule) (GainMode, error) {
return -1, err
}
func SetGainMode(bladeRF *BladeRF, module IOModule, mode GainMode) error {
func SetGainMode(bladeRF *BladeRF, module IOModule, mode GainMode) error {
return GetError(C.bladerf_set_gain_mode((*bladeRF).bladeRF, C.bladerf_module(module), C.bladerf_gain_mode(mode)))
}
@ -357,49 +362,44 @@ func DisableModule(bladeRF *BladeRF, direction Direction) error {
return GetError(C.bladerf_enable_module((*bladeRF).bladeRF, C.bladerf_module(direction), false))
}
var call = 0
func do_work() bool {
call = call + 1
return call >= 5000
}
func SyncRX(bladeRF *BladeRF, bufferSize uintptr) []int16 {
var metadata C.struct_bladerf_metadata
var buff *C.int16_t
size := unsafe.Sizeof(*buff)
// var buff *C.int16_t
// size := unsafe.Sizeof(*buff)
start := C.malloc(C.size_t(size * bufferSize * 2 * 1))
var err error
var done bool
var results []int16
for err == nil && !done {
err = GetError(C.bladerf_sync_rx((*bladeRF).bladeRF, start, C.uint(bufferSize), &metadata, 32))
if err == nil {
done = do_work()
if done {
for i := 0; i < (int(metadata.actual_count)); i++ {
n := (*C.int16_t)(unsafe.Pointer(uintptr(start) + (size * uintptr(i))))
results = append(results, int16(*n))
}
}
} else {
fmt.Printf("Failed to RX samples: %s", err)
err = GetError(C.bladerf_sync_rx((*bladeRF).bladeRF, start, C.uint(bufferSize), &metadata, 32))
if err == nil {
for i := 0; i < (int(metadata.actual_count)); i++ {
n := (*C.int16_t)(unsafe.Pointer(uintptr(start) + (size * uintptr(i))))
results = append(results, int16(*n))
}
} else {
fmt.Printf("Failed to RX samples: %s", err)
}
return results
}
func InitStream(bladeRF *BladeRF, format Format, numBuffers int, samplesPerBuffer int, numTransfers int) *Stream {
type Callback struct {
cb func(data []int16)
results []int16
}
func InitStream(bladeRF *BladeRF, format Format, numBuffers int, samplesPerBuffer int, numTransfers int, callback func(data []int16)) *Stream {
var buffers *unsafe.Pointer
var data unsafe.Pointer
var rxStream *C.struct_bladerf_stream
stream := Stream{stream: rxStream}
var res []int16
cb := Callback{cb: callback, results: res}
C.bladerf_init_stream(
&((stream).stream),
(*bladeRF).bladeRF,
@ -408,7 +408,7 @@ func InitStream(bladeRF *BladeRF, format Format, numBuffers int, samplesPerBuffe
C.bladerf_format(format),
C.ulong(samplesPerBuffer),
C.ulong(numTransfers),
data,
unsafe.Pointer(&cb),
)
return &stream
@ -418,16 +418,14 @@ func DeInitStream(stream *Stream) {
C.bladerf_deinit_stream(stream.stream)
}
func GetStreamTimeout(bladeRF *BladeRF, direction Direction) int {
func GetStreamTimeout(bladeRF *BladeRF, direction Direction) (int, error) {
var timeout C.uint
err := GetError(C.bladerf_get_stream_timeout((*bladeRF).bladeRF, C.bladerf_direction(direction), &timeout))
fmt.Println(err)
return int(timeout)
return int(timeout), err
}
func SetStreamTimeout(bladeRF *BladeRF, direction Direction, timeout int) {
err := GetError(C.bladerf_set_stream_timeout((*bladeRF).bladeRF, C.bladerf_direction(direction), C.uint(timeout)))
fmt.Println(err)
func SetStreamTimeout(bladeRF *BladeRF, direction Direction, timeout int) error {
return GetError(C.bladerf_set_stream_timeout((*bladeRF).bladeRF, C.bladerf_direction(direction), C.uint(timeout)))
}
func SyncConfig(bladeRF *BladeRF, layout ChannelLayout, format Format, numBuffers int, bufferSize int, numTransfers int, timeout int) error {
@ -435,7 +433,6 @@ func SyncConfig(bladeRF *BladeRF, layout ChannelLayout, format Format, numBuffer
return err
}
func StartStream(stream *Stream, layout ChannelLayout) {
err := GetError(C.bladerf_stream(stream.stream, C.bladerf_channel_layout(layout)))
fmt.Println(err)
func StartStream(stream *Stream, layout ChannelLayout) error {
return GetError(C.bladerf_stream(stream.stream, C.bladerf_channel_layout(layout)))
}

View File

@ -57,7 +57,7 @@ func TestBladeRF(t *testing.T) {
fmt.Printf("Bootloaders Len: %d\n", len(bootloaders))
rf := Open()
stream := InitStream(&rf, SC16_Q11, 2, 1024, 1)
stream := InitStream(&rf, SC16_Q11, 2, 1024, 1, cb)
StartStream(stream, RX_X1)
Close(rf)
}
@ -145,8 +145,22 @@ func TestStream(t *testing.T) {
}
}
func cb(data []int16) {
out := demodulator.Work(GetFinalData(data))
if out != nil {
var o = out.(demodcore.DemodData)
var nBf = make([]float32, len(o.Data))
copy(nBf, o.Data)
var buffs = len(nBf) / audioBufferSize
for i := 0; i < buffs; i++ {
audioFifo.Add(nBf[audioBufferSize*i : audioBufferSize*(i+1)])
}
}
}
func TestAsyncStream(t *testing.T) {
log.SetVerbosity(log.Critical)
log.SetVerbosity(log.Debug)
devices := GetDeviceList()
@ -158,14 +172,32 @@ func TestAsyncStream(t *testing.T) {
rf := OpenWithDevInfo(devices[0])
defer Close(rf)
SetSampleRate(&rf, IORX, 4000000)
EnableModule(&rf, RX)
_ = SetFrequency(&rf, IORX, 96600000)
_ = SetSampleRate(&rf, IORX, 4e6)
_, _ = SetBandwidth(&rf, IORX, 240000)
_ = SetGainMode(&rf, IORX, Hybrid_AGC)
_ = EnableModule(&rf, RX)
rxStream := InitStream(&rf, SC16_Q11, 32, 32768, 16)
rxStream := InitStream(&rf, SC16_Q11, 16, audioBufferSize, 8, cb)
defer DeInitStream(rxStream)
SetStreamTimeout(&rf, RX, 16)
GetStreamTimeout(&rf, RX)
_ = SetStreamTimeout(&rf, RX, 32)
timeout, _ := GetStreamTimeout(&rf, RX)
println(timeout)
StartStream(rxStream, RX_X1)
demodulator = demodcore.MakeWBFMDemodulator(uint32(2e6), 80e3, 48000)
portaudio.Initialize()
h, _ := portaudio.DefaultHostApi()
p := portaudio.LowLatencyParameters(nil, h.DefaultOutputDevice)
p.Input.Channels = 0
p.Output.Channels = 1
p.SampleRate = 48000
p.FramesPerBuffer = audioBufferSize
audioStream, _ = portaudio.OpenStream(p, ProcessAudio)
_ = audioStream.Start()
_ = StartStream(rxStream, RX_X1)
}