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:
Klaus Schmidinger 2004-01-18 18:00:00 +01:00
parent a76a03c0d8
commit b8e837dbbb
29 changed files with 18529 additions and 107 deletions

View File

@ -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
View File

@ -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
View File

@ -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

View File

@ -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:

View File

@ -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 }
}; };

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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)
{ {
if (Channel->Source() && Channel->Transponder()) {
for (cScanData *sd = First(); sd; sd = Next(sd)) { for (cScanData *sd = First(); sd; sd = Next(sd)) {
if (sd->Source() == Channel->Source() && ISTRANSPONDER(sd->Transponder(), Channel->Transponder())) if (sd->Source() == Channel->Source() && ISTRANSPONDER(sd->Transponder(), Channel->Transponder()))
return; 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;
} }
} }

View File

@ -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
View File

@ -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
View File

@ -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

File diff suppressed because it is too large Load Diff

5602
fontosd-iso8859-5.c Normal file

File diff suppressed because it is too large Load Diff

6274
fontsml-iso8859-5.c Normal file

File diff suppressed because it is too large Load Diff

261
i18n.c

File diff suppressed because it is too large Load Diff

4
i18n.h
View File

@ -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];

View File

@ -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));
} }

View File

@ -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:

View File

@ -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:

View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -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
View File

@ -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);

View File

@ -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
View File

@ -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);