8546f3c16d3ca2db219e4be32b44281ad1c84ab3
[vlc.git] / modules / access / dtv / access.c
1 /**
2  * @file access.c
3  * @brief Digital broadcasting input module for VLC media player
4  */
5 /*****************************************************************************
6  * Copyright © 2011 Rémi Denis-Courmont
7  *
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.
12  *
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.
17  *
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  *****************************************************************************/
22
23 #ifdef HAVE_CONFIG_H
24 # include <config.h>
25 #endif
26
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>
32 #include <search.h>
33
34 #include "dtv/dtv.h"
35
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.")
40
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.")
49
50 #define NAME_TEXT N_("Network name")
51 #define NAME_LONGTEXT N_("Unique network name in the System Tuning Spaces")
52
53 #define CREATE_TEXT N_("Network name to create")
54 #define CREATE_LONGTEXT N_("Create unique name in the System Tuning Spaces")
55
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.")
60
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",
72     "8VSB", "16VSB",
73     "QPSK", "DQPSK", "8PSK", "16APSK", "32APSK",
74 };
75 static const char *const modulation_user[] = { N_("Undefined"),
76     "Auto QAM", "16-QAM", "32-QAM", "64-QAM", "128-QAM", "256-QAM",
77     "8-VSB", "16-VSB",
78     "QPSK", "DQPSK", "8-PSK", "16-APSK", "32-APSK",
79 };
80
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.")
85
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") };
93
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",
105 };
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",
109 };
110
111 #define TRANSMISSION_TEXT N_("Transmission mode")
112 const int transmission_vlc[] = { -1,
113     1, 2, 4, 8, 16, 32,
114 };
115 static const char *const transmission_user[] = { N_("Automatic"),
116     "1k", "2k", "4k", "8k", "16k", "32k",
117 };
118
119 #define BANDWIDTH_TEXT N_("Bandwidth (MHz)")
120 const int bandwidth_vlc[] = { 0,
121     10, 8, 7, 6, 5, 2
122 };
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"),
126 };
127
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",
131 };
132 static const char *const guard_user[] = { N_("Automatic"),
133     "1/128", "1/32", "1/16", "19/256", "1/8", "19/128", "1/4",
134 };
135
136 #define HIERARCHY_TEXT N_("Hierarchy mode")
137 const int hierarchy_vlc[] = { -1,
138     0, 1, 2, 4,
139 };
140 static const char *const hierarchy_user[] = { N_("Automatic"),
141     N_("None"), "1", "2", "4",
142 };
143
144 #define PLP_ID_TEXT N_("DVB-T2 Physical Layer Pipe")
145
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")
149
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")
153
154 #define STREAM_ID_TEXT N_("Stream identifier")
155
156 #define PILOT_TEXT N_("Pilot")
157
158 #define ROLLOFF_TEXT N_("Roll-off factor")
159 const int rolloff_vlc[] = { -1,
160     35, 20, 25,
161 };
162 static const char *const rolloff_user[] = { N_("Automatic"),
163     N_("0.35 (same as DVB-S)"), N_("0.20"), N_("0.25"),
164 };
165
166 #define TS_ID_TEXT N_("Transport stream ID")
167
168 #define POLARIZATION_TEXT N_("Polarization (Voltage)")
169 #define POLARIZATION_LONGTEXT N_( \
170     "To select the polarization of the transponder, a different voltage " \
171     "is normally applied to the low noise block-downconverter (LNB).")
172 static const char *const polarization_vlc[] = { "", "V", "H", "R", "L" };
173 static const char *const polarization_user[] = { N_("Unspecified (0V)"),
174     N_("Vertical (13V)"), N_("Horizontal (18V)"),
175     N_("Circular Right Hand (13V)"), N_("Circular Left Hand (18V)") };
176
177 #define HIGH_VOLTAGE_TEXT N_("High LNB voltage")
178 #define HIGH_VOLTAGE_LONGTEXT N_( \
179     "If the cables between the satellilte low noise block-downconverter and " \
180     "the receiver are long, higher voltage may be required.\n" \
181     "Not all receivers support this.")
182
183 #define LNB_LOW_TEXT N_("Local oscillator low frequency (kHz)")
184 #define LNB_HIGH_TEXT N_("Local oscillator high frequency (kHz)")
185 #define LNB_LONGTEXT N_( \
186     "The downconverter (LNB) will substract the local oscillator frequency " \
187     "from the satellite transmission frequency. " \
188     "The intermediate frequency (IF) on the RF cable is the result.")
189 #define LNB_SWITCH_TEXT N_("Universal LNB switch frequency (kHz)")
190 #define LNB_SWITCH_LONGTEXT N_( \
191     "If the satellite transmission frequency exceeds the switch frequency, " \
192     "the oscillator high frequency will be used as reference. " \
193     "Furthermore the automatic continuous 22kHz tone will be sent.")
194 #define TONE_TEXT N_("Continuous 22kHz tone")
195 #define TONE_LONGTEXT N_( \
196     "A continuous tone at 22kHz can be sent on the cable. " \
197     "This normally selects the higher frequency band from a universal LNB.")
198
199 #define SATNO_TEXT N_("DiSEqC LNB number")
200 #define SATNO_LONGTEXT N_( \
201     "If the satellite receiver is connected to multiple " \
202     "low noise block-downconverters (LNB) through a DiSEqC 1.0 switch, " \
203     "the correct LNB can be selected (1 to 4). " \
204     "If there is no switch, this parameter should be 0.")
205 #ifdef HAVE_LINUX_DVB
206 static const int satno_vlc[] = { 0, 1, 2, 3, 4 };
207 static const char *const satno_user[] = { N_("Unspecified"),
208     "A/1", "B/2", "C/3", "D/4" };
209 #endif
210
211 #define UNCOMMITTED_TEXT N_("Uncommitted DiSEqC LNB number")
212 #define UNCOMMITTED_LONGTEXT N_( \
213     "If the satellite receiver is connected to multiple " \
214     "low noise block-downconverters (LNB) through a cascade formed from " \
215     "DiSEqC 1.1 uncommitted switch and DiSEqC 1.0 committed switch, " \
216     "the correct uncommitted LNB can be selected (1 to 4). " \
217     "If there is no uncommitted switch, this parameter should be 0.")
218
219 /* BDA module additional DVB-S Parameters */
220 #define NETID_TEXT N_("Network identifier")
221 #define AZIMUTH_TEXT N_("Satellite azimuth")
222 #define AZIMUTH_LONGTEXT N_("Satellite azimuth in tenths of degree")
223 #define ELEVATION_TEXT N_("Satellite elevation")
224 #define ELEVATION_LONGTEXT N_("Satellite elevation in tenths of degree")
225 #define LONGITUDE_TEXT N_("Satellite longitude")
226 #define LONGITUDE_LONGTEXT N_( \
227     "Satellite longitude in tenths of degree. West is negative.")
228
229 #define RANGE_TEXT N_("Satellite range code")
230 #define RANGE_LONGTEXT N_("Satellite range code as defined by manufacturer " \
231    "e.g. DISEqC switch code")
232
233 /* ATSC */
234 #define MAJOR_CHANNEL_TEXT N_("Major channel")
235 #define MINOR_CHANNEL_TEXT N_("ATSC minor channel")
236 #define PHYSICAL_CHANNEL_TEXT N_("Physical channel")
237
238 static int  Open (vlc_object_t *);
239 static void Close (vlc_object_t *);
240
241 vlc_module_begin ()
242     set_shortname (N_("DTV"))
243     set_description (N_("Digital Television and Radio"))
244     set_category (CAT_INPUT)
245     set_subcategory (SUBCAT_INPUT_ACCESS)
246     set_capability ("access", 0)
247     set_callbacks (Open, Close)
248     add_shortcut ("dtv", "tv", "dvb", /* "radio", "dab",*/
249                   "cable", "dvb-c", "cqam", "isdb-c",
250                   "satellite", "dvb-s", "dvb-s2", "isdb-s",
251                   "terrestrial", "dvb-t", "dvb-t2", "isdb-t", "atsc"
252 #ifdef _WIN32
253                   ,"dvbt"
254 #endif
255                  )
256
257 #ifdef HAVE_LINUX_DVB
258     add_integer ("dvb-adapter", 0, ADAPTER_TEXT, ADAPTER_LONGTEXT, false)
259         change_integer_range (0, 255)
260         change_safe ()
261     add_integer ("dvb-device", 0, DEVICE_TEXT, DEVICE_LONGTEXT, false)
262         change_integer_range (0, 255)
263         change_safe ()
264     add_bool ("dvb-budget-mode", false, BUDGET_TEXT, BUDGET_LONGTEXT, true)
265 #endif
266 #ifdef _WIN32
267     add_integer ("dvb-adapter", -1, ADAPTER_TEXT, ADAPTER_LONGTEXT, true)
268         change_safe ()
269     add_string ("dvb-network-name", "", NAME_TEXT, NAME_LONGTEXT, true)
270     /* Hmm: is this one really safe??: */
271     add_string ("dvb-create-name", "", CREATE_TEXT, CREATE_LONGTEXT, true)
272         change_private ()
273 #endif
274     add_integer ("dvb-frequency", 0, FREQ_TEXT, FREQ_LONGTEXT, false)
275         change_integer_range (0, 107999999)
276         change_safe ()
277     add_integer ("dvb-inversion", -1, INVERSION_TEXT, INVERSION_LONGTEXT, true)
278         change_integer_list (auto_off_on_vlc, auto_off_on_user)
279         change_safe ()
280
281     set_section (N_("Terrestrial reception parameters"), NULL)
282     add_integer ("dvb-bandwidth", 0, BANDWIDTH_TEXT, BANDWIDTH_TEXT, true)
283         change_integer_list (bandwidth_vlc, bandwidth_user)
284         change_safe ()
285     add_integer ("dvb-transmission", 0,
286                  TRANSMISSION_TEXT, TRANSMISSION_TEXT, true)
287         change_integer_list (transmission_vlc, transmission_user)
288         change_safe ()
289     add_string ("dvb-guard", "", GUARD_TEXT, GUARD_TEXT, true)
290         change_string_list (guard_vlc, guard_user)
291         change_safe ()
292
293     set_section (N_("DVB-T reception parameters"), NULL)
294     add_string ("dvb-code-rate-hp", "",
295                 CODE_RATE_HP_TEXT, CODE_RATE_LONGTEXT, true)
296         change_string_list (code_rate_vlc, code_rate_user)
297         change_safe ()
298     add_string ("dvb-code-rate-lp", "",
299                 CODE_RATE_LP_TEXT, CODE_RATE_LONGTEXT, true)
300         change_string_list (code_rate_vlc, code_rate_user)
301         change_safe ()
302     add_integer ("dvb-hierarchy", -1, HIERARCHY_TEXT, HIERARCHY_TEXT, true)
303         change_integer_list (hierarchy_vlc, hierarchy_user)
304         change_safe ()
305     add_integer ("dvb-plp-id", 0, PLP_ID_TEXT, PLP_ID_TEXT, false)
306         change_integer_range (0, 255)
307         change_safe ()
308
309     set_section (N_("ISDB-T reception parameters"), NULL)
310     add_string ("dvb-a-modulation", NULL,
311                 MODULATION_A_TEXT, MODULATION_LONGTEXT, true)
312         change_string_list (modulation_vlc, modulation_user)
313         change_safe ()
314     add_string ("dvb-a-fec", NULL, CODE_RATE_A_TEXT, CODE_RATE_LONGTEXT, true)
315         change_string_list (code_rate_vlc, code_rate_user)
316         change_safe ()
317     add_integer ("dvb-a-count", 0, SEGMENT_COUNT_A_TEXT, NULL, true)
318         change_integer_range (0, 13)
319         change_safe ()
320     add_integer ("dvb-a-interleaving", 0, TIME_INTERLEAVING_A_TEXT, NULL, true)
321         change_integer_range (0, 3)
322         change_safe ()
323     add_string ("dvb-b-modulation", NULL,
324                 MODULATION_B_TEXT, MODULATION_LONGTEXT, true)
325         change_string_list (modulation_vlc, modulation_user)
326         change_safe ()
327     add_string ("dvb-b-fec", NULL, CODE_RATE_B_TEXT, CODE_RATE_LONGTEXT, true)
328         change_string_list (code_rate_vlc, code_rate_user)
329         change_safe ()
330     add_integer ("dvb-b-count", 0, SEGMENT_COUNT_B_TEXT, NULL, true)
331         change_integer_range (0, 13)
332         change_safe ()
333     add_integer ("dvb-b-interleaving", 0, TIME_INTERLEAVING_B_TEXT, NULL, true)
334         change_integer_range (0, 3)
335         change_safe ()
336     add_string ("dvb-c-modulation", NULL,
337                 MODULATION_C_TEXT, MODULATION_LONGTEXT, true)
338         change_string_list (modulation_vlc, modulation_user)
339         change_safe ()
340     add_string ("dvb-c-fec", NULL, CODE_RATE_C_TEXT, CODE_RATE_LONGTEXT, true)
341         change_string_list (code_rate_vlc, code_rate_user)
342         change_safe ()
343     add_integer ("dvb-c-count", 0, SEGMENT_COUNT_C_TEXT, NULL, true)
344         change_integer_range (0, 13)
345         change_safe ()
346     add_integer ("dvb-c-interleaving", 0, TIME_INTERLEAVING_C_TEXT, NULL, true)
347         change_integer_range (0, 3)
348         change_safe ()
349
350     set_section (N_("Cable and satellite reception parameters"), NULL)
351     add_string ("dvb-modulation", NULL,
352                  MODULATION_TEXT, MODULATION_LONGTEXT, false)
353         change_string_list (modulation_vlc, modulation_user)
354         change_safe ()
355     add_integer ("dvb-srate", 0, SRATE_TEXT, SRATE_LONGTEXT, false)
356         change_integer_range (0, UINT64_C(0xffffffff))
357         change_safe ()
358     add_string ("dvb-fec", "", CODE_RATE_TEXT, CODE_RATE_LONGTEXT, true)
359         change_string_list (code_rate_vlc, code_rate_user)
360         change_safe ()
361
362     set_section (N_("DVB-S2 parameters"), NULL)
363     add_integer ("dvb-stream", 0, STREAM_ID_TEXT, STREAM_ID_TEXT, false)
364         change_integer_range (0, 255)
365         change_safe ()
366     add_integer ("dvb-pilot", -1, PILOT_TEXT, PILOT_TEXT, true)
367         change_integer_list (auto_off_on_vlc, auto_off_on_user)
368         change_safe ()
369     add_integer ("dvb-rolloff", -1, ROLLOFF_TEXT, ROLLOFF_TEXT, true)
370         change_integer_list (rolloff_vlc, rolloff_user)
371         change_safe ()
372
373     set_section (N_("ISDB-S parameters"), NULL)
374     add_integer ("dvb-ts-id", 0, TS_ID_TEXT, TS_ID_TEXT, false)
375         change_integer_range (0, 0xffff)
376         change_safe ()
377
378     set_section (N_("Satellite equipment control"), NULL)
379     add_string ("dvb-polarization", "",
380                 POLARIZATION_TEXT, POLARIZATION_LONGTEXT, false)
381         change_string_list (polarization_vlc, polarization_user)
382         change_safe ()
383     add_integer ("dvb-voltage", 13, "", "", true)
384         change_integer_range (0, 18)
385         change_private ()
386         change_safe ()
387 #ifdef HAVE_LINUX_DVB
388     add_bool ("dvb-high-voltage", false,
389               HIGH_VOLTAGE_TEXT, HIGH_VOLTAGE_LONGTEXT, false)
390 #endif
391     add_integer ("dvb-lnb-low", 0, LNB_LOW_TEXT, LNB_LONGTEXT, true)
392         change_integer_range (0, 0x7fffffff)
393     add_obsolete_integer ("dvb-lnb-lof1") /* since 2.0.0 */
394     add_integer ("dvb-lnb-high", 0, LNB_HIGH_TEXT, LNB_LONGTEXT, true)
395         change_integer_range (0, 0x7fffffff)
396     add_obsolete_integer ("dvb-lnb-lof2") /* since 2.0.0 */
397     add_integer ("dvb-lnb-switch", 11700000,
398                  LNB_SWITCH_TEXT, LNB_SWITCH_LONGTEXT, true)
399         change_integer_range (0, 0x7fffffff)
400     add_obsolete_integer ("dvb-lnb-slof") /* since 2.0.0 */
401 #ifdef HAVE_LINUX_DVB
402     add_integer ("dvb-satno", 0, SATNO_TEXT, SATNO_LONGTEXT, true)
403         change_integer_list (satno_vlc, satno_user)
404         change_safe ()
405     add_integer ("dvb-uncommitted", 0, UNCOMMITTED_TEXT, UNCOMMITTED_LONGTEXT, true)
406         change_integer_list (satno_vlc, satno_user)
407         change_safe ()
408     add_integer ("dvb-tone", -1, TONE_TEXT, TONE_LONGTEXT, true)
409         change_integer_list (auto_off_on_vlc, auto_off_on_user)
410 #endif
411 #ifdef _WIN32
412     add_integer ("dvb-network-id", 0, NETID_TEXT, NETID_TEXT, true)
413     add_integer ("dvb-azimuth", 0, AZIMUTH_TEXT, AZIMUTH_LONGTEXT, true)
414     add_integer ("dvb-elevation", 0, ELEVATION_TEXT, ELEVATION_LONGTEXT, true)
415     add_integer ("dvb-longitude", 0, LONGITUDE_TEXT, LONGITUDE_LONGTEXT, true)
416     add_string ("dvb-range", "", RANGE_TEXT, RANGE_LONGTEXT, true)
417     /* dvb-range corresponds to the BDA InputRange parameter which is
418     * used by some drivers to control the diseqc */
419
420     set_section (N_("ATSC reception parameters"), NULL)
421     add_integer ("dvb-major-channel", 0, MAJOR_CHANNEL_TEXT, NULL, true)
422     add_integer ("dvb-minor-channel", 0, MINOR_CHANNEL_TEXT, NULL, true)
423     add_integer ("dvb-physical-channel", 0, PHYSICAL_CHANNEL_TEXT, NULL, true)
424 #endif
425 vlc_module_end ()
426
427 struct access_sys_t
428 {
429     dvb_device_t *dev;
430     uint8_t signal_poll;
431 };
432
433 typedef struct delsys
434 {
435     int (*setup) (vlc_object_t *, dvb_device_t *, uint64_t freq);
436     /* TODO: scan stuff */
437 } delsys_t;
438
439 static const delsys_t dvbc, dvbs, dvbs2, dvbt, dvbt2;
440 static const delsys_t isdbc, isdbs, isdbt;
441 static const delsys_t atsc, cqam;
442
443 static block_t *Read (access_t *);
444 static int Control (access_t *, int, va_list);
445 static const delsys_t *GuessSystem (const char *, dvb_device_t *);
446 static int Tune (vlc_object_t *, dvb_device_t *, const delsys_t *, uint64_t);
447 static uint64_t var_InheritFrequency (vlc_object_t *);
448
449 static int Open (vlc_object_t *obj)
450 {
451     access_t *access = (access_t *)obj;
452     access_sys_t *sys = malloc (sizeof (*sys));
453     if (unlikely(sys == NULL))
454         return VLC_ENOMEM;
455
456     var_LocationParse (obj, access->psz_location, "dvb-");
457
458     dvb_device_t *dev = dvb_open (obj);
459     if (dev == NULL)
460     {
461         free (sys);
462         return VLC_EGENERIC;
463     }
464
465     sys->dev = dev;
466     sys->signal_poll = 0;
467     access->p_sys = sys;
468
469     uint64_t freq = var_InheritFrequency (obj);
470     if (freq != 0)
471     {
472         const delsys_t *delsys = GuessSystem (access->psz_access, dev);
473         if (delsys == NULL || Tune (obj, dev, delsys, freq))
474         {
475             msg_Err (obj, "tuning to %"PRIu64" Hz failed", freq);
476             dialog_Fatal (obj, N_("Digital broadcasting"),
477                           N_("The selected digital tuner does not support "
478                              "the specified parameters.\n"
479                              "Please check the preferences."));
480             goto error;
481         }
482     }
483     dvb_add_pid (dev, 0);
484
485     access->pf_block = Read;
486     access->pf_control = Control;
487     return VLC_SUCCESS;
488
489 error:
490     Close (obj);
491     access->p_sys = NULL;
492     return VLC_EGENERIC;
493 }
494
495 static void Close (vlc_object_t *obj)
496 {
497     access_t *access = (access_t *)obj;
498     access_sys_t *sys = access->p_sys;
499
500     dvb_close (sys->dev);
501     free (sys);
502 }
503
504 static block_t *Read (access_t *access)
505 {
506 #define BUFSIZE (20*188)
507     block_t *block = block_Alloc (BUFSIZE);
508     if (unlikely(block == NULL))
509         return NULL;
510
511     access_sys_t *sys = access->p_sys;
512     ssize_t val = dvb_read (sys->dev, block->p_buffer, BUFSIZE);
513
514     if (val <= 0)
515     {
516         if (val == 0)
517             access->info.b_eof = true;
518         block_Release (block);
519         return NULL;
520     }
521
522     block->i_buffer = val;
523
524     return block;
525 }
526
527 static int Control (access_t *access, int query, va_list args)
528 {
529     access_sys_t *sys = access->p_sys;
530     dvb_device_t *dev = sys->dev;
531
532     switch (query)
533     {
534         case ACCESS_CAN_SEEK:
535         case ACCESS_CAN_FASTSEEK:
536         case ACCESS_CAN_PAUSE:
537         case ACCESS_CAN_CONTROL_PACE:
538             *va_arg (args, bool *) = false;
539             break;
540
541         case ACCESS_GET_PTS_DELAY:
542         {
543             int64_t *v = va_arg (args, int64_t *);
544             *v = var_InheritInteger (access, "live-caching") * INT64_C(1000);
545             break;
546         }
547
548         case ACCESS_GET_CONTENT_TYPE:
549             *va_arg (args, char **) = strdup ("video/MP2T");
550             break;
551
552         case ACCESS_GET_SIGNAL:
553             /* Fetch the signal levels only every so often to avoid stressing
554              * the device bus. */
555             if ((sys->signal_poll++))
556                 return VLC_EGENERIC;
557
558             *va_arg (args, double *) = dvb_get_snr (dev);
559             *va_arg (args, double *) = dvb_get_signal_strength (dev);
560             return VLC_SUCCESS;
561
562         case ACCESS_SET_PRIVATE_ID_STATE:
563         {
564             unsigned pid = va_arg (args, int);
565             bool add = va_arg (args, int);
566
567             if (unlikely(pid > 0x1FFF))
568                 return VLC_EGENERIC;
569             if (add)
570             {
571                 if (dvb_add_pid (dev, pid))
572                     return VLC_EGENERIC;
573             }
574             else
575                 dvb_remove_pid (dev, pid);
576             break;
577         }
578
579 #ifdef HAVE_DVBPSI
580         case ACCESS_SET_PRIVATE_ID_CA:
581         {
582             struct dvbpsi_pmt_s *pmt = va_arg (args, struct dvbpsi_pmt_s *);
583
584             dvb_set_ca_pmt (dev, pmt);
585             break;
586         }
587 #endif
588         case ACCESS_GET_PRIVATE_ID_STATE:
589         {
590             unsigned pid = va_arg (args, int);
591             bool *on = va_arg (args, bool *);
592
593             *on = likely(pid <= 0x1FFF) ? dvb_get_pid_state(dev, pid) : false;
594             return VLC_SUCCESS;
595         }
596
597         default:
598             return VLC_EGENERIC;
599     }
600
601     return VLC_SUCCESS;
602 }
603
604
605 /*** Generic tuning ***/
606
607 /** Determines which delivery system to use. */
608 static const delsys_t *GuessSystem (const char *scheme, dvb_device_t *dev)
609 {
610     /* Specific delivery system is specified */
611     if (!strcasecmp (scheme, "atsc"))
612         return &atsc;
613     if (!strcasecmp (scheme, "cqam"))
614         return &cqam;
615     if (!strcasecmp (scheme, "dvb-c"))
616         return &dvbc;
617     if (!strcasecmp (scheme, "dvb-s"))
618         return &dvbs;
619     if (!strcasecmp (scheme, "dvb-s2"))
620         return &dvbs2;
621     if (!strcasecmp (scheme, "dvb-t"))
622         return &dvbt;
623     if (!strcasecmp (scheme, "dvb-t2"))
624         return &dvbt2;
625     if (!strcasecmp (scheme, "isdb-c"))
626         return &isdbc;
627     if (!strcasecmp (scheme, "isdb-s"))
628         return &isdbs;
629     if (!strcasecmp (scheme, "isdb-t"))
630         return &isdbt;
631
632     /* If the demodulator supports 2G, we cannot guess whether
633      * 1G or 2G is intended. For backward compatibility, 1G is assumed
634      * (this is not a limitation of Linux DVB). We will probably need something
635      * smarter when 2G (semi automatic) scanning is implemented. */
636     unsigned systems = dvb_enum_systems (dev);
637
638     /* Only wave carrier is specified */
639     if (!strcasecmp (scheme, "cable"))
640     {
641         if (systems & DVB_C)
642             return &dvbc;
643         if (systems & CQAM)
644             return &cqam;
645         if (systems & ISDB_C)
646             return &isdbc;
647     }
648     if (!strcasecmp (scheme, "satellite"))
649     {
650         if (systems & DVB_S)
651             return &dvbs;
652         if (systems & ISDB_S)
653             return &isdbs;
654     }
655     if (!strcasecmp (scheme, "terrestrial"))
656     {
657         if (systems & DVB_T)
658             return &dvbc;
659         if (systems & ATSC)
660             return &cqam;
661         if (systems & ISDB_T)
662             return &isdbt;
663     }
664
665     /* Only standards family or nothing is specified */
666     if (systems & DVB_C)
667         return &dvbc;
668     if (systems & DVB_S)
669         return &dvbs;
670     if (systems & DVB_T)
671         return &dvbt;
672     if (systems & ATSC)
673         return &atsc;
674     return NULL;
675 }
676
677 /** Set parameters and tune the device */
678 static int Tune (vlc_object_t *obj, dvb_device_t *dev, const delsys_t *delsys,
679                  uint64_t freq)
680 {
681     if (delsys->setup (obj, dev, freq)
682      || dvb_set_inversion (dev, var_InheritInteger (obj, "dvb-inversion"))
683      || dvb_tune (dev))
684         return VLC_EGENERIC;
685     return VLC_SUCCESS;
686 }
687
688 static uint64_t var_InheritFrequency (vlc_object_t *obj)
689 {
690     uint64_t freq = var_InheritInteger (obj, "dvb-frequency");
691     if (freq != 0 && freq < 30000000)
692     {
693         msg_Err (obj, "%"PRIu64" Hz carrier frequency is too low.", freq);
694         freq *= 1000;
695         msg_Info (obj, "Assuming %"PRIu64" Hz frequency instead.", freq);
696     }
697     return freq;
698 }
699
700 static uint32_t var_InheritCodeRate (vlc_object_t *obj, const char *varname)
701 {
702     char *code_rate = var_InheritString (obj, varname);
703     if (code_rate == NULL)
704         return VLC_FEC_AUTO;
705
706     uint16_t a, b;
707     int v = sscanf (code_rate, "%"SCNu16"/%"SCNu16, &a, &b);
708     free (code_rate);
709     switch (v)
710     {
711         case 2:
712             return VLC_FEC(a, b);
713         case 1:
714             if (a == 0)
715                 return 0;
716             /* Backward compatibility with VLC < 1.2 (= Linux DVBv3 enum) */
717             if (a < 9)
718             {
719                 msg_Warn (obj, "\"%s=%"PRIu16"\" option is obsolete. "
720                           "Use \"%s=%"PRIu16"/%"PRIu16"\" instead.",
721                           varname + 4, a, varname + 4, a, a + 1);
722                 return VLC_FEC(a, a + 1);
723             }
724             else
725                 msg_Warn (obj, "\"fec=9\" option is obsolete.");
726     }
727     return VLC_FEC_AUTO;
728 }
729
730 static int modcmp (const void *a, const void *b)
731 {
732     return strcasecmp (a, *(const char *const *)b);
733 }
734
735 static const char *var_InheritModulation (vlc_object_t *obj, const char *var)
736 {
737     char *mod = var_InheritString (obj, var);
738     if (mod == NULL)
739         return "";
740
741     size_t n = sizeof (modulation_vlc) / sizeof (modulation_vlc[0]);
742     const char *const *p = lfind (mod, modulation_vlc, &n, sizeof (mod), modcmp);
743     if (p != NULL)
744     {
745         free (mod);
746         return *p;
747     }
748
749     /* Backward compatibility with VLC < 1.2 */
750     const char *str;
751     switch (atoi (mod))
752     {
753         case -1:  str = "QPSK";   break;
754         case 0:   str = "QAM";    break;
755         case 8:   str = "8VSB";   break;
756         case 16:  str = "16QAM";  break;
757         case 32:  str = "32QAM";  break;
758         case 64:  str = "64QAM";  break;
759         case 128: str = "128QAM"; break;
760         case 256: str = "256QAM"; break;
761         default:  return "";
762     }
763
764     msg_Warn (obj, "\"modulation=%s\" option is obsolete. "
765                    "Use \"modulation=%s\" instead.", mod, str);
766     free (mod);
767     return str;
768 }
769
770 static unsigned var_InheritGuardInterval (vlc_object_t *obj)
771 {
772     char *guard = var_InheritString (obj, "dvb-guard");
773     if (guard == NULL)
774         return VLC_GUARD_AUTO;
775
776     uint16_t a, b;
777     int v = sscanf (guard, "%"SCNu16"/%"SCNu16, &a, &b);
778     free (guard);
779     switch (v)
780     {
781         case 1:
782             /* Backward compatibility with VLC < 1.2 */
783             if (a == 0)
784                 break;
785             msg_Warn (obj, "\"guard=%"PRIu16"\" option is obsolete. "
786                            "Use \"guard=1/%"PRIu16" instead.", a, a);
787             b = a;
788             a = 1;
789         case 2:
790             return VLC_GUARD(a, b);
791     }
792     return VLC_GUARD_AUTO;
793 }
794
795
796 /*** ATSC ***/
797 static int atsc_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
798 {
799     const char *mod = var_InheritModulation (obj, "dvb-modulation");
800
801     return dvb_set_atsc (dev, freq, mod);
802 }
803
804 static const delsys_t atsc = { .setup = atsc_setup };
805
806 static int cqam_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
807 {
808     const char *mod = var_InheritModulation (obj, "dvb-modulation");
809
810     return dvb_set_cqam (dev, freq, mod);
811 }
812
813 static const delsys_t cqam = { .setup = cqam_setup };
814
815
816 /*** DVB-C ***/
817 static int dvbc_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
818 {
819     const char *mod = var_InheritModulation (obj, "dvb-modulation");
820     uint32_t fec = var_InheritCodeRate (obj, "dvb-fec");
821     unsigned srate = var_InheritInteger (obj, "dvb-srate");
822
823     return dvb_set_dvbc (dev, freq, mod, srate, fec);
824 }
825
826 static const delsys_t dvbc = { .setup = dvbc_setup };
827
828
829 /*** DVB-S ***/
830 static char var_InheritPolarization (vlc_object_t *obj)
831 {
832     char pol;
833     char *polstr = var_InheritString (obj, "dvb-polarization");
834     if (polstr != NULL)
835     {
836         pol = *polstr;
837         free (polstr);
838         if (unlikely(pol >= 'a' && pol <= 'z'))
839             pol -= 'a' - 'A';
840         return pol;
841     }
842
843     /* Backward compatibility with VLC for Linux < 1.2 */
844     unsigned voltage = var_InheritInteger (obj, "dvb-voltage");
845     switch (voltage)
846     {
847         case 13:  pol = 'V'; break;
848         case 18:  pol = 'H'; break;
849         default:  return 0;
850     }
851
852     msg_Warn (obj, "\"voltage=%u\" option is obsolete. "
853                    "Use \"polarization=%c\" instead.", voltage, pol);
854     return pol;
855 }
856
857 static void sec_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
858 {
859     char pol = var_InheritPolarization (obj);
860     unsigned lowf = var_InheritInteger (obj, "dvb-lnb-low");
861     unsigned highf = var_InheritInteger (obj, "dvb-lnb-high");
862     unsigned switchf = var_InheritInteger (obj, "dvb-lnb-switch");
863
864     dvb_set_sec (dev, freq, pol, lowf, highf, switchf);
865 }
866
867 static int dvbs_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
868 {
869     uint32_t fec = var_InheritCodeRate (obj, "dvb-fec");
870     uint32_t srate = var_InheritInteger (obj, "dvb-srate");
871
872     int ret = dvb_set_dvbs (dev, freq, srate, fec);
873     if (ret == 0)
874         sec_setup (obj, dev, freq);
875     return ret;
876 }
877
878 static int dvbs2_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
879 {
880     const char *mod = var_InheritModulation (obj, "dvb-modulation");
881     uint32_t fec = var_InheritCodeRate (obj, "dvb-fec");
882     uint32_t srate = var_InheritInteger (obj, "dvb-srate");
883     int pilot = var_InheritInteger (obj, "dvb-pilot");
884     int rolloff = var_InheritInteger (obj, "dvb-rolloff");
885     uint8_t sid = var_InheritInteger (obj, "dvb-stream");
886
887     int ret = dvb_set_dvbs2 (dev, freq, mod, srate, fec, pilot, rolloff, sid);
888     if (ret == 0)
889         sec_setup (obj, dev, freq);
890     return ret;
891 }
892
893 static const delsys_t dvbs = { .setup = dvbs_setup };
894 static const delsys_t dvbs2 = { .setup = dvbs2_setup };
895
896
897 /*** DVB-T ***/
898 static int dvbt_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
899 {
900     const char *mod = var_InheritModulation (obj, "dvb-modulation");
901     uint32_t fec_hp = var_InheritCodeRate (obj, "dvb-code-rate-hp");
902     uint32_t fec_lp = var_InheritCodeRate (obj, "dvb-code-rate-lp");
903     uint32_t guard = var_InheritGuardInterval (obj);
904     uint32_t bw = var_InheritInteger (obj, "dvb-bandwidth");
905     int tx = var_InheritInteger (obj, "dvb-transmission");
906     int h = var_InheritInteger (obj, "dvb-hierarchy");
907
908     return dvb_set_dvbt (dev, freq, mod, fec_hp, fec_lp, bw, tx, guard, h);
909 }
910
911 static int dvbt2_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
912 {
913     const char *mod = var_InheritModulation (obj, "dvb-modulation");
914     uint32_t fec = var_InheritCodeRate (obj, "dvb-fec");
915     uint32_t guard = var_InheritGuardInterval (obj);
916     uint32_t bw = var_InheritInteger (obj, "dvb-bandwidth");
917     uint32_t plp = var_InheritInteger (obj, "dvb-plp-id");
918     int tx = var_InheritInteger (obj, "dvb-transmission");
919
920     return dvb_set_dvbt2 (dev, freq, mod, fec, bw, tx, guard, plp);
921 }
922
923 static const delsys_t dvbt = { .setup = dvbt_setup };
924 static const delsys_t dvbt2 = { .setup = dvbt2_setup };
925
926
927 /*** ISDB-C ***/
928 static int isdbc_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
929 {
930     const char *mod = var_InheritModulation (obj, "dvb-modulation");
931     uint32_t fec = var_InheritCodeRate (obj, "dvb-fec");
932     unsigned srate = var_InheritInteger (obj, "dvb-srate");
933
934     return dvb_set_isdbc (dev, freq, mod, srate, fec);
935 }
936
937 static const delsys_t isdbc = { .setup = isdbc_setup };
938
939
940 /*** ISDB-S ***/
941 static int isdbs_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
942 {
943     uint16_t ts_id = var_InheritInteger (obj, "dvb-ts-id");
944
945     int ret = dvb_set_isdbs (dev, freq, ts_id);
946     if (ret == 0)
947         sec_setup (obj, dev, freq);
948     return ret;
949 }
950
951 static const delsys_t isdbs = { .setup = isdbs_setup };
952
953
954 /*** ISDB-T ***/
955 static int isdbt_setup (vlc_object_t *obj, dvb_device_t *dev, uint64_t freq)
956 {
957     isdbt_layer_t layers[3];
958     uint32_t guard = var_InheritGuardInterval (obj);
959     uint32_t bw = var_InheritInteger (obj, "dvb-bandwidth");
960     int tx = var_InheritInteger (obj, "dvb-transmission");
961
962     for (unsigned i = 0; i < 3; i++)
963     {
964         char varname[sizeof ("dvb-X-interleaving")];
965         memcpy (varname, "dvb-X-", 4);
966         varname[4] = 'a' + i;
967
968         strcpy (varname + 6, "modulation");
969         layers[i].modulation = var_InheritModulation (obj, varname);
970         strcpy (varname + 6, "fec");
971         layers[i].code_rate = var_InheritCodeRate (obj, varname);
972         strcpy (varname + 6, "count");
973         layers[i].segment_count = var_InheritInteger (obj, varname);
974         strcpy (varname + 6, "interleaving");
975         layers[i].time_interleaving = var_InheritInteger (obj, varname);
976     }
977
978     return dvb_set_isdbt (dev, freq, bw, tx, guard, layers);
979 }
980
981 static const delsys_t isdbt = { .setup = isdbt_setup };