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