mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
Version 1.3.2
- Fixed resetting the EPG data versions after changing the preferred languages (thanks to Teemu Rantanen for reporting this one and helping to debug it). - Added LinkageDescriptor handling to 'libsi' (thanks to Marcel Wiesweg). - Added Russian language texts (thanks to Vyacheslav Dikonov). Plugin authors may want to add the new entries to their I18N texts and contact the translators to have their texts translated. Note that there are now 17 different OSD languages, so please make sure you have 17 versions for each of your texts. - Some corrections and additions to the Finnish OSD texts (thanks to Rolf Ahrenberg and Niko Tarnanen). - Fixed a wrong 'delta' value in the call to the shutdown script (thanks to Stephan Epstein for reporting this one). - Activated detection of radio channels (to avoid reports about "channels not being detected that used to be detected with the 'scan' utility or the original 'autopid' patch ;-). - Channels with a zero VPID no longer write a PPID into channels.conf. - Short channel names are now only stored if they actually differ from the full name. - The EPG scan now scans newly found transponders together with already existing ones. - The "Red" button in the "Setup/EPG" menu can now be used to force an EPG scan on a single DVB card system (see MANUAL for details). - The new SVDRP command 'SCAN' can be used to force an EPG scan on a single DVB card system (see MANUAL under Setup/EPG for details). - Fixed handling PID changes in 'Transfer Mode'. - Excess blanks in channel names read from the SDT are now removed. - Fixed wrong parameter settings when scanning NITs for terrestrial transponders (thanks to Christian Tramnitz for pointing out this one). - Fixed some out of bounds parameter settings when scanning NITs for cable and satellite transponders. - Added 'libsi' include files to the 'include' directory, so that plugins can use them (thanks to Marcel Wiesweg). - Now only processing NITs that contain the transponder they are actually broadcast on. - Fixed setting the source type for newly detected terrestrial transponders (thanks to Christian Tramnitz for his support in debugging this).
This commit is contained in:
parent
a76a03c0d8
commit
b8e837dbbb
16
CONTRIBUTORS
16
CONTRIBUTORS
@ -641,6 +641,8 @@ Teemu Rantanen <tvr@iki.fi>
|
|||||||
for reporting a problem in calculation of channel ids for tv stations that use
|
for reporting a problem in calculation of channel ids for tv stations that use
|
||||||
the undefined NID value 0
|
the undefined NID value 0
|
||||||
for adding EPG preferred languages
|
for adding EPG preferred languages
|
||||||
|
for reporting and helping to debug resetting the EPG data versions after changing
|
||||||
|
the preferred languages
|
||||||
|
|
||||||
Jan Ekholm <chakie@infa.abo.fi>
|
Jan Ekholm <chakie@infa.abo.fi>
|
||||||
for adding/improving some Swedish language OSD texts
|
for adding/improving some Swedish language OSD texts
|
||||||
@ -654,6 +656,8 @@ Marcel Wiesweg <marcel.wiesweg@gmx.de>
|
|||||||
for fixing volume display in case a plugin has its own OSD open
|
for fixing volume display in case a plugin has its own OSD open
|
||||||
for providing 'libsi' and adapting the EIT mechanisms to it
|
for providing 'libsi' and adapting the EIT mechanisms to it
|
||||||
for fixing testing for matching section filters in case they are turned off
|
for fixing testing for matching section filters in case they are turned off
|
||||||
|
for adding 'libsi' include files to the 'include' directory, so that plugins can
|
||||||
|
use them
|
||||||
|
|
||||||
Torsten Herz <torsten.herz@web.de>
|
Torsten Herz <torsten.herz@web.de>
|
||||||
for fixing a possible deadlock when using the "Blue" button in the "Schedules" menu
|
for fixing a possible deadlock when using the "Blue" button in the "Schedules" menu
|
||||||
@ -902,3 +906,15 @@ Martin Holst <holstm@gmx.de>
|
|||||||
Robert Huitl <vdr@huitl.de>
|
Robert Huitl <vdr@huitl.de>
|
||||||
for fixing 'su' call in 'runvdr' to make it work on systems that require the
|
for fixing 'su' call in 'runvdr' to make it work on systems that require the
|
||||||
user name to appear before the command option
|
user name to appear before the command option
|
||||||
|
|
||||||
|
Vyacheslav Dikonov <sdiconov@mail.ru>
|
||||||
|
for translating OSD texts to the Russian language
|
||||||
|
|
||||||
|
Stephan Epstein <s.epstein@vinzenz.com>
|
||||||
|
for reporting a wrong 'delta' value in the call to the shutdown script
|
||||||
|
|
||||||
|
Christian Tramnitz <maillist@tramnitz.com>
|
||||||
|
for pointing out a problem with wrong parameter settings when scanning NITs
|
||||||
|
for terrestrial transponders
|
||||||
|
for his support in debugging a problem in setting the source type for newly
|
||||||
|
detected terrestrial transponders
|
||||||
|
39
HISTORY
39
HISTORY
@ -2571,3 +2571,42 @@ Video Disk Recorder Revision History
|
|||||||
scanned for channels during the next EPG scan. Note that only the satellite
|
scanned for channels during the next EPG scan. Note that only the satellite
|
||||||
branches are tested, cable and terrestrial need to be tested by somebody who
|
branches are tested, cable and terrestrial need to be tested by somebody who
|
||||||
actually has such equipment.
|
actually has such equipment.
|
||||||
|
|
||||||
|
2004-01-18: Version 1.3.2
|
||||||
|
|
||||||
|
- Fixed resetting the EPG data versions after changing the preferred languages
|
||||||
|
(thanks to Teemu Rantanen for reporting this one and helping to debug it).
|
||||||
|
- Added LinkageDescriptor handling to 'libsi' (thanks to Marcel Wiesweg).
|
||||||
|
- Added Russian language texts (thanks to Vyacheslav Dikonov).
|
||||||
|
Plugin authors may want to add the new entries to their I18N texts and contact
|
||||||
|
the translators to have their texts translated. Note that there are now 17
|
||||||
|
different OSD languages, so please make sure you have 17 versions for each of
|
||||||
|
your texts.
|
||||||
|
- Some corrections and additions to the Finnish OSD texts (thanks to Rolf
|
||||||
|
Ahrenberg and Niko Tarnanen).
|
||||||
|
- Fixed a wrong 'delta' value in the call to the shutdown script (thanks to
|
||||||
|
Stephan Epstein for reporting this one).
|
||||||
|
- Activated detection of radio channels (to avoid reports about "channels not
|
||||||
|
being detected that used to be detected with the 'scan' utility or the
|
||||||
|
original 'autopid' patch ;-).
|
||||||
|
- Channels with a zero VPID no longer write a PPID into channels.conf.
|
||||||
|
- Short channel names are now only stored if they actually differ from the
|
||||||
|
full name.
|
||||||
|
- The EPG scan now scans newly found transponders together with already existing
|
||||||
|
ones.
|
||||||
|
- The "Red" button in the "Setup/EPG" menu can now be used to force an EPG
|
||||||
|
scan on a single DVB card system (see MANUAL for details).
|
||||||
|
- The new SVDRP command 'SCAN' can be used to force an EPG scan on a single
|
||||||
|
DVB card system (see MANUAL under Setup/EPG for details).
|
||||||
|
- Fixed handling PID changes in 'Transfer Mode'.
|
||||||
|
- Excess blanks in channel names read from the SDT are now removed.
|
||||||
|
- Fixed wrong parameter settings when scanning NITs for terrestrial transponders
|
||||||
|
(thanks to Christian Tramnitz for pointing out this one).
|
||||||
|
- Fixed some out of bounds parameter settings when scanning NITs for cable
|
||||||
|
and satellite transponders.
|
||||||
|
- Added 'libsi' include files to the 'include' directory, so that plugins can
|
||||||
|
use them (thanks to Marcel Wiesweg).
|
||||||
|
- Now only processing NITs that contain the transponder they are actually
|
||||||
|
broadcast on.
|
||||||
|
- Fixed setting the source type for newly detected terrestrial transponders
|
||||||
|
(thanks to Christian Tramnitz for his support in debugging this).
|
||||||
|
9
MANUAL
9
MANUAL
@ -482,6 +482,7 @@ Version 1.2
|
|||||||
be taken. Note that in order to set the system time from
|
be taken. Note that in order to set the system time from
|
||||||
the transponder data the option "Set system time" must also
|
the transponder data the option "Set system time" must also
|
||||||
be enabled.
|
be enabled.
|
||||||
|
|
||||||
Preferred languages = 0
|
Preferred languages = 0
|
||||||
Some tv stations broadcast their EPG data in various
|
Some tv stations broadcast their EPG data in various
|
||||||
different languages. This option allows you to define
|
different languages. This option allows you to define
|
||||||
@ -496,6 +497,14 @@ Version 1.2
|
|||||||
different languages, the preferred languages are checked
|
different languages, the preferred languages are checked
|
||||||
in the given order to decide which one to take.
|
in the given order to decide which one to take.
|
||||||
|
|
||||||
|
Scan The "Red" button in the "Setup/EPG" menu can be used to
|
||||||
|
force an EPG scan on a single DVB card system. If pressed,
|
||||||
|
and the primary DVB device is currently not recording or
|
||||||
|
replaying, it will loop through the transponders once and
|
||||||
|
then switch back to the original channel. Any user activity
|
||||||
|
during the EPG scan will also stop the scan and bring back
|
||||||
|
the original channel.
|
||||||
|
|
||||||
DVB:
|
DVB:
|
||||||
|
|
||||||
Primary DVB interface = 1
|
Primary DVB interface = 1
|
||||||
|
20
Makefile
20
Makefile
@ -4,7 +4,7 @@
|
|||||||
# See the main source file 'vdr.c' for copyright information and
|
# See the main source file 'vdr.c' for copyright information and
|
||||||
# how to reach the author.
|
# how to reach the author.
|
||||||
#
|
#
|
||||||
# $Id: Makefile 1.63 2004/01/10 14:11:57 kls Exp $
|
# $Id: Makefile 1.65 2004/01/18 14:16:53 kls Exp $
|
||||||
|
|
||||||
.DELETE_ON_ERROR:
|
.DELETE_ON_ERROR:
|
||||||
|
|
||||||
@ -42,6 +42,9 @@ OBJS = audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o d
|
|||||||
FIXFONT_ISO8859_1 = -adobe-courier-bold-r-normal--25-*-100-100-m-*-iso8859-1
|
FIXFONT_ISO8859_1 = -adobe-courier-bold-r-normal--25-*-100-100-m-*-iso8859-1
|
||||||
OSDFONT_ISO8859_1 = -adobe-helvetica-medium-r-normal--23-*-100-100-p-*-iso8859-1
|
OSDFONT_ISO8859_1 = -adobe-helvetica-medium-r-normal--23-*-100-100-p-*-iso8859-1
|
||||||
SMLFONT_ISO8859_1 = -adobe-helvetica-medium-r-normal--18-*-100-100-p-*-iso8859-1
|
SMLFONT_ISO8859_1 = -adobe-helvetica-medium-r-normal--18-*-100-100-p-*-iso8859-1
|
||||||
|
FIXFONT_ISO8859_5 = -rfx-courier-bold-r-normal--24-*-75-75-m-*-iso8859-5
|
||||||
|
OSDFONT_ISO8859_5 = -rfx-helvetica-medium-r-normal--24-*-75-75-p-*-iso8859-5
|
||||||
|
SMLFONT_ISO8859_5 = -rfx-helvetica-medium-r-normal--18-*-75-75-p-*-iso8859-5
|
||||||
FIXFONT_ISO8859_7 = --user-medium-r-normal--26-171-110-110-m-140-iso8859-7
|
FIXFONT_ISO8859_7 = --user-medium-r-normal--26-171-110-110-m-140-iso8859-7
|
||||||
OSDFONT_ISO8859_7 = --user-medium-r-normal--23-179-85-85-m-120-iso8859-7
|
OSDFONT_ISO8859_7 = --user-medium-r-normal--23-179-85-85-m-120-iso8859-7
|
||||||
SMLFONT_ISO8859_7 = --user-medium-r-normal--19-160-72-72-m-110-iso8859-7
|
SMLFONT_ISO8859_7 = --user-medium-r-normal--19-160-72-72-m-110-iso8859-7
|
||||||
@ -70,6 +73,7 @@ endif
|
|||||||
all: vdr
|
all: vdr
|
||||||
font: genfontfile\
|
font: genfontfile\
|
||||||
fontfix.c fontosd.c fontsml.c\
|
fontfix.c fontosd.c fontsml.c\
|
||||||
|
fontfix_iso8859_5.c fontosd_iso8859_5.c fontsml_iso8859_5.c\
|
||||||
fontfix_iso8859_7.c fontosd_iso8859_7.c fontsml_iso8859_7.c
|
fontfix_iso8859_7.c fontosd_iso8859_7.c fontsml_iso8859_7.c
|
||||||
@echo "font files created."
|
@echo "font files created."
|
||||||
|
|
||||||
@ -100,11 +104,17 @@ fontosd.c:
|
|||||||
./genfontfile "cFont::tPixelData FontOsd_iso8859_1" "$(OSDFONT_ISO8859_1)" > $@
|
./genfontfile "cFont::tPixelData FontOsd_iso8859_1" "$(OSDFONT_ISO8859_1)" > $@
|
||||||
fontsml.c:
|
fontsml.c:
|
||||||
./genfontfile "cFont::tPixelData FontSml_iso8859_1" "$(SMLFONT_ISO8859_1)" > $@
|
./genfontfile "cFont::tPixelData FontSml_iso8859_1" "$(SMLFONT_ISO8859_1)" > $@
|
||||||
fontfix_iso8859_1.c:
|
fontfix_iso8859_5.c:
|
||||||
|
./genfontfile "cFont::tPixelData FontFix_iso8859_5" "$(FIXFONT_ISO8859_5)" > $@
|
||||||
|
fontosd_iso8859_5.c:
|
||||||
|
./genfontfile "cFont::tPixelData FontOsd_iso8859_5" "$(OSDFONT_ISO8859_5)" > $@
|
||||||
|
fontsml_iso8859_5.c:
|
||||||
|
./genfontfile "cFont::tPixelData FontSml_iso8859_5" "$(SMLFONT_ISO8859_5)" > $@
|
||||||
|
fontfix_iso8859_7.c:
|
||||||
./genfontfile "cFont::tPixelData FontFix_iso8859_7" "$(FIXFONT_ISO8859_7)" > $@
|
./genfontfile "cFont::tPixelData FontFix_iso8859_7" "$(FIXFONT_ISO8859_7)" > $@
|
||||||
fontosd_iso8859_1.c:
|
fontosd_iso8859_7.c:
|
||||||
./genfontfile "cFont::tPixelData FontOsd_iso8859_7" "$(OSDFONT_ISO8859_7)" > $@
|
./genfontfile "cFont::tPixelData FontOsd_iso8859_7" "$(OSDFONT_ISO8859_7)" > $@
|
||||||
fontsml_iso8859_1.c:
|
fontsml_iso8859_7.c:
|
||||||
./genfontfile "cFont::tPixelData FontSml_iso8859_7" "$(SMLFONT_ISO8859_7)" > $@
|
./genfontfile "cFont::tPixelData FontSml_iso8859_7" "$(SMLFONT_ISO8859_7)" > $@
|
||||||
|
|
||||||
# The font file generator:
|
# The font file generator:
|
||||||
@ -122,6 +132,8 @@ $(SILIB):
|
|||||||
include-dir:
|
include-dir:
|
||||||
@mkdir -p include/vdr
|
@mkdir -p include/vdr
|
||||||
@(cd include/vdr; for i in ../../*.h; do ln -fs $$i .; done)
|
@(cd include/vdr; for i in ../../*.h; do ln -fs $$i .; done)
|
||||||
|
@mkdir -p include/libsi
|
||||||
|
@(cd include/libsi; for i in ../../libsi/*.h; do ln -fs $$i .; done)
|
||||||
|
|
||||||
# Plugins:
|
# Plugins:
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* See the README file for copyright information and how to reach the author.
|
* See the README file for copyright information and how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: i18n.c 1.3 2002/06/23 13:05:59 kls Exp $
|
* $Id: i18n.c 1.4 2004/01/16 13:28:23 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "i18n.h"
|
#include "i18n.h"
|
||||||
@ -24,6 +24,8 @@ const tI18nPhrase Phrases[] = {
|
|||||||
"",// TODO
|
"",// TODO
|
||||||
"",// TODO
|
"",// TODO
|
||||||
"",// TODO
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"Привет!",
|
||||||
},
|
},
|
||||||
{ "Hello world!",
|
{ "Hello world!",
|
||||||
"Hallo Welt!",
|
"Hallo Welt!",
|
||||||
@ -40,6 +42,8 @@ const tI18nPhrase Phrases[] = {
|
|||||||
"",// TODO
|
"",// TODO
|
||||||
"",// TODO
|
"",// TODO
|
||||||
"",// TODO
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"Здравствуй мир!",
|
||||||
},
|
},
|
||||||
{ "Howdy folks!",
|
{ "Howdy folks!",
|
||||||
"Tach zusammen!",
|
"Tach zusammen!",
|
||||||
@ -56,6 +60,8 @@ const tI18nPhrase Phrases[] = {
|
|||||||
"",// TODO
|
"",// TODO
|
||||||
"",// TODO
|
"",// TODO
|
||||||
"",// TODO
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"Как поживаете?",
|
||||||
},
|
},
|
||||||
{ "A friendly greeting",
|
{ "A friendly greeting",
|
||||||
"Ein freundlicher Gruß",
|
"Ein freundlicher Gruß",
|
||||||
@ -72,6 +78,8 @@ const tI18nPhrase Phrases[] = {
|
|||||||
"",// TODO
|
"",// TODO
|
||||||
"",// TODO
|
"",// TODO
|
||||||
"",// TODO
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"Дружеское приветствие",
|
||||||
},
|
},
|
||||||
{ "Greeting time (s)",
|
{ "Greeting time (s)",
|
||||||
"Dauer des Grußes (s)",
|
"Dauer des Grußes (s)",
|
||||||
@ -88,6 +96,8 @@ const tI18nPhrase Phrases[] = {
|
|||||||
"",// TODO
|
"",// TODO
|
||||||
"",// TODO
|
"",// TODO
|
||||||
"",// TODO
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"Продолжительность приветствия",
|
||||||
},
|
},
|
||||||
{ "Use alternate greeting",
|
{ "Use alternate greeting",
|
||||||
"Alternativen Gruß verwenden",
|
"Alternativen Gruß verwenden",
|
||||||
@ -104,6 +114,8 @@ const tI18nPhrase Phrases[] = {
|
|||||||
"",// TODO
|
"",// TODO
|
||||||
"",// TODO
|
"",// TODO
|
||||||
"",// TODO
|
"",// TODO
|
||||||
|
"",// TODO
|
||||||
|
"Альтернативное приветствие",
|
||||||
},
|
},
|
||||||
{ NULL }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
@ -31,7 +31,6 @@ Here's a list of the highlights - and what _not_ to expect yet
|
|||||||
- Improved CAM support. Channels with conditional access now automatically
|
- Improved CAM support. Channels with conditional access now automatically
|
||||||
use the device that contains the proper CAM.
|
use the device that contains the proper CAM.
|
||||||
- No NVOD or "linked services" support yet.
|
- No NVOD or "linked services" support yet.
|
||||||
- No radio support yet.
|
|
||||||
|
|
||||||
Note that this is currently work in progress, so there may be some
|
Note that this is currently work in progress, so there may be some
|
||||||
areas that don't work as smooth as expected, yet.
|
areas that don't work as smooth as expected, yet.
|
||||||
|
@ -6,7 +6,7 @@ Das Erste:11836:hC34:S19.2E:27500:101:102:104:0:28106:1:1101:0
|
|||||||
Bayerisches FS:11836:hC34:S19.2E:27500:201:202:204:0:28107:1:1101:0
|
Bayerisches FS:11836:hC34:S19.2E:27500:201:202:204:0:28107:1:1101:0
|
||||||
hessen fernsehen:11836:hC34:S19.2E:27500:301:302:304:0:28108:1:1101:0
|
hessen fernsehen:11836:hC34:S19.2E:27500:301:302:304:0:28108:1:1101:0
|
||||||
NDR FS MV:12109:hC34:S19.2E:27500:2401:2402:2404:0:28224:1:1073:0
|
NDR FS MV:12109:hC34:S19.2E:27500:2401:2402:2404:0:28224:1:1073:0
|
||||||
SR Fernsehen Suedwest:11836:hC34:S19.2E:27500:501:502:504:0:28110:1:1101:0
|
SR Fernsehen Südwest:11836:hC34:S19.2E:27500:501:502:504:0:28110:1:1101:0
|
||||||
WDR Köln:11836:hC34:S19.2E:27500:601:602:604:0:28111:1:1101:0
|
WDR Köln:11836:hC34:S19.2E:27500:601:602:604:0:28111:1:1101:0
|
||||||
BR-alpha:11836:hC34:S19.2E:27500:701:702:704:0:28112:1:1101:0
|
BR-alpha:11836:hC34:S19.2E:27500:701:702:704:0:28112:1:1101:0
|
||||||
SÜDWEST BW:11836:hC34:S19.2E:27500:801:802:804:0:28113:1:1101:0
|
SÜDWEST BW:11836:hC34:S19.2E:27500:801:802:804:0:28113:1:1101:0
|
||||||
@ -63,7 +63,6 @@ SPORT 1,PREMIERE SPORT 1:11719:hC34:S19.2E:27500:255:256,257:0:1702,1722,1801:17
|
|||||||
SPORT 2,PREMIERE SPORT 2:12031:hC34:S19.2E:27500:3839:3840,3841:0:1702,1722,1801:27:133:4:0
|
SPORT 2,PREMIERE SPORT 2:12031:hC34:S19.2E:27500:3839:3840,3841:0:1702,1722,1801:27:133:4:0
|
||||||
:Beta Digital
|
:Beta Digital
|
||||||
N24:12480:vC34:S19.2E:27500:2047:2048:36:0:47:133:33:0
|
N24:12480:vC34:S19.2E:27500:2047:2048:36:0:47:133:33:0
|
||||||
CNBC:11953:hC34:S19.2E:27500:510:520:530:0:28010:1:1079:0
|
|
||||||
Liberty TV.com:12610:vC56:S19.2E:22000:941:943:0:0:12199:1:1112:0
|
Liberty TV.com:12610:vC56:S19.2E:22000:941:943:0:0:12199:1:1112:0
|
||||||
:-
|
:-
|
||||||
ProSieben Austria:12051:vC34:S19.2E:27500:161:84:36:0:20002:1:1082:0
|
ProSieben Austria:12051:vC34:S19.2E:27500:161:84:36:0:20002:1:1082:0
|
||||||
@ -84,7 +83,6 @@ RTL TELE Letzebuerg:12552:vC56:S19.2E:22000:168:144,146:74:0:3994:1:1108:0
|
|||||||
Yorin:12574:hC56:S19.2E:22000:512+8190:84:33:622,602,100:5010:53:1109:0
|
Yorin:12574:hC56:S19.2E:22000:512+8190:84:33:622,602,100:5010:53:1109:0
|
||||||
MTV2 Pop Channel:12226:hC34:S19.2E:27500:513:661:577:0:28640:1:1091:0
|
MTV2 Pop Channel:12226:hC34:S19.2E:27500:513:661:577:0:28640:1:1091:0
|
||||||
Via 1 - Schöner Reisen:12148:h:S19.2E:27500:511:512:0:0:44:0:0:0
|
Via 1 - Schöner Reisen:12148:h:S19.2E:27500:511:512:0:0:44:0:0:0
|
||||||
Video Italia:12610:v:S19.2E:22000:121:122:0:0:12220:0:0:0
|
|
||||||
VIVA:12669:vC56:S19.2E:22000:309:310:311:0:12732:1:1116:0
|
VIVA:12669:vC56:S19.2E:22000:309:310:311:0:12732:1:1116:0
|
||||||
VIVA PLUS:12552:vC56:S19.2E:22000:171:172:173:0:12120:1:1108:0
|
VIVA PLUS:12552:vC56:S19.2E:22000:171:172:173:0:12120:1:1108:0
|
||||||
MTV Central:11739:vC34:S19.2E:27500:3031:3032:3034:0:28653:1:1066:0
|
MTV Central:11739:vC34:S19.2E:27500:3031:3032:3034:0:28653:1:1066:0
|
||||||
|
6
config.h
6
config.h
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: config.h 1.182 2004/01/06 16:47:41 kls Exp $
|
* $Id: config.h 1.183 2004/01/11 21:42:23 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __CONFIG_H
|
#ifndef __CONFIG_H
|
||||||
@ -20,8 +20,8 @@
|
|||||||
#include "i18n.h"
|
#include "i18n.h"
|
||||||
#include "tools.h"
|
#include "tools.h"
|
||||||
|
|
||||||
#define VDRVERSION "1.3.1"
|
#define VDRVERSION "1.3.2"
|
||||||
#define VDRVERSNUM 10301 // Version * 10000 + Major * 100 + Minor
|
#define VDRVERSNUM 10302 // Version * 10000 + Major * 100 + Minor
|
||||||
|
|
||||||
#define MAXPRIORITY 99
|
#define MAXPRIORITY 99
|
||||||
#define MAXLIFETIME 99
|
#define MAXLIFETIME 99
|
||||||
|
79
eitscan.c
79
eitscan.c
@ -4,58 +4,48 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: eitscan.c 1.18 2004/01/11 15:50:59 kls Exp $
|
* $Id: eitscan.c 1.20 2004/01/17 15:38:11 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "eitscan.h"
|
#include "eitscan.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "channels.h"
|
#include "channels.h"
|
||||||
#include "dvbdevice.h"
|
#include "dvbdevice.h"
|
||||||
|
#include "interface.h"
|
||||||
|
|
||||||
// --- cScanData -------------------------------------------------------------
|
// --- cScanData -------------------------------------------------------------
|
||||||
|
|
||||||
class cScanData : public cListObject {
|
class cScanData : public cListObject {
|
||||||
private:
|
private:
|
||||||
int source;
|
cChannel channel;
|
||||||
int transponder;
|
|
||||||
public:
|
public:
|
||||||
cScanData(int Source, int Transponder);
|
cScanData(const cChannel *Channel);
|
||||||
virtual bool operator< (const cListObject &ListObject);
|
virtual bool operator< (const cListObject &ListObject);
|
||||||
int Source(void) { return source; }
|
int Source(void) { return channel.Source(); }
|
||||||
int Transponder(void) { return transponder; }
|
int Transponder(void) { return channel.Transponder(); }
|
||||||
cChannel *GetChannel(cList<cChannel> *Channels);
|
const cChannel *GetChannel(void) { return &channel; }
|
||||||
};
|
};
|
||||||
|
|
||||||
cScanData::cScanData(int Source, int Transponder)
|
cScanData::cScanData(const cChannel *Channel)
|
||||||
{
|
{
|
||||||
source = Source;
|
channel = *Channel;
|
||||||
transponder = Transponder;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool cScanData::operator< (const cListObject &ListObject)
|
bool cScanData::operator< (const cListObject &ListObject)
|
||||||
{
|
{
|
||||||
cScanData *sd = (cScanData *)&ListObject;
|
cScanData *sd = (cScanData *)&ListObject;
|
||||||
return source < sd->source || source == sd->source && transponder < sd->transponder;
|
return Source() < sd->Source() || Source() == sd->Source() && Transponder() < sd->Transponder();
|
||||||
}
|
|
||||||
|
|
||||||
cChannel *cScanData::GetChannel(cList<cChannel> *Channels)
|
|
||||||
{
|
|
||||||
for (cChannel *Channel = Channels->First(); Channel; Channel = Channels->Next(Channel)) {
|
|
||||||
if (!Channel->GroupSep() && Channel->Source() == source && ISTRANSPONDER(Channel->Transponder(), transponder))
|
|
||||||
return Channel;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- cScanList -------------------------------------------------------------
|
// --- cScanList -------------------------------------------------------------
|
||||||
|
|
||||||
class cScanList : public cList<cScanData> {
|
class cScanList : public cList<cScanData> {
|
||||||
public:
|
public:
|
||||||
cScanList(cList<cChannel> *Channels);
|
void AddTransponders(cList<cChannel> *Channels);
|
||||||
void AddTransponder(const cChannel *Channel);
|
void AddTransponder(const cChannel *Channel);
|
||||||
};
|
};
|
||||||
|
|
||||||
cScanList::cScanList(cList<cChannel> *Channels)
|
void cScanList::AddTransponders(cList<cChannel> *Channels)
|
||||||
{
|
{
|
||||||
for (cChannel *ch = Channels->First(); ch; ch = Channels->Next(ch))
|
for (cChannel *ch = Channels->First(); ch; ch = Channels->Next(ch))
|
||||||
AddTransponder(ch);
|
AddTransponder(ch);
|
||||||
@ -64,11 +54,13 @@ cScanList::cScanList(cList<cChannel> *Channels)
|
|||||||
|
|
||||||
void cScanList::AddTransponder(const cChannel *Channel)
|
void cScanList::AddTransponder(const cChannel *Channel)
|
||||||
{
|
{
|
||||||
for (cScanData *sd = First(); sd; sd = Next(sd)) {
|
if (Channel->Source() && Channel->Transponder()) {
|
||||||
if (sd->Source() == Channel->Source() && ISTRANSPONDER(sd->Transponder(), Channel->Transponder()))
|
for (cScanData *sd = First(); sd; sd = Next(sd)) {
|
||||||
return;
|
if (sd->Source() == Channel->Source() && ISTRANSPONDER(sd->Transponder(), Channel->Transponder()))
|
||||||
}
|
return;
|
||||||
Add(new cScanData(Channel->Source(), Channel->Transponder()));
|
}
|
||||||
|
Add(new cScanData(Channel));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// --- cTransponderList ------------------------------------------------------
|
// --- cTransponderList ------------------------------------------------------
|
||||||
@ -98,7 +90,6 @@ cEITScanner::cEITScanner(void)
|
|||||||
lastScan = lastActivity = time(NULL);
|
lastScan = lastActivity = time(NULL);
|
||||||
currentDevice = NULL;
|
currentDevice = NULL;
|
||||||
currentChannel = 0;
|
currentChannel = 0;
|
||||||
numScan = 0;
|
|
||||||
scanList = NULL;
|
scanList = NULL;
|
||||||
transponderList = NULL;
|
transponderList = NULL;
|
||||||
}
|
}
|
||||||
@ -116,6 +107,11 @@ void cEITScanner::AddTransponder(cChannel *Channel)
|
|||||||
transponderList->AddTransponder(Channel);
|
transponderList->AddTransponder(Channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cEITScanner::ForceScan(void)
|
||||||
|
{
|
||||||
|
lastActivity = 0;
|
||||||
|
}
|
||||||
|
|
||||||
void cEITScanner::Activity(void)
|
void cEITScanner::Activity(void)
|
||||||
{
|
{
|
||||||
if (currentChannel) {
|
if (currentChannel) {
|
||||||
@ -131,11 +127,15 @@ void cEITScanner::Process(void)
|
|||||||
time_t now = time(NULL);
|
time_t now = time(NULL);
|
||||||
if (now - lastScan > ScanTimeout && now - lastActivity > ActivityTimeout) {
|
if (now - lastScan > ScanTimeout && now - lastActivity > ActivityTimeout) {
|
||||||
if (Channels.Lock(false, 10)) {
|
if (Channels.Lock(false, 10)) {
|
||||||
cList<cChannel> *ChannelList = &Channels;
|
if (!scanList) {
|
||||||
if (numScan % 2 == 0 && transponderList) // switch between the list of new transponders and the actual channels in case there are transponders w/o any channels
|
scanList = new cScanList;
|
||||||
ChannelList = transponderList;
|
scanList->AddTransponders(&Channels);
|
||||||
if (!scanList)
|
if (transponderList) {
|
||||||
scanList = new cScanList(ChannelList);
|
scanList->AddTransponders(transponderList);
|
||||||
|
delete transponderList;
|
||||||
|
transponderList = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
for (bool AnyDeviceSwitched = false; !AnyDeviceSwitched; ) {
|
for (bool AnyDeviceSwitched = false; !AnyDeviceSwitched; ) {
|
||||||
cScanData *ScanData = NULL;
|
cScanData *ScanData = NULL;
|
||||||
for (int i = 0; i < cDevice::NumDevices(); i++) {
|
for (int i = 0; i < cDevice::NumDevices(); i++) {
|
||||||
@ -144,12 +144,14 @@ void cEITScanner::Process(void)
|
|||||||
if (Device) {
|
if (Device) {
|
||||||
if (Device != cDevice::PrimaryDevice() || (cDevice::NumDevices() == 1 && Setup.EPGScanTimeout && now - lastActivity > Setup.EPGScanTimeout * 3600)) {
|
if (Device != cDevice::PrimaryDevice() || (cDevice::NumDevices() == 1 && Setup.EPGScanTimeout && now - lastActivity > Setup.EPGScanTimeout * 3600)) {
|
||||||
if (!(Device->Receiving(true) || Device->Replaying())) {
|
if (!(Device->Receiving(true) || Device->Replaying())) {
|
||||||
cChannel *Channel = ScanData->GetChannel(ChannelList);
|
const cChannel *Channel = ScanData->GetChannel();
|
||||||
if (Channel) {
|
if (Channel) {
|
||||||
//XXX if (Device->ProvidesTransponder(Channel)) {
|
//XXX if (Device->ProvidesTransponder(Channel)) {
|
||||||
if ((!Channel->Ca() || Channel->Ca() == Device->DeviceNumber() + 1 || Channel->Ca() >= 0x0100) && Device->ProvidesTransponder(Channel)) { //XXX temporary for the 'sky' plugin
|
if ((!Channel->Ca() || Channel->Ca() == Device->DeviceNumber() + 1 || Channel->Ca() >= 0x0100) && Device->ProvidesTransponder(Channel)) { //XXX temporary for the 'sky' plugin
|
||||||
if (Device == cDevice::PrimaryDevice() && !currentChannel)
|
if (Device == cDevice::PrimaryDevice() && !currentChannel) {
|
||||||
currentChannel = Device->CurrentChannel();
|
currentChannel = Device->CurrentChannel();
|
||||||
|
Interface->Info("Starting EPG scan");
|
||||||
|
}
|
||||||
currentDevice = Device;//XXX see also dvbdevice.c!!!
|
currentDevice = Device;//XXX see also dvbdevice.c!!!
|
||||||
Device->SwitchChannel(Channel, false);
|
Device->SwitchChannel(Channel, false);
|
||||||
currentDevice = NULL;
|
currentDevice = NULL;
|
||||||
@ -172,11 +174,8 @@ void cEITScanner::Process(void)
|
|||||||
if (!scanList->Count()) {
|
if (!scanList->Count()) {
|
||||||
delete scanList;
|
delete scanList;
|
||||||
scanList = NULL;
|
scanList = NULL;
|
||||||
numScan++;
|
if (lastActivity == 0) // this was a triggered scan
|
||||||
if (ChannelList == transponderList) {
|
Activity();
|
||||||
delete transponderList;
|
|
||||||
transponderList = NULL;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: eitscan.h 1.6 2004/01/11 14:11:25 kls Exp $
|
* $Id: eitscan.h 1.8 2004/01/17 15:36:24 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __EITSCAN_H
|
#ifndef __EITSCAN_H
|
||||||
@ -24,15 +24,15 @@ private:
|
|||||||
time_t lastScan, lastActivity;
|
time_t lastScan, lastActivity;
|
||||||
cDevice *currentDevice;
|
cDevice *currentDevice;
|
||||||
int currentChannel;
|
int currentChannel;
|
||||||
int numScan;
|
|
||||||
cScanList *scanList;
|
cScanList *scanList;
|
||||||
cTransponderList *transponderList;
|
cTransponderList *transponderList;
|
||||||
public:
|
public:
|
||||||
cEITScanner(void);
|
cEITScanner(void);
|
||||||
~cEITScanner();
|
~cEITScanner();
|
||||||
bool Active(void) { return currentChannel; }
|
bool Active(void) { return currentChannel || lastActivity == 0; }
|
||||||
bool UsesDevice(const cDevice *Device) { return currentDevice == Device; }
|
bool UsesDevice(const cDevice *Device) { return currentDevice == Device; }
|
||||||
void AddTransponder(cChannel *Channel);
|
void AddTransponder(cChannel *Channel);
|
||||||
|
void ForceScan(void);
|
||||||
void Activity(void);
|
void Activity(void);
|
||||||
void Process(void);
|
void Process(void);
|
||||||
};
|
};
|
||||||
|
12
font.c
12
font.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: font.c 1.4 2003/10/24 12:59:35 kls Exp $
|
* $Id: font.c 1.5 2004/01/16 13:17:57 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "font.h"
|
#include "font.h"
|
||||||
@ -14,18 +14,24 @@
|
|||||||
#include "fontosd.c"
|
#include "fontosd.c"
|
||||||
#include "fontsml.c"
|
#include "fontsml.c"
|
||||||
|
|
||||||
|
#include "fontfix-iso8859-5.c"
|
||||||
|
#include "fontosd-iso8859-5.c"
|
||||||
|
#include "fontsml-iso8859-5.c"
|
||||||
|
|
||||||
#include "fontfix-iso8859-7.c"
|
#include "fontfix-iso8859-7.c"
|
||||||
#include "fontosd-iso8859-7.c"
|
#include "fontosd-iso8859-7.c"
|
||||||
#include "fontsml-iso8859-7.c"
|
#include "fontsml-iso8859-7.c"
|
||||||
|
|
||||||
static void *FontData[eDvbCodeSize][eDvbFontSize] = {
|
static void *FontData[eDvbCodeSize][eDvbFontSize] = {
|
||||||
{ FontOsd_iso8859_1, FontFix_iso8859_1, FontSml_iso8859_1 },
|
{ FontOsd_iso8859_1, FontFix_iso8859_1, FontSml_iso8859_1 },
|
||||||
{ FontOsd_iso8859_7, FontFix_iso8859_7, FontSml_iso8859_7 }
|
{ FontOsd_iso8859_5, FontFix_iso8859_5, FontSml_iso8859_5 },
|
||||||
|
{ FontOsd_iso8859_7, FontFix_iso8859_7, FontSml_iso8859_7 },
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *FontCode[eDvbCodeSize] = {
|
static const char *FontCode[eDvbCodeSize] = {
|
||||||
"iso8859-1",
|
"iso8859-1",
|
||||||
"iso8859-7"
|
"iso8859-5",
|
||||||
|
"iso8859-7",
|
||||||
};
|
};
|
||||||
|
|
||||||
eDvbCode cFont::code = code_iso8859_1;
|
eDvbCode cFont::code = code_iso8859_1;
|
||||||
|
5
font.h
5
font.h
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: font.h 1.4 2003/10/24 12:59:45 kls Exp $
|
* $Id: font.h 1.5 2004/01/16 13:18:28 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __FONT_H
|
#ifndef __FONT_H
|
||||||
@ -21,7 +21,8 @@ enum eDvbFont {
|
|||||||
|
|
||||||
enum eDvbCode {
|
enum eDvbCode {
|
||||||
code_iso8859_1,
|
code_iso8859_1,
|
||||||
code_iso8859_7
|
code_iso8859_5,
|
||||||
|
code_iso8859_7,
|
||||||
#define eDvbCodeSize (code_iso8859_7 + 1)
|
#define eDvbCodeSize (code_iso8859_7 + 1)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
6051
fontfix-iso8859-5.c
Normal file
6051
fontfix-iso8859-5.c
Normal file
File diff suppressed because it is too large
Load Diff
5602
fontosd-iso8859-5.c
Normal file
5602
fontosd-iso8859-5.c
Normal file
File diff suppressed because it is too large
Load Diff
6274
fontsml-iso8859-5.c
Normal file
6274
fontsml-iso8859-5.c
Normal file
File diff suppressed because it is too large
Load Diff
4
i18n.h
4
i18n.h
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: i18n.h 1.8 2004/01/06 15:56:53 kls Exp $
|
* $Id: i18n.h 1.9 2004/01/16 12:43:47 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __I18N_H
|
#ifndef __I18N_H
|
||||||
@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
const int I18nNumLanguages = 16;
|
const int I18nNumLanguages = 17;
|
||||||
|
|
||||||
typedef const char *tI18nPhrase[I18nNumLanguages];
|
typedef const char *tI18nPhrase[I18nNumLanguages];
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
* the Free Software Foundation; either version 2 of the License, or *
|
* the Free Software Foundation; either version 2 of the License, or *
|
||||||
* (at your option) any later version. *
|
* (at your option) any later version. *
|
||||||
* *
|
* *
|
||||||
* $Id: descriptor.c 1.2 2003/12/13 10:42:05 kls Exp $
|
* $Id: descriptor.c 1.3 2004/01/12 16:17:20 kls Exp $
|
||||||
* *
|
* *
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
@ -492,6 +492,28 @@ void MultilingualServiceNameDescriptor::Name::Parse() {
|
|||||||
name.setData(data+offset, mid->service_name_length);
|
name.setData(data+offset, mid->service_name_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LinkageDescriptor::Parse() {
|
||||||
|
unsigned int offset=0;
|
||||||
|
data.setPointerAndOffset<const descr_linkage>(s, offset);
|
||||||
|
privateData.assign(data.getData(offset), getLength()-offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
int LinkageDescriptor::getTransportStreamId() const {
|
||||||
|
return HILO(s->transport_stream_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
int LinkageDescriptor::getOriginalNetworkId() const {
|
||||||
|
return HILO(s->original_network_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
int LinkageDescriptor::getServiceId() const {
|
||||||
|
return HILO(s->service_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
LinkageType LinkageDescriptor::getLinkageType() const {
|
||||||
|
return (LinkageType)s->linkage_type;
|
||||||
|
}
|
||||||
|
|
||||||
void ApplicationSignallingDescriptor::Parse() {
|
void ApplicationSignallingDescriptor::Parse() {
|
||||||
entryLoop.setData(data+sizeof(descr_application_signalling), getLength()-sizeof(descr_application_signalling));
|
entryLoop.setData(data+sizeof(descr_application_signalling), getLength()-sizeof(descr_application_signalling));
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
* the Free Software Foundation; either version 2 of the License, or *
|
* the Free Software Foundation; either version 2 of the License, or *
|
||||||
* (at your option) any later version. *
|
* (at your option) any later version. *
|
||||||
* *
|
* *
|
||||||
* $Id: descriptor.h 1.2 2003/12/13 10:42:08 kls Exp $
|
* $Id: descriptor.h 1.3 2004/01/12 16:17:47 kls Exp $
|
||||||
* *
|
* *
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
@ -361,6 +361,19 @@ protected:
|
|||||||
virtual void Parse();
|
virtual void Parse();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class LinkageDescriptor : public Descriptor {
|
||||||
|
public:
|
||||||
|
int getTransportStreamId() const;
|
||||||
|
int getOriginalNetworkId() const;
|
||||||
|
int getServiceId() const;
|
||||||
|
LinkageType getLinkageType() const;
|
||||||
|
CharArray privateData;
|
||||||
|
protected:
|
||||||
|
virtual void Parse();
|
||||||
|
private:
|
||||||
|
const descr_linkage *s;
|
||||||
|
};
|
||||||
|
|
||||||
//a descriptor currently unimplemented in this library
|
//a descriptor currently unimplemented in this library
|
||||||
class UnimplementedDescriptor : public Descriptor {
|
class UnimplementedDescriptor : public Descriptor {
|
||||||
protected:
|
protected:
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
* the Free Software Foundation; either version 2 of the License, or *
|
* the Free Software Foundation; either version 2 of the License, or *
|
||||||
* (at your option) any later version. *
|
* (at your option) any later version. *
|
||||||
* *
|
* *
|
||||||
* $Id: si.c 1.4 2004/01/05 11:04:17 kls Exp $
|
* $Id: si.c 1.5 2004/01/12 22:19:34 kls Exp $
|
||||||
* *
|
* *
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
@ -320,6 +320,9 @@ Descriptor *Descriptor::getDescriptor(CharArray da, DescriptorTagDomain domain)
|
|||||||
case ApplicationSignallingDescriptorTag:
|
case ApplicationSignallingDescriptorTag:
|
||||||
d=new ApplicationSignallingDescriptor();
|
d=new ApplicationSignallingDescriptor();
|
||||||
break;
|
break;
|
||||||
|
case LinkageDescriptorTag:
|
||||||
|
d=new LinkageDescriptor();
|
||||||
|
break;
|
||||||
|
|
||||||
//note that it is no problem to implement one
|
//note that it is no problem to implement one
|
||||||
//of the unimplemented descriptors.
|
//of the unimplemented descriptors.
|
||||||
@ -348,7 +351,6 @@ Descriptor *Descriptor::getDescriptor(CharArray da, DescriptorTagDomain domain)
|
|||||||
case VBITeletextDescriptorTag:
|
case VBITeletextDescriptorTag:
|
||||||
case CountryAvailabilityDescriptorTag:
|
case CountryAvailabilityDescriptorTag:
|
||||||
case MocaicDescriptorTag:
|
case MocaicDescriptorTag:
|
||||||
case LinkageDescriptorTag:
|
|
||||||
case TeletextDescriptorTag:
|
case TeletextDescriptorTag:
|
||||||
case TelephoneDescriptorTag:
|
case TelephoneDescriptorTag:
|
||||||
case LocalTimeOffsetDescriptorTag:
|
case LocalTimeOffsetDescriptorTag:
|
||||||
|
18
libsi/si.h
18
libsi/si.h
@ -6,7 +6,7 @@
|
|||||||
* the Free Software Foundation; either version 2 of the License, or *
|
* the Free Software Foundation; either version 2 of the License, or *
|
||||||
* (at your option) any later version. *
|
* (at your option) any later version. *
|
||||||
* *
|
* *
|
||||||
* $Id: si.h 1.5 2004/01/09 15:59:53 kls Exp $
|
* $Id: si.h 1.6 2004/01/12 16:19:11 kls Exp $
|
||||||
* *
|
* *
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
@ -154,6 +154,18 @@ enum RunningStatus { RunningStatusUndefined = 0,
|
|||||||
RunningStatusRunning = 4
|
RunningStatusRunning = 4
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum LinkageType { LinkageTypeInformationService = 0x01,
|
||||||
|
LinkageTypeEPGService = 0x02,
|
||||||
|
LinkageTypeCaReplacementService = 0x03,
|
||||||
|
LinkageTypeTSContainingCompleteNetworkBouquetSi = 0x04,
|
||||||
|
LinkageTypeServiceReplacementService = 0x05,
|
||||||
|
LinkageTypeDataBroadcastService = 0x06,
|
||||||
|
LinkageTypeRCSMap = 0x07,
|
||||||
|
LinkageTypeMobileHandover = 0x08,
|
||||||
|
LinkageTypeSystemSoftwareUpdateService = 0x09,
|
||||||
|
LinkageTypeTSContainingSsuBatOrNit = 0x0A
|
||||||
|
};
|
||||||
|
|
||||||
/* Some principles:
|
/* Some principles:
|
||||||
- Objects that return references to other objects contained in their data must make sure
|
- Objects that return references to other objects contained in their data must make sure
|
||||||
that the returned objects have been parsed.
|
that the returned objects have been parsed.
|
||||||
@ -167,6 +179,7 @@ public:
|
|||||||
Object(CharArray &d);
|
Object(CharArray &d);
|
||||||
//can only be called once since data is immutable
|
//can only be called once since data is immutable
|
||||||
void setData(const unsigned char*data, unsigned int size, bool doCopy=true);
|
void setData(const unsigned char*data, unsigned int size, bool doCopy=true);
|
||||||
|
CharArray getData() { return data; }
|
||||||
virtual int getLength() = 0;
|
virtual int getLength() = 0;
|
||||||
protected:
|
protected:
|
||||||
CharArray data;
|
CharArray data;
|
||||||
@ -224,9 +237,6 @@ private:
|
|||||||
class LoopElement : public Object {
|
class LoopElement : public Object {
|
||||||
};
|
};
|
||||||
|
|
||||||
class SubStructure : public LoopElement {
|
|
||||||
};
|
|
||||||
|
|
||||||
class Descriptor : public LoopElement {
|
class Descriptor : public LoopElement {
|
||||||
public:
|
public:
|
||||||
virtual int getLength();
|
virtual int getLength();
|
||||||
|
19
menu.c
19
menu.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: menu.c 1.279 2004/01/11 15:40:32 kls Exp $
|
* $Id: menu.c 1.281 2004/01/17 14:17:00 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "menu.h"
|
#include "menu.h"
|
||||||
@ -16,6 +16,7 @@
|
|||||||
#include "channels.h"
|
#include "channels.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "cutter.h"
|
#include "cutter.h"
|
||||||
|
#include "eitscan.h"
|
||||||
#include "i18n.h"
|
#include "i18n.h"
|
||||||
#include "menuitems.h"
|
#include "menuitems.h"
|
||||||
#include "plugin.h"
|
#include "plugin.h"
|
||||||
@ -2044,6 +2045,7 @@ cMenuSetupEPG::cMenuSetupEPG(void)
|
|||||||
;
|
;
|
||||||
originalNumLanguages = numLanguages;
|
originalNumLanguages = numLanguages;
|
||||||
SetSection(tr("EPG"));
|
SetSection(tr("EPG"));
|
||||||
|
SetHelp(tr("Scan"));
|
||||||
Setup();
|
Setup();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2068,10 +2070,6 @@ void cMenuSetupEPG::Setup(void)
|
|||||||
|
|
||||||
eOSState cMenuSetupEPG::ProcessKey(eKeys Key)
|
eOSState cMenuSetupEPG::ProcessKey(eKeys Key)
|
||||||
{
|
{
|
||||||
int oldnumLanguages = numLanguages;
|
|
||||||
int oldSetSystemTime = data.SetSystemTime;
|
|
||||||
|
|
||||||
eOSState state = cMenuSetupBase::ProcessKey(Key);
|
|
||||||
if (Key == kOk) {
|
if (Key == kOk) {
|
||||||
bool Modified = numLanguages != originalNumLanguages;
|
bool Modified = numLanguages != originalNumLanguages;
|
||||||
if (!Modified) {
|
if (!Modified) {
|
||||||
@ -2085,7 +2083,12 @@ eOSState cMenuSetupEPG::ProcessKey(eKeys Key)
|
|||||||
if (Modified)
|
if (Modified)
|
||||||
cSchedules::ResetVersions();
|
cSchedules::ResetVersions();
|
||||||
}
|
}
|
||||||
else if (Key != kNone) {
|
|
||||||
|
int oldnumLanguages = numLanguages;
|
||||||
|
int oldSetSystemTime = data.SetSystemTime;
|
||||||
|
|
||||||
|
eOSState state = cMenuSetupBase::ProcessKey(Key);
|
||||||
|
if (Key != kNone) {
|
||||||
if (numLanguages != oldnumLanguages || data.SetSystemTime != oldSetSystemTime) {
|
if (numLanguages != oldnumLanguages || data.SetSystemTime != oldSetSystemTime) {
|
||||||
for (int i = oldnumLanguages; i < numLanguages; i++) {
|
for (int i = oldnumLanguages; i < numLanguages; i++) {
|
||||||
data.EPGLanguages[i] = 0;
|
data.EPGLanguages[i] = 0;
|
||||||
@ -2104,6 +2107,10 @@ eOSState cMenuSetupEPG::ProcessKey(eKeys Key)
|
|||||||
data.EPGLanguages[numLanguages] = -1;
|
data.EPGLanguages[numLanguages] = -1;
|
||||||
Setup();
|
Setup();
|
||||||
}
|
}
|
||||||
|
if (Key == kRed) {
|
||||||
|
EITScanner.ForceScan();
|
||||||
|
return osEnd;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
99
nit.c
99
nit.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: nit.c 1.1 2004/01/11 15:42:51 kls Exp $
|
* $Id: nit.c 1.5 2004/01/18 16:32:45 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "nit.h"
|
#include "nit.h"
|
||||||
@ -17,12 +17,16 @@
|
|||||||
|
|
||||||
cNitFilter::cNitFilter(void)
|
cNitFilter::cNitFilter(void)
|
||||||
{
|
{
|
||||||
|
numNits = 0;
|
||||||
|
networkId = 0;
|
||||||
Set(0x10, 0x40); // NIT
|
Set(0x10, 0x40); // NIT
|
||||||
}
|
}
|
||||||
|
|
||||||
void cNitFilter::SetStatus(bool On)
|
void cNitFilter::SetStatus(bool On)
|
||||||
{
|
{
|
||||||
cFilter::SetStatus(On);
|
cFilter::SetStatus(On);
|
||||||
|
numNits = 0;
|
||||||
|
networkId = 0;
|
||||||
sectionSyncer.Reset();
|
sectionSyncer.Reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -31,7 +35,59 @@ void cNitFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
|
|||||||
SI::NIT nit(Data, false);
|
SI::NIT nit(Data, false);
|
||||||
if (!nit.CheckCRCAndParse())
|
if (!nit.CheckCRCAndParse())
|
||||||
return;
|
return;
|
||||||
if (!sectionSyncer.Sync(nit.getVersionNumber(), nit.getSectionNumber(), nit.getLastSectionNumber()))
|
// Some broadcasters send more than one NIT, with no apparent way of telling which
|
||||||
|
// one is the right one to use. This is an attempt to find the NIT that contains
|
||||||
|
// the transponder it was transmitted on and use only that one:
|
||||||
|
int ThisNIT = -1;
|
||||||
|
if (!networkId) {
|
||||||
|
for (int i = 0; i < numNits; i++) {
|
||||||
|
if (nits[i].networkId == nit.getNetworkId()) {
|
||||||
|
if (nit.getSectionNumber() == 0) {
|
||||||
|
// all NITs have passed by
|
||||||
|
for (int j = 0; j < numNits; j++) {
|
||||||
|
if (nits[j].hasTransponder) {
|
||||||
|
networkId = nits[j].networkId;
|
||||||
|
//printf("taking NIT with network ID %d\n", networkId);
|
||||||
|
//XXX what if more than one NIT contaisn this transponder???
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!networkId) {
|
||||||
|
//printf("none of the NITs contains transponder %d\n", Transponder());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ThisNIT = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!networkId && ThisNIT < 0 && numNits < MAXNITS) {
|
||||||
|
if (nit.getSectionNumber() == 0) {
|
||||||
|
*nits[numNits].name = 0;
|
||||||
|
SI::Descriptor *d;
|
||||||
|
for (SI::Loop::Iterator it; (d = nit.commonDescriptors.getNext(it)); ) {
|
||||||
|
switch (d->getDescriptorTag()) {
|
||||||
|
case SI::NetworkNameDescriptorTag: {
|
||||||
|
SI::NetworkNameDescriptor *nnd = (SI::NetworkNameDescriptor *)d;
|
||||||
|
nnd->name.getText(nits[numNits].name);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default: ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
nits[numNits].networkId = nit.getNetworkId();
|
||||||
|
nits[numNits].hasTransponder = false;
|
||||||
|
//printf("NIT[%d] %5d '%s'\n", numNits, nits[numNits].networkId, nits[numNits].name);
|
||||||
|
ThisNIT = numNits;
|
||||||
|
numNits++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (networkId != nit.getNetworkId())
|
||||||
|
return; // ignore all other NITs
|
||||||
|
else if (!sectionSyncer.Sync(nit.getVersionNumber(), nit.getSectionNumber(), nit.getLastSectionNumber()))
|
||||||
return;
|
return;
|
||||||
if (!Channels.Lock(true, 10))
|
if (!Channels.Lock(true, 10))
|
||||||
return;
|
return;
|
||||||
@ -46,9 +102,16 @@ void cNitFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
|
|||||||
int Frequency = BCD2INT(sd->getFrequency()) / 100;
|
int Frequency = BCD2INT(sd->getFrequency()) / 100;
|
||||||
static char Polarizations[] = { 'h', 'v', 'l', 'r' };
|
static char Polarizations[] = { 'h', 'v', 'l', 'r' };
|
||||||
char Polarization = Polarizations[sd->getPolarization()];
|
char Polarization = Polarizations[sd->getPolarization()];
|
||||||
static int CodeRates[] = { FEC_NONE, FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_NONE, FEC_NONE, FEC_NONE, FEC_NONE, FEC_NONE, FEC_NONE, FEC_NONE, FEC_NONE, FEC_NONE, FEC_NONE };
|
static int CodeRates[] = { FEC_NONE, FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_NONE };
|
||||||
int CodeRate = CodeRates[sd->getFecInner()];
|
int CodeRate = CodeRates[sd->getFecInner()];
|
||||||
int SymbolRate = BCD2INT(sd->getSymbolRate()) / 10;
|
int SymbolRate = BCD2INT(sd->getSymbolRate()) / 10;
|
||||||
|
if (ThisNIT >= 0) {
|
||||||
|
if (ISTRANSPONDER(Frequency, Transponder())) {
|
||||||
|
nits[ThisNIT].hasTransponder = true;
|
||||||
|
//printf("has transponder %d\n", Transponder());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
bool found = false;
|
bool found = false;
|
||||||
for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) {
|
for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) {
|
||||||
if (!Channel->GroupSep() && Channel->Source() == Source && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) {
|
if (!Channel->GroupSep() && Channel->Source() == Source && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) {
|
||||||
@ -72,11 +135,18 @@ void cNitFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
|
|||||||
int Source = cSource::FromData(cSource::stCable);
|
int Source = cSource::FromData(cSource::stCable);
|
||||||
int Frequency = BCD2INT(sd->getFrequency()) / 10;
|
int Frequency = BCD2INT(sd->getFrequency()) / 10;
|
||||||
//XXX FEC_outer???
|
//XXX FEC_outer???
|
||||||
static int CodeRates[] = { FEC_NONE, FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_NONE, FEC_NONE, FEC_NONE, FEC_NONE, FEC_NONE, FEC_NONE, FEC_NONE, FEC_NONE, FEC_NONE, FEC_NONE };
|
static int CodeRates[] = { FEC_NONE, FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_AUTO, FEC_NONE };
|
||||||
int CodeRate = CodeRates[sd->getFecInner()];
|
int CodeRate = CodeRates[sd->getFecInner()];
|
||||||
static int Modulations[] = { QPSK, QAM_16, QAM_32, QAM_64, QAM_128, QAM_256 };
|
static int Modulations[] = { QPSK, QAM_16, QAM_32, QAM_64, QAM_128, QAM_256, QAM_AUTO };
|
||||||
int Modulation = Modulations[sd->getModulation()];
|
int Modulation = Modulations[min(sd->getModulation(), 6)];
|
||||||
int SymbolRate = BCD2INT(sd->getSymbolRate()) / 10;
|
int SymbolRate = BCD2INT(sd->getSymbolRate()) / 10;
|
||||||
|
if (ThisNIT >= 0) {
|
||||||
|
if (ISTRANSPONDER(Frequency / 1000, Transponder())) {
|
||||||
|
nits[ThisNIT].hasTransponder = true;
|
||||||
|
//printf("has transponder %d\n", Transponder());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
bool found = false;
|
bool found = false;
|
||||||
for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) {
|
for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) {
|
||||||
if (!Channel->GroupSep() && Channel->Source() == Source && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) {
|
if (!Channel->GroupSep() && Channel->Source() == Source && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) {
|
||||||
@ -97,21 +167,28 @@ void cNitFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
|
|||||||
break;
|
break;
|
||||||
case SI::TerrestrialDeliverySystemDescriptorTag: {
|
case SI::TerrestrialDeliverySystemDescriptorTag: {
|
||||||
SI::TerrestrialDeliverySystemDescriptor *sd = (SI::TerrestrialDeliverySystemDescriptor *)d;
|
SI::TerrestrialDeliverySystemDescriptor *sd = (SI::TerrestrialDeliverySystemDescriptor *)d;
|
||||||
int Source = cSource::FromData(cSource::stCable);
|
int Source = cSource::FromData(cSource::stTerr);
|
||||||
int Frequency = sd->getFrequency() * 10;
|
int Frequency = sd->getFrequency() * 10;
|
||||||
static int Bandwidths[] = { BANDWIDTH_6_MHZ, BANDWIDTH_7_MHZ, BANDWIDTH_8_MHZ, BANDWIDTH_AUTO, BANDWIDTH_AUTO, BANDWIDTH_AUTO, BANDWIDTH_AUTO, BANDWIDTH_AUTO };
|
static int Bandwidths[] = { BANDWIDTH_8_MHZ, BANDWIDTH_7_MHZ, BANDWIDTH_6_MHZ, BANDWIDTH_AUTO, BANDWIDTH_AUTO, BANDWIDTH_AUTO, BANDWIDTH_AUTO, BANDWIDTH_AUTO };
|
||||||
int Bandwidth = Bandwidths[sd->getBandwidth()];
|
int Bandwidth = Bandwidths[sd->getBandwidth()];
|
||||||
static int Constellations[] = { QPSK, QAM_16, QAM_64, QAM_AUTO };
|
static int Constellations[] = { QPSK, QAM_16, QAM_64, QAM_AUTO };
|
||||||
int Constellation = Constellations[sd->getConstellation()];
|
int Constellation = Constellations[sd->getConstellation()];
|
||||||
static int Hierarchies[] = { HIERARCHY_NONE, HIERARCHY_1, HIERARCHY_2, HIERARCHY_4 };
|
static int Hierarchies[] = { HIERARCHY_NONE, HIERARCHY_1, HIERARCHY_2, HIERARCHY_4, HIERARCHY_AUTO, HIERARCHY_AUTO, HIERARCHY_AUTO, HIERARCHY_AUTO };
|
||||||
int Hierarchy = Hierarchies[sd->getHierarchy()];
|
int Hierarchy = Hierarchies[sd->getHierarchy()];
|
||||||
static int CodeRates[] = { FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_NONE, FEC_NONE, FEC_NONE };
|
static int CodeRates[] = { FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_AUTO, FEC_AUTO, FEC_AUTO };
|
||||||
int CodeRateHP = CodeRates[sd->getCodeRateHP()];
|
int CodeRateHP = CodeRates[sd->getCodeRateHP()];
|
||||||
int CodeRateLP = CodeRates[sd->getCodeRateLP()];
|
int CodeRateLP = CodeRates[sd->getCodeRateLP()];
|
||||||
static int GuardIntervals[] = { GUARD_INTERVAL_1_4, GUARD_INTERVAL_1_8, GUARD_INTERVAL_1_16, GUARD_INTERVAL_1_32 };
|
static int GuardIntervals[] = { GUARD_INTERVAL_1_32, GUARD_INTERVAL_1_16, GUARD_INTERVAL_1_8, GUARD_INTERVAL_1_4 };
|
||||||
int GuardInterval = GuardIntervals[sd->getGuardInterval()];
|
int GuardInterval = GuardIntervals[sd->getGuardInterval()];
|
||||||
static int TransmissionModes[] = { TRANSMISSION_MODE_2K, TRANSMISSION_MODE_8K, TRANSMISSION_MODE_AUTO, TRANSMISSION_MODE_AUTO };
|
static int TransmissionModes[] = { TRANSMISSION_MODE_2K, TRANSMISSION_MODE_8K, TRANSMISSION_MODE_AUTO, TRANSMISSION_MODE_AUTO };
|
||||||
int TransmissionMode = TransmissionModes[sd->getTransmissionMode()];
|
int TransmissionMode = TransmissionModes[sd->getTransmissionMode()];
|
||||||
|
if (ThisNIT >= 0) {
|
||||||
|
if (ISTRANSPONDER(Frequency / 1000000, Transponder())) {
|
||||||
|
nits[ThisNIT].hasTransponder = true;
|
||||||
|
//printf("has transponder %d\n", Transponder());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
bool found = false;
|
bool found = false;
|
||||||
for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) {
|
for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) {
|
||||||
if (!Channel->GroupSep() && Channel->Source() == Source && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) {
|
if (!Channel->GroupSep() && Channel->Source() == Source && Channel->Nid() == ts.getOriginalNetworkId() && Channel->Tid() == ts.getTransportStreamId()) {
|
||||||
|
16
nit.h
16
nit.h
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: nit.h 1.1 2004/01/11 14:31:05 kls Exp $
|
* $Id: nit.h 1.2 2004/01/18 11:13:48 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __NIT_H
|
#ifndef __NIT_H
|
||||||
@ -12,9 +12,23 @@
|
|||||||
|
|
||||||
#include "filter.h"
|
#include "filter.h"
|
||||||
|
|
||||||
|
#define MAXNITS 16
|
||||||
|
#define MAXNETWORKNAME 256
|
||||||
|
|
||||||
class cNitFilter : public cFilter {
|
class cNitFilter : public cFilter {
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
class cNit {
|
||||||
|
public:
|
||||||
|
u_short networkId;
|
||||||
|
char name[MAXNETWORKNAME];
|
||||||
|
bool hasTransponder;
|
||||||
|
};
|
||||||
|
|
||||||
cSectionSyncer sectionSyncer;
|
cSectionSyncer sectionSyncer;
|
||||||
|
cNit nits[MAXNITS];
|
||||||
|
u_short networkId;
|
||||||
|
int numNits;
|
||||||
protected:
|
protected:
|
||||||
virtual void Process(u_short Pid, u_char Tid, const u_char *Data, int Length);
|
virtual void Process(u_short Pid, u_char Tid, const u_char *Data, int Length);
|
||||||
public:
|
public:
|
||||||
|
4
pat.c
4
pat.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: pat.c 1.4 2004/01/05 11:42:30 kls Exp $
|
* $Id: pat.c 1.5 2004/01/16 15:43:34 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "pat.h"
|
#include "pat.h"
|
||||||
@ -369,7 +369,7 @@ void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (Setup.UpdateChannels >= 2) {
|
if (Setup.UpdateChannels >= 2) {
|
||||||
Channel->SetPids(Vpid, Ppid, Apids[0], Apids[1], Dpids[0], Dpids[1], Tpid);
|
Channel->SetPids(Vpid, Vpid ? Ppid : 0, Apids[0], Apids[1], Dpids[0], Dpids[1], Tpid);
|
||||||
Channel->SetCaIds(CaDescriptors->CaIds());
|
Channel->SetCaIds(CaDescriptors->CaIds());
|
||||||
Channel->SetCaDescriptors(CaDescriptorHandler.AddCaDescriptors(CaDescriptors));
|
Channel->SetCaDescriptors(CaDescriptorHandler.AddCaDescriptors(CaDescriptors));
|
||||||
}
|
}
|
||||||
|
8
sdt.c
8
sdt.c
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: sdt.c 1.4 2004/01/11 14:28:28 kls Exp $
|
* $Id: sdt.c 1.7 2004/01/17 17:27:49 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "sdt.h"
|
#include "sdt.h"
|
||||||
@ -53,7 +53,7 @@ void cSdtFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
|
|||||||
SI::ServiceDescriptor *sd = (SI::ServiceDescriptor *)d;
|
SI::ServiceDescriptor *sd = (SI::ServiceDescriptor *)d;
|
||||||
switch (sd->getServiceType()) {
|
switch (sd->getServiceType()) {
|
||||||
case 0x01: // digital television service
|
case 0x01: // digital television service
|
||||||
//XXX TODO case 0x02: // digital radio sound service
|
case 0x02: // digital radio sound service
|
||||||
//XXX TODO case 0x04: // NVOD reference service
|
//XXX TODO case 0x04: // NVOD reference service
|
||||||
//XXX TODO case 0x05: // NVOD time-shifted service
|
//XXX TODO case 0x05: // NVOD time-shifted service
|
||||||
{
|
{
|
||||||
@ -78,11 +78,13 @@ void cSdtFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
|
|||||||
}
|
}
|
||||||
*pn = *ps = 0;
|
*pn = *ps = 0;
|
||||||
pn = NameBuf;
|
pn = NameBuf;
|
||||||
if (*NameBuf && *ShortNameBuf) {
|
if (*NameBuf && *ShortNameBuf && strcmp(NameBuf, ShortNameBuf) != 0) {
|
||||||
*ps++ = ',';
|
*ps++ = ',';
|
||||||
strcpy(ps, NameBuf);
|
strcpy(ps, NameBuf);
|
||||||
pn = ShortNameBuf;
|
pn = ShortNameBuf;
|
||||||
}
|
}
|
||||||
|
pn = compactspace(pn);
|
||||||
|
ps = compactspace(ps);
|
||||||
if (channel) {
|
if (channel) {
|
||||||
channel->SetId(sdt.getOriginalNetworkId(), sdt.getTransportStreamId(), SiSdtService.getServiceId());
|
channel->SetId(sdt.getOriginalNetworkId(), sdt.getTransportStreamId(), SiSdtService.getServiceId());
|
||||||
if (Setup.UpdateChannels >= 1)
|
if (Setup.UpdateChannels >= 1)
|
||||||
|
13
svdrp.c
13
svdrp.c
@ -10,7 +10,7 @@
|
|||||||
* and interact with the Video Disk Recorder - or write a full featured
|
* and interact with the Video Disk Recorder - or write a full featured
|
||||||
* graphical interface that sits on top of an SVDRP connection.
|
* graphical interface that sits on top of an SVDRP connection.
|
||||||
*
|
*
|
||||||
* $Id: svdrp.c 1.57 2003/12/28 10:09:30 kls Exp $
|
* $Id: svdrp.c 1.58 2004/01/17 13:47:39 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "svdrp.h"
|
#include "svdrp.h"
|
||||||
@ -29,6 +29,7 @@
|
|||||||
#include "channels.h"
|
#include "channels.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "device.h"
|
#include "device.h"
|
||||||
|
#include "eitscan.h"
|
||||||
#include "keys.h"
|
#include "keys.h"
|
||||||
#include "remote.h"
|
#include "remote.h"
|
||||||
#include "timers.h"
|
#include "timers.h"
|
||||||
@ -251,6 +252,9 @@ const char *HelpPages[] = {
|
|||||||
" format defined in vdr(5) for the 'epg.data' file. A '.' on a line\n"
|
" format defined in vdr(5) for the 'epg.data' file. A '.' on a line\n"
|
||||||
" by itself terminates the input and starts processing of the data (all\n"
|
" by itself terminates the input and starts processing of the data (all\n"
|
||||||
" entered data is buffered until the terminating '.' is seen).",
|
" entered data is buffered until the terminating '.' is seen).",
|
||||||
|
"SCAN\n"
|
||||||
|
" Forces an EPG scan. If this is a single DVB device system, the scan\n"
|
||||||
|
" will be done on the primary device unless it is currently recording.",
|
||||||
"STAT disk\n"
|
"STAT disk\n"
|
||||||
" Return information about disk usage (total, free, percent).",
|
" Return information about disk usage (total, free, percent).",
|
||||||
"UPDT <settings>\n"
|
"UPDT <settings>\n"
|
||||||
@ -954,6 +958,12 @@ void cSVDRP::CmdPUTE(const char *Option)
|
|||||||
DELETENULL(PUTEhandler);
|
DELETENULL(PUTEhandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cSVDRP::CmdSCAN(const char *Option)
|
||||||
|
{
|
||||||
|
EITScanner.ForceScan();
|
||||||
|
Reply(250, "EPG scan triggered");
|
||||||
|
}
|
||||||
|
|
||||||
void cSVDRP::CmdSTAT(const char *Option)
|
void cSVDRP::CmdSTAT(const char *Option)
|
||||||
{
|
{
|
||||||
if (*Option) {
|
if (*Option) {
|
||||||
@ -1062,6 +1072,7 @@ void cSVDRP::Execute(char *Cmd)
|
|||||||
else if (CMD("NEWT")) CmdNEWT(s);
|
else if (CMD("NEWT")) CmdNEWT(s);
|
||||||
else if (CMD("NEXT")) CmdNEXT(s);
|
else if (CMD("NEXT")) CmdNEXT(s);
|
||||||
else if (CMD("PUTE")) CmdPUTE(s);
|
else if (CMD("PUTE")) CmdPUTE(s);
|
||||||
|
else if (CMD("SCAN")) CmdSCAN(s);
|
||||||
else if (CMD("STAT")) CmdSTAT(s);
|
else if (CMD("STAT")) CmdSTAT(s);
|
||||||
else if (CMD("UPDT")) CmdUPDT(s);
|
else if (CMD("UPDT")) CmdUPDT(s);
|
||||||
else if (CMD("VOLU")) CmdVOLU(s);
|
else if (CMD("VOLU")) CmdVOLU(s);
|
||||||
|
3
svdrp.h
3
svdrp.h
@ -4,7 +4,7 @@
|
|||||||
* See the main source file 'vdr.c' for copyright information and
|
* See the main source file 'vdr.c' for copyright information and
|
||||||
* how to reach the author.
|
* how to reach the author.
|
||||||
*
|
*
|
||||||
* $Id: svdrp.h 1.19 2003/04/27 14:09:59 kls Exp $
|
* $Id: svdrp.h 1.20 2004/01/17 13:30:52 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __SVDRP_H
|
#ifndef __SVDRP_H
|
||||||
@ -73,6 +73,7 @@ private:
|
|||||||
void CmdNEWT(const char *Option);
|
void CmdNEWT(const char *Option);
|
||||||
void CmdNEXT(const char *Option);
|
void CmdNEXT(const char *Option);
|
||||||
void CmdPUTE(const char *Option);
|
void CmdPUTE(const char *Option);
|
||||||
|
void CmdSCAN(const char *Option);
|
||||||
void CmdSTAT(const char *Option);
|
void CmdSTAT(const char *Option);
|
||||||
void CmdUPDT(const char *Option);
|
void CmdUPDT(const char *Option);
|
||||||
void CmdVOLU(const char *Option);
|
void CmdVOLU(const char *Option);
|
||||||
|
6
vdr.c
6
vdr.c
@ -22,7 +22,7 @@
|
|||||||
*
|
*
|
||||||
* The project's page is at http://www.cadsoft.de/vdr
|
* The project's page is at http://www.cadsoft.de/vdr
|
||||||
*
|
*
|
||||||
* $Id: vdr.c 1.172 2004/01/04 11:12:05 kls Exp $
|
* $Id: vdr.c 1.174 2004/01/17 16:56:57 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
@ -52,6 +52,7 @@
|
|||||||
#include "sources.h"
|
#include "sources.h"
|
||||||
#include "timers.h"
|
#include "timers.h"
|
||||||
#include "tools.h"
|
#include "tools.h"
|
||||||
|
#include "transfer.h"
|
||||||
#include "videodir.h"
|
#include "videodir.h"
|
||||||
|
|
||||||
#define MINCHANNELWAIT 10 // seconds to wait between failed channel switchings
|
#define MINCHANNELWAIT 10 // seconds to wait between failed channel switchings
|
||||||
@ -520,7 +521,7 @@ int main(int argc, char *argv[])
|
|||||||
if (Channel && Channel->Modification(CHANNELMOD_RETUNE)) {
|
if (Channel && Channel->Modification(CHANNELMOD_RETUNE)) {
|
||||||
cRecordControls::ChannelDataModified(Channel);
|
cRecordControls::ChannelDataModified(Channel);
|
||||||
if (Channel->Number() == cDevice::CurrentChannel()) {
|
if (Channel->Number() == cDevice::CurrentChannel()) {
|
||||||
if (!cDevice::PrimaryDevice()->Replaying()) {
|
if (!cDevice::PrimaryDevice()->Replaying() || cTransferControl::ReceiverDevice()) {
|
||||||
isyslog("retuning due to modification of channel %d", Channel->Number());
|
isyslog("retuning due to modification of channel %d", Channel->Number());
|
||||||
Channels.SwitchTo(Channel->Number());
|
Channels.SwitchTo(Channel->Number());
|
||||||
}
|
}
|
||||||
@ -795,6 +796,7 @@ int main(int argc, char *argv[])
|
|||||||
if (Interface->Confirm(tr("Press any key to cancel shutdown"), UserShutdown ? 5 : SHUTDOWNWAIT, true)) {
|
if (Interface->Confirm(tr("Press any key to cancel shutdown"), UserShutdown ? 5 : SHUTDOWNWAIT, true)) {
|
||||||
int Channel = timer ? timer->Channel()->Number() : 0;
|
int Channel = timer ? timer->Channel()->Number() : 0;
|
||||||
const char *File = timer ? timer->File() : "";
|
const char *File = timer ? timer->File() : "";
|
||||||
|
Delta = Next - time(NULL); // compensates for Confirm() timeout
|
||||||
char *cmd;
|
char *cmd;
|
||||||
asprintf(&cmd, "%s %ld %ld %d \"%s\" %d", Shutdown, Next, Delta, Channel, strescape(File, "\"$"), UserShutdown);
|
asprintf(&cmd, "%s %ld %ld %d \"%s\" %d", Shutdown, Next, Delta, Channel, strescape(File, "\"$"), UserShutdown);
|
||||||
isyslog("executing '%s'", cmd);
|
isyslog("executing '%s'", cmd);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user