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
|
||||
the undefined NID value 0
|
||||
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>
|
||||
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 providing 'libsi' and adapting the EIT mechanisms to it
|
||||
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>
|
||||
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>
|
||||
for fixing 'su' call in 'runvdr' to make it work on systems that require the
|
||||
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
|
||||
branches are tested, cable and terrestrial need to be tested by somebody who
|
||||
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
|
||||
the transponder data the option "Set system time" must also
|
||||
be enabled.
|
||||
|
||||
Preferred languages = 0
|
||||
Some tv stations broadcast their EPG data in various
|
||||
different languages. This option allows you to define
|
||||
@ -496,6 +497,14 @@ Version 1.2
|
||||
different languages, the preferred languages are checked
|
||||
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:
|
||||
|
||||
Primary DVB interface = 1
|
||||
|
20
Makefile
20
Makefile
@ -4,7 +4,7 @@
|
||||
# See the main source file 'vdr.c' for copyright information and
|
||||
# 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:
|
||||
|
||||
@ -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
|
||||
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
|
||||
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
|
||||
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
|
||||
@ -70,6 +73,7 @@ endif
|
||||
all: vdr
|
||||
font: genfontfile\
|
||||
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
|
||||
@echo "font files created."
|
||||
|
||||
@ -100,11 +104,17 @@ fontosd.c:
|
||||
./genfontfile "cFont::tPixelData FontOsd_iso8859_1" "$(OSDFONT_ISO8859_1)" > $@
|
||||
fontsml.c:
|
||||
./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)" > $@
|
||||
fontosd_iso8859_1.c:
|
||||
fontosd_iso8859_7.c:
|
||||
./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)" > $@
|
||||
|
||||
# The font file generator:
|
||||
@ -122,6 +132,8 @@ $(SILIB):
|
||||
include-dir:
|
||||
@mkdir -p include/vdr
|
||||
@(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:
|
||||
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* 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"
|
||||
@ -24,6 +24,8 @@ const tI18nPhrase Phrases[] = {
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"Привет!",
|
||||
},
|
||||
{ "Hello world!",
|
||||
"Hallo Welt!",
|
||||
@ -40,6 +42,8 @@ const tI18nPhrase Phrases[] = {
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"Здравствуй мир!",
|
||||
},
|
||||
{ "Howdy folks!",
|
||||
"Tach zusammen!",
|
||||
@ -56,6 +60,8 @@ const tI18nPhrase Phrases[] = {
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"Как поживаете?",
|
||||
},
|
||||
{ "A friendly greeting",
|
||||
"Ein freundlicher Gruß",
|
||||
@ -72,6 +78,8 @@ const tI18nPhrase Phrases[] = {
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"Дружеское приветствие",
|
||||
},
|
||||
{ "Greeting time (s)",
|
||||
"Dauer des Grußes (s)",
|
||||
@ -88,6 +96,8 @@ const tI18nPhrase Phrases[] = {
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"Продолжительность приветствия",
|
||||
},
|
||||
{ "Use alternate greeting",
|
||||
"Alternativen Gruß verwenden",
|
||||
@ -104,6 +114,8 @@ const tI18nPhrase Phrases[] = {
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"",// TODO
|
||||
"Альтернативное приветствие",
|
||||
},
|
||||
{ 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
|
||||
use the device that contains the proper CAM.
|
||||
- No NVOD or "linked services" support yet.
|
||||
- No radio support yet.
|
||||
|
||||
Note that this is currently work in progress, so there may be some
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
@ -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
|
||||
:Beta Digital
|
||||
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
|
||||
:-
|
||||
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
|
||||
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
|
||||
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 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
|
||||
|
6
config.h
6
config.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* 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
|
||||
@ -20,8 +20,8 @@
|
||||
#include "i18n.h"
|
||||
#include "tools.h"
|
||||
|
||||
#define VDRVERSION "1.3.1"
|
||||
#define VDRVERSNUM 10301 // Version * 10000 + Major * 100 + Minor
|
||||
#define VDRVERSION "1.3.2"
|
||||
#define VDRVERSNUM 10302 // Version * 10000 + Major * 100 + Minor
|
||||
|
||||
#define MAXPRIORITY 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
|
||||
* 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 <stdlib.h>
|
||||
#include "channels.h"
|
||||
#include "dvbdevice.h"
|
||||
#include "interface.h"
|
||||
|
||||
// --- cScanData -------------------------------------------------------------
|
||||
|
||||
class cScanData : public cListObject {
|
||||
private:
|
||||
int source;
|
||||
int transponder;
|
||||
cChannel channel;
|
||||
public:
|
||||
cScanData(int Source, int Transponder);
|
||||
cScanData(const cChannel *Channel);
|
||||
virtual bool operator< (const cListObject &ListObject);
|
||||
int Source(void) { return source; }
|
||||
int Transponder(void) { return transponder; }
|
||||
cChannel *GetChannel(cList<cChannel> *Channels);
|
||||
int Source(void) { return channel.Source(); }
|
||||
int Transponder(void) { return channel.Transponder(); }
|
||||
const cChannel *GetChannel(void) { return &channel; }
|
||||
};
|
||||
|
||||
cScanData::cScanData(int Source, int Transponder)
|
||||
cScanData::cScanData(const cChannel *Channel)
|
||||
{
|
||||
source = Source;
|
||||
transponder = Transponder;
|
||||
channel = *Channel;
|
||||
}
|
||||
|
||||
bool cScanData::operator< (const cListObject &ListObject)
|
||||
{
|
||||
cScanData *sd = (cScanData *)&ListObject;
|
||||
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;
|
||||
return Source() < sd->Source() || Source() == sd->Source() && Transponder() < sd->Transponder();
|
||||
}
|
||||
|
||||
// --- cScanList -------------------------------------------------------------
|
||||
|
||||
class cScanList : public cList<cScanData> {
|
||||
public:
|
||||
cScanList(cList<cChannel> *Channels);
|
||||
void AddTransponders(cList<cChannel> *Channels);
|
||||
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))
|
||||
AddTransponder(ch);
|
||||
@ -64,11 +54,13 @@ cScanList::cScanList(cList<cChannel> *Channels)
|
||||
|
||||
void cScanList::AddTransponder(const cChannel *Channel)
|
||||
{
|
||||
for (cScanData *sd = First(); sd; sd = Next(sd)) {
|
||||
if (sd->Source() == Channel->Source() && ISTRANSPONDER(sd->Transponder(), Channel->Transponder()))
|
||||
return;
|
||||
}
|
||||
Add(new cScanData(Channel->Source(), Channel->Transponder()));
|
||||
if (Channel->Source() && Channel->Transponder()) {
|
||||
for (cScanData *sd = First(); sd; sd = Next(sd)) {
|
||||
if (sd->Source() == Channel->Source() && ISTRANSPONDER(sd->Transponder(), Channel->Transponder()))
|
||||
return;
|
||||
}
|
||||
Add(new cScanData(Channel));
|
||||
}
|
||||
}
|
||||
|
||||
// --- cTransponderList ------------------------------------------------------
|
||||
@ -98,7 +90,6 @@ cEITScanner::cEITScanner(void)
|
||||
lastScan = lastActivity = time(NULL);
|
||||
currentDevice = NULL;
|
||||
currentChannel = 0;
|
||||
numScan = 0;
|
||||
scanList = NULL;
|
||||
transponderList = NULL;
|
||||
}
|
||||
@ -116,6 +107,11 @@ void cEITScanner::AddTransponder(cChannel *Channel)
|
||||
transponderList->AddTransponder(Channel);
|
||||
}
|
||||
|
||||
void cEITScanner::ForceScan(void)
|
||||
{
|
||||
lastActivity = 0;
|
||||
}
|
||||
|
||||
void cEITScanner::Activity(void)
|
||||
{
|
||||
if (currentChannel) {
|
||||
@ -131,11 +127,15 @@ void cEITScanner::Process(void)
|
||||
time_t now = time(NULL);
|
||||
if (now - lastScan > ScanTimeout && now - lastActivity > ActivityTimeout) {
|
||||
if (Channels.Lock(false, 10)) {
|
||||
cList<cChannel> *ChannelList = &Channels;
|
||||
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
|
||||
ChannelList = transponderList;
|
||||
if (!scanList)
|
||||
scanList = new cScanList(ChannelList);
|
||||
if (!scanList) {
|
||||
scanList = new cScanList;
|
||||
scanList->AddTransponders(&Channels);
|
||||
if (transponderList) {
|
||||
scanList->AddTransponders(transponderList);
|
||||
delete transponderList;
|
||||
transponderList = NULL;
|
||||
}
|
||||
}
|
||||
for (bool AnyDeviceSwitched = false; !AnyDeviceSwitched; ) {
|
||||
cScanData *ScanData = NULL;
|
||||
for (int i = 0; i < cDevice::NumDevices(); i++) {
|
||||
@ -144,12 +144,14 @@ void cEITScanner::Process(void)
|
||||
if (Device) {
|
||||
if (Device != cDevice::PrimaryDevice() || (cDevice::NumDevices() == 1 && Setup.EPGScanTimeout && now - lastActivity > Setup.EPGScanTimeout * 3600)) {
|
||||
if (!(Device->Receiving(true) || Device->Replaying())) {
|
||||
cChannel *Channel = ScanData->GetChannel(ChannelList);
|
||||
const cChannel *Channel = ScanData->GetChannel();
|
||||
if (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 (Device == cDevice::PrimaryDevice() && !currentChannel)
|
||||
if (Device == cDevice::PrimaryDevice() && !currentChannel) {
|
||||
currentChannel = Device->CurrentChannel();
|
||||
Interface->Info("Starting EPG scan");
|
||||
}
|
||||
currentDevice = Device;//XXX see also dvbdevice.c!!!
|
||||
Device->SwitchChannel(Channel, false);
|
||||
currentDevice = NULL;
|
||||
@ -172,11 +174,8 @@ void cEITScanner::Process(void)
|
||||
if (!scanList->Count()) {
|
||||
delete scanList;
|
||||
scanList = NULL;
|
||||
numScan++;
|
||||
if (ChannelList == transponderList) {
|
||||
delete transponderList;
|
||||
transponderList = NULL;
|
||||
}
|
||||
if (lastActivity == 0) // this was a triggered scan
|
||||
Activity();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* 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
|
||||
@ -24,15 +24,15 @@ private:
|
||||
time_t lastScan, lastActivity;
|
||||
cDevice *currentDevice;
|
||||
int currentChannel;
|
||||
int numScan;
|
||||
cScanList *scanList;
|
||||
cTransponderList *transponderList;
|
||||
public:
|
||||
cEITScanner(void);
|
||||
~cEITScanner();
|
||||
bool Active(void) { return currentChannel; }
|
||||
bool Active(void) { return currentChannel || lastActivity == 0; }
|
||||
bool UsesDevice(const cDevice *Device) { return currentDevice == Device; }
|
||||
void AddTransponder(cChannel *Channel);
|
||||
void ForceScan(void);
|
||||
void Activity(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
|
||||
* 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"
|
||||
@ -14,18 +14,24 @@
|
||||
#include "fontosd.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 "fontosd-iso8859-7.c"
|
||||
#include "fontsml-iso8859-7.c"
|
||||
|
||||
static void *FontData[eDvbCodeSize][eDvbFontSize] = {
|
||||
{ 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] = {
|
||||
"iso8859-1",
|
||||
"iso8859-7"
|
||||
"iso8859-5",
|
||||
"iso8859-7",
|
||||
};
|
||||
|
||||
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
|
||||
* 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
|
||||
@ -21,7 +21,8 @@ enum eDvbFont {
|
||||
|
||||
enum eDvbCode {
|
||||
code_iso8859_1,
|
||||
code_iso8859_7
|
||||
code_iso8859_5,
|
||||
code_iso8859_7,
|
||||
#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
|
||||
* 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
|
||||
@ -12,7 +12,7 @@
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
const int I18nNumLanguages = 16;
|
||||
const int I18nNumLanguages = 17;
|
||||
|
||||
typedef const char *tI18nPhrase[I18nNumLanguages];
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (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);
|
||||
}
|
||||
|
||||
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() {
|
||||
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 *
|
||||
* (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();
|
||||
};
|
||||
|
||||
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
|
||||
class UnimplementedDescriptor : public Descriptor {
|
||||
protected:
|
||||
|
@ -6,7 +6,7 @@
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (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:
|
||||
d=new ApplicationSignallingDescriptor();
|
||||
break;
|
||||
case LinkageDescriptorTag:
|
||||
d=new LinkageDescriptor();
|
||||
break;
|
||||
|
||||
//note that it is no problem to implement one
|
||||
//of the unimplemented descriptors.
|
||||
@ -348,7 +351,6 @@ Descriptor *Descriptor::getDescriptor(CharArray da, DescriptorTagDomain domain)
|
||||
case VBITeletextDescriptorTag:
|
||||
case CountryAvailabilityDescriptorTag:
|
||||
case MocaicDescriptorTag:
|
||||
case LinkageDescriptorTag:
|
||||
case TeletextDescriptorTag:
|
||||
case TelephoneDescriptorTag:
|
||||
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 *
|
||||
* (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
|
||||
};
|
||||
|
||||
enum LinkageType { LinkageTypeInformationService = 0x01,
|
||||
LinkageTypeEPGService = 0x02,
|
||||
LinkageTypeCaReplacementService = 0x03,
|
||||
LinkageTypeTSContainingCompleteNetworkBouquetSi = 0x04,
|
||||
LinkageTypeServiceReplacementService = 0x05,
|
||||
LinkageTypeDataBroadcastService = 0x06,
|
||||
LinkageTypeRCSMap = 0x07,
|
||||
LinkageTypeMobileHandover = 0x08,
|
||||
LinkageTypeSystemSoftwareUpdateService = 0x09,
|
||||
LinkageTypeTSContainingSsuBatOrNit = 0x0A
|
||||
};
|
||||
|
||||
/* Some principles:
|
||||
- Objects that return references to other objects contained in their data must make sure
|
||||
that the returned objects have been parsed.
|
||||
@ -167,6 +179,7 @@ public:
|
||||
Object(CharArray &d);
|
||||
//can only be called once since data is immutable
|
||||
void setData(const unsigned char*data, unsigned int size, bool doCopy=true);
|
||||
CharArray getData() { return data; }
|
||||
virtual int getLength() = 0;
|
||||
protected:
|
||||
CharArray data;
|
||||
@ -224,9 +237,6 @@ private:
|
||||
class LoopElement : public Object {
|
||||
};
|
||||
|
||||
class SubStructure : public LoopElement {
|
||||
};
|
||||
|
||||
class Descriptor : public LoopElement {
|
||||
public:
|
||||
virtual int getLength();
|
||||
|
19
menu.c
19
menu.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* 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"
|
||||
@ -16,6 +16,7 @@
|
||||
#include "channels.h"
|
||||
#include "config.h"
|
||||
#include "cutter.h"
|
||||
#include "eitscan.h"
|
||||
#include "i18n.h"
|
||||
#include "menuitems.h"
|
||||
#include "plugin.h"
|
||||
@ -2044,6 +2045,7 @@ cMenuSetupEPG::cMenuSetupEPG(void)
|
||||
;
|
||||
originalNumLanguages = numLanguages;
|
||||
SetSection(tr("EPG"));
|
||||
SetHelp(tr("Scan"));
|
||||
Setup();
|
||||
}
|
||||
|
||||
@ -2068,10 +2070,6 @@ void cMenuSetupEPG::Setup(void)
|
||||
|
||||
eOSState cMenuSetupEPG::ProcessKey(eKeys Key)
|
||||
{
|
||||
int oldnumLanguages = numLanguages;
|
||||
int oldSetSystemTime = data.SetSystemTime;
|
||||
|
||||
eOSState state = cMenuSetupBase::ProcessKey(Key);
|
||||
if (Key == kOk) {
|
||||
bool Modified = numLanguages != originalNumLanguages;
|
||||
if (!Modified) {
|
||||
@ -2085,7 +2083,12 @@ eOSState cMenuSetupEPG::ProcessKey(eKeys Key)
|
||||
if (Modified)
|
||||
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) {
|
||||
for (int i = oldnumLanguages; i < numLanguages; i++) {
|
||||
data.EPGLanguages[i] = 0;
|
||||
@ -2104,6 +2107,10 @@ eOSState cMenuSetupEPG::ProcessKey(eKeys Key)
|
||||
data.EPGLanguages[numLanguages] = -1;
|
||||
Setup();
|
||||
}
|
||||
if (Key == kRed) {
|
||||
EITScanner.ForceScan();
|
||||
return osEnd;
|
||||
}
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
99
nit.c
99
nit.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* 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"
|
||||
@ -17,12 +17,16 @@
|
||||
|
||||
cNitFilter::cNitFilter(void)
|
||||
{
|
||||
numNits = 0;
|
||||
networkId = 0;
|
||||
Set(0x10, 0x40); // NIT
|
||||
}
|
||||
|
||||
void cNitFilter::SetStatus(bool On)
|
||||
{
|
||||
cFilter::SetStatus(On);
|
||||
numNits = 0;
|
||||
networkId = 0;
|
||||
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);
|
||||
if (!nit.CheckCRCAndParse())
|
||||
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;
|
||||
if (!Channels.Lock(true, 10))
|
||||
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;
|
||||
static char Polarizations[] = { 'h', 'v', 'l', 'r' };
|
||||
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 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;
|
||||
for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) {
|
||||
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 Frequency = BCD2INT(sd->getFrequency()) / 10;
|
||||
//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()];
|
||||
static int Modulations[] = { QPSK, QAM_16, QAM_32, QAM_64, QAM_128, QAM_256 };
|
||||
int Modulation = Modulations[sd->getModulation()];
|
||||
static int Modulations[] = { QPSK, QAM_16, QAM_32, QAM_64, QAM_128, QAM_256, QAM_AUTO };
|
||||
int Modulation = Modulations[min(sd->getModulation(), 6)];
|
||||
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;
|
||||
for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) {
|
||||
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;
|
||||
case SI::TerrestrialDeliverySystemDescriptorTag: {
|
||||
SI::TerrestrialDeliverySystemDescriptor *sd = (SI::TerrestrialDeliverySystemDescriptor *)d;
|
||||
int Source = cSource::FromData(cSource::stCable);
|
||||
int Source = cSource::FromData(cSource::stTerr);
|
||||
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()];
|
||||
static int Constellations[] = { QPSK, QAM_16, QAM_64, QAM_AUTO };
|
||||
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()];
|
||||
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 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()];
|
||||
static int TransmissionModes[] = { TRANSMISSION_MODE_2K, TRANSMISSION_MODE_8K, TRANSMISSION_MODE_AUTO, TRANSMISSION_MODE_AUTO };
|
||||
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;
|
||||
for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) {
|
||||
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
|
||||
* 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
|
||||
@ -12,9 +12,23 @@
|
||||
|
||||
#include "filter.h"
|
||||
|
||||
#define MAXNITS 16
|
||||
#define MAXNETWORKNAME 256
|
||||
|
||||
class cNitFilter : public cFilter {
|
||||
private:
|
||||
|
||||
class cNit {
|
||||
public:
|
||||
u_short networkId;
|
||||
char name[MAXNETWORKNAME];
|
||||
bool hasTransponder;
|
||||
};
|
||||
|
||||
cSectionSyncer sectionSyncer;
|
||||
cNit nits[MAXNITS];
|
||||
u_short networkId;
|
||||
int numNits;
|
||||
protected:
|
||||
virtual void Process(u_short Pid, u_char Tid, const u_char *Data, int Length);
|
||||
public:
|
||||
|
4
pat.c
4
pat.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* 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"
|
||||
@ -369,7 +369,7 @@ void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
|
||||
}
|
||||
}
|
||||
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->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
|
||||
* 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"
|
||||
@ -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;
|
||||
switch (sd->getServiceType()) {
|
||||
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 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 = NameBuf;
|
||||
if (*NameBuf && *ShortNameBuf) {
|
||||
if (*NameBuf && *ShortNameBuf && strcmp(NameBuf, ShortNameBuf) != 0) {
|
||||
*ps++ = ',';
|
||||
strcpy(ps, NameBuf);
|
||||
pn = ShortNameBuf;
|
||||
}
|
||||
pn = compactspace(pn);
|
||||
ps = compactspace(ps);
|
||||
if (channel) {
|
||||
channel->SetId(sdt.getOriginalNetworkId(), sdt.getTransportStreamId(), SiSdtService.getServiceId());
|
||||
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
|
||||
* 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"
|
||||
@ -29,6 +29,7 @@
|
||||
#include "channels.h"
|
||||
#include "config.h"
|
||||
#include "device.h"
|
||||
#include "eitscan.h"
|
||||
#include "keys.h"
|
||||
#include "remote.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"
|
||||
" by itself terminates the input and starts processing of the data (all\n"
|
||||
" 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"
|
||||
" Return information about disk usage (total, free, percent).",
|
||||
"UPDT <settings>\n"
|
||||
@ -954,6 +958,12 @@ void cSVDRP::CmdPUTE(const char *Option)
|
||||
DELETENULL(PUTEhandler);
|
||||
}
|
||||
|
||||
void cSVDRP::CmdSCAN(const char *Option)
|
||||
{
|
||||
EITScanner.ForceScan();
|
||||
Reply(250, "EPG scan triggered");
|
||||
}
|
||||
|
||||
void cSVDRP::CmdSTAT(const char *Option)
|
||||
{
|
||||
if (*Option) {
|
||||
@ -1062,6 +1072,7 @@ void cSVDRP::Execute(char *Cmd)
|
||||
else if (CMD("NEWT")) CmdNEWT(s);
|
||||
else if (CMD("NEXT")) CmdNEXT(s);
|
||||
else if (CMD("PUTE")) CmdPUTE(s);
|
||||
else if (CMD("SCAN")) CmdSCAN(s);
|
||||
else if (CMD("STAT")) CmdSTAT(s);
|
||||
else if (CMD("UPDT")) CmdUPDT(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
|
||||
* 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
|
||||
@ -73,6 +73,7 @@ private:
|
||||
void CmdNEWT(const char *Option);
|
||||
void CmdNEXT(const char *Option);
|
||||
void CmdPUTE(const char *Option);
|
||||
void CmdSCAN(const char *Option);
|
||||
void CmdSTAT(const char *Option);
|
||||
void CmdUPDT(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
|
||||
*
|
||||
* $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>
|
||||
@ -52,6 +52,7 @@
|
||||
#include "sources.h"
|
||||
#include "timers.h"
|
||||
#include "tools.h"
|
||||
#include "transfer.h"
|
||||
#include "videodir.h"
|
||||
|
||||
#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)) {
|
||||
cRecordControls::ChannelDataModified(Channel);
|
||||
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());
|
||||
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)) {
|
||||
int Channel = timer ? timer->Channel()->Number() : 0;
|
||||
const char *File = timer ? timer->File() : "";
|
||||
Delta = Next - time(NULL); // compensates for Confirm() timeout
|
||||
char *cmd;
|
||||
asprintf(&cmd, "%s %ld %ld %d \"%s\" %d", Shutdown, Next, Delta, Channel, strescape(File, "\"$"), UserShutdown);
|
||||
isyslog("executing '%s'", cmd);
|
||||
|
Loading…
x
Reference in New Issue
Block a user