From a769aa6eb6c868e4487cde63fe6c63641f0b9e5d Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Sun, 11 Mar 2012 18:05:21 +0200 Subject: [PATCH] DTV: deal with "cable", "terrestrial" and "satellite" scheme right This requires Linux DVBv5.5. --- modules/access/dtv/access.c | 57 +++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/modules/access/dtv/access.c b/modules/access/dtv/access.c index d451fa4382..c7cbf06769 100644 --- a/modules/access/dtv/access.c +++ b/modules/access/dtv/access.c @@ -589,25 +589,7 @@ static int Control (access_t *access, int query, va_list args) /** Determines which delivery system to use. */ static const delsys_t *GuessSystem (const char *scheme, dvb_device_t *dev) { - /* NOTE: We should guess the delivery system for the "cable", "satellite" - * and "terrestrial" shortcuts (i.e. DVB, ISDB, ATSC...). But there is - * seemingly no sane way to do get the info with Linux DVB version 5.2. - * In particular, the frontend infos distinguish only the modulator class - * (QPSK, QAM, OFDM or ATSC). - * - * Furthermore, if the demodulator supports 2G, we cannot guess whether - * 1G or 2G is intended. For backward compatibility, 1G is assumed - * (this is not a limitation of Linux DVB). We will probably need something - * smarter when 2G (semi automatic) scanning is implemented. */ - if (!strcasecmp (scheme, "cable")) - scheme = "dvb-c"; - else - if (!strcasecmp (scheme, "satellite")) - scheme = "dvb-s"; - else - if (!strcasecmp (scheme, "terrestrial")) - scheme = "dvb-t"; - + /* Specific delivery system is specified */ if (!strcasecmp (scheme, "atsc")) return &atsc; if (!strcasecmp (scheme, "cqam")) @@ -629,15 +611,48 @@ static const delsys_t *GuessSystem (const char *scheme, dvb_device_t *dev) if (!strcasecmp (scheme, "isdb-t")) return &isdbt; + /* If the demodulator supports 2G, we cannot guess whether + * 1G or 2G is intended. For backward compatibility, 1G is assumed + * (this is not a limitation of Linux DVB). We will probably need something + * smarter when 2G (semi automatic) scanning is implemented. */ unsigned systems = dvb_enum_systems (dev); - if (systems & ATSC) - return &atsc; + + /* Only wave carrier is specified */ + if (!strcasecmp (scheme, "cable")) + { + if (systems & DVB_C) + return &dvbc; + if (systems & CQAM) + return &cqam; + if (systems & ISDB_C) + return &isdbc; + } + if (!strcasecmp (scheme, "satellite")) + { + if (systems & DVB_S) + return &dvbs; + if (systems & ISDB_S) + return &isdbs; + } + if (!strcasecmp (scheme, "terrestrial")) + { + if (systems & DVB_T) + return &dvbc; + if (systems & ATSC) + return &cqam; + if (systems & ISDB_T) + return &isdbt; + } + + /* Only standards family or nothing is specified */ if (systems & DVB_C) return &dvbc; if (systems & DVB_S) return &dvbc; if (systems & DVB_T) return &dvbt; + if (systems & ATSC) + return &atsc; return NULL; } -- 2.39.2