1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00

Added NID, TID and RID to the channel definitions

This commit is contained in:
Klaus Schmidinger 2002-11-24 14:48:38 +01:00
parent 08e4f36ccd
commit 82ccabff8a
12 changed files with 318 additions and 240 deletions

View File

@ -470,3 +470,7 @@ Peter Seyringer <e9425234@student.tuwien.ac.at>
Stefan Schluenss <dxr3_osd@schluenss.de> Stefan Schluenss <dxr3_osd@schluenss.de>
for reporting a bug where PID handles were not closed correctly for reporting a bug where PID handles were not closed correctly
Régis Bossut <rbossut@auchan.com>
for pointing out that with some providers the channels can only be distinguished
through the RID

15
HISTORY
View File

@ -1788,3 +1788,18 @@ Video Disk Recorder Revision History
a very primitive game that shows how a plugin can have its own raw OSD. Especially a very primitive game that shows how a plugin can have its own raw OSD. Especially
look into cLineGame and see how it implements the Show() function. See also look into cLineGame and see how it implements the Show() function. See also
the chapter on "User interaction" in PLUGINS.html. the chapter on "User interaction" in PLUGINS.html.
- Added three new fields to the lines in 'channels.conf': NID, TID and RID. NID and
TID are the Network and Transport Stream IDs, respectively. RID is an additional ID
that can be used to tell apart channels that would otherwise be indistinguishable.
This is typically the case with radio channels, which may have the same NID, TID
and SID, but different "radio IDs". This new field is therefore called RID ("radio
ID"). Currently NID and TID are not yet used by VDR and should always be 0. The
RID is actually used when building the "unique channel ID", so if you have channels
in your 'channels.conf' file that cause error messages when loading, you can set
the RIDs of these channels to different values.
When reading an old 'channels.conf' these new fields will be automatically
initialized to 0 and once the file is written back to disk they will be appended
to the channel definitions.
Thanks to Régis Bossut for pointing out that with some providers the channels can
only be distinguished through the RID.
- The "unique channel ID" now contains an optional 5th part (the RID). See man vdr(5).

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: channels.c 1.8 2002/11/10 13:01:55 kls Exp $ * $Id: channels.c 1.9 2002/11/24 14:28:48 kls Exp $
*/ */
#include "channels.h" #include "channels.h"
@ -120,6 +120,39 @@ int MapToDriver(int Value, const tChannelParameterMap *Map)
return -1; return -1;
} }
// -- tChannelID -------------------------------------------------------------
const tChannelID tChannelID::InvalidID;
bool tChannelID::operator== (const tChannelID &arg) const
{
return source == arg.source && nid == arg.nid && tid == arg.tid && sid == arg.sid && rid == arg.rid;
}
tChannelID tChannelID::FromString(const char *s)
{
char *sourcebuf = NULL;
int nid;
int tid;
int sid;
int rid = 0;
int fields = sscanf(s, "%a[^-]-%d-%d-%d-%d", &sourcebuf, &nid, &tid, &sid, &rid);
if (fields == 4 || fields == 5) {
int source = cSource::FromString(sourcebuf);
free(sourcebuf);
if (source >= 0)
return tChannelID(source, nid, tid, sid, rid);
}
return tChannelID::InvalidID;
}
const char *tChannelID::ToString(void)
{
static char buffer[256];
snprintf(buffer, sizeof(buffer), rid ? "%s-%d-%d-%d-%d" : "%s-%d-%d-%d", cSource::ToString(source), nid, tid, sid, rid);
return buffer;
}
// -- cChannel --------------------------------------------------------------- // -- cChannel ---------------------------------------------------------------
char *cChannel::buffer = NULL; char *cChannel::buffer = NULL;
@ -137,7 +170,10 @@ cChannel::cChannel(void)
dpid2 = 0; dpid2 = 0;
tpid = 32; tpid = 32;
ca = 0; ca = 0;
sid = 0; nid = 0;
tid = 0;
sid = 888;
rid = 0;
groupSep = false; groupSep = false;
polarization = 'v'; polarization = 'v';
inversion = INVERSION_AUTO; inversion = INVERSION_AUTO;
@ -158,36 +194,14 @@ cChannel& cChannel::operator= (const cChannel &Channel)
static int MHz(int frequency) static int MHz(int frequency)
{ {
while (frequency > 20000) { while (frequency > 20000)
frequency /= 1000; frequency /= 1000;
}
return frequency; return frequency;
} }
uint64 cChannel::GetChannelID(void) const tChannelID cChannel::GetChannelID(void) const
{ {
return (uint64(source) << 48) | (uint64(0) << 32) | ((MHz(frequency)) << 16) | sid; return tChannelID(source, nid, nid ? tid : MHz(frequency), sid, rid);
}
const char *cChannel::GetChannelIDStr(void) const
{
static char buffer[256];
snprintf(buffer, sizeof(buffer), "%s-%d-%d-%d", cSource::ToString(source), 0, MHz(frequency), sid);
return buffer;
}
uint64 cChannel::StringToChannelID(const char *s)
{
char *sourcebuf = NULL;
int reserved;
int frequency;
int sid;
if (4 == sscanf(s, "%a[^-]-%d-%d-%d", &sourcebuf, &reserved, &frequency, &sid)) {
int source = cSource::FromString(sourcebuf);
if (source >= 0)
return (uint64(source) << 48) | (uint64(reserved) << 32) | (frequency << 16) | sid;
}
return 0;
} }
static int PrintParameter(char *p, char Name, int Value) static int PrintParameter(char *p, char Name, int Value)
@ -281,7 +295,7 @@ const char *cChannel::ToText(cChannel *Channel)
if (Channel->dpid2) if (Channel->dpid2)
q += snprintf(q, sizeof(apidbuf) - (q - apidbuf), ",%d", Channel->dpid2); q += snprintf(q, sizeof(apidbuf) - (q - apidbuf), ",%d", Channel->dpid2);
*q = 0; *q = 0;
asprintf(&buffer, "%s:%d:%s:%s:%d:%d:%s:%d:%d:%d\n", s, Channel->frequency, Channel->ParametersToString(), cSource::ToString(Channel->source), Channel->srate, Channel->vpid, apidbuf, Channel->tpid, Channel->ca, Channel->sid); asprintf(&buffer, "%s:%d:%s:%s:%d:%d:%s:%d:%d:%d:%d:%d:%d\n", s, Channel->frequency, Channel->ParametersToString(), cSource::ToString(Channel->source), Channel->srate, Channel->vpid, apidbuf, Channel->tpid, Channel->ca, Channel->sid, Channel->nid, Channel->tid, Channel->rid);
} }
return buffer; return buffer;
} }
@ -312,7 +326,7 @@ bool cChannel::Parse(const char *s, bool AllowNonUniqueID)
char *sourcebuf = NULL; char *sourcebuf = NULL;
char *parambuf = NULL; char *parambuf = NULL;
char *apidbuf = NULL; char *apidbuf = NULL;
int fields = sscanf(s, "%a[^:]:%d :%a[^:]:%a[^:] :%d :%d :%a[^:]:%d :%d :%d ", &namebuf, &frequency, &parambuf, &sourcebuf, &srate, &vpid, &apidbuf, &tpid, &ca, &sid); int fields = sscanf(s, "%a[^:]:%d :%a[^:]:%a[^:] :%d :%d :%a[^:]:%d :%d :%d :%d :%d :%d ", &namebuf, &frequency, &parambuf, &sourcebuf, &srate, &vpid, &apidbuf, &tpid, &ca, &sid, &nid, &tid, &rid);
if (fields >= 9) { if (fields >= 9) {
if (fields == 9) { if (fields == 9) {
// allow reading of old format // allow reading of old format
@ -430,18 +444,25 @@ cChannel *cChannels::GetByServiceID(int Source, unsigned short ServiceID)
return NULL; return NULL;
} }
cChannel *cChannels::GetByChannelID(uint64 ChannelID) cChannel *cChannels::GetByChannelID(tChannelID ChannelID, bool TryWithoutRid)
{ {
for (cChannel *channel = First(); channel; channel = Next(channel)) { for (cChannel *channel = First(); channel; channel = Next(channel)) {
if (!channel->GroupSep() && channel->GetChannelID() == ChannelID) if (!channel->GroupSep() && channel->GetChannelID() == ChannelID)
return channel; return channel;
} }
if (TryWithoutRid) {
ChannelID.ClrRid();
for (cChannel *channel = First(); channel; channel = Next(channel)) {
if (!channel->GroupSep() && channel->GetChannelID().ClrRid() == ChannelID)
return channel;
}
}
return NULL; return NULL;
} }
bool cChannels::HasUniqueChannelID(cChannel *NewChannel, cChannel *OldChannel) bool cChannels::HasUniqueChannelID(cChannel *NewChannel, cChannel *OldChannel)
{ {
uint64 NewChannelID = NewChannel->GetChannelID(); tChannelID NewChannelID = NewChannel->GetChannelID();
for (cChannel *channel = First(); channel; channel = Next(channel)) { for (cChannel *channel = First(); channel; channel = Next(channel)) {
if (!channel->GroupSep() && channel != OldChannel && channel->GetChannelID() == NewChannelID) if (!channel->GroupSep() && channel != OldChannel && channel->GetChannelID() == NewChannelID)
return false; return false;

View File

@ -1,149 +1,149 @@
RTL:12188:h:S19.2E:27500:163:104:105:0:12003 RTL:12188:h:S19.2E:27500:163:104:105:0:12003:0:0:0
Sat.1:12480:v:S19.2E:27500:1791:1792:34:0:46 Sat.1:12480:v:S19.2E:27500:1791:1792:34:0:46:0:0:0
Pro-7:12480:v:S19.2E:27500:255:256;257:32:0:898 Pro-7:12480:v:S19.2E:27500:255:256;257:32:0:898:0:0:0
RTL2:12188:h:S19.2E:27500:166:128:68:0:12020 RTL2:12188:h:S19.2E:27500:166:128:68:0:12020:0:0:0
ARD:11837:h:S19.2E:27500:101:102:104:0:28106 ARD:11837:h:S19.2E:27500:101:102:104:0:28106:0:0:0
BR3:11837:h:S19.2E:27500:201:202:204:0:28107 BR3:11837:h:S19.2E:27500:201:202:204:0:28107:0:0:0
Hessen-3:11837:h:S19.2E:27500:301:302:304:0:28108 Hessen-3:11837:h:S19.2E:27500:301:302:304:0:28108:0:0:0
N3:12110:h:S19.2E:27500:2401:2402:2404:0:28224 N3:12110:h:S19.2E:27500:2401:2402:2404:0:28224:0:0:0
SR3:11837:h:S19.2E:27500:501:502:504:0:28110 SR3:11837:h:S19.2E:27500:501:502:504:0:28110:0:0:0
WDR:11837:h:S19.2E:27500:601:602:604:0:28111 WDR:11837:h:S19.2E:27500:601:602:604:0:28111:0:0:0
BR-alpha:11837:h:S19.2E:27500:701:702:704:0:28112 BR-alpha:11837:h:S19.2E:27500:701:702:704:0:28112:0:0:0
SWR BW:11837:h:S19.2E:27500:801:802:804:0:28113 SWR BW:11837:h:S19.2E:27500:801:802:804:0:28113:0:0:0
Phoenix:11837:h:S19.2E:27500:901:902:904:0:28114 Phoenix:11837:h:S19.2E:27500:901:902:904:0:28114:0:0:0
ZDF:11954:h:S19.2E:27500:110:120:130:0:28006 ZDF:11954:h:S19.2E:27500:110:120:130:0:28006:0:0:0
3sat:11954:h:S19.2E:27500:210:220:230:0:28007 3sat:11954:h:S19.2E:27500:210:220:230:0:28007:0:0:0
KiKa:11954:h:S19.2E:27500:310:320:330:0:28008 KiKa:11954:h:S19.2E:27500:310:320:330:0:28008:0:0:0
arte:11836:h:S19.2E:27500:401:402:404:0:28109 arte:11836:h:S19.2E:27500:401:402:404:0:28109:0:0:0
ORF1:12692:h:S19.2E:22000:160:161:165:102:13001 ORF1:12692:h:S19.2E:22000:160:161:165:102:13001:0:0:0
ORF2:12692:h:S19.2E:22000:500:501:505:102:13002 ORF2:12692:h:S19.2E:22000:500:501:505:102:13002:0:0:0
ZDF.info:11954:h:S19.2E:27500:610:620:0:0:28011 ZDF.info:11954:h:S19.2E:27500:610:620:0:0:28011:0:0:0
CNN:12168:v:S19.2E:27500:165:100:0:0:28512 CNN:12168:v:S19.2E:27500:165:100:0:0:28512:0:0:0
Super RTL:12188:h:S19.2E:27500:165:120:65:0:12040 Super RTL:12188:h:S19.2E:27500:165:120:65:0:12040:0:0:0
VOX:12188:h:S19.2E:27500:167:136:71:0:12060 VOX:12188:h:S19.2E:27500:167:136:71:0:12060:0:0:0
DW TV:10788:v:S19.2E:22000:305:306:0:0:8905 DW TV:10788:v:S19.2E:22000:305:306:0:0:8905:0:0:0
Kabel 1:12480:v:S19.2E:27500:511:512:33:0:899 Kabel 1:12480:v:S19.2E:27500:511:512:33:0:899:0:0:0
Neun Live:12480:v:S19.2E:27500:767:768:35:0:897 Neun Live:12480:v:S19.2E:27500:767:768:35:0:897:0:0:0
DSF:12480:v:S19.2E:27500:1023:1024:0:0:900 DSF:12480:v:S19.2E:27500:1023:1024:0:0:900:0:0:0
HOT:12480:v:S19.2E:27500:1279:1280:0:0:40 HOT:12480:v:S19.2E:27500:1279:1280:0:0:40:0:0:0
Bloomberg TV Germany:12552:v:S19.2E:22000:162:99:0:0:12160 Bloomberg TV Germany:12552:v:S19.2E:22000:162:99:0:0:12160:0:0:0
Bloomberg TV France:11817:v:S19.2E:27500:163:92:0:0:8004 Bloomberg TV France:11817:v:S19.2E:27500:163:92:0:0:8004:0:0:0
Bloomberg TV Spain:12168:v:S19.2E:27500:167:112:0:0:12721 Bloomberg TV Spain:12168:v:S19.2E:27500:167:112:0:0:12721:0:0:0
Sky News:12552:v:S19.2E:22000:305:306:0:0:3995 Sky News:12552:v:S19.2E:22000:305:306:0:0:3995:0:0:0
Fox Kids Netherlands:12574:h:S19.2E:22000:163:92:0:0:5020 Fox Kids Netherlands:12574:h:S19.2E:22000:163:92:0:0:5020:0:0:0
Alice:12610:v:S19.2E:22000:162:96:0:0:12200 Alice:12610:v:S19.2E:22000:162:96:0:0:12200:0:0:0
n-tv:12670:v:S19.2E:22000:162:96:55:0:12730 n-tv:12670:v:S19.2E:22000:162:96:55:0:12730:0:0:0
Grand Tourisme:12670:v:S19.2E:22000:289:290:0:0:17300 Grand Tourisme:12670:v:S19.2E:22000:289:290:0:0:17300:0:0:0
TW1:12692:h:S19.2E:22000:166:167:0:0:13013 TW1:12692:h:S19.2E:22000:166:167:0:0:13013:0:0:0
Eurosport:11954:h:S19.2E:27500:410:420:0:0:28009 Eurosport:11954:h:S19.2E:27500:410:420:0:0:28009:0:0:0
EinsExtra:12110:h:S19.2E:27500:101:102:0:0:28201 EinsExtra:12110:h:S19.2E:27500:101:102:0:0:28201:0:0:0
EinsFestival:12110:h:S19.2E:27500:201:202:0:0:28202 EinsFestival:12110:h:S19.2E:27500:201:202:0:0:28202:0:0:0
EinsMuXx:12110:h:S19.2E:27500:301:302:0:0:28203 EinsMuXx:12110:h:S19.2E:27500:301:302:0:0:28203:0:0:0
ZDF Theaterkanal:11954:h:S19.2E:27500:1110:1120:0:0:28016 ZDF Theaterkanal:11954:h:S19.2E:27500:1110:1120:0:0:28016:0:0:0
ZDF.doku:11954:h:S19.2E:27500:660:670:0:0:28014 ZDF.doku:11954:h:S19.2E:27500:660:670:0:0:28014:0:0:0
MDR:12110:h:S19.2E:27500:401:402:404:0:28204 MDR:12110:h:S19.2E:27500:401:402:404:0:28204:0:0:0
ORB:12110:h:S19.2E:27500:501:502:504:0:28205 ORB:12110:h:S19.2E:27500:501:502:504:0:28205:0:0:0
B1:12110:h:S19.2E:27500:601:602:604:0:28206 B1:12110:h:S19.2E:27500:601:602:604:0:28206:0:0:0
:Premiere World :Premiere World
Premiere Start:11797:h:S19.2E:27500:255:256:0:101:8 Premiere Start:11797:h:S19.2E:27500:255:256:0:101:8:0:0:0
Premiere 1:11797:h:S19.2E:27500:511:512,513;515:0:101:10 Premiere 1:11797:h:S19.2E:27500:511:512,513;515:0:101:10:0:0:0
Premiere 2:11797:h:S19.2E:27500:1791:1792,1793;1795:0:101:11 Premiere 2:11797:h:S19.2E:27500:1791:1792,1793;1795:0:101:11:0:0:0
Premiere 3:11797:h:S19.2E:27500:2303:2304:0:101:43 Premiere 3:11797:h:S19.2E:27500:2303:2304:0:101:43:0:0:0
Premiere 4:11797:h:S19.2E:27500:767:768:0:101:9 Premiere 4:11797:h:S19.2E:27500:767:768:0:101:9:0:0:0
Premiere 5:11797:h:S19.2E:27500:1279:1280:0:101:29 Premiere 5:11797:h:S19.2E:27500:1279:1280:0:101:29:0:0:0
Premiere 6:11797:h:S19.2E:27500:1535:1536:0:101:41 Premiere 6:11797:h:S19.2E:27500:1535:1536:0:101:41:0:0:0
Premiere 7:11797:h:S19.2E:27500:1023:1024:0:101:20 Premiere 7:11797:h:S19.2E:27500:1023:1024:0:101:20:0:0:0
13th Street:11758:h:S19.2E:27500:2303:2304:0:101:42 13th Street:11758:h:S19.2E:27500:2303:2304:0:101:42:0:0:0
Studio Universal:12090:v:S19.2E:27500:255:256:0:101:36 Studio Universal:12090:v:S19.2E:27500:255:256:0:101:36:0:0:0
Premiere Serie:12031:h:S19.2E:27500:1023:1024:0:101:16 Premiere Serie:12031:h:S19.2E:27500:1023:1024:0:101:16:0:0:0
Disney Channel:12090:v:S19.2E:27500:767:768:0:101:34 Disney Channel:12090:v:S19.2E:27500:767:768:0:101:34:0:0:0
Premiere Nostalgie:12031:h:S19.2E:27500:2559:2560:0:101:516 Premiere Nostalgie:12031:h:S19.2E:27500:2559:2560:0:101:516:0:0:0
Discovery Channel:12031:h:S19.2E:27500:1791:1792:0:101:14 Discovery Channel:12031:h:S19.2E:27500:1791:1792:0:101:14:0:0:0
Planet:12090:v:S19.2E:27500:1279:1280:0:101:13 Planet:12090:v:S19.2E:27500:1279:1280:0:101:13:0:0:0
Fox Kids:11758:h:S19.2E:27500:1279:1280:0:101:28 Fox Kids:11758:h:S19.2E:27500:1279:1280:0:101:28:0:0:0
Junior:11758:h:S19.2E:27500:255:256:0:101:19 Junior:11758:h:S19.2E:27500:255:256:0:101:19:0:0:0
K-Toon:11758:h:S19.2E:27500:511:512:0:101:12 K-Toon:11758:h:S19.2E:27500:511:512:0:101:12:0:0:0
Krimi&Co:12031:h:S19.2E:27500:1535:1536:0:101:23 Krimi&Co:12031:h:S19.2E:27500:1535:1536:0:101:23:0:0:0
Goldstar TV:11758:h:S19.2E:27500:3839:3840:0:101:518 Goldstar TV:11758:h:S19.2E:27500:3839:3840:0:101:518:0:0:0
Classica:11758:h:S19.2E:27500:767:768:0:101:15 Classica:11758:h:S19.2E:27500:767:768:0:101:15:0:0:0
Sonnenklar TV:12090:v:S19.2E:27500:1023:1024:0:0:32 Sonnenklar TV:12090:v:S19.2E:27500:1023:1024:0:0:32:0:0:0
:Premiere Direkt :Premiere Direkt
Premiere Direkt 1A:12031:h:S19.2E:27500:511:512,513;515:0:101:177 Premiere Direkt 1A:12031:h:S19.2E:27500:511:512,513;515:0:101:177:0:0:0
Premiere Direkt 1B:11719:h:S19.2E:27500:1023:1024,1025;1027:0:101:182 Premiere Direkt 1B:11719:h:S19.2E:27500:1023:1024,1025;1027:0:101:182:0:0:0
Premiere Direkt 2A:12031:h:S19.2E:27500:255:256;259:0:101:176 Premiere Direkt 2A:12031:h:S19.2E:27500:255:256;259:0:101:176:0:0:0
Premiere Direkt 2B:11719:h:S19.2E:27500:767:768;769:0:101:181 Premiere Direkt 2B:11719:h:S19.2E:27500:767:768;769:0:101:181:0:0:0
Premiere Direkt 3A:11719:h:S19.2E:27500:511:512;515:0:101:180 Premiere Direkt 3A:11719:h:S19.2E:27500:511:512;515:0:101:180:0:0:0
Premiere Direkt 3B:11719:h:S19.2E:27500:1279:1280;1283:0:101:183 Premiere Direkt 3B:11719:h:S19.2E:27500:1279:1280;1283:0:101:183:0:0:0
Premiere Direkt 4A:12031:h:S19.2E:27500:2815:2816:0:101:18 Premiere Direkt 4A:12031:h:S19.2E:27500:2815:2816:0:101:18:0:0:0
:#Premiere Direkt 4B:12070:h:S19.2E:27500:1535:1536:0:101:216 :#Premiere Direkt 4B:12070:h:S19.2E:27500:1535:1536:0:101:216:0:0:0
:PW Erotic :PW Erotic
Beate-Uhse.TV:11758:h:S19.2E:27500:1023:1024:0:101:21 Beate-Uhse.TV:11758:h:S19.2E:27500:1023:1024:0:101:21:0:0:0
Premiere Erotik 1:12031:h:S19.2E:27500:1279:1280:0:101:513 Premiere Erotik 1:12031:h:S19.2E:27500:1279:1280:0:101:513:0:0:0
Premiere Erotik 2:11719:h:S19.2E:27500:1535:1536:0:101:778 Premiere Erotik 2:11719:h:S19.2E:27500:1535:1536:0:101:778:0:0:0
Premiere Erotik 3:11719:h:S19.2E:27500:1791:1792:0:101:779 Premiere Erotik 3:11719:h:S19.2E:27500:1791:1792:0:101:779:0:0:0
Premiere Erotik 4:11719:h:S19.2E:27500:3583:3584:0:101:780 Premiere Erotik 4:11719:h:S19.2E:27500:3583:3584:0:101:780:0:0:0
:Sportsworld :Sportsworld
Premiere Sport 1:11720:h:S19.2E:27500:255:256,257:0:101:17 Premiere Sport 1:11720:h:S19.2E:27500:255:256,257:0:101:17:0:0:0
Premiere Sport 2:12031:h:S19.2E:27500:3839:3840:0:101:27 Premiere Sport 2:12031:h:S19.2E:27500:3839:3840:0:101:27:0:0:0
:Formel 1 :Formel 1
:#Supersignal:12070:h:S19.2E:27500:255:256:0:101:211 :#Supersignal:12070:h:S19.2E:27500:255:256:0:101:211:0:0:0
:#Cockpitkanal:12070:h:S19.2E:27500:511:512:0:101:212 :#Cockpitkanal:12070:h:S19.2E:27500:511:512:0:101:212:0:0:0
:#Boxengasse:12070:h:S19.2E:27500:767:768:0:101:213 :#Boxengasse:12070:h:S19.2E:27500:767:768:0:101:213:0:0:0
:#Verfolgerfeld:12070:h:S19.2E:27500:1023:1024:0:101:214 :#Verfolgerfeld:12070:h:S19.2E:27500:1023:1024:0:101:214:0:0:0
:#Infokanal:12070:h:S19.2E:27500:1279:1280:0:101:215 :#Infokanal:12070:h:S19.2E:27500:1279:1280:0:101:215:0:0:0
:#Multikanal:11720:h:S19.2E:27500:255:256:0:101:17 :#Multikanal:11720:h:S19.2E:27500:255:256:0:101:17:0:0:0
:Beta Digital :Beta Digital
N24:12480:v:S19.2E:27500:2047:2048:0:0:47 N24:12480:v:S19.2E:27500:2047:2048:0:0:47:0:0:0
CNBC:11954:h:S19.2E:27500:510:520:0:0:28010 CNBC:11954:h:S19.2E:27500:510:520:0:0:28010:0:0:0
Liberty TV.com:12610:v:S19.2E:22000:941:943,942:0:0:12199 Liberty TV.com:12610:v:S19.2E:22000:941:943,942:0:0:12199:0:0:0
:Premiere Bundesliga :Premiere Bundesliga
BL-Konferenz:12031:h:S19.2E:27500:2303:2304,2305:0:101:210 BL-Konferenz:12031:h:S19.2E:27500:2303:2304,2305:0:101:210:0:0:0
BuLi 1:11719:h:S19.2E:27500:255:256,257:0:101:17 BuLi 1:11719:h:S19.2E:27500:255:256,257:0:101:17:0:0:0
BuLi 2:11719:h:S19.2E:27500:2047:2048,2049:0:101:240 BuLi 2:11719:h:S19.2E:27500:2047:2048,2049:0:101:240:0:0:0
BuLi 3:11719:h:S19.2E:27500:2303:2304,2305:0:101:241 BuLi 3:11719:h:S19.2E:27500:2303:2304,2305:0:101:241:0:0:0
BuLi 4:11719:h:S19.2E:27500:2559:2560,2561:0:101:242 BuLi 4:11719:h:S19.2E:27500:2559:2560,2561:0:101:242:0:0:0
BuLi 5:11719:h:S19.2E:27500:2815:2816,2817:0:101:243 BuLi 5:11719:h:S19.2E:27500:2815:2816,2817:0:101:243:0:0:0
BuLi 6:11719:h:S19.2E:27500:3071:3072,3073:0:101:244 BuLi 6:11719:h:S19.2E:27500:3071:3072,3073:0:101:244:0:0:0
BuLi 7:11719:h:S19.2E:27500:3327:3328,3329:0:101:245 BuLi 7:11719:h:S19.2E:27500:3327:3328,3329:0:101:245:0:0:0
BuLi 8:12031:h:S19.2E:27500:3071:3072,3073:0:101:208 BuLi 8:12031:h:S19.2E:27500:3071:3072,3073:0:101:208:0:0:0
BuLi 9:12031:h:S19.2E:27500:3327:3328,3329:0:101:209 BuLi 9:12031:h:S19.2E:27500:3327:3328,3329:0:101:209:0:0:0
:- :-
Mosaico:11934:v:S19.2E:27500:165:100:0:0:29010 Mosaico:11934:v:S19.2E:27500:165:100:0:0:29010:0:0:0
Andalucia TV:11934:v:S19.2E:27500:166:104:0:0:29011 Andalucia TV:11934:v:S19.2E:27500:166:104:0:0:29011:0:0:0
Canal J:11934:v:S19.2E:27500:167:108:0:0:8157 Canal J:11934:v:S19.2E:27500:167:108:0:0:8157:0:0:0
Extreme Sports Channel:11992:h:S19.2E:27500:165:98,99:0:0:20365 Extreme Sports Channel:11992:h:S19.2E:27500:165:98,99:0:0:20365:0:0:0
Pro 7 Austria:12051:v:S19.2E:27500:161:84:0:0:20002 Pro 7 Austria:12051:v:S19.2E:27500:161:84:0:0:20002:0:0:0
Kabel 1 Schweiz:12051:v:S19.2E:27500:162:163:0:0:20003 Kabel 1 Schweiz:12051:v:S19.2E:27500:162:163:0:0:20003:0:0:0
Kabel 1 Austria:12051:v:S19.2E:27500:166:167:0:0:20004 Kabel 1 Austria:12051:v:S19.2E:27500:166:167:0:0:20004:0:0:0
Pro 7 Schweiz:12051:v:S19.2E:27500:289:290:0:0:20001 Pro 7 Schweiz:12051:v:S19.2E:27500:289:290:0:0:20001:0:0:0
KTO:11739:v:S19.2E:27500:163:90:0:0:8304 KTO:11739:v:S19.2E:27500:163:90:0:0:8304:0:0:0
Cartoon Network France:12168:v:S19.2E:27500:161:84:0:0:28511 Cartoon Network France:12168:v:S19.2E:27500:161:84:0:0:28511:0:0:0
TVBS Europe:12168:v:S19.2E:27500:162:88,89:0:0:28631 TVBS Europe:12168:v:S19.2E:27500:162:88,89:0:0:28631:0:0:0
travel channel:12168:v:S19.2E:27500:163:92,93:0:0:28001 travel channel:12168:v:S19.2E:27500:163:92,93:0:0:28001:0:0:0
TCM Espana:12168:v:S19.2E:27500:164:96,97:0:0:28516 TCM Espana:12168:v:S19.2E:27500:164:96,97:0:0:28516:0:0:0
TCM France:12168:v:S19.2E:27500:169:64,65:0:0:28515 TCM France:12168:v:S19.2E:27500:169:64,65:0:0:28515:0:0:0
La Cinquieme:12207:v:S19.2E:27500:160:80:0:0:8501 La Cinquieme:12207:v:S19.2E:27500:160:80:0:0:8501:0:0:0
LCP:12207:v:S19.2E:27500:165:100:0:0:8506 LCP:12207:v:S19.2E:27500:165:100:0:0:8506:0:0:0
AB Moteurs:12266:h:S19.2E:27500:160:80:0:0:17000 AB Moteurs:12266:h:S19.2E:27500:160:80:0:0:17000:0:0:0
AB 1:12266:h:S19.2E:27500:161:84:0:0:17001 AB 1:12266:h:S19.2E:27500:161:84:0:0:17001:0:0:0
Escales:12285:v:S19.2E:27500:165:100:0:0:17025 Escales:12285:v:S19.2E:27500:165:100:0:0:17025:0:0:0
Canal Club:12324:v:S19.2E:27500:160:80:0:0:8612 Canal Club:12324:v:S19.2E:27500:160:80:0:0:8612:0:0:0
RAI Uno:10788:v:S19.2E:22000:289:290:0:0:9004 RAI Uno:10788:v:S19.2E:22000:289:290:0:0:9004:0:0:0
K13:12402:v:S19.2E:27500:163:92:0:0:8704 K13:12402:v:S19.2E:27500:163:92:0:0:8704:0:0:0
Astra Mosaic 1:12552:v:S19.2E:22000:175:176:0:0:3988 Astra Mosaic 1:12552:v:S19.2E:22000:175:176:0:0:3988:0:0:0
Astra Mosaic 2:12552:v:S19.2E:22000:179:120:0:0:3987 Astra Mosaic 2:12552:v:S19.2E:22000:179:120:0:0:3987:0:0:0
Astra Mosaic 3:12552:v:S19.2E:22000:182:169:0:0:3986 Astra Mosaic 3:12552:v:S19.2E:22000:182:169:0:0:3986:0:0:0
Astra Mosaic 4:12552:v:S19.2E:22000:185:170:0:0:3985 Astra Mosaic 4:12552:v:S19.2E:22000:185:170:0:0:3985:0:0:0
Astra Mosaic 5:12552:v:S19.2E:22000:163:170:0:0:3984 Astra Mosaic 5:12552:v:S19.2E:22000:163:170:0:0:3984:0:0:0
Chamber TV:12552:v:S19.2E:22000:55:56:0:0:12180 Chamber TV:12552:v:S19.2E:22000:55:56:0:0:12180:0:0:0
RTL Tele Letzebuerg:12552:v:S19.2E:22000:168:144,146:0:0:3994 RTL Tele Letzebuerg:12552:v:S19.2E:22000:168:144,146:0:0:3994:0:0:0
VERONICA:12574:h:S19.2E:22000:161:84:0:0:5010 VERONICA:12574:h:S19.2E:22000:161:84:0:0:5010:0:0:0
VH1 Classic:12670:v:S19.2E:22000:3071:3072:0:0:28647 VH1 Classic:12670:v:S19.2E:22000:3071:3072:0:0:28647:0:0:0
MTV 2 Pop:12670:v:S19.2E:22000:3081:3082:0:0:28648 MTV 2 Pop:12670:v:S19.2E:22000:3081:3082:0:0:28648:0:0:0
Via 1 - Schöner Reisen:12148:h:S19.2E:27500:511:512:0:0:44 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 Video Italia:12610:v:S19.2E:22000:121:122:0:0:12220:0:0:0
ORF/ZDF:12670:h:S19.2E:22000:506:507:0:0:13012 ORF/ZDF:12670:h:S19.2E:22000:506:507:0:0:13012:0:0:0
VIVA:12670:v:S19.2E:22000:309:310:0:0:12732 VIVA:12670:v:S19.2E:22000:309:310:0:0:12732:0:0:0
VIVA PLUS:12552:v:S19.2E:22000:171:172:0:0:12120 VIVA PLUS:12552:v:S19.2E:22000:171:172:0:0:12120:0:0:0
MTV German:12670:v:S19.2E:22000:3031:3032:0:0:28643 MTV German:12670:v:S19.2E:22000:3031:3032:0:0:28643:0:0:0
QVC Germany:12552:v:S19.2E:22000:165:166:0:0:12100 QVC Germany:12552:v:S19.2E:22000:165:166:0:0:12100:0:0: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: channels.h 1.4 2002/11/10 13:01:23 kls Exp $ * $Id: channels.h 1.5 2002/11/24 14:27:51 kls Exp $
*/ */
#ifndef __CHANNELS_H #ifndef __CHANNELS_H
@ -35,6 +35,24 @@ extern const tChannelParameterMap TransmissionValues[];
extern const tChannelParameterMap GuardValues[]; extern const tChannelParameterMap GuardValues[];
extern const tChannelParameterMap HierarchyValues[]; extern const tChannelParameterMap HierarchyValues[];
struct tChannelID {
private:
int source;
int nid;
int tid;
int sid;
int rid;
public:
tChannelID(void) { source = nid = tid = sid = rid = 0; }
tChannelID(int Source, int Nid, int Tid, int Sid, int Rid = 0) { source = Source; nid = Nid; tid = Tid; sid = Sid; rid = Rid; }
bool operator== (const tChannelID &arg) const;
bool Valid(void) { return source && tid && sid; } // nid and rid are optional
tChannelID &ClrRid(void) { rid = 0; return *this; }
static tChannelID FromString(const char *s);
const char *ToString(void);
static const tChannelID InvalidID;
};
class cChannel : public cListObject { class cChannel : public cListObject {
friend class cMenuEditChannel; friend class cMenuEditChannel;
private: private:
@ -51,7 +69,10 @@ private:
int dpid1, dpid2; int dpid1, dpid2;
int tpid; int tpid;
int ca; int ca;
int nid;
int tid;
int sid; int sid;
int rid;
int number; // Sequence number assigned on load int number; // Sequence number assigned on load
bool groupSep; bool groupSep;
char polarization; char polarization;
@ -99,9 +120,7 @@ public:
bool IsCable(void) { return (source & cSource::st_Mask) == cSource::stCable; } bool IsCable(void) { return (source & cSource::st_Mask) == cSource::stCable; }
bool IsSat(void) { return (source & cSource::st_Mask) == cSource::stSat; } bool IsSat(void) { return (source & cSource::st_Mask) == cSource::stSat; }
bool IsTerr(void) { return (source & cSource::st_Mask) == cSource::stTerr; } bool IsTerr(void) { return (source & cSource::st_Mask) == cSource::stTerr; }
uint64 GetChannelID(void) const; tChannelID GetChannelID(void) const;
const char *GetChannelIDStr(void) const;
static uint64 StringToChannelID(const char *s);
}; };
class cChannels : public cConfig<cChannel> { class cChannels : public cConfig<cChannel> {
@ -116,7 +135,7 @@ public:
void ReNumber(void); // Recalculate 'number' based on channel type void ReNumber(void); // Recalculate 'number' based on channel type
cChannel *GetByNumber(int Number, int SkipGap = 0); cChannel *GetByNumber(int Number, int SkipGap = 0);
cChannel *GetByServiceID(int Source, unsigned short ServiceID); cChannel *GetByServiceID(int Source, unsigned short ServiceID);
cChannel *GetByChannelID(uint64 ChannelID); cChannel *GetByChannelID(tChannelID ChannelID, bool TryWithoutRid = false);
bool HasUniqueChannelID(cChannel *NewChannel, cChannel *OldChannel = NULL); bool HasUniqueChannelID(cChannel *NewChannel, cChannel *OldChannel = NULL);
bool SwitchTo(int Number); bool SwitchTo(int Number);
int MaxNumber(void) { return maxNumber; } int MaxNumber(void) { return maxNumber; }

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.140 2002/11/11 16:59:04 kls Exp $ * $Id: config.h 1.141 2002/11/24 12:28:20 kls Exp $
*/ */
#ifndef __CONFIG_H #ifndef __CONFIG_H
@ -17,7 +17,6 @@
#include <time.h> #include <time.h>
#include <unistd.h> #include <unistd.h>
#include "device.h" #include "device.h"
#include "eit.h"
#include "tools.h" #include "tools.h"
#define VDRVERSION "1.1.17" #define VDRVERSION "1.1.17"

60
eit.c
View File

@ -16,7 +16,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: eit.c 1.60 2002/11/10 15:50:21 kls Exp $ * $Id: eit.c 1.61 2002/11/24 14:37:38 kls Exp $
***************************************************************************/ ***************************************************************************/
#include "eit.h" #include "eit.h"
@ -180,7 +180,7 @@ bool cTDT::SetSystemTime()
// --- cEventInfo ------------------------------------------------------------ // --- cEventInfo ------------------------------------------------------------
cEventInfo::cEventInfo(uint64 channelid, unsigned short eventid) cEventInfo::cEventInfo(tChannelID channelid, unsigned short eventid)
{ {
pTitle = NULL; pTitle = NULL;
pSubtitle = NULL; pSubtitle = NULL;
@ -190,7 +190,7 @@ cEventInfo::cEventInfo(uint64 channelid, unsigned short eventid)
tTime = 0; tTime = 0;
uTableID = 0; uTableID = 0;
uEventID = eventid; uEventID = eventid;
uChannelID = channelid; channelID = channelid;
nChannelNumber = 0; nChannelNumber = 0;
} }
@ -325,15 +325,15 @@ void cEventInfo::SetEventID(unsigned short evid)
uEventID = evid; uEventID = evid;
} }
/** */ /** */
void cEventInfo::SetChannelID(uint64 channelid) void cEventInfo::SetChannelID(tChannelID channelid)
{ {
uChannelID = channelid; channelID = channelid;
} }
/** */ /** */
uint64 cEventInfo::GetChannelID() const tChannelID cEventInfo::GetChannelID() const
{ {
return uChannelID; return channelID;
} }
/** */ /** */
@ -404,13 +404,13 @@ bool cEventInfo::Read(FILE *f, cSchedule *Schedule)
struct tEpgBugFixStats { struct tEpgBugFixStats {
int hits; int hits;
int n; int n;
uint64 channelIDs[MAXEPGBUGFIXCHANS]; tChannelID channelIDs[MAXEPGBUGFIXCHANS];
tEpgBugFixStats(void) { hits = n = 0; } tEpgBugFixStats(void) { hits = n = 0; }
}; };
tEpgBugFixStats EpgBugFixStats[MAXEPGBUGFIXSTATS]; tEpgBugFixStats EpgBugFixStats[MAXEPGBUGFIXSTATS];
static void EpgBugFixStat(int Number, uint64 ChannelID) static void EpgBugFixStat(int Number, tChannelID ChannelID)
{ {
if (0 <= Number && Number < MAXEPGBUGFIXSTATS) { if (0 <= Number && Number < MAXEPGBUGFIXSTATS) {
tEpgBugFixStats *p = &EpgBugFixStats[Number]; tEpgBugFixStats *p = &EpgBugFixStats[Number];
@ -448,7 +448,7 @@ static void ReportEpgBugFixStats(bool Reset = false)
char *q = buffer; char *q = buffer;
q += snprintf(q, sizeof(buffer) - (q - buffer), "%d\t%d", i, p->hits); q += snprintf(q, sizeof(buffer) - (q - buffer), "%d\t%d", i, p->hits);
for (int c = 0; c < p->n; c++) { for (int c = 0; c < p->n; c++) {
cChannel *channel = Channels.GetByChannelID(p->channelIDs[c]); cChannel *channel = Channels.GetByChannelID(p->channelIDs[c], true);
if (channel) { if (channel) {
q += snprintf(q, sizeof(buffer) - (q - buffer), "%s%s", delim, channel->Name()); q += snprintf(q, sizeof(buffer) - (q - buffer), "%s%s", delim, channel->Name());
delim = ", "; delim = ", ";
@ -608,10 +608,10 @@ void cEventInfo::FixEpgBugs(void)
// --- cSchedule ------------------------------------------------------------- // --- cSchedule -------------------------------------------------------------
cSchedule::cSchedule(uint64 channelid) cSchedule::cSchedule(tChannelID channelid)
{ {
pPresent = pFollowing = NULL; pPresent = pFollowing = NULL;
uChannelID = channelid; channelID = channelid;
} }
@ -645,14 +645,14 @@ const cEventInfo *cSchedule::GetFollowingEvent(void) const
return pe; return pe;
} }
void cSchedule::SetChannelID(uint64 channelid) void cSchedule::SetChannelID(tChannelID channelid)
{ {
uChannelID = channelid; channelID = channelid;
} }
/** */ /** */
uint64 cSchedule::GetChannelID() const tChannelID cSchedule::GetChannelID() const
{ {
return uChannelID; return channelID;
} }
/** */ /** */
const cEventInfo * cSchedule::GetEvent(unsigned short uEventID, time_t tTime) const const cEventInfo * cSchedule::GetEvent(unsigned short uEventID, time_t tTime) const
@ -735,10 +735,10 @@ void cSchedule::Cleanup(time_t tTime)
/** */ /** */
void cSchedule::Dump(FILE *f, const char *Prefix) const void cSchedule::Dump(FILE *f, const char *Prefix) const
{ {
cChannel *channel = Channels.GetByChannelID(uChannelID); cChannel *channel = Channels.GetByChannelID(channelID, true);
if (channel) if (channel)
{ {
fprintf(f, "%sC %s %s\n", Prefix, channel->GetChannelIDStr(), channel->Name()); fprintf(f, "%sC %s %s\n", Prefix, channel->GetChannelID().ToString(), channel->Name());
for (cEventInfo *p = Events.First(); p; p = Events.Next(p)) for (cEventInfo *p = Events.First(); p; p = Events.Next(p))
p->Dump(f, Prefix); p->Dump(f, Prefix);
fprintf(f, "%sc\n", Prefix); fprintf(f, "%sc\n", Prefix);
@ -756,9 +756,9 @@ bool cSchedule::Read(FILE *f, cSchedules *Schedules)
if (p) if (p)
*p = 0; // strips optional channel name *p = 0; // strips optional channel name
if (*s) { if (*s) {
uint64 uChannelID = cChannel::StringToChannelID(s); tChannelID channelID = tChannelID::FromString(s);
if (uChannelID) { if (channelID.Valid()) {
cSchedule *p = (cSchedule *)Schedules->AddChannelID(uChannelID); cSchedule *p = (cSchedule *)Schedules->AddChannelID(channelID);
if (p) { if (p) {
if (!cEventInfo::Read(f, p)) if (!cEventInfo::Read(f, p))
return false; return false;
@ -785,14 +785,13 @@ bool cSchedule::Read(FILE *f, cSchedules *Schedules)
cSchedules::cSchedules() cSchedules::cSchedules()
{ {
pCurrentSchedule = NULL; pCurrentSchedule = NULL;
uCurrentChannelID = 0;
} }
cSchedules::~cSchedules() cSchedules::~cSchedules()
{ {
} }
/** */ /** */
const cSchedule *cSchedules::AddChannelID(uint64 channelid) const cSchedule *cSchedules::AddChannelID(tChannelID channelid)
{ {
const cSchedule *p = GetSchedule(channelid); const cSchedule *p = GetSchedule(channelid);
if (!p) { if (!p) {
@ -802,11 +801,12 @@ const cSchedule *cSchedules::AddChannelID(uint64 channelid)
return p; return p;
} }
/** */ /** */
const cSchedule *cSchedules::SetCurrentChannelID(uint64 channelid) const cSchedule *cSchedules::SetCurrentChannelID(tChannelID channelid)
{ {
channelid.ClrRid();
pCurrentSchedule = AddChannelID(channelid); pCurrentSchedule = AddChannelID(channelid);
if (pCurrentSchedule) if (pCurrentSchedule)
uCurrentChannelID = channelid; currentChannelID = channelid;
return pCurrentSchedule; return pCurrentSchedule;
} }
/** */ /** */
@ -815,10 +815,11 @@ const cSchedule * cSchedules::GetSchedule() const
return pCurrentSchedule; return pCurrentSchedule;
} }
/** */ /** */
const cSchedule * cSchedules::GetSchedule(uint64 channelid) const const cSchedule * cSchedules::GetSchedule(tChannelID channelid) const
{ {
cSchedule *p; cSchedule *p;
channelid.ClrRid();
p = First(); p = First();
while (p != NULL) while (p != NULL)
{ {
@ -905,7 +906,8 @@ int cEIT::ProcessEIT(unsigned char *buffer, int CurrentSource)
for (VdrProgramInfo = (struct VdrProgramInfo *) VdrProgramInfos->Head; VdrProgramInfo; VdrProgramInfo = (struct VdrProgramInfo *) xSucc (VdrProgramInfo)) { for (VdrProgramInfo = (struct VdrProgramInfo *) VdrProgramInfos->Head; VdrProgramInfo; VdrProgramInfo = (struct VdrProgramInfo *) xSucc (VdrProgramInfo)) {
//XXX TODO use complete channel ID //XXX TODO use complete channel ID
cChannel *channel = Channels.GetByServiceID(CurrentSource, VdrProgramInfo->ServiceID); cChannel *channel = Channels.GetByServiceID(CurrentSource, VdrProgramInfo->ServiceID);
uint64 channelID = channel ? channel->GetChannelID() : (uint64(CurrentSource) << 48) | VdrProgramInfo->ServiceID; tChannelID channelID = channel ? channel->GetChannelID() : tChannelID(CurrentSource, 0, 0, VdrProgramInfo->ServiceID);
channelID.ClrRid();
//XXX //XXX
pSchedule = (cSchedule *)schedules->GetSchedule(channelID); pSchedule = (cSchedule *)schedules->GetSchedule(channelID);
if (!pSchedule) { if (!pSchedule) {
@ -915,7 +917,7 @@ int cEIT::ProcessEIT(unsigned char *buffer, int CurrentSource)
break; break;
} }
if (VdrProgramInfo->ReferenceServiceID) { if (VdrProgramInfo->ReferenceServiceID) {
rSchedule = (cSchedule *)schedules->GetSchedule((uint64(CurrentSource) << 48) | VdrProgramInfo->ReferenceServiceID); rSchedule = (cSchedule *)schedules->GetSchedule(tChannelID(CurrentSource, 0, 0, VdrProgramInfo->ReferenceServiceID));
if (!rSchedule) if (!rSchedule)
break; break;
rEvent = (cEventInfo *)rSchedule->GetEvent((unsigned short)VdrProgramInfo->ReferenceEventID); rEvent = (cEventInfo *)rSchedule->GetEvent((unsigned short)VdrProgramInfo->ReferenceEventID);
@ -1270,7 +1272,7 @@ void cSIProcessor::SetCurrentTransponder(int CurrentSource, int CurrentTranspond
} }
/** */ /** */
bool cSIProcessor::SetCurrentChannelID(uint64 channelid) bool cSIProcessor::SetCurrentChannelID(tChannelID channelid)
{ {
cMutexLock MutexLock(&schedulesMutex); cMutexLock MutexLock(&schedulesMutex);
return schedules ? schedules->SetCurrentChannelID(channelid) : false; return schedules ? schedules->SetCurrentChannelID(channelid) : false;

29
eit.h
View File

@ -16,12 +16,13 @@
* 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: eit.h 1.21 2002/11/10 12:58:27 kls Exp $ * $Id: eit.h 1.22 2002/11/24 12:45:55 kls Exp $
***************************************************************************/ ***************************************************************************/
#ifndef __EIT_H #ifndef __EIT_H
#define __EIT_H #define __EIT_H
#include "channels.h"
#include "thread.h" #include "thread.h"
#include "tools.h" #include "tools.h"
@ -32,7 +33,7 @@ class cEventInfo : public cListObject {
friend class cEIT; friend class cEIT;
private: private:
unsigned char uTableID; // Table ID this event came from unsigned char uTableID; // Table ID this event came from
uint64 uChannelID; // Channel ID of program for that event tChannelID channelID; // Channel ID of program for that event
bool bIsFollowing; // true if this is the next event on this channel bool bIsFollowing; // true if this is the next event on this channel
bool bIsPresent; // true if this is the present event running bool bIsPresent; // true if this is the present event running
char *pExtendedDescription; // Extended description of this event char *pExtendedDescription; // Extended description of this event
@ -47,13 +48,13 @@ protected:
void SetFollowing(bool foll); void SetFollowing(bool foll);
void SetPresent(bool pres); void SetPresent(bool pres);
void SetTitle(const char *string); void SetTitle(const char *string);
void SetChannelID(uint64 channelid); void SetChannelID(tChannelID channelid);
void SetEventID(unsigned short evid); void SetEventID(unsigned short evid);
void SetDuration(long l); void SetDuration(long l);
void SetTime(time_t t); void SetTime(time_t t);
void SetExtendedDescription(const char *string); void SetExtendedDescription(const char *string);
void SetSubtitle(const char *string); void SetSubtitle(const char *string);
cEventInfo(uint64 channelid, unsigned short eventid); cEventInfo(tChannelID channelid, unsigned short eventid);
public: public:
~cEventInfo(); ~cEventInfo();
const unsigned char GetTableID(void) const; const unsigned char GetTableID(void) const;
@ -68,7 +69,7 @@ public:
unsigned short GetEventID(void) const; unsigned short GetEventID(void) const;
long GetDuration(void) const; long GetDuration(void) const;
time_t GetTime(void) const; time_t GetTime(void) const;
uint64 GetChannelID(void) const; tChannelID GetChannelID(void) const;
int GetChannelNumber(void) const { return nChannelNumber; } int GetChannelNumber(void) const { return nChannelNumber; }
void SetChannelNumber(int ChannelNumber) const { ((cEventInfo *)this)->nChannelNumber = ChannelNumber; } // doesn't modify the EIT data, so it's ok to make it 'const' void SetChannelNumber(int ChannelNumber) const { ((cEventInfo *)this)->nChannelNumber = ChannelNumber; } // doesn't modify the EIT data, so it's ok to make it 'const'
void Dump(FILE *f, const char *Prefix = "") const; void Dump(FILE *f, const char *Prefix = "") const;
@ -82,21 +83,21 @@ class cSchedule : public cListObject {
private: private:
cEventInfo *pPresent; cEventInfo *pPresent;
cEventInfo *pFollowing; cEventInfo *pFollowing;
uint64 uChannelID; tChannelID channelID;
cList<cEventInfo> Events; cList<cEventInfo> Events;
protected: protected:
void SetChannelID(uint64 channelid); void SetChannelID(tChannelID channelid);
bool SetFollowingEvent(cEventInfo *pEvent); bool SetFollowingEvent(cEventInfo *pEvent);
bool SetPresentEvent(cEventInfo *pEvent); bool SetPresentEvent(cEventInfo *pEvent);
void Cleanup(time_t tTime); void Cleanup(time_t tTime);
void Cleanup(void); void Cleanup(void);
cSchedule(uint64 channelid = 0); cSchedule(tChannelID channelid = tChannelID::InvalidID);
public: public:
~cSchedule(); ~cSchedule();
cEventInfo *AddEvent(cEventInfo *EventInfo); cEventInfo *AddEvent(cEventInfo *EventInfo);
const cEventInfo *GetPresentEvent(void) const; const cEventInfo *GetPresentEvent(void) const;
const cEventInfo *GetFollowingEvent(void) const; const cEventInfo *GetFollowingEvent(void) const;
uint64 GetChannelID(void) const; tChannelID GetChannelID(void) const;
const cEventInfo *GetEvent(unsigned short uEventID, time_t tTime = 0) const; const cEventInfo *GetEvent(unsigned short uEventID, time_t tTime = 0) const;
const cEventInfo *GetEventAround(time_t tTime) const; const cEventInfo *GetEventAround(time_t tTime) const;
const cEventInfo *GetEventNumber(int n) const { return Events.Get(n); } const cEventInfo *GetEventNumber(int n) const { return Events.Get(n); }
@ -110,15 +111,15 @@ class cSchedules : public cList<cSchedule> {
friend class cSIProcessor; friend class cSIProcessor;
private: private:
const cSchedule *pCurrentSchedule; const cSchedule *pCurrentSchedule;
uint64 uCurrentChannelID; tChannelID currentChannelID;
protected: protected:
const cSchedule *AddChannelID(uint64 channelid); const cSchedule *AddChannelID(tChannelID channelid);
const cSchedule *SetCurrentChannelID(uint64 channelid); const cSchedule *SetCurrentChannelID(tChannelID channelid);
void Cleanup(); void Cleanup();
public: public:
cSchedules(void); cSchedules(void);
~cSchedules(); ~cSchedules();
const cSchedule *GetSchedule(uint64 channelid) const; const cSchedule *GetSchedule(tChannelID channelid) const;
const cSchedule *GetSchedule(void) const; const cSchedule *GetSchedule(void) const;
void Dump(FILE *f, const char *Prefix = "") const; void Dump(FILE *f, const char *Prefix = "") const;
static bool Read(FILE *f); static bool Read(FILE *f);
@ -162,7 +163,7 @@ public:
static void Clear(void); static void Clear(void);
void SetStatus(bool On); void SetStatus(bool On);
void SetCurrentTransponder(int CurrentSource, int CurrentTransponder); void SetCurrentTransponder(int CurrentSource, int CurrentTransponder);
static bool SetCurrentChannelID(uint64 channelid); static bool SetCurrentChannelID(tChannelID channelid);
static void TriggerDump(void); static void TriggerDump(void);
}; };

17
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.225 2002/11/23 14:51:24 kls Exp $ * $Id: menu.c 1.226 2002/11/24 14:34:41 kls Exp $
*/ */
#include "menu.h" #include "menu.h"
@ -582,6 +582,11 @@ void cMenuEditChannel::Setup(void)
Add(new cMenuEditIntItem( tr("Tpid"), &data.tpid, 0, 0x1FFF)); Add(new cMenuEditIntItem( tr("Tpid"), &data.tpid, 0, 0x1FFF));
Add(new cMenuEditCaItem( tr("CA"), &data.ca, true)); Add(new cMenuEditCaItem( tr("CA"), &data.ca, true));
Add(new cMenuEditIntItem( tr("Sid"), &data.sid, 0)); Add(new cMenuEditIntItem( tr("Sid"), &data.sid, 0));
/* XXX not yet used
Add(new cMenuEditIntItem( tr("Nid"), &data.nid, 0));
Add(new cMenuEditIntItem( tr("Tid"), &data.tid, 0));
Add(new cMenuEditIntItem( tr("Rid"), &data.rid, 0));
XXX*/
// Parameters for specific types of sources: // Parameters for specific types of sources:
ST(" S ") Add(new cMenuEditChrItem( tr("Polarization"), &data.polarization, "hv")); ST(" S ") Add(new cMenuEditChrItem( tr("Polarization"), &data.polarization, "hv"));
ST("CS ") Add(new cMenuEditIntItem( tr("Srate"), &data.srate)); ST("CS ") Add(new cMenuEditIntItem( tr("Srate"), &data.srate));
@ -1089,7 +1094,7 @@ cMenuEvent::cMenuEvent(const cEventInfo *EventInfo, bool CanSwitch)
{ {
eventInfo = EventInfo; eventInfo = EventInfo;
if (eventInfo) { if (eventInfo) {
cChannel *channel = Channels.GetByChannelID(eventInfo->GetChannelID()); cChannel *channel = Channels.GetByChannelID(eventInfo->GetChannelID(), true);
if (channel) { if (channel) {
char *buffer; char *buffer;
asprintf(&buffer, "%-17.*s\t%.*s %s - %s", 17, channel->Name(), 5, eventInfo->GetDate(), eventInfo->GetTimeString(), eventInfo->GetEndTimeString()); asprintf(&buffer, "%-17.*s\t%.*s %s - %s", 17, channel->Name(), 5, eventInfo->GetDate(), eventInfo->GetTimeString(), eventInfo->GetEndTimeString());
@ -1183,7 +1188,7 @@ cMenuWhatsOn::cMenuWhatsOn(const cSchedules *Schedules, bool Now, int CurrentCha
pArray[num] = Now ? Schedule->GetPresentEvent() : Schedule->GetFollowingEvent(); pArray[num] = Now ? Schedule->GetPresentEvent() : Schedule->GetFollowingEvent();
if (pArray[num]) { if (pArray[num]) {
cChannel *channel = Channels.GetByChannelID(pArray[num]->GetChannelID()); cChannel *channel = Channels.GetByChannelID(pArray[num]->GetChannelID(), true);
if (channel) { if (channel) {
pArray[num]->SetChannelNumber(channel->Number()); pArray[num]->SetChannelNumber(channel->Number());
num++; num++;
@ -1213,7 +1218,7 @@ eOSState cMenuWhatsOn::Switch(void)
{ {
cMenuWhatsOnItem *item = (cMenuWhatsOnItem *)Get(Current()); cMenuWhatsOnItem *item = (cMenuWhatsOnItem *)Get(Current());
if (item) { if (item) {
cChannel *channel = Channels.GetByChannelID(item->eventInfo->GetChannelID()); cChannel *channel = Channels.GetByChannelID(item->eventInfo->GetChannelID(), true);
if (channel && cDevice::PrimaryDevice()->SwitchChannel(channel, true)) if (channel && cDevice::PrimaryDevice()->SwitchChannel(channel, true))
return osEnd; return osEnd;
} }
@ -1397,7 +1402,7 @@ eOSState cMenuSchedule::ProcessKey(eKeys Key)
if (!now && !next) { if (!now && !next) {
int ChannelNr = 0; int ChannelNr = 0;
if (Count()) { if (Count()) {
cChannel *channel = Channels.GetByChannelID(((cMenuScheduleItem *)Get(Current()))->eventInfo->GetChannelID()); cChannel *channel = Channels.GetByChannelID(((cMenuScheduleItem *)Get(Current()))->eventInfo->GetChannelID(), true);
if (channel) if (channel)
ChannelNr = channel->Number(); ChannelNr = channel->Number();
} }
@ -1424,7 +1429,7 @@ eOSState cMenuSchedule::ProcessKey(eKeys Key)
now = next = false; now = next = false;
const cEventInfo *ei = cMenuWhatsOn::ScheduleEventInfo(); const cEventInfo *ei = cMenuWhatsOn::ScheduleEventInfo();
if (ei) { if (ei) {
cChannel *channel = Channels.GetByChannelID(ei->GetChannelID()); cChannel *channel = Channels.GetByChannelID(ei->GetChannelID(), true);
if (channel) { if (channel) {
PrepareSchedule(channel); PrepareSchedule(channel);
if (channel->Number() != cDevice::CurrentChannel()) { if (channel->Number() != cDevice::CurrentChannel()) {

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: timers.c 1.2 2002/11/10 10:19:12 kls Exp $ * $Id: timers.c 1.3 2002/11/24 14:29:21 kls Exp $
*/ */
#include "timers.h" #include "timers.h"
@ -49,7 +49,7 @@ cTimer::cTimer(const cEventInfo *EventInfo)
startTime = stopTime = 0; startTime = stopTime = 0;
recording = pending = false; recording = pending = false;
active = true; active = true;
channel = Channels.GetByChannelID(EventInfo->GetChannelID()); channel = Channels.GetByChannelID(EventInfo->GetChannelID(), true);
time_t tstart = EventInfo->GetTime(); time_t tstart = EventInfo->GetTime();
time_t tstop = tstart + EventInfo->GetDuration() + Setup.MarginStop * 60; time_t tstop = tstart + EventInfo->GetDuration() + Setup.MarginStop * 60;
tstart -= Setup.MarginStart * 60; tstart -= Setup.MarginStart * 60;
@ -97,7 +97,7 @@ const char *cTimer::ToText(bool UseChannelID)
free(buffer); free(buffer);
strreplace(file, ':', '|'); strreplace(file, ':', '|');
strreplace(summary, '\n', '|'); strreplace(summary, '\n', '|');
asprintf(&buffer, "%d:%s:%s:%04d:%04d:%d:%d:%s:%s\n", active, UseChannelID ? Channel()->GetChannelIDStr() : itoa(Channel()->Number()), PrintDay(day, firstday), start, stop, priority, lifetime, file, summary ? summary : ""); asprintf(&buffer, "%d:%s:%s:%04d:%04d:%d:%d:%s:%s\n", active, UseChannelID ? Channel()->GetChannelID().ToString() : itoa(Channel()->Number()), PrintDay(day, firstday), start, stop, priority, lifetime, file, summary ? summary : "");
strreplace(summary, '|', '\n'); strreplace(summary, '|', '\n');
strreplace(file, '|', ':'); strreplace(file, '|', ':');
return buffer; return buffer;
@ -216,8 +216,8 @@ bool cTimer::Parse(const char *s)
strn0cpy(file, filebuffer, MaxFileName); strn0cpy(file, filebuffer, MaxFileName);
strreplace(file, '|', ':'); strreplace(file, '|', ':');
strreplace(summary, '|', '\n'); strreplace(summary, '|', '\n');
uint64 cid = cChannel::StringToChannelID(channelbuffer); tChannelID cid = tChannelID::FromString(channelbuffer);
channel = cid ? Channels.GetByChannelID(cid) : Channels.GetByNumber(atoi(channelbuffer)); channel = cid.Valid() ? Channels.GetByChannelID(cid) : Channels.GetByNumber(atoi(channelbuffer));
if (!channel) { if (!channel) {
esyslog("ERROR: channel %s not defined", channelbuffer); esyslog("ERROR: channel %s not defined", channelbuffer);
result = false; result = false;

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: timers.h 1.2 2002/11/10 10:17:05 kls Exp $ * $Id: timers.h 1.3 2002/11/24 11:50:56 kls Exp $
*/ */
#ifndef __TIMERS_H #ifndef __TIMERS_H
@ -12,6 +12,7 @@
#include "channels.h" #include "channels.h"
#include "config.h" #include "config.h"
#include "eit.h"
#include "tools.h" #include "tools.h"
enum eTimerActive { taInactive = 0, enum eTimerActive { taInactive = 0,

23
vdr.5
View File

@ -8,7 +8,7 @@
.\" License as specified in the file COPYING that comes with the .\" License as specified in the file COPYING that comes with the
.\" vdr distribution. .\" vdr distribution.
.\" .\"
.\" $Id: vdr.5 1.12 2002/11/10 10:10:15 kls Exp $ .\" $Id: vdr.5 1.13 2002/11/24 13:48:13 kls Exp $
.\" .\"
.TH vdr 5 "10 Nov 2002" "1.2.0" "Video Disk Recorder Files" .TH vdr 5 "10 Nov 2002" "1.2.0" "Video Disk Recorder Files"
.SH NAME .SH NAME
@ -38,7 +38,7 @@ The given number must be larger than the number of any previous channel
A \fBchannel definition\fR is a line with channel data, where the fields A \fBchannel definition\fR is a line with channel data, where the fields
are separated by ':' characters. Example: are separated by ':' characters. Example:
\fBRTL:12188:h:S19.2E:27500:163:104:105:0:12003\fR \fBRTL:12188:h:S19.2E:27500:163:104:105:0:12003:0:0:0\fR
The line number of a channel definition (not counting group separators, The line number of a channel definition (not counting group separators,
and based on a possible previous '@...' parameter) and based on a possible previous '@...' parameter)
@ -119,16 +119,27 @@ l l.
.TE .TE
.TP .TP
.B SID .B SID
The service ID of this channel. The Service ID of this channel.
.TP
.B NID
The Network ID of this channel (for future use, currently always 0).
.TP
.B TID
The Transport stream ID of this channel (for future use, currently always 0).
.TP
.B RID
The Radio ID of this channel (typically 0, may be used to distinguish channels where
NID, TID and SID are all equal).
.PP .PP
A particular channel can be uniquely identified by its \fBchannel\ ID\fR, A particular channel can be uniquely identified by its \fBchannel\ ID\fR,
which is a string that looks like this: which is a string that looks like this:
\fBS19.2E-0-12188-12003\fR \fBS19.2E-0-12188-12003-0\fR
The components of this string are the \fBSource\fR (S19.2E), \fBFrequency\fR The components of this string are the \fBSource\fR (S19.2E), \fBFrequency\fR
(12188, MHz) and \fBSID\fR (12003) as defined above. The part that is currently (12188, MHz) and \fBSID\fR (12003) as defined above. The parts that are currently
\fB0\fR is reserved for future use. \fB0\fR are reserved for future use (the last part can be omitted if it is \fB0\fR,
so the above example could also be written as \fBS19.2E-0-12188-12003\fR).
.br .br
The \fBchannel\ ID\fR is used in the \fItimers.conf\fR and \fIepg.data\fR The \fBchannel\ ID\fR is used in the \fItimers.conf\fR and \fIepg.data\fR
files to properly identify the channels. files to properly identify the channels.