Download raw body.
NEW: comms/soapy-rtlsdr
Hello,
I tried CubicSDR with SoapyRTLSDR.
It looks working but stucks when frequency is changed.
Due to libusb's issue, rtlsdr_read_async() does not work well on OpenBSD.
This affects rtl_tcp of comms/rtl-sdr and comms/soapy-rtlsdr,
Airspy's SDR# (on Windows) with rtl_tcp (on OpenBSD) have same trouble.
For testing, I rewrited rtl_tcp code with rtlsdr_read_sync().
This is avaiable at https://github.com/jg1uaa/rtl_tcp_sync and
I think this have enough performance.
So, I did same thing for SoapyRTLSDR with rtlsdr_read_sync().
If this works well, can I commit it?
--
SASANO Takayoshi (JG1UAA) <uaa@mx5.nisiq.net>
Index: Makefile
===================================================================
RCS file: /cvs/ports/comms/soapy-rtlsdr/Makefile,v
diff -u -p -r1.1.1.1 Makefile
--- Makefile 29 May 2026 20:15:45 -0000 1.1.1.1
+++ Makefile 31 Jul 2026 11:35:16 -0000
@@ -1,6 +1,7 @@
COMMENT = Soapy SDR plugin for RTL-SDR
V = 0.3.3
+REVISION = 0
GH_ACCOUNT = pothosware
GH_PROJECT = SoapyRTLSDR
GH_COMMIT = b1f568d1b57cc973a1d2ee49be68d0d748d164e4
Index: patches/patch-SoapyRTLSDR_hpp
===================================================================
RCS file: patches/patch-SoapyRTLSDR_hpp
diff -N patches/patch-SoapyRTLSDR_hpp
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-SoapyRTLSDR_hpp 31 Jul 2026 11:35:16 -0000
@@ -0,0 +1,16 @@
+--- SoapyRTLSDR.hpp.orig Mon Aug 25 17:45:34 2025
++++ SoapyRTLSDR.hpp Fri Jul 31 20:18:53 2026
+@@ -264,9 +264,10 @@ class SoapyRTLSDR: public SoapySDR::Device (public)
+ std::vector<signed char> data;
+ };
+
+- //async api usage
+- std::thread _rx_async_thread;
+- void rx_async_operation(void);
++ //sync api usage
++ std::atomic<bool> _rxRunning;
++ std::thread _rx_sync_thread;
++ void rx_sync_operation(void);
+ void rx_callback(unsigned char *buf, uint32_t len);
+
+ std::mutex _buf_mutex;
Index: patches/patch-Streaming_cpp
===================================================================
RCS file: patches/patch-Streaming_cpp
diff -N patches/patch-Streaming_cpp
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-Streaming_cpp 31 Jul 2026 11:35:16 -0000
@@ -0,0 +1,75 @@
+--- Streaming.cpp.orig Mon Aug 25 17:45:34 2025
++++ Streaming.cpp Fri Jul 31 20:19:17 2026
+@@ -80,6 +80,7 @@ SoapySDR::ArgInfoList SoapyRTLSDR::getStreamArgsInfo(c
+
+ streamArgs.push_back(buffersArg);
+
++ // args for async no longer work, but kept for compatibility
+ SoapySDR::ArgInfo asyncbuffsArg;
+ asyncbuffsArg.key = "asyncBuffs";
+ asyncbuffsArg.value = "0";
+@@ -94,21 +95,23 @@ SoapySDR::ArgInfoList SoapyRTLSDR::getStreamArgsInfo(c
+ }
+
+ /*******************************************************************
+- * Async thread work
++ * Sync thread work
+ ******************************************************************/
+
+-static void _rx_callback(unsigned char *buf, uint32_t len, void *ctx)
++void SoapyRTLSDR::rx_sync_operation(void)
+ {
+- //printf("_rx_callback\n");
+- SoapyRTLSDR *self = (SoapyRTLSDR *)ctx;
+- self->rx_callback(buf, len);
+-}
++ int rxSize;
++ unsigned char *rxBuf = new unsigned char[bufferLength];
+
+-void SoapyRTLSDR::rx_async_operation(void)
+-{
+- //printf("rx_async_operation\n");
+- rtlsdr_read_async(dev, &_rx_callback, this, asyncBuffs, bufferLength);
+- //printf("rx_async_operation done!\n");
++ //printf("rx_sync_operation\n");
++ while (_rxRunning) {
++ if (rtlsdr_read_sync(dev, (void *)rxBuf, bufferLength, &rxSize) < 0)
++ break;
++ rx_callback(rxBuf, rxSize);
++ }
++ //printf("rx_sync_operation done!\n");
++
++ delete[] rxBuf;
+ }
+
+ void SoapyRTLSDR::rx_callback(unsigned char *buf, uint32_t len)
+@@ -316,11 +319,12 @@ int SoapyRTLSDR::activateStream(
+ resetBuffer = true;
+ bufferedElems = 0;
+
+- //start the async thread
+- if (not _rx_async_thread.joinable())
++ //start the sync thread
++ if (not _rx_sync_thread.joinable())
+ {
+ rtlsdr_reset_buffer(dev);
+- _rx_async_thread = std::thread(&SoapyRTLSDR::rx_async_operation, this);
++ _rxRunning = true;
++ _rx_sync_thread = std::thread(&SoapyRTLSDR::rx_sync_operation, this);
+ }
+
+ return 0;
+@@ -329,10 +333,10 @@ int SoapyRTLSDR::activateStream(
+ int SoapyRTLSDR::deactivateStream(SoapySDR::Stream *stream, const int flags, const long long timeNs)
+ {
+ if (flags != 0) return SOAPY_SDR_NOT_SUPPORTED;
+- if (_rx_async_thread.joinable())
++ if (_rx_sync_thread.joinable())
+ {
+- rtlsdr_cancel_async(dev);
+- _rx_async_thread.join();
++ _rxRunning = false;
++ _rx_sync_thread.join();
+ }
+ return 0;
+ }
NEW: comms/soapy-rtlsdr