vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Wed Mar 23 19:48:20 2011 +0200| [51a887bbfeb157a110315409e03600874ff5b23e] | committer: Rémi Denis-Courmont
DTV: adjust DVB-S frequency and send tone This is done according to oscillator configuration. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=51a887bbfeb157a110315409e03600874ff5b23e --- modules/access/dtv/access.c | 61 +++++++++++++++++++++++++++++++----------- modules/access/dtv/dtv.h | 3 +- modules/access/dtv/linux.c | 56 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 101 insertions(+), 19 deletions(-) diff --git a/modules/access/dtv/access.c b/modules/access/dtv/access.c index c7b825e..277f128 100644 --- a/modules/access/dtv/access.c +++ b/modules/access/dtv/access.c @@ -132,6 +132,7 @@ static const char *const hierarchy_user[] = { N_("Automatic"), }; #define PILOT_TEXT N_("Pilot") + #define ROLLOFF_TEXT N_("Roll-off factor") const int rolloff_vlc[] = { -1, 35, 20, 25, @@ -155,6 +156,31 @@ static const char *const polarization_user[] = { N_("Unspecified (0V)"), "the receiver are long, higher voltage may be required.\n" \ "Not all receivers support this.") +#define LNB_LOW_TEXT N_("Local oscillator low frequency (kHz)") +#define LNB_HIGH_TEXT N_("Local oscillator high frequency (kHz)") +#define LNB_LONGTEXT N_( \ + "The downconverter (LNB) will substract the local oscillator frequency " \ + "from the satellite transmission frequency. " \ + "The intermediate frequency (IF) on the RF cable is the result.") +#define LNB_SWITCH_TEXT N_("Universal LNB switch frequency (kHz)") +#define LNB_SWITCH_LONGTEXT N_( \ + "If the satellite transmission frequency exceeds the switch frequency, " \ + "the oscillator high frequency will be used as reference. " \ + "Furthermore the automatic continuous 22kHz tone will be sent.") +#define TONE_TEXT N_("Continuous 22kHz tone") +#define TONE_LONGTEXT N_( \ + "A continuous tone at 22kHz can be sent on the cable. " \ + "This normally selects the higher frequency band from a universal LNB.") + +#if 0 +#define SATNO_TEXT N_("DiSEqC LNB number") +#define SATNO_LONGTEXT N_( \ + "If the satellite receiver is connected to multiple " \ + "low noise block-downconverters (LNB) through a DiSEqC 1.0 switch, " \ + "the correct LNB can be selected (1 to 4). " \ + "If there is no switch, this parameter should be 0.") +#endif + static int Open (vlc_object_t *); static void Close (vlc_object_t *); @@ -166,7 +192,7 @@ vlc_module_begin () set_capability ("access", 0) set_callbacks (Open, Close) add_shortcut ("dtv", "tv", "dvb", /* "radio", "dab",*/ - "cable", "dvb-c", /*"satellite", "dvb-s", "dvb-s2",*/ + "cable", "dvb-c", "satellite", "dvb-s", "dvb-s2", "terrestrial", "dvb-t", "atsc") /* All options starting with dvb- can be overriden in the MRL, so they @@ -250,21 +276,21 @@ vlc_module_begin () add_bool ("dvb-high-voltage", false, HIGH_VOLTAGE_TEXT, HIGH_VOLTAGE_LONGTEXT, false) #endif -#if 0 - add_integer ("dvb-tone", -1, TONE_TEXT, TONE_LONGTEXT, true) - change_integer_list (tone_vlc, auto_off_on) - change_safe () - add_integer ("dvb-lnb-lof1", 0, LNB_LOF1_TEXT, LNB_LOF1_LONGTEXT, true) + add_integer ("dvb-lnb-low", 0, LNB_LOW_TEXT, LNB_LONGTEXT, true) change_integer_range (0, 0x7fffffff) - change_safe () - add_integer ("dvb-lnb-lof2", 0, LNB_LOF2_TEXT, LNB_LOF2_LONGTEXT, true) + add_deprecated_alias ("dvb-lnb-lof1") + add_integer ("dvb-lnb-high", 0, LNB_HIGH_TEXT, LNB_LONGTEXT, true) change_integer_range (0, 0x7fffffff) - change_safe () - add_integer ("dvb-lnb-slof", 0, LNB_SLOF_TEXT, LNB_SLOF_LONGTEXT, true) + add_deprecated_alias ("dvb-lnb-lof2") + add_integer ("dvb-lnb-switch", 11700000, + LNB_SWITCH_TEXT, LNB_SWITCH_LONGTEXT, true) change_integer_range (0, 0x7fffffff) - change_safe () + add_deprecated_alias ("dvb-lnb-slof") + add_integer ("dvb-tone", -1, TONE_TEXT, TONE_LONGTEXT, true) + change_integer_list (auto_off_on_vlc, auto_off_on_user) +#if 0 add_integer ("dvb-satno", 0, SATNO_TEXT, SATNO_LONGTEXT, true) - change_integer_list (satno_vlc, satno_user) + change_integer_range (0, 4) change_safe () #endif vlc_module_end () @@ -611,11 +637,14 @@ static char var_InheritPolarization (vlc_object_t *obj) return pol; } -static int sec_setup (vlc_object_t *obj, dvb_device_t *dev) +static int sec_setup (vlc_object_t *obj, dvb_device_t *dev, unsigned freq) { char pol = var_InheritPolarization (obj); + unsigned lowf = var_InheritInteger (obj, "dvb-lnb-low"); + unsigned highf = var_InheritInteger (obj, "dvb-lnb-high"); + unsigned switchf = var_InheritInteger (obj, "dvb-lnb-switch"); - return dvb_set_sec (dev, pol); + return dvb_set_sec (dev, freq, pol, lowf, highf, switchf); } static int dvbs_setup (vlc_object_t *obj, dvb_device_t *dev, unsigned freq) @@ -627,7 +656,7 @@ static int dvbs_setup (vlc_object_t *obj, dvb_device_t *dev, unsigned freq) int ret = dvb_set_dvbs (dev, freq, srate, fec); free (fec); if (ret == 0) - ret = sec_setup (obj, dev); + ret = sec_setup (obj, dev, freq); return ret; } @@ -644,7 +673,7 @@ static int dvbs2_setup (vlc_object_t *obj, dvb_device_t *dev, unsigned freq) free (fec); free (mod); if (ret == 0) - ret = sec_setup (obj, dev); + ret = sec_setup (obj, dev, freq); return ret; } diff --git a/modules/access/dtv/dtv.h b/modules/access/dtv/dtv.h index c8ffb09..5493db3 100644 --- a/modules/access/dtv/dtv.h +++ b/modules/access/dtv/dtv.h @@ -49,7 +49,8 @@ int dvb_set_dvbs (dvb_device_t *, uint32_t freq, uint32_t srate, const char *fec); int dvb_set_dvbs2 (dvb_device_t *, uint32_t freq, const char *mod, uint32_t srate, const char *fec, int pilot, int rolloff); -int dvb_set_sec (dvb_device_t *, char pol); +int dvb_set_sec (dvb_device_t *, uint32_t freq, char pol, + uint32_t lowf, uint32_t highf, uint32_t switchf); /* DVB-T */ int dvb_set_dvbt (dvb_device_t *, uint32_t freq, const char *mod, diff --git a/modules/access/dtv/linux.c b/modules/access/dtv/linux.c index 04a5108..268a3e8 100644 --- a/modules/access/dtv/linux.c +++ b/modules/access/dtv/linux.c @@ -548,16 +548,68 @@ static unsigned dvb_parse_polarization (char pol) return dvb_parse_int (pol, tab, 5, SEC_VOLTAGE_OFF); } -int dvb_set_sec (dvb_device_t *d, char pol) +int dvb_set_sec (dvb_device_t *d, uint32_t freq, char pol, + uint32_t lowf, uint32_t highf, uint32_t switchf) { /* Always try to configure high voltage, but only warn on enable failure */ int val = var_InheritBool (d->obj, "dvb-high-voltage"); if (ioctl (d->frontend, FE_ENABLE_HIGH_LNB_VOLTAGE, &val) < 0 && val) msg_Err (d->obj, "cannot enable high LNB voltage: %m"); + /* Windows BDA exposes a higher-level API covering LNB oscillators. + * So lets pretend this is platform-specific stuff and do it here. */ + if (!lowf) + { /* Default oscillator frequencies */ + static const struct + { + uint16_t min, max, low, high; + } tab[] = + { /* min max low high */ + { 10700, 13250, 9750, 10600 }, /* Ku band */ + { 4500, 4800, 5950, 0 }, /* C band (high) */ + { 3400, 4200, 5150, 0 }, /* C band (low) */ + { 2500, 2700, 3650, 0 }, /* S band */ + { 950, 2150, 0, 0 }, /* adjusted IF (L band) */ + }; + uint_fast16_t mhz = freq / 1000; + + for (size_t i = 0; i < sizeof (tab) / sizeof (tab[0]); i++) + if (mhz >= tab[i].min && mhz <= tab[i].max) + { + lowf = tab[i].low * 1000; + highf = tab[i].high * 1000; + goto known; + } + + msg_Err (d->obj, "no known band for frequency %u kHz", freq); +known: + msg_Dbg (d->obj, "selected LNB low: %u kHz, LNB high: %u kHz", + lowf, highf); + } + + /* Use high oscillator frequency? */ + bool high = highf != 0 && freq > switchf; + + freq -= high ? highf : lowf; + if ((int32_t)freq < 0) + freq *= -1; + assert (freq < 0x7fffffff); + + /* TODO: DiSEqC */ + + /* Continuous tone (to select high oscillator frequency) */ + int tone; + switch (var_InheritInteger (d->obj, "dvb-tone")) + { + case 0: tone = SEC_TONE_OFF; break; + case 1: tone = SEC_TONE_ON; break; + default: tone = high ? SEC_TONE_ON : SEC_TONE_OFF; + } + unsigned voltage = dvb_parse_polarization (pol); - return dvb_set_prop (d, DTV_VOLTAGE, voltage); + return dvb_set_props (d, 3, DTV_FREQUENCY, freq, + DTV_VOLTAGE, voltage, DTV_TONE, tone); } int dvb_set_dvbs (dvb_device_t *d, uint32_t freq, _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
