From 22551e72bfb953ab5f4d7e510be31295c7ab5179 Mon Sep 17 00:00:00 2001 From: Enrique Date: Fri, 5 May 2017 17:59:28 -0700 Subject: [PATCH] sync mode is not default, lowered number of buffers for librtlsdr --- src/librtlsdr.c | 2 +- src/rtl_fm.c | 52 ++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/src/librtlsdr.c b/src/librtlsdr.c index 9b7ba52..0e45911 100644 --- a/src/librtlsdr.c +++ b/src/librtlsdr.c @@ -354,7 +354,7 @@ static rtlsdr_dongle_t known_devices[] = { { 0x1f4d, 0xd803, "PROlectrix DV107669" }, }; -#define DEFAULT_BUF_NUMBER 15 +#define DEFAULT_BUF_NUMBER 1 #define DEFAULT_BUF_LENGTH (16 * 32 * 512) #define DEF_RTL_XTAL_FREQ 28800000 diff --git a/src/rtl_fm.c b/src/rtl_fm.c index e89e42d..89ce5e6 100644 --- a/src/rtl_fm.c +++ b/src/rtl_fm.c @@ -92,6 +92,9 @@ static int *atan_lut = NULL; static int atan_lut_size = 131072; /* 512 KB */ static int atan_lut_coef = 8; +static uint8_t *buffer = NULL; +static int use_sync = 0; + struct dongle_state { int exit_flag; @@ -215,6 +218,7 @@ void usage(void) "\t enables low-leakage downsample filter\n" "\t size can be 0 or 9. 0 has bad roll off\n" "\t[-A std/fast/lut choose atan math (default: std)]\n" + "\t[-S force sync output (defatuls: async)]\n" //"\t[-C clip_path (default: off)\n" //"\t (create time stamped raw clips, requires squelch)\n" //"\t (path must have '\%s' and will expand to date_time_freq)\n" @@ -236,7 +240,8 @@ sighandler(int signum) if (CTRL_C_EVENT == signum) { fprintf(stderr, "Signal caught, exiting!\n"); do_exit = 1; - rtlsdr_cancel_async(dongle.dev); + if (!use_sync) + rtlsdr_cancel_async(dongle.dev); return TRUE; } return FALSE; @@ -246,7 +251,8 @@ static void sighandler(int signum) { fprintf(stderr, "Signal caught, exiting!\n"); do_exit = 1; - rtlsdr_cancel_async(dongle.dev); + if (!use_sync) + rtlsdr_cancel_async(dongle.dev); } #endif @@ -1034,6 +1040,20 @@ void sanity_checks(void) } +void dongle_read_sync(struct dongle_state *s) +{ + int r; + int n_read; + + r = rtlsdr_read_sync(s->dev, buffer, ACTUAL_BUF_LENGTH, &n_read); + if (r < 0) { + fprintf(stderr, "WARNING: sync read failed.\n"); + return; + } + + rtlsdr_callback(buffer, n_read, s); +} + int main(int argc, char **argv) { #ifndef _WIN32 @@ -1047,7 +1067,7 @@ int main(int argc, char **argv) output_init(&output); controller_init(&controller); - while ((opt = getopt(argc, argv, "d:f:g:s:b:l:o:t:r:p:E:F:A:M:h")) != -1) { + while ((opt = getopt(argc, argv, "d:f:g:s:b:l:o:t:r:p:E:F:A:M:h:S")) != -1) { switch (opt) { case 'd': dongle.dev_index = verbose_device_search(optarg); @@ -1142,6 +1162,9 @@ int main(int argc, char **argv) demod.deemph = 1; demod.squelch_level = 0;} break; + case 'S': + use_sync = 1; + break; case 'h': default: usage(); @@ -1229,18 +1252,33 @@ int main(int argc, char **argv) usleep(100000); pthread_create(&output.thread, NULL, output_thread_fn, (void *)(&output)); pthread_create(&demod.thread, NULL, demod_thread_fn, (void *)(&demod)); - pthread_create(&dongle.thread, NULL, dongle_thread_fn, (void *)(&dongle)); - while (!do_exit) { - usleep(100000); + if (!use_sync) { + pthread_create(&dongle.thread, NULL, dongle_thread_fn, (void *)(&dongle)); + while(!do_exit) { + usleep(100000); + } } + else { + + buffer = malloc(ACTUAL_BUF_LENGTH * sizeof(uint8_t)); + + while (!do_exit) { + dongle_read_sync(&dongle); + usleep(100); + } + + free (buffer); + } + if (do_exit) { fprintf(stderr, "\nUser cancel, exiting...\n");} else { fprintf(stderr, "\nLibrary error %d, exiting...\n", r);} - rtlsdr_cancel_async(dongle.dev); + if (!use_sync) + rtlsdr_cancel_async(dongle.dev); pthread_join(dongle.thread, NULL); safe_cond_signal(&demod.ready, &demod.ready_m); pthread_join(demod.thread, NULL);