Good day!

I was struggling with an occasional crash of the rtl-sdr tools on
windows when closing the device after pressing CTRL-C. Both with the
versions as provided with VCPKG and when directly compiling the latest
version in MSVC (with latest of libusb). It is a bit difficult to spot
a crash at close as usually it is silent but you can see it running it
from MSVC  or in a debugger. It does not happen always but frequent
enough.

Also, consider this example for the binary versions from Jan 2
(https://ftp.osmocom.org/binaries/windows/rtl-sdr/):

C:\>rtl_adsb.exe
Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000001

Using device 0: Generic RTL2832U OEM
Found Rafael Micro R820T tuner
....
Signal caught, exiting!

User cancel, exiting...

C:\>echo %ERRORLEVEL%
-1073741819

After investigation of the libusb logs and experimentation I think
this crash can be avoided by 1) defining zerotv in rtlsdr_read_async
as 1 ms instead of zero (see libusb/libusb#1043) or 2) include a short
call to Sleep to allow async operations to finish. Please find below a
patch for the latter fix for your consideration.

More information, here: https://github.com/osmocom/rtl-sdr/pull/18 and
here: https://github.com/libusb/libusb/issues/1043
Thanks for your great work on the rtlsdr library and kind regards.


Author: jvde.github <[email protected]>
Date:   Sat Jan 8 13:30:34 2022 +0100

    force wait state after cancel of usb transfer and before handling usb events

diff --git a/src/librtlsdr.c b/src/librtlsdr.c
index 0146298..2682d77 100644
--- a/src/librtlsdr.c
+++ b/src/librtlsdr.c
@@ -1930,6 +1930,9 @@ int rtlsdr_read_async(rtlsdr_dev_t *dev,
rtlsdr_read_async_cb_t cb, void *ctx,
                                        /* handle events after canceling
                                         * to allow transfer status to
                                         * propagate */
+#ifdef _WIN32
+                                       Sleep(1);
+#endif

libusb_handle_events_timeout_completed(dev->ctx,

        &zerotv, NULL);
                                        if (r < 0)

Reply via email to