unsafe internal int StreamCallback(libhackrf.hackrf_transfer *transfer) { if (disposed || transfer == null) { return(0); } if (device.mode == NetHackrf.transceiver_mode_t.RX) { buffer_semaphore.WaitOne(); for (int i = 0; i < transfer->valid_length; i++) { stream_buffer[write_pos] = transfer->buffer[i]; write_pos++; if (write_pos >= stream_buffer.Length) { write_pos = 0; } if (write_pos == read_pos) { SetOverrunError(); } } buffer_semaphore.Release(); set_event(); } else if (device.mode == NetHackrf.transceiver_mode_t.TX) { buffer_semaphore.WaitOne(); for (int i = 0; i < transfer->valid_length; i++) { //transfer->buffer[i] = stream_buffer[read_pos]; transfer->buffer[i] = stream_buffer[read_pos]; read_pos++; if (read_pos >= stream_buffer.Length) { read_pos = 0; } if (read_pos == write_pos) { SetOverrunError(); break; } } buffer_semaphore.Release(); set_event(); } return(0); }
unsafe internal int StreamCallback(libhackrf.hackrf_transfer *transfer) // hackrf.dll calls this method to exchange data with device { if (disposed || transfer == null) // this method should be immedeately ended if stream is closed { return(0); } if (device.mode == NetHackrf.transceiver_mode_t.RX) { buffer_semaphore.WaitOne(); for (int i = 0; i < transfer->valid_length; i++) { stream_buffer[write_pos] = transfer->buffer[i]; write_pos++; if (write_pos >= stream_buffer.Length) { write_pos = 0; } if (write_pos == read_pos) { SetOverrunError(); } } buffer_semaphore.Release(); set_event(); } else if (device.mode == NetHackrf.transceiver_mode_t.TX) { buffer_semaphore.WaitOne(); for (int i = 0; i < transfer->valid_length; i++) { transfer->buffer[i] = stream_buffer[read_pos]; read_pos++; if (read_pos >= stream_buffer.Length) { read_pos = 0; } if (read_pos == write_pos) { SetOverrunError(); break; } } buffer_semaphore.Release(); set_event(); } return(0); }