[PATCH] rtl_fm null squelch

Wilson Waters osmocom-sdr-mail at alintech.com.au
Mon Nov 2 15:24:01 UTC 2015


Hi all,

I've created a simple little change for rtl_fm which outputs values of 0 
(instead of nothing) when the output is squelched. Use the -E 
nullsquelch option to enable.

This is useful when live streaming output to icecast or similar which 
requires a constant stream of data (such as 
http://rtl-sdr.com/forum/viewtopic.php?f=7&t=141).

Cheers,
Wilson.
-------------- next part --------------
diff --git a/src/rtl_fm.c b/src/rtl_fm.c
index e89e42d..4c314f7 100644
--- a/src/rtl_fm.c
+++ b/src/rtl_fm.c
@@ -131,7 +131,7 @@ struct demod_state
        int      downsample;    /* min 1, max 256 */
        int      post_downsample;
        int      output_scale;
-       int      squelch_level, conseq_squelch, squelch_hits, terminate_on_squelch;
+       int      squelch_level, conseq_squelch, squelch_hits, terminate_on_squelch, null_squelch;
        int      downsample_passes;
        int      comp_fir_size;
        int      custom_atan;
@@ -205,6 +205,7 @@ void usage(void)
                "\t    deemp:  enable de-emphasis filter\n"
                "\t    direct: enable direct sampling\n"
                "\t    offset: enable offset tuning\n"
+               "\t    nullsquelch: output null padding when squelched\n"
                "\tfilename ('-' means stdout)\n"
                "\t    omitting the filename also uses stdout\n\n"
                "Experimental options:\n"
@@ -812,6 +813,7 @@ static void *dongle_thread_fn(void *arg)

 static void *demod_thread_fn(void *arg)
 {
+       int i;
        struct demod_state *d = arg;
        struct output_state *o = d->output_target;
        while (!do_exit) {
@@ -825,7 +827,9 @@ static void *demod_thread_fn(void *arg)
                if (d->squelch_level && d->squelch_hits > d->conseq_squelch) {
                        d->squelch_hits = d->conseq_squelch + 1;  /* hair trigger */
                        safe_cond_signal(&controller.hop, &controller.hop_m);
-                       continue;
+                       if (!d->null_squelch) {
+                               continue;
+                       }
                }
                pthread_rwlock_wrlock(&o->rw);
                memcpy(o->result, d->result, 2*d->result_len);
@@ -1106,6 +1110,8 @@ int main(int argc, char **argv)
                                dongle.direct_sampling = 1;}
                        if (strcmp("offset",  optarg) == 0) {
                                dongle.offset_tuning = 1;}
+                       if (strcmp("nullsquelch",  optarg) == 0) {
+                               demod.null_squelch = 1;}
                        break;
                case 'F':
                        demod.downsample_passes = 1;  /* truthy placeholder */


More information about the osmocom-sdr mailing list