Re: comms/rtl-sdr fix rtl_tcp
Sebastian Reitenbach <[email protected]> Mon, 3 Aug 2026 22:05:46 +0200
| Newsgroups | gmane.os.openbsd.ports |
|---|---|
| Message-ID | <CAEoLn6-90LmLw9ozGphM3u+3e7t2sEFgm8N4mYqrw5KPKQ4Atg@mail.gmail.com> |
--00000000000013503206582a1146 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable without and with your patch, I can run rtl_sdr -a 127.0.0.1 and connect gqrx to it, to listen to radio. So what does the patch fix for you? Do you have something I could reproduce? Sebastian On Sat, Aug 1, 2026 at 7:10=E2=80=AFPM Sebastian Reitenbach < [email protected]> wrote: > I'll give ti a try hopefully later Today or tomorrow. > > On Sat, Aug 1, 2026 at 3:54=E2=80=AFAM SASANO Takayoshi <[email protected]= t> wrote: > >> 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 >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> 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=3D software to turn RTL2832U into an SDR >> >> +REVISION =3D 0 >> GH_ACCOUNT =3D osmocom >> GH_PROJECT =3D rtl-sdr >> GH_TAGNAME =3D v2.0.2 >> Index: patches/patch-src_rtl_tcp_c >> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >> 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 =3D 0; >> + static int global_numq =3D 0; >> + static struct llist *ll_buffers =3D 0; >> + static int llbuf_num =3D DEFAULT_MAX_NUM_BUFFERS; >> ++static int rxbuffer_size =3D DEFAULT_RXBUFFER_SIZE; >> + >> +-static volatile int do_exit =3D 0; >> ++static atomic_int do_exit =3D 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 =3D=3D signum) { >> + fprintf(stderr, "Signal caught, exiting!\n"); >> + do_exit =3D 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 =3D 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 =3D malloc(rxbuffer_size); >> ++ >> ++ if(rxbuf =3D=3D NULL) { >> ++ fprintf(stderr, "Failed to allocate rxbuffer\n"); >> ++ goto out; >> ++ } >> ++ >> ++ while(1) { >> ++ if(do_exit) >> ++ goto out; >> ++ >> ++ r =3D rtlsdr_read_sync(dev, rxbuf, rxbuffer_size, &rxsiz= e); >> ++ 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 =3D getopt(argc, argv, "a:p:f:g:s:b:n:d:P:TD")) !=3D= -1) { >> ++ while ((opt =3D getopt(argc, argv, "a:p:f:g:s:B:b:n:d:P:TD")) != =3D >> -1) { >> + switch (opt) { >> + case 'd': >> + dev_index =3D verbose_device_search(optarg); >> +@@ -436,6 +466,9 @@ int main(int argc, char **argv) >> + case 'p': >> + port =3D strdup(optarg); >> + break; >> ++ case 'B': >> ++ rxbuffer_size =3D atoi(optarg) * 1024; >> ++ break; >> + case 'b': >> + buf_num =3D atoi(optarg); >> + break; >> +@@ -634,10 +667,10 @@ int main(int argc, char **argv) >> + pthread_attr_setdetachstate(&attr, >> PTHREAD_CREATE_JOINABLE); >> + r =3D pthread_create(&tcp_worker_thread, &attr, tcp_work= er, >> NULL); >> + r =3D pthread_create(&command_thread, &attr, >> command_worker, NULL); >> ++ r =3D pthread_create(&reader_thread, &attr, reader_worke= r, >> NULL); >> + pthread_attr_destroy(&attr); >> + >> +- r =3D 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); >> + >> > > > -- > https://buzzdeee.reitenba.ch > --=20 https://buzzdeee.reitenba.ch --00000000000013503206582a1146 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable <div dir=3D"ltr"><div>without and with your patch, I can run rtl_sdr -a 127= .0.0.1 and connect gqrx to it, to listen to radio.</div><div>So what does t= he patch fix for you?</div><div><br></div><div>Do you have something I coul= d reproduce?</div><div><br></div><div>Sebastian</div><div><br></div></div><= br><div class=3D"gmail_quote gmail_quote_container"><div dir=3D"ltr" class= =3D"gmail_attr">On Sat, Aug 1, 2026 at 7:10=E2=80=AFPM Sebastian Reitenbach= <<a href=3D"mailto:[email protected]">sebastia@l00-bugdead-= prods.de</a>> wrote:<br></div><blockquote class=3D"gmail_quote" style=3D= "margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-le= ft:1ex"><div dir=3D"ltr">I'll give ti a try hopefully=C2=A0later Today = or=C2=A0tomorrow.</div><br><div class=3D"gmail_quote"><div dir=3D"ltr" clas= s=3D"gmail_attr">On Sat, Aug 1, 2026 at 3:54=E2=80=AFAM SASANO Takayoshi &l= t;<a href=3D"mailto:[email protected]" target=3D"_blank">[email protected]<= /a>> wrote:<br></div><blockquote class=3D"gmail_quote" style=3D"margin:0= px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">H= ello,<br> <br> here is a diff to rtlsdr_read_async() -> rtlsdr_read_sync().<br> I use this modified rtl_tcp with Airspy SDR# on Windows box. work fine.<br> <br> -- <br> SASANO Takayoshi (JG1UAA) <<a href=3D"mailto:[email protected]" target= =3D"_blank">[email protected]</a>><br> <br> Index: Makefile<br> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D<br> RCS file: /cvs/ports/comms/rtl-sdr/Makefile,v<br> diff -u -p -r1.12 Makefile<br> --- Makefile=C2=A0 =C2=A0 22 Oct 2024 19:03:17 -0000=C2=A0 =C2=A0 =C2=A0 1.= 12<br> +++ Makefile=C2=A0 =C2=A0 1 Aug 2026 01:50:16 -0000<br> @@ -1,5 +1,6 @@<br> =C2=A0COMMENT=3D=C2=A0 =C2=A0 =C2=A0 =C2=A0software to turn RTL2832U into a= n SDR<br> <br> +REVISION =3D=C2=A0 =C2=A0 =C2=A00<br> =C2=A0GH_ACCOUNT =3D=C2=A0 =C2=A0osmocom<br> =C2=A0GH_PROJECT =3D=C2=A0 =C2=A0rtl-sdr<br> =C2=A0GH_TAGNAME =3D=C2=A0 =C2=A0v2.0.2<br> Index: patches/patch-src_rtl_tcp_c<br> =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D<br> RCS file: patches/patch-src_rtl_tcp_c<br> diff -N patches/patch-src_rtl_tcp_c<br> --- /dev/null=C2=A0 =C2=A01 Jan 1970 00:00:00 -0000<br> +++ patches/patch-src_rtl_tcp_c 1 Aug 2026 01:50:16 -0000<br> @@ -0,0 +1,123 @@<br> +--- src/rtl_tcp.c.orig.port=C2=A0 =C2=A0 Tue Apr 23 18:42:58 2024<br> ++++ src/rtl_tcp.c=C2=A0 =C2=A0 =C2=A0 Sat Aug=C2=A0 1 10:43:56 2026<br> +@@ -22,6 +22,7 @@<br> + #include <string.h><br> + #include <stdio.h><br> + #include <stdlib.h><br> ++#include <stdatomic.h><br> + <br> + #ifndef _WIN32<br> + #include <unistd.h><br> +@@ -59,9 +60,11 @@ typedef int socklen_t;<br> + #define DEFAULT_PORT_STR "1234"<br> + #define DEFAULT_SAMPLE_RATE_HZ 2048000<br> + #define DEFAULT_MAX_NUM_BUFFERS 500<br> ++#define DEFAULT_RXBUFFER_SIZE 262144=C2=A0 // see "rtl-sdr.h"<b= r> + <br> + static SOCKET s;<br> + <br> ++static pthread_t reader_thread;<br> + static pthread_t tcp_worker_thread;<br> + static pthread_t command_thread;<br> + static pthread_cond_t exit_cond;<br> +@@ -88,8 +91,9 @@ static int enable_biastee =3D 0;<br> + static int global_numq =3D 0;<br> + static struct llist *ll_buffers =3D 0;<br> + static int llbuf_num =3D DEFAULT_MAX_NUM_BUFFERS;<br> ++static int rxbuffer_size =3D DEFAULT_RXBUFFER_SIZE;<br> + <br> +-static volatile int do_exit =3D 0;<br> ++static atomic_int do_exit =3D 0;<br> + <br> + <br> + void usage(void)<br> +@@ -100,6 +104,7 @@ void usage(void)<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0printf("\t[-f frequency to tune to [Hz]]\n= ");<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0printf("\t[-g gain (default: 0 for auto)]\= n");<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0printf("\t[-s samplerate in Hz (default: %= d Hz)]\n", DEFAULT_SAMPLE_RATE_HZ);<br> ++=C2=A0 =C2=A0 =C2=A0 printf("\t[-B size of buffer (default: %d kB)]\= n", DEFAULT_RXBUFFER_SIZE / 1024);<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0printf("\t[-b number of buffers (default: = 15, set by library)]\n");<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0printf("\t[-n max number of linked list bu= ffers to keep (default: %d)]\n", DEFAULT_MAX_NUM_BUFFERS);<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0printf("\t[-d device index or serial (defa= ult: 0)]\n");<br> +@@ -137,7 +142,6 @@ sighandler(int signum)<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0if (CTRL_C_EVENT =3D=3D signum) {<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0fprintf(stderr, &qu= ot;Signal caught, exiting!\n");<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0do_exit =3D 1;<br> +-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 rtlsdr_cancel_async(dev)= ;<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return TRUE;<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0}<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0return FALSE;<br> +@@ -147,7 +151,6 @@ static void sighandler(int signum)<br> + {<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0signal(SIGPIPE, SIG_IGN);<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0fprintf(stderr, "Signal caught, exiting!\n= ");<br> +-=C2=A0 =C2=A0 =C2=A0 rtlsdr_cancel_async(dev);<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0do_exit =3D 1;<br> + }<br> + #endif<br> +@@ -197,6 +200,33 @@ void rtlsdr_callback(unsigned char *buf, uint32_t len= ,<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0}<br> + }<br> + <br> ++static void *reader_worker(void *arg)<br> ++{<br> ++=C2=A0 =C2=A0 =C2=A0 int r, rxsize;<br> ++=C2=A0 =C2=A0 =C2=A0 unsigned char *rxbuf =3D malloc(rxbuffer_size);<br> ++<br> ++=C2=A0 =C2=A0 =C2=A0 if(rxbuf =3D=3D NULL) {<br> ++=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf(stderr, "Fa= iled to allocate rxbuffer\n");<br> ++=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto out;<br> ++=C2=A0 =C2=A0 =C2=A0 }<br> ++<br> ++=C2=A0 =C2=A0 =C2=A0 while(1) {<br> ++=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if(do_exit)<br> ++=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 goto out;<br> ++=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 <br> ++=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 r =3D rtlsdr_read_sync(d= ev, rxbuf, rxbuffer_size, &rxsize);<br> ++=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if(r < 0) {<br> ++=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 fprintf(stderr, "Failed to rtlsdr_read_sync %d\n", r);<br> ++=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 goto out;<br> ++=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }<br> ++<br> ++=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 rtlsdr_callback(rxbuf, r= xsize, NULL);<br> ++=C2=A0 =C2=A0 =C2=A0 }<br> ++<br> ++out:<br> ++=C2=A0 =C2=A0 =C2=A0 pthread_exit(0);<br> ++}<br> ++<br> + static void *tcp_worker(void *arg)<br> + {<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0struct llist *curelem,*prev;<br> +@@ -415,7 +445,7 @@ int main(int argc, char **argv)<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0struct sigaction sigact, sigign;<br> + #endif<br> + <br> +-=C2=A0 =C2=A0 =C2=A0 while ((opt =3D getopt(argc, argv, "a:p:f:g:s:b= :n:d:P:TD")) !=3D -1) {<br> ++=C2=A0 =C2=A0 =C2=A0 while ((opt =3D getopt(argc, argv, "a:p:f:g:s:B= :b:n:d:P:TD")) !=3D -1) {<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0switch (opt) {<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0case 'd':<b= r> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0dev_index =3D verbose_device_search(optarg);<br> +@@ -436,6 +466,9 @@ int main(int argc, char **argv)<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0case 'p':<b= r> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0port =3D strdup(optarg);<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0break;<br> ++=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 case 'B':<br> ++=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 rxbuffer_size =3D atoi(optarg) * 1024;<br> ++=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 break;<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0case 'b':<b= r> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0buf_num =3D atoi(optarg);<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0break;<br> +@@ -634,10 +667,10 @@ int main(int argc, char **argv)<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pthread_attr_setdet= achstate(&attr, PTHREAD_CREATE_JOINABLE);<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0r =3D pthread_creat= e(&tcp_worker_thread, &attr, tcp_worker, NULL);<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0r =3D pthread_creat= e(&command_thread, &attr, command_worker, NULL);<br> ++=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 r =3D pthread_create(&am= p;reader_thread, &attr, reader_worker, NULL);<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pthread_attr_destro= y(&attr);<br> + <br> +-=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 r =3D rtlsdr_read_async(= dev, rtlsdr_callback, NULL, buf_num, 0);<br> +-<br> ++=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pthread_join(reader_thre= ad, &status);<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pthread_join(tcp_wo= rker_thread, &status);<br> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pthread_join(comman= d_thread, &status);<br> + <br> </blockquote></div><div><br clear=3D"all"></div><br><span class=3D"gmail_si= gnature_prefix">-- </span><br><div dir=3D"ltr" class=3D"gmail_signature"><d= iv dir=3D"ltr"><a href=3D"https://buzzdeee.reitenba.ch" target=3D"_blank">h= ttps://buzzdeee.reitenba.ch</a></div></div> </blockquote></div><div><br clear=3D"all"></div><br><span class=3D"gmail_si= gnature_prefix">-- </span><br><div dir=3D"ltr" class=3D"gmail_signature"><d= iv dir=3D"ltr"><a href=3D"https://buzzdeee.reitenba.ch" target=3D"_blank">h= ttps://buzzdeee.reitenba.ch</a></div></div> --00000000000013503206582a1146--