3 * @brief Digital broadcasting input module for VLC media player
5 /*****************************************************************************
6 * Copyright © 2011 Rémi Denis-Courmont
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU Lesser General Public License as published by
10 * the Free Software Foundation; either version 2.1 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public License
19 * along with this program; if not, write to the Free Software Foundation,
20 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
21 *****************************************************************************/
27 #include <vlc_common.h>
28 #include <vlc_access.h>
29 #include <vlc_input.h>
30 #include <vlc_plugin.h>
31 #include <vlc_dialog.h>
36 #define ADAPTER_TEXT N_("DVB adapter")
37 #define ADAPTER_LONGTEXT N_( \
38 "If there is more than one digital broadcasting adapter, " \
39 "the adapter number must be selected. Numbering starts from zero.")
41 #define DEVICE_TEXT N_("DVB device")
42 #define DEVICE_LONGTEXT N_( \
43 "If the adapter provides multiple independent tuner devices, " \
44 "the device number must be selected. Numbering starts from zero.")
45 #define BUDGET_TEXT N_("Do not demultiplex")
46 #define BUDGET_LONGTEXT N_( \
47 "Only useful programs are normally demultiplexed from the transponder. " \
48 "This option will disable demultiplexing and receive all programs.")
50 #define NAME_TEXT N_("Network name")
51 #define NAME_LONGTEXT N_("Unique network name in the System Tuning Spaces")
53 #define CREATE_TEXT N_("Network name to create")
54 #define CREATE_LONGTEXT N_("Create unique name in the System Tuning Spaces")
56 #define FREQ_TEXT N_("Frequency (Hz)")
57 #define FREQ_LONGTEXT N_( \
58 "TV channels are grouped by transponder (a.k.a. multiplex) " \
59 "on a given frequency. This is required to tune the receiver.")
61 #define MODULATION_TEXT N_("Modulation / Constellation")
62 #define MODULATION_A_TEXT N_("Layer A modulation")
63 #define MODULATION_B_TEXT N_("Layer B modulation")
64 #define MODULATION_C_TEXT N_("Layer C modulation")
65 #define MODULATION_LONGTEXT N_( \
66 "The digital signal can be modulated according with different " \
67 "constellations (depending on the delivery system). " \
68 "If the demodulator cannot detect the constellation automatically, " \
69 "it needs to be configured manually.")
70 static const char *const modulation_vlc[] = { "",
71 "QAM", "16QAM", "32QAM", "64QAM", "128QAM", "256QAM",
73 "QPSK", "DQPSK", "8PSK", "16APSK", "32APSK",
75 static const char *const modulation_user[] = { N_("Undefined"),
76 "Auto QAM", "16-QAM", "32-QAM", "64-QAM", "128-QAM", "256-QAM",
78 "QPSK", "DQPSK", "8-PSK", "16-APSK", "32-APSK",
81 #define SRATE_TEXT N_("Symbol rate (bauds)")
82 #define SRATE_LONGTEXT N_( \
83 "The symbol rate must be specified manually for some systems, " \
84 "notably DVB-C, DVB-S and DVB-S2.")
86 #define INVERSION_TEXT N_("Spectrum inversion")
87 #define INVERSION_LONGTEXT N_( \
88 "If the demodulator cannot detect spectral inversion correctly, " \
89 "it needs to be configured manually.")
90 const int auto_off_on_vlc[] = { -1, 0, 1 };
91 static const char *const auto_off_on_user[] = { N_("Automatic"),
92 N_("Off"), N_("On") };
94 #define CODE_RATE_TEXT N_("FEC code rate")
95 #define CODE_RATE_HP_TEXT N_("High-priority code rate")
96 #define CODE_RATE_LP_TEXT N_("Low-priority code rate")
97 #define CODE_RATE_A_TEXT N_("Layer A code rate")
98 #define CODE_RATE_B_TEXT N_("Layer B code rate")
99 #define CODE_RATE_C_TEXT N_("Layer C code rate")
100 #define CODE_RATE_LONGTEXT N_( \
101 "The code rate for Forward Error Correction can be specified.")
102 static const char *const code_rate_vlc[] = { "",
103 "0", /*"1/4", "1/3",*/ "1/2", "3/5", "2/3", "3/4",
104 "4/5", "5/6", "6/7", "7/8", "8/9", "9/10",
106 static const char *const code_rate_user[] = { N_("Automatic"),
107 N_("None"), /*"1/4", "1/3",*/ "1/2", "3/5", "2/3", "3/4",
108 "4/5", "5/6", "6/7", "7/8", "8/9", "9/10",
111 #define TRANSMISSION_TEXT N_("Transmission mode")
112 const int transmission_vlc[] = { -1,
115 static const char *const transmission_user[] = { N_("Automatic"),
116 "1k", "2k", "4k", "8k", "16k", "32k",
119 #define BANDWIDTH_TEXT N_("Bandwidth (MHz)")
120 const int bandwidth_vlc[] = { 0,
123 static const char *const bandwidth_user[] = { N_("Automatic"),
124 N_("10 MHz"), N_("8 MHz"), N_("7 MHz"), N_("6 MHz"),
125 N_("5 MHz"), N_("1.712 MHz"),
128 #define GUARD_TEXT N_("Guard interval")
129 const char *const guard_vlc[] = { "",
130 "1/128", "1/32", "1/16", "19/256", "1/8", "19/128", "1/4",
132 static const char *const guard_user[] = { N_("Automatic"),
133 "1/128", "1/32", "1/16", "19/256", "1/8", "19/128", "1/4",
136 #define HIERARCHY_TEXT N_("Hierarchy mode")
137 const int hierarchy_vlc[] = { -1,
140 static const char *const hierarchy_user[] = { N_("Automatic"),
141 N_("None"), "1", "2", "4",
144 #define PLP_ID_TEXT N_("DVB-T2 Physical Layer Pipe")
146 #define SEGMENT_COUNT_A_TEXT N_("Layer A segments count")
147 #define SEGMENT_COUNT_B_TEXT N_("Layer B segments count")
148 #define SEGMENT_COUNT_C_TEXT N_("Layer C segments count")
150 #define TIME_INTERLEAVING_A_TEXT N_("Layer A time interleaving")
151 #define TIME_INTERLEAVING_B_TEXT N_("Layer B time interleaving")
152 #define TIME_INTERLEAVING_C_TEXT N_("Layer C time interleaving")
154 #define PILOT_TEXT N_("Pilot")
156 #define ROLLOFF_TEXT N_("Roll-off factor")
157 const int rolloff_vlc[] = { -1,
160 static const char *const rolloff_user[] = { N_("Automatic"),
161 N_("0.35 (same as DVB-S)"), N_("0.20"), N_("0.25"),
164 #define TS_ID_TEXT N_("Transport stream ID")
166 #define POLARIZATION_TEXT N_("Polarization (Voltage)")
167 #define POLARIZATION_LONGTEXT N_( \
168 "To select the polarization of the transponder, a different voltage " \
169 "is normally applied to the low noise block-downconverter (LNB).")
170 static const char *const polarization_vlc[] = { "", "V", "H", "R", "L" };
171 static const char *const polarization_user[] = { N_("Unspecified (0V)"),
172 N_("Vertical (13V)"), N_("Horizontal (18V)"),
173 N_("Circular Right Hand (13V)"), N_("Circular Left Hand (18V)") };
175 #define HIGH_VOLTAGE_TEXT N_("High LNB voltage")
176 #define HIGH_VOLTAGE_LONGTEXT N_( \
177 "If the cables between the satellilte low noise block-downconverter and " \
178 "the receiver are long, higher voltage may be required.\n" \
179 "Not all receivers support this.")
181 #define LNB_LOW_TEXT N_("Local oscillator low frequency (kHz)")
182 #define LNB_HIGH_TEXT N_("Local oscillator high frequency (kHz)")
183 #define LNB_LONGTEXT N_( \
184 "The downconverter (LNB) will substract the local oscillator frequency " \
185 "from the satellite transmission frequency. " \
186 "The intermediate frequency (IF) on the RF cable is the result.")
187 #define LNB_SWITCH_TEXT N_("Universal LNB switch frequency (kHz)")
188 #define LNB_SWITCH_LONGTEXT N_( \
189 "If the satellite transmission frequency exceeds the switch frequency, " \
190 "the oscillator high frequency will be used as reference. " \
191 "Furthermore the automatic continuous 22kHz tone will be sent.")
192 #define TONE_TEXT N_("Continuous 22kHz tone")
193 #define TONE_LONGTEXT N_( \
194 "A continuous tone at 22kHz can be sent on the cable. " \
195 "This normally selects the higher frequency band from a universal LNB.")
197 #define SATNO_TEXT N_("DiSEqC LNB number")
198 #define SATNO_LONGTEXT N_( \
199 "If the satellite receiver is connected to multiple " \
200 "low noise block-downconverters (LNB) through a DiSEqC 1.0 switch, " \
201 "the correct LNB can be selected (1 to 4). " \
202 "If there is no switch, this parameter should be 0.")
203 #ifdef HAVE_LINUX_DVB
204 static const int satno_vlc[] = { 0, 1, 2, 3, 4 };
205 static const char *const satno_user[] = { N_("Unspecified"),
206 "A/1", "B/2", "C/3", "D/4" };
209 #define UNCOMMITTED_TEXT N_("Uncommitted DiSEqC LNB number")
210 #define UNCOMMITTED_LONGTEXT N_( \
211 "If the satellite receiver is connected to multiple " \
212 "low noise block-downconverters (LNB) through a cascade formed from " \
213 "DiSEqC 1.1 uncommitted switch and DiSEqC 1.0 committed switch, " \
214 "the correct uncommitted LNB can be selected (1 to 4). " \
215 "If there is no uncommitted switch, this parameter should be 0.")
217 /* BDA module additional DVB-S Parameters */
218 #define NETID_TEXT N_("Network identifier")
219 #define AZIMUTH_TEXT N_("Satellite azimuth")
220 #define AZIMUTH_LONGTEXT N_("Satellite azimuth in tenths of degree")
221 #define ELEVATION_TEXT N_("Satellite elevation")
222 #define ELEVATION_LONGTEXT N_("Satellite elevation in tenths of degree")
223 #define LONGITUDE_TEXT N_("Satellite longitude")
224 #define LONGITUDE_LONGTEXT N_( \
225 "Satellite longitude in tenths of degree. West is negative.")
227 #define RANGE_TEXT N_("Satellite range code")
228 #define RANGE_LONGTEXT N_("Satellite range code as defined by manufacturer " \
229 "e.g. DISEqC switch code")
232 #define MAJOR_CHANNEL_TEXT N_("Major channel")
233 #define MINOR_CHANNEL_TEXT N_("ATSC minor channel")
234 #define PHYSICAL_CHANNEL_TEXT N_("Physical channel")
236 static int Open (vlc_object_t *);
237 static void Close (vlc_object_t *);
240 set_shortname (N_("DTV"))
241 set_description (N_("Digital Television and Radio"))
242 set_category (CAT_INPUT)
243 set_subcategory (SUBCAT_INPUT_ACCESS)
244 set_capability ("access", 0)
245 set_callbacks (Open, Close)
246 add_shortcut ("dtv", "tv", "dvb", /* "radio", "dab",*/
247 "cable", "dvb-c", "cqam", "isdb-c",
248 "satellite", "dvb-s", "dvb-s2", "isdb-s",
249 "terrestrial", "dvb-t", "dvb-t2", "isdb-t", "atsc"
255 #ifdef HAVE_LINUX_DVB
256 add_integer ("dvb-adapter", 0, ADAPTER_TEXT, ADAPTER_LONGTEXT, false)
257 change_integer_range (0, 255)
259 add_integer ("dvb-device", 0, DEVICE_TEXT, DEVICE_LONGTEXT, false)
260 change_integer_range (0, 255)
262 add_bool ("dvb-budget-mode", false, BUDGET_TEXT, BUDGET_LONGTEXT, true)
265 add_integer ("dvb-adapter", -1, ADAPTER_TEXT, ADAPTER_LONGTEXT, true)
267 add_string ("dvb-network-name", "", NAME_TEXT, NAME_LONGTEXT, true)
268 /* Hmm: is this one really safe??: */
269 add_string ("dvb-create-name", "", CREATE_TEXT, CREATE_LONGTEXT, true)
272 add_integer ("dvb-frequency", 0, FREQ_TEXT, FREQ_LONGTEXT, false)
273 change_integer_range (0, 107999999)
275 add_integer ("dvb-inversion", -1, INVERSION_TEXT, INVERSION_LONGTEXT, true)
276 change_integer_list (auto_off_on_vlc, auto_off_on_user)
279 set_section (N_("Terrestrial reception parameters"), NULL)
280 add_integer ("dvb-bandwidth", 0, BANDWIDTH_TEXT, BANDWIDTH_TEXT, true)
281 change_integer_list (bandwidth_vlc, bandwidth_user)
283 add_integer ("dvb-transmission", 0,
284 TRANSMISSION_TEXT, TRANSMISSION_TEXT, true)
285 change_integer_list (transmission_vlc, transmission_user)
287 add_string ("dvb-guard", "", GUARD_TEXT, GUARD_TEXT, true)
288 change_string_list (guard_vlc, guard_user, NULL)
291 set_section (N_("DVB-T reception parameters"), NULL)
292 add_string ("dvb-code-rate-hp", "",
293 CODE_RATE_HP_TEXT, CODE_RATE_LONGTEXT, true)
294 change_string_list (code_rate_vlc, code_rate_user, NULL)
296 add_string ("dvb-code-rate-lp", "",
297 CODE_RATE_LP_TEXT, CODE_RATE_LONGTEXT, true)
298 change_string_list (code_rate_vlc, code_rate_user, NULL)
300 add_integer ("dvb-hierarchy", -1, HIERARCHY_TEXT, HIERARCHY_TEXT, true)
301 change_integer_list (hierarchy_vlc, hierarchy_user)
303 add_integer ("dvb-plp-id", 0, PLP_ID_TEXT, PLP_ID_TEXT, false)
304 change_integer_range (0, 0xFFFFFFFF)
307 set_section (N_("ISDB-T reception parameters"), NULL)
308 add_string ("dvb-a-modulation", NULL,
309 MODULATION_A_TEXT, MODULATION_LONGTEXT, true)
310 change_string_list (modulation_vlc, modulation_user, NULL)
312 add_string ("dvb-a-fec", NULL, CODE_RATE_A_TEXT, CODE_RATE_LONGTEXT, true)
313 change_string_list (code_rate_vlc, code_rate_user, NULL)
315 add_integer ("dvb-a-count", 0, SEGMENT_COUNT_A_TEXT, NULL, true)
316 change_integer_range (0, 13)
318 add_integer ("dvb-a-interleaving", 0, TIME_INTERLEAVING_A_TEXT, NULL, true)
319 change_integer_range (0, 3)
321 add_string ("dvb-b-modulation", NULL,
322 MODULATION_B_TEXT, MODULATION_LONGTEXT, true)
323 change_string_list (modulation_vlc, modulation_user, NULL)
325 add_string ("dvb-b-fec", NULL, CODE_RATE_B_TEXT, CODE_RATE_LONGTEXT, true)
326 change_string_list (code_rate_vlc, code_rate_user, NULL)
328 add_integer ("dvb-b-count", 0, SEGMENT_COUNT_B_TEXT, NULL, true)
329 change_integer_range (0, 13)
331 add_integer ("dvb-b-interleaving", 0, TIME_INTERLEAVING_B_TEXT, NULL, true)
332 change_integer_range (0, 3)
334 add_string ("dvb-c-modulation", NULL,
335 MODULATION_C_TEXT, MODULATION_LONGTEXT, true)
336 change_string_list (modulation_vlc, modulation_user, NULL)
338 add_string ("dvb-c-fec", NULL, CODE_RATE_C_TEXT, CODE_RATE_LONGTEXT, true)
339 change_string_list (code_rate_vlc, code_rate_user, NULL)
341 add_integer ("dvb-c-count", 0, SEGMENT_COUNT_C_TEXT, NULL, true)
342 change_integer_range (0, 13)
344 add_integer ("dvb-c-interleaving", 0, TIME_INTERLEAVING_C_TEXT, NULL, true)
345 change_integer_range (0, 3)
348 set_section (N_("Cable and satellite reception parameters"), NULL)
349 add_string ("dvb-modulation", NULL,
350 MODULATION_TEXT, MODULATION_LONGTEXT, false)
351 change_string_list (modulation_vlc, modulation_user, NULL)
353 add_integer ("dvb-srate", 0, SRATE_TEXT, SRATE_LONGTEXT, false)
354 change_integer_range (0, UINT64_C(0xffffffff))
356 add_string ("dvb-fec", "", CODE_RATE_TEXT, CODE_RATE_LONGTEXT, true)
357 change_string_list (code_rate_vlc, code_rate_user, NULL)
360 set_section (N_("DVB-S2 parameters"), NULL)
361 add_integer ("dvb-pilot", -1, PILOT_TEXT, PILOT_TEXT, true)
362 change_integer_list (auto_off_on_vlc, auto_off_on_user)
364 add_integer ("dvb-rolloff", -1, ROLLOFF_TEXT, ROLLOFF_TEXT, true)
365 change_integer_list (rolloff_vlc, rolloff_user)
368 set_section (N_("ISDB-S parameters"), NULL)
369 add_integer ("dvb-ts-id", 0, TS_ID_TEXT, TS_ID_TEXT, false)
370 change_integer_range (0, 0xffff)
373 set_section (N_("Satellite equipment control"), NULL)
374 add_string ("dvb-polarization", "",
375 POLARIZATION_TEXT, POLARIZATION_LONGTEXT, false)
376 change_string_list (polarization_vlc, polarization_user, NULL)
378 add_integer ("dvb-voltage", 13, "", "", true)
379 change_integer_range (0, 18)
382 #ifdef HAVE_LINUX_DVB
383 add_bool ("dvb-high-voltage", false,
384 HIGH_VOLTAGE_TEXT, HIGH_VOLTAGE_LONGTEXT, false)
386 add_integer ("dvb-lnb-low", 0, LNB_LOW_TEXT, LNB_LONGTEXT, true)
387 change_integer_range (0, 0x7fffffff)
388 add_obsolete_integer ("dvb-lnb-lof1") /* since 2.0.0 */
389 add_integer ("dvb-lnb-high", 0, LNB_HIGH_TEXT, LNB_LONGTEXT, true)
390 change_integer_range (0, 0x7fffffff)
391 add_obsolete_integer ("dvb-lnb-lof2") /* since 2.0.0 */
392 add_integer ("dvb-lnb-switch", 11700000,
393 LNB_SWITCH_TEXT, LNB_SWITCH_LONGTEXT, true)
394 change_integer_range (0, 0x7fffffff)
395 add_obsolete_integer ("dvb-lnb-slof") /* since 2.0.0 */
396 #ifdef HAVE_LINUX_DVB
397 add_integer ("dvb-satno", 0, SATNO_TEXT, SATNO_LONGTEXT, true)
398 change_integer_list (satno_vlc, satno_user)
399 add_integer ("dvb-uncommitted", 0, UNCOMMITTED_TEXT, UNCOMMITTED_LONGTEXT, true)
400 change_integer_list (satno_vlc, satno_user)
401 add_integer ("dvb-tone", -1, TONE_TEXT, TONE_LONGTEXT, true)
402 change_integer_list (auto_off_on_vlc, auto_off_on_user)
405 add_integer ("dvb-network-id", 0, NETID_TEXT, NETID_TEXT, true)
406 add_integer ("dvb-azimuth", 0, AZIMUTH_TEXT, AZIMUTH_LONGTEXT, true)
407 add_integer ("dvb-elevation", 0, ELEVATION_TEXT, ELEVATION_LONGTEXT, true)
408 add_integer ("dvb-longitude", 0, LONGITUDE_TEXT, LONGITUDE_LONGTEXT, true)
409 add_string ("dvb-range", "", RANGE_TEXT, RANGE_LONGTEXT, true)
410 /* dvb-range corresponds to the BDA InputRange parameter which is
411 * used by some drivers to control the diseqc */
413 set_section (N_("ATSC reception parameters"), NULL)
414 add_integer ("dvb-major-channel", 0, MAJOR_CHANNEL_TEXT, NULL, true)
415 add_integer ("dvb-minor-channel", 0, MINOR_CHANNEL_TEXT, NULL, true)
416 add_integer ("dvb-physical-channel", 0, PHYSICAL_CHANNEL_TEXT, NULL, true)
426 typedef struct delsys
428 int (*setup) (vlc_object_t *, dvb_device_t *, uint64_t freq);
429 /* TODO: scan stuff */
432 static const delsys_t dvbc, dvbs, dvbs2, dvbt, dvbt2;
433 static const delsys_t isdbc, isdbs, isdbt;
434 static const delsys_t atsc, cqam;
436 static block_t *Read (access_t *);
437 static int Control (access_t *, int, va_list);
438 static const delsys_t *GuessSystem (const char *, dvb_device_t *);
439 static int Tune (vlc_object_t *, dvb_device_t *, const delsys_t *, uint64_t);
440 static uint64_t var_InheritFrequency (vlc_object_t *);
442 static int Open (vlc_object_t *obj)
444 access_t *access = (access_t *)obj;
445 access_sys_t *sys = malloc (sizeof (*sys));
446 if (unlikely(sys == NULL))
449 var_LocationParse (obj, access->psz_location, "dvb-");
451 dvb_device_t *dev = dvb_open (obj);
459 sys->signal_poll = 0;
462 uint64_t freq = var_InheritFrequency (obj);
465 const delsys_t *delsys = GuessSystem (access->psz_access, dev);
466 if (delsys == NULL || Tune (obj, dev, delsys, freq))
468 msg_Err (obj, "tuning to %"PRIu64" Hz failed", freq);
469 dialog_Fatal (obj, N_("Digital broadcasting"),
470 N_("The selected digital tuner does not support "
471 "the specified parameters.\n"
472 "Please check the preferences."));
476 dvb_add_pid (dev, 0);
478 access->pf_block = Read;
479 access->pf_control = Control;
480 if (access->psz_demux == NULL || !access->psz_demux[0])
482 free (access->psz_demux);
483 access->psz_demux = strdup ("ts");
489 access->p_sys = NULL;
493 static void Close (vlc_object_t *obj)
495 access_t *access = (access_t *)obj;
496 access_sys_t *sys = access->p_sys;
498 dvb_close (sys->dev);
502 static block_t *Read (access_t *access)
504 #define BUFSIZE (20*188)
505 block_t *block = block_Alloc (BUFSIZE);
506 if (unlikely(block == NULL))
509 access_sys_t *sys = access->p_sys;
510 ssize_t val = dvb_read (sys->dev, block->p_buffer, BUFSIZE);
515 access->info.b_eof = true;
516 block_Release (block);
520 block->i_buffer = val;
522 /* Fetch the signal levels every so often. Some devices do not like this
523 * to be requested too frequently, e.g. due to low bandwidth I²C bus. */
524 if ((sys->signal_poll++) == 0)
525 access->info.i_update |= INPUT_UPDATE_SIGNAL;
530 static int Control (access_t *access, int query, va_list args)
532 access_sys_t *sys = access->p_sys;
533 dvb_device_t *dev = sys->dev;
537 case ACCESS_CAN_SEEK:
538 case ACCESS_CAN_FASTSEEK:
539 case ACCESS_CAN_PAUSE:
540 case ACCESS_CAN_CONTROL_PACE:
542 bool *v = va_arg (args, bool *);
547 case ACCESS_GET_PTS_DELAY:
549 int64_t *v = va_arg (args, int64_t *);
550 *v = var_InheritInteger (access, "live-caching") * INT64_C(1000);
554 case ACCESS_GET_TITLE_INFO:
555 case ACCESS_GET_META:
558 case ACCESS_GET_CONTENT_TYPE:
560 char **pt = va_arg (args, char **);
561 *pt = strdup ("video/MP2T");
565 case ACCESS_SET_PAUSE_STATE:
566 case ACCESS_SET_TITLE:
567 case ACCESS_SET_SEEKPOINT:
570 case ACCESS_GET_SIGNAL:
571 *va_arg (args, double *) = dvb_get_snr (dev);
572 *va_arg (args, double *) = dvb_get_signal_strength (dev);
575 case ACCESS_SET_PRIVATE_ID_STATE:
577 unsigned pid = va_arg (args, unsigned);
578 bool add = va_arg (args, unsigned);
580 if (unlikely(pid > 0x1FFF))
584 if (dvb_add_pid (dev, pid))
588 dvb_remove_pid (dev, pid);
592 case ACCESS_SET_PRIVATE_ID_CA:
595 struct dvbpsi_pmt_s *pmt = va_arg (args, struct dvbpsi_pmt_s *);
597 dvb_set_ca_pmt (dev, pmt);
602 case ACCESS_GET_PRIVATE_ID_STATE:
606 msg_Warn (access, "unimplemented query %d in control", query);
611 /*** Generic tuning ***/
613 /** Determines which delivery system to use. */
614 static const delsys_t *GuessSystem (const char *scheme, dvb_device_t *dev)
616 /* Specific delivery system is specified */
617 if (!strcasecmp (scheme, "atsc"))
619 if (!strcasecmp (scheme, "cqam"))
621 if (!strcasecmp (scheme, "dvb-c"))
623 if (!strcasecmp (scheme, "dvb-s"))
625 if (!strcasecmp (scheme, "dvb-s2"))
627 if (!strcasecmp (scheme, "dvb-t"))
629 if (!strcasecmp (scheme, "dvb-t2"))
631 if (!strcasecmp (scheme, "isdb-c"))
633 if (!strcasecmp (scheme, "isdb-s"))
635 if (!strcasecmp (scheme, "isdb-t"))
638 /* If the demodulator supports 2G, we cannot guess whether
639 * 1G or 2G is intended. For backward compatibility, 1G is assumed
640 * (this is not a limitation of Linux DVB). We will probably need something
641 * smarter when 2G (semi automatic) scanning is implemented. */
642 unsigned systems = dvb_enum_systems (dev);
644 /* Only wave carrier is specified */
645 if (!strcasecmp (scheme, "cable"))
651 if (systems & ISDB_C)
654 if (!strcasecmp (scheme, "satellite"))
658 if (systems & ISDB_S)
661 if (!strcasecmp (scheme, "terrestrial"))
667 if (systems & ISDB_T)
671 /* Only standards family or nothing is specified */
683 /** Set parameters and tune the device */
684 static int Tune (vlc_object_t *obj, dvb_device_t *dev, const delsys_t *delsys,
687 if (delsys->setup (obj, dev, freq)
688 || dvb_set_inversion (dev, var_InheritInteger (obj, "dvb-inversion"))
694 static uint64_t var_InheritFrequency (vlc_object_t *obj)
696 uint64_t freq = var_InheritInteger (obj, "dvb-frequency");
697 if (freq != 0 && freq <= 108000000)
699 msg_Err (obj, "%"PRIu64" Hz carrier frequency is too low.", freq);
701 msg_Info (obj, "Assuming %"PRIu64" Hz frequency instead.", freq);
706 static uint32_t var_InheritCodeRate (vlc_object_t *obj, const char *varname)
708 char *code_rate = var_InheritString (obj, varname);
709 if (code_rate == NULL)
713 int v = sscanf (code_rate, "%"SCNu16"/%"SCNu16, &a, &b);
718 return VLC_FEC(a, b);
722 /* Backward compatibility with VLC < 1.2 (= Linux DVBv3 enum) */
725 msg_Warn (obj, "\"%s=%"PRIu16"\" option is obsolete. "
726 "Use \"%s=%"PRIu16"/%"PRIu16"\" instead.",
727 varname + 4, a, varname + 4, a, a + 1);
728 return VLC_FEC(a, a + 1);
731 msg_Warn (obj, "\"fec=9\" option is obsolete.");
736 static int modcmp (const void *a, const void *b)
738 return strcasecmp (a, *(const char *const *)b);
741 static const char *var_InheritModulation (vlc_object_t *obj, const char *var)
743 char *mod = var_InheritString (obj, var);
747 size_t n = sizeof (modulation_vlc) / sizeof (modulation_vlc[0]);
748 const char *const *p = lfind (mod, modulation_vlc, &n, sizeof (mod), modcmp);
755 /* Backward compatibility with VLC < 1.2 */
759 case -1: str = "QPSK"; break;
760 case 0: str = "QAM"; break;
761 case 8: str = "8VSB"; break;
762 case 16: str = "16QAM"; break;
763 case 32: str = "32QAM"; break;
764 case 64: str = "64QAM"; break;
765 case 128: str = "128QAM"; break;
766 case 256: str = "256QAM"; break;
770 msg_Warn (obj, "\"modulation=%s\" option is obsolete. "
771 "Use \"modulation=%s\" instead.", mod, str);
776 static unsigned var_InheritGuardInterval (vlc_object_t *obj)
778 char *guard = var_InheritString (obj, "dvb-guard");
780 return VLC_GUARD_AUTO;
783 int v = sscanf (guard, "%"SCNu16"/%"SCNu16, &a, &b);
788 /* Backward compatibility with VLC < 1.2 */
791 msg_Warn (obj, "\"guard=%"PRIu16"\" option is obsolete. "
792 "Use \"guard=1/%"PRIu16" instead.", a, a);
796 return VLC_GUARD(a, b);
798 return VLC_GUARD_AUTO;
803 static int atsc_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
805 const char *mod = var_InheritModulation (obj, "dvb-modulation");
807 return dvb_set_atsc (dev, freq, mod);
810 static const delsys_t atsc = { .setup = atsc_setup };
812 static int cqam_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
814 const char *mod = var_InheritModulation (obj, "dvb-modulation");
816 return dvb_set_cqam (dev, freq, mod);
819 static const delsys_t cqam = { .setup = cqam_setup };
823 static int dvbc_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
825 const char *mod = var_InheritModulation (obj, "dvb-modulation");
826 uint32_t fec = var_InheritCodeRate (obj, "dvb-fec");
827 unsigned srate = var_InheritInteger (obj, "dvb-srate");
829 return dvb_set_dvbc (dev, freq, mod, srate, fec);
832 static const delsys_t dvbc = { .setup = dvbc_setup };
836 static char var_InheritPolarization (vlc_object_t *obj)
839 char *polstr = var_InheritString (obj, "dvb-polarization");
844 if (unlikely(pol >= 'a' && pol <= 'z'))
849 /* Backward compatibility with VLC for Linux < 1.2 */
850 unsigned voltage = var_InheritInteger (obj, "dvb-voltage");
853 case 13: pol = 'V'; break;
854 case 18: pol = 'H'; break;
858 msg_Warn (obj, "\"voltage=%u\" option is obsolete. "
859 "Use \"polarization=%c\" instead.", voltage, pol);
863 static int sec_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
865 char pol = var_InheritPolarization (obj);
866 unsigned lowf = var_InheritInteger (obj, "dvb-lnb-low");
867 unsigned highf = var_InheritInteger (obj, "dvb-lnb-high");
868 unsigned switchf = var_InheritInteger (obj, "dvb-lnb-switch");
870 return dvb_set_sec (dev, freq, pol, lowf, highf, switchf);
873 static int dvbs_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
875 uint32_t fec = var_InheritCodeRate (obj, "dvb-fec");
876 uint32_t srate = var_InheritInteger (obj, "dvb-srate");
878 int ret = dvb_set_dvbs (dev, freq, srate, fec);
880 ret = sec_setup (obj, dev, freq);
884 static int dvbs2_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
886 const char *mod = var_InheritModulation (obj, "dvb-modulation");
887 uint32_t fec = var_InheritCodeRate (obj, "dvb-fec");
888 uint32_t srate = var_InheritInteger (obj, "dvb-srate");
889 int pilot = var_InheritInteger (obj, "dvb-pilot");
890 int rolloff = var_InheritInteger (obj, "dvb-rolloff");
892 int ret = dvb_set_dvbs2 (dev, freq, mod, srate, fec, pilot, rolloff);
894 ret = sec_setup (obj, dev, freq);
898 static const delsys_t dvbs = { .setup = dvbs_setup };
899 static const delsys_t dvbs2 = { .setup = dvbs2_setup };
903 static int dvbt_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
905 const char *mod = var_InheritModulation (obj, "dvb-modulation");
906 uint32_t fec_hp = var_InheritCodeRate (obj, "dvb-code-rate-hp");
907 uint32_t fec_lp = var_InheritCodeRate (obj, "dvb-code-rate-lp");
908 uint32_t guard = var_InheritGuardInterval (obj);
909 uint32_t bw = var_InheritInteger (obj, "dvb-bandwidth");
910 int tx = var_InheritInteger (obj, "dvb-transmission");
911 int h = var_InheritInteger (obj, "dvb-hierarchy");
913 return dvb_set_dvbt (dev, freq, mod, fec_hp, fec_lp, bw, tx, guard, h);
916 static int dvbt2_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
918 const char *mod = var_InheritModulation (obj, "dvb-modulation");
919 uint32_t fec = var_InheritCodeRate (obj, "dvb-fec");
920 uint32_t guard = var_InheritGuardInterval (obj);
921 uint32_t bw = var_InheritInteger (obj, "dvb-bandwidth");
922 uint32_t plp = var_InheritInteger (obj, "dvd-plp-id");
923 int tx = var_InheritInteger (obj, "dvb-transmission");
925 return dvb_set_dvbt2 (dev, freq, mod, fec, bw, tx, guard, plp);
928 static const delsys_t dvbt = { .setup = dvbt_setup };
929 static const delsys_t dvbt2 = { .setup = dvbt2_setup };
933 static int isdbc_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
935 const char *mod = var_InheritModulation (obj, "dvb-modulation");
936 uint32_t fec = var_InheritCodeRate (obj, "dvb-fec");
937 unsigned srate = var_InheritInteger (obj, "dvb-srate");
939 return dvb_set_isdbc (dev, freq, mod, srate, fec);
942 static const delsys_t isdbc = { .setup = isdbc_setup };
946 static int isdbs_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
948 uint16_t ts_id = var_InheritInteger (obj, "dvb-ts-id");
950 int ret = dvb_set_isdbs (dev, freq, ts_id);
952 ret = sec_setup (obj, dev, freq);
956 static const delsys_t isdbs = { .setup = isdbs_setup };
960 static int isdbt_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
962 isdbt_layer_t layers[3];
963 uint32_t guard = var_InheritGuardInterval (obj);
964 uint32_t bw = var_InheritInteger (obj, "dvb-bandwidth");
965 int tx = var_InheritInteger (obj, "dvb-transmission");
967 for (unsigned i = 0; i < 3; i++)
969 char varname[sizeof ("dvb-X-interleaving")];
970 memcpy (varname, "dvb-X-", 4);
971 varname[4] = 'a' + i;
973 strcpy (varname + 6, "modulation");
974 layers[i].modulation = var_InheritModulation (obj, varname);
975 strcpy (varname + 6, "fec");
976 layers[i].code_rate = var_InheritCodeRate (obj, varname);
977 strcpy (varname + 6, "count");
978 layers[i].segment_count = var_InheritInteger (obj, varname);
979 strcpy (varname + 6, "interleaving");
980 layers[i].time_interleaving = var_InheritInteger (obj, varname);
983 return dvb_set_isdbt (dev, freq, bw, tx, guard, layers);
986 static const delsys_t isdbt = { .setup = isdbt_setup };