Index | Thread | Search

From:
Sebastian Reitenbach <sebastia@l00-bugdead-prods.de>
Subject:
Re: NEW: comms/soapy-rtlsdr
To:
SASANO Takayoshi <uaa@mx5.nisiq.net>
Cc:
uaa@openbsd.org, ports <ports@openbsd.org>
Date:
Tue, 4 Aug 2026 14:46:29 +0200

Download raw body.

Thread
  • Sebastian Reitenbach:

    NEW: comms/soapy-rtlsdr

  • Sebastian Reitenbach:

    NEW: comms/soapy-rtlsdr

  • lrz mr test that one as well!
    
    On Fri, Jul 31, 2026 at 1:49 PM SASANO Takayoshi <uaa@mx5.nisiq.net> wrote:
    
    > 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;
    > + }
    >
    
    
    -- 
    https://buzzdeee.reitenba.ch
    
  • Sebastian Reitenbach:

    NEW: comms/soapy-rtlsdr

  • Sebastian Reitenbach:

    NEW: comms/soapy-rtlsdr