[vlc-commits] DTV: factorize tuning and add spectral inversion

Rémi Denis-Courmont git at videolan.org
Sun Mar 20 15:58:36 CET 2011


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Mar 20 16:45:50 2011 +0200| [44fdf553b59d60898b1396510e73a52a1b412b47] | committer: Rémi Denis-Courmont

DTV: factorize tuning and add spectral inversion

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=44fdf553b59d60898b1396510e73a52a1b412b47
---

 modules/access/dtv/access.c |  128 +++++++++++++++++++++++-------------------
 1 files changed, 70 insertions(+), 58 deletions(-)

diff --git a/modules/access/dtv/access.c b/modules/access/dtv/access.c
index 893ff80..f4460a0 100644
--- a/modules/access/dtv/access.c
+++ b/modules/access/dtv/access.c
@@ -81,9 +81,6 @@ static const char *const modulation_user[] = { N_("Undefined"),
 #define INVERSION_LONGTEXT N_( \
     "If the demodulator cannot detect spectral inversion correctly, " \
     "it needs to be configured manually.")
-//TODO const int inversion_linux[] = { INVERSION_AUTO,
-//    INVERSION_OFF, INVERSION_ON,
-//};
 const int inversion_vlc[] = { -1, 0, 1 };
 static const char *const auto_off_on[] = { N_("Automatic"),
     N_("Off"), N_("On") };
@@ -247,49 +244,14 @@ struct access_sys_t
 
 struct delsys
 {
-    int (*tune) (vlc_object_t *, dvb_device_t *, uint64_t freq);
+    int (*setup) (vlc_object_t *, dvb_device_t *, uint64_t freq);
     /* TODO: scan stuff */
 };
 
 static block_t *Read (access_t *);
 static int Control (access_t *, int, va_list);
-
-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";
-
-    if (!strcasecmp (scheme, "atsc"))
-        return &atsc;
-    if (!strcasecmp (scheme, "dvb-c"))
-        return &dvbc;
-    if (!strcasecmp (scheme, "dvb-s"))
-        return &dvbs;
-    if (!strcasecmp (scheme, "dvb-s2"))
-        return &dvbs2;
-    if (!strcasecmp (scheme, "dvb-t"))
-        return &dvbt;
-
-    return dvb_guess_system (dev);
-}
-
+static const delsys_t *GuessSystem (const char *, dvb_device_t *);
+static int Tune (vlc_object_t *, dvb_device_t *, const delsys_t *, uint64_t);
 
 static int Open (vlc_object_t *obj)
 {
@@ -314,12 +276,12 @@ static int Open (vlc_object_t *obj)
     if (freq != 0)
     {
         const delsys_t *delsys = GuessSystem (access->psz_access, dev);
-        if (delsys == NULL || delsys->tune (obj, dev, freq))
+        if (delsys == NULL || Tune (obj, dev, delsys, freq))
         {
             msg_Err (obj, "tuning to %"PRIu64" Hz failed", freq);
             dialog_Fatal (obj, N_("Digital broadcasting"),
                           N_("The selected digital tuner does not support "
-                             "the specified parameters. "
+                             "the specified parameters.\n"
                              "Please check the preferences."));
             goto error;
         }
@@ -447,23 +409,71 @@ static int Control (access_t *access, int query, va_list args)
 }
 
 
+/*** Generic tuning ***/
+
+/** 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";
+
+    if (!strcasecmp (scheme, "atsc"))
+        return &atsc;
+    if (!strcasecmp (scheme, "dvb-c"))
+        return &dvbc;
+    if (!strcasecmp (scheme, "dvb-s"))
+        return &dvbs;
+    if (!strcasecmp (scheme, "dvb-s2"))
+        return &dvbs2;
+    if (!strcasecmp (scheme, "dvb-t"))
+        return &dvbt;
+
+    return dvb_guess_system (dev);
+}
+
+/** Set parameters and tune the device */
+static int Tune (vlc_object_t *obj, dvb_device_t *dev, const delsys_t *delsys,
+                 uint64_t freq)
+{
+    if (delsys->setup (obj, dev, freq)
+     || dvb_set_inversion (dev, var_InheritInteger (obj, "dvb-inversion"))
+     || dvb_tune (dev))
+        return VLC_EGENERIC;
+    return VLC_SUCCESS;
+}
+
+
 /*** ATSC ***/
-static int atsc_tune (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
+static int atsc_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
 {
     char *mod = var_InheritString (obj, "dvb-modulation");
 
     int ret = dvb_set_atsc (dev, freq, mod);
     free (mod);
-    if (ret == 0)
-        ret = dvb_tune (dev);
     return ret;
 }
 
-const delsys_t atsc = { .tune = atsc_tune };
+const delsys_t atsc = { .setup = atsc_setup };
 
 
 /*** DVB-C ***/
-static int dvbc_tune (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
+static int dvbc_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
 {
     char *mod = var_InheritString (obj, "dvb-modulation");
     char *fec = var_InheritString (obj, "dvb-code-rate");
@@ -472,29 +482,33 @@ static int dvbc_tune (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
     int ret = dvb_set_dvbc (dev, freq, mod, srate, fec);
     free (fec);
     free (mod);
-    if (ret == 0)
-        ret = dvb_tune (dev);
     return ret;
 }
 
-const delsys_t dvbc = { .tune = dvbc_tune };
+const delsys_t dvbc = { .setup = dvbc_setup };
 
 
 /*** DVB-S ***/
-static int dvbs_tune (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
+static int dvbs_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
 {
     (void) dev; (void) freq;
     msg_Err (obj, "DVB-S not implemented");
     return -1;
 }
 
+static int dvbs2_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
+{
+    (void) dev; (void) freq;
+    msg_Err (obj, "DVB-S2 not implemented");
+    return -1;
+}
 
-const delsys_t dvbs = { .tune = dvbs_tune };
-const delsys_t dvbs2 = { .tune = dvbs_tune };
+const delsys_t dvbs = { .setup = dvbs_setup };
+const delsys_t dvbs2 = { .setup = dvbs2_setup };
 
 
 /*** DVB-T ***/
-static int dvbt_tune (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
+static int dvbt_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
 {
     char *mod = var_InheritString (obj, "dvb-modulation");
     char *fec_hp = var_InheritString (obj, "dvb-code-rate-hp");
@@ -509,9 +523,7 @@ static int dvbt_tune (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
     free (fec_lp);
     free (fec_hp);
     free (mod);
-    if (ret == 0)
-        ret = dvb_tune (dev);
     return ret;
 }
 
-const delsys_t dvbt = { .tune = dvbt_tune };
+const delsys_t dvbt = { .setup = dvbt_setup };



More information about the vlc-commits mailing list