comms/rtl-sdr fix rtl_tcp

SASANO Takayoshi <[email protected]> Sat, 01 Aug 2026 10:54:27 +0900
Newsgroups gmane.os.openbsd.ports
Message-ID <[email protected]>
Hello,

here is a diff to rtlsdr_read_async() -> rtlsdr_read_sync().
I use this modified rtl_tcp with Airspy SDR# on Windows box. work fine.

-- 
SASANO Takayoshi (JG1UAA) <[email protected]>

Index: Makefile
===================================================================
RCS file: /cvs/ports/comms/rtl-sdr/Makefile,v
diff -u -p -r1.12 Makefile
--- Makefile	22 Oct 2024 19:03:17 -0000	1.12
+++ Makefile	1 Aug 2026 01:50:16 -0000
@@ -1,5 +1,6 @@
 COMMENT=	software to turn RTL2832U into an SDR
 
+REVISION =	0
 GH_ACCOUNT =	osmocom
 GH_PROJECT =	rtl-sdr
 GH_TAGNAME =	v2.0.2
Index: patches/patch-src_rtl_tcp_c
===================================================================
RCS file: patches/patch-src_rtl_tcp_c
diff -N patches/patch-src_rtl_tcp_c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_rtl_tcp_c	1 Aug 2026 01:50:16 -0000
@@ -0,0 +1,123 @@
+--- src/rtl_tcp.c.orig.port	Tue Apr 23 18:42:58 2024
++++ src/rtl_tcp.c	Sat Aug  1 10:43:56 2026
+@@ -22,6 +22,7 @@
+ #include <string.h>
+ #include <stdio.h>
+ #include <stdlib.h>
++#include <stdatomic.h>
+ 
+ #ifndef _WIN32
+ #include <unistd.h>
+@@ -59,9 +60,11 @@ typedef int socklen_t;
+ #define DEFAULT_PORT_STR "1234"
+ #define DEFAULT_SAMPLE_RATE_HZ 2048000
+ #define DEFAULT_MAX_NUM_BUFFERS 500
++#define DEFAULT_RXBUFFER_SIZE 262144	// see "rtl-sdr.h"
+ 
+ static SOCKET s;
+ 
++static pthread_t reader_thread;
+ static pthread_t tcp_worker_thread;
+ static pthread_t command_thread;
+ static pthread_cond_t exit_cond;
+@@ -88,8 +91,9 @@ static int enable_biastee = 0;
+ static int global_numq = 0;
+ static struct llist *ll_buffers = 0;
+ static int llbuf_num = DEFAULT_MAX_NUM_BUFFERS;
++static int rxbuffer_size = DEFAULT_RXBUFFER_SIZE;
+ 
+-static volatile int do_exit = 0;
++static atomic_int do_exit = 0;
+ 
+ 
+ void usage(void)
+@@ -100,6 +104,7 @@ void usage(void)
+ 	printf("\t[-f frequency to tune to [Hz]]\n");
+ 	printf("\t[-g gain (default: 0 for auto)]\n");
+ 	printf("\t[-s samplerate in Hz (default: %d Hz)]\n", DEFAULT_SAMPLE_RATE_HZ);
++	printf("\t[-B size of buffer (default: %d kB)]\n", DEFAULT_RXBUFFER_SIZE / 1024);
+ 	printf("\t[-b number of buffers (default: 15, set by library)]\n");
+ 	printf("\t[-n max number of linked list buffers to keep (default: %d)]\n", DEFAULT_MAX_NUM_BUFFERS);
+ 	printf("\t[-d device index or serial (default: 0)]\n");
+@@ -137,7 +142,6 @@ sighandler(int signum)
+ 	if (CTRL_C_EVENT == signum) {
+ 		fprintf(stderr, "Signal caught, exiting!\n");
+ 		do_exit = 1;
+-		rtlsdr_cancel_async(dev);
+ 		return TRUE;
+ 	}
+ 	return FALSE;
+@@ -147,7 +151,6 @@ static void sighandler(int signum)
+ {
+ 	signal(SIGPIPE, SIG_IGN);
+ 	fprintf(stderr, "Signal caught, exiting!\n");
+-	rtlsdr_cancel_async(dev);
+ 	do_exit = 1;
+ }
+ #endif
+@@ -197,6 +200,33 @@ void rtlsdr_callback(unsigned char *buf, uint32_t len,
+ 	}
+ }
+ 
++static void *reader_worker(void *arg)
++{
++	int r, rxsize;
++	unsigned char *rxbuf = malloc(rxbuffer_size);
++
++	if(rxbuf == NULL) {
++		fprintf(stderr, "Failed to allocate rxbuffer\n");
++		goto out;
++	}
++
++	while(1) {
++		if(do_exit)
++			goto out;
++		
++		r = rtlsdr_read_sync(dev, rxbuf, rxbuffer_size, &rxsize);
++		if(r < 0) {
++			fprintf(stderr, "Failed to rtlsdr_read_sync %d\n", r);
++			goto out;
++		}
++
++		rtlsdr_callback(rxbuf, rxsize, NULL);
++	}
++
++out:
++	pthread_exit(0);
++}
++
+ static void *tcp_worker(void *arg)
+ {
+ 	struct llist *curelem,*prev;
+@@ -415,7 +445,7 @@ int main(int argc, char **argv)
+ 	struct sigaction sigact, sigign;
+ #endif
+ 
+-	while ((opt = getopt(argc, argv, "a:p:f:g:s:b:n:d:P:TD")) != -1) {
++	while ((opt = getopt(argc, argv, "a:p:f:g:s:B:b:n:d:P:TD")) != -1) {
+ 		switch (opt) {
+ 		case 'd':
+ 			dev_index = verbose_device_search(optarg);
+@@ -436,6 +466,9 @@ int main(int argc, char **argv)
+ 		case 'p':
+ 		        port = strdup(optarg);
+ 			break;
++		case 'B':
++			rxbuffer_size = atoi(optarg) * 1024;
++			break;
+ 		case 'b':
+ 			buf_num = atoi(optarg);
+ 			break;
+@@ -634,10 +667,10 @@ int main(int argc, char **argv)
+ 		pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
+ 		r = pthread_create(&tcp_worker_thread, &attr, tcp_worker, NULL);
+ 		r = pthread_create(&command_thread, &attr, command_worker, NULL);
++		r = pthread_create(&reader_thread, &attr, reader_worker, NULL);
+ 		pthread_attr_destroy(&attr);
+ 
+-		r = rtlsdr_read_async(dev, rtlsdr_callback, NULL, buf_num, 0);
+-
++		pthread_join(reader_thread, &status);
+ 		pthread_join(tcp_worker_thread, &status);
+ 		pthread_join(command_thread, &status);
+