rtlsdr not reseting buffers

Nuno Gonçalves nunojpg at gmail.com
Sun Apr 21 11:59:56 UTC 2013


rtlsdr in async mode is returning buffers full with data from previous calls.

I noticed that sometimes the first async callbacks would return TOO
QUICKLY so that it would be impossible to have sampled that data. This
might be because lib-usb have previous transfers submitted and not
cleared?

I compiled rtl_test with a small modification that will print the
sampling time if it is much lower than expected.
BUF_LENGTH is (16 * 16384)=256K, and SAMPLE_RATE is 2048000, so a full
buffer should take about 64ms.

You can see that in this example the async callback is returned after
7.79ms (and the following one 1.47ms later). So the data must be old.

The ns printf

nuno at ubuntu:~/Desktop/rtl-sdr/build/src$ ./rtl_test -p
Found 1 device(s):
  0:  ezcap USB 2.0 DVB-T/DAB/FM dongle

Using device 0: ezcap USB 2.0 DVB-T/DAB/FM dongle
Found Rafael Micro R820T tuner
Supported gain values (29): 0.0 0.9 1.4 2.7 3.7 7.7 8.7 12.5 14.4 15.7
16.6 19.7 20.7 22.9 25.4 28.0 29.7 32.8 33.8 36.4 37.2 38.6 40.2 42.1
43.4 43.9 44.5 48.0 49.6
Reporting PPM error measurement every 10 seconds...
Press ^C after a few minutes.
Reading samples in async mode...
ERROR ns:   7791886
ERROR ns:   9259301
lost at least 185 bytes
real sample rate: 2073369
real sample rate: 2048190
^CSignal caught, exiting!

User cancel, exiting...
Cumulative PPM error: -289


The modifications to demonstrate the issue:

nuno at ubuntu:~/Desktop/rtl-sdr/src$ git diff
diff --git a/src/rtl_test.c b/src/rtl_test.c
index f5a56b8..1935bfb 100644
--- a/src/rtl_test.c
+++ b/src/rtl_test.c
@@ -138,9 +138,11 @@ static void rtlsdr_callback(unsigned char *buf, uint32_t le
        ppm_now.tv_sec = tv.tv_sec;
        ppm_now.tv_nsec = tv.tv_usec*1000;
        #endif
-       if (ppm_now.tv_sec - ppm_recent.tv_sec > PPM_DURATION) {
-               ns = 1000000000L * (int64_t)(ppm_now.tv_sec - ppm_recent.tv_sec)
-               ns += (int64_t)(ppm_now.tv_nsec - ppm_recent.tv_nsec);
+       ns = 1000000000L * (int64_t)(ppm_now.tv_sec - ppm_recent.tv_sec);
+       ns += (int64_t)(ppm_now.tv_nsec - ppm_recent.tv_nsec);
+       if(ns<60000000)
+               printf("ERROR ns: %9lld\n",ns);
+       if (ppm_now.tv_sec - ppm_recent.tv_sec > PPM_DURATION) {
                printf("real sample rate: %i\n",
                (int)((1000000000L * ppm_count / 2L) / ns));
                #ifndef __APPLE__


Nuno




More information about the osmocom-sdr mailing list