dvbv5-scan: Allow using separate adapter for FE and demux
authorMauro Carvalho Chehab <m.chehab@samsung.com>
Mon, 11 Nov 2013 15:09:13 +0000 (13:09 -0200)
committerMauro Carvalho Chehab <m.chehab@samsung.com>
Mon, 11 Nov 2013 15:09:13 +0000 (13:09 -0200)
Complex embedded devices may have more than one adapter, and some
pipelines between them.

Allow specifying a different adapter for FE than the one for demux.

In order to use multiple adapters, the -a option should apeear
twice, each just before the frontend/demod option (-f and -d),
like:

dvbv5-scan -a 0 -f 0 -a 2 -d 2 some_scan_file

If only one -a (or --adapter) is found, the same adapter will
be used by both frontends and demuxes, and the -a can be on any
order at the command line. This way, it preserves backward
compatibility.

Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
utils/dvb/dvbv5-scan.c

index 9a29b34..4ffa790 100644 (file)
@@ -46,7 +46,7 @@ const char *argp_program_bug_address = "Mauro Carvalho Chehab <mchehab@redhat.co
 
 struct arguments {
        char *confname, *lnb_name, *output, *demux_dev;
-       unsigned adapter, frontend, demux, get_detected, get_nit;
+       unsigned adapter, n_adapter, adapter_fe, adapter_dmx, frontend, demux, get_detected, get_nit;
        int force_dvbv3, lnb, sat_number, freq_bpf;
        unsigned diseqc_wait, dont_add_new_freqs, timeout_multiply;
        unsigned other_nit;
@@ -521,12 +521,15 @@ static error_t parse_opt(int k, char *optarg, struct argp_state *state)
        switch (k) {
        case 'a':
                args->adapter = strtoul(optarg, NULL, 0);
+               args->n_adapter++;
                break;
        case 'f':
                args->frontend = strtoul(optarg, NULL, 0);
+               args->adapter_fe = args->adapter;
                break;
        case 'd':
                args->demux = strtoul(optarg, NULL, 0);
+               args->adapter_dmx = args->adapter;
                break;
        case 'l':
                args->lnb_name = optarg;
@@ -593,11 +596,17 @@ int main(int argc, char **argv)
        args.input_format = FILE_DVBV5;
        args.output_format = FILE_DVBV5;
        args.timeout_multiply = 1;
+       args.adapter = (unsigned)-1;
 
        argp_parse(&argp, argc, argv, 0, &idx, &args);
        if (args.timeout_multiply == 0)
                args.timeout_multiply = 1;
 
+       if (args.n_adapter == 1) {
+               args.adapter_fe = args.adapter;
+               args.adapter_dmx = args.adapter;
+       }
+
        if (args.lnb_name) {
                lnb = dvb_sat_search_lnb(args.lnb_name);
                if (lnb < 0) {
@@ -626,12 +635,12 @@ int main(int argc, char **argv)
        }
 
        asprintf(&args.demux_dev,
-                "/dev/dvb/adapter%i/demux%i", args.adapter, args.demux);
+                "/dev/dvb/adapter%i/demux%i", args.adapter_dmx, args.demux);
 
        if (verbose)
                fprintf(stderr, "using demux '%s'\n", args.demux_dev);
 
-       struct dvb_v5_fe_parms *parms = dvb_fe_open(args.adapter,
+       struct dvb_v5_fe_parms *parms = dvb_fe_open(args.adapter_fe,
                                                    args.frontend,
                                                    verbose, args.force_dvbv3);
        if (!parms)