Commit 51a887bb authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

DTV: adjust DVB-S frequency and send tone

This is done according to oscillator configuration.
parent af9370e9
......@@ -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;
}
......
......@@ -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,
......
......@@ -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,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment