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=
 &lt;<a href=3D"mailto:[email protected]">sebastia@l00-bugdead-=
prods.de</a>&gt; 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&#39;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>&gt; 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() -&gt; rtlsdr_read_sync().<br>
I use this modified rtl_tcp with Airspy SDR# on Windows box. work fine.<br>
<br>
-- <br>
SASANO Takayoshi (JG1UAA) &lt;<a href=3D"mailto:[email protected]" target=
=3D"_blank">[email protected]</a>&gt;<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 &lt;string.h&gt;<br>
+ #include &lt;stdio.h&gt;<br>
+ #include &lt;stdlib.h&gt;<br>
++#include &lt;stdatomic.h&gt;<br>
+ <br>
+ #ifndef _WIN32<br>
+ #include &lt;unistd.h&gt;<br>
+@@ -59,9 +60,11 @@ typedef int socklen_t;<br>
+ #define DEFAULT_PORT_STR &quot;1234&quot;<br>
+ #define DEFAULT_SAMPLE_RATE_HZ 2048000<br>
+ #define DEFAULT_MAX_NUM_BUFFERS 500<br>
++#define DEFAULT_RXBUFFER_SIZE 262144=C2=A0 // see &quot;rtl-sdr.h&quot;<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(&quot;\t[-f frequency to tune to [Hz]]\n=
&quot;);<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0printf(&quot;\t[-g gain (default: 0 for auto)]\=
n&quot;);<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0printf(&quot;\t[-s samplerate in Hz (default: %=
d Hz)]\n&quot;, DEFAULT_SAMPLE_RATE_HZ);<br>
++=C2=A0 =C2=A0 =C2=A0 printf(&quot;\t[-B size of buffer (default: %d kB)]\=
n&quot;, DEFAULT_RXBUFFER_SIZE / 1024);<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0printf(&quot;\t[-b number of buffers (default: =
15, set by library)]\n&quot;);<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0printf(&quot;\t[-n max number of linked list bu=
ffers to keep (default: %d)]\n&quot;, DEFAULT_MAX_NUM_BUFFERS);<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0printf(&quot;\t[-d device index or serial (defa=
ult: 0)]\n&quot;);<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&quot;);<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, &quot;Signal caught, exiting!\n=
&quot;);<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, &quot;Fa=
iled to allocate rxbuffer\n&quot;);<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, &amp;rxsize);<br>
++=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if(r &lt; 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, &quot;Failed to rtlsdr_read_sync %d\n&quot;, 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, &quot;a:p:f:g:s:b=
:n:d:P:TD&quot;)) !=3D -1) {<br>
++=C2=A0 =C2=A0 =C2=A0 while ((opt =3D getopt(argc, argv, &quot;a:p:f:g:s:B=
:b:n:d:P:TD&quot;)) !=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 &#39;d&#39;:<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 &#39;p&#39;:<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 &#39;B&#39;:<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 &#39;b&#39;:<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(&amp;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(&amp;tcp_worker_thread, &amp;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(&amp;command_thread, &amp;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, &amp;attr, reader_worker, NULL);<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pthread_attr_destro=
y(&amp;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, &amp;status);<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pthread_join(tcp_wo=
rker_thread, &amp;status);<br>
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pthread_join(comman=
d_thread, &amp;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--