Version 1.3.4

- Fixed handling language codes in case there is no audio or Dolby PID.
- Fixed handling CA ids (was broken in 1.3.3).
- Fixed the SVDRP command 'STAT DISK' to avoid a 'division by 0' in case the
  disk is full (thanks to Jens Rosenboom).
- Fixed handling bitmap indexes for 256 color mode (thanks to Andreas Regel).
- Now handling "linked services" (based on the 'autopid' patch from Andreas
  Schultz). Linked channels are detected and added to 'channels.conf', but
  currently they are not yet presented to the user other than being in the
  normal channel list (this will come later).
- Preliminary fix for the "Unknown picture type error" (thanks to Sascha
  Volkenandt for his support in debugging this one). This may slow down switching
  between channels on different transponders for now, but a better solution will
  come later.
- Fixed the validity check for channel IDs, because some providers use TIDs with
  value 0 (thanks to Thomas Bergwinkl).
- Enabled switching to a channel even if it has no Vpid or Apid set, because these
  might be automatically set when tuned to that transponder.
- No longer closing the Channels menu after trying to switch to a channel that
  is currently not available.
- Removed the now obsolete CaCaps stuff. The Setup/CICAM menu now displays the
  actual CAM type as reported by the CAM. The 'ca.conf' file has been stripped
  down to the values 0..4.
This commit is contained in:
Klaus Schmidinger 2004-02-08 18:00:00 +01:00
parent 7c5ef5dbba
commit 3fc2965975
22 changed files with 245 additions and 211 deletions

View File

@ -685,6 +685,7 @@ Sascha Volkenandt <sascha@akv-soft.de>
for reporting a problem with cReceivers that use a ring buffer and didn't immediately for reporting a problem with cReceivers that use a ring buffer and didn't immediately
return from their Receive() function if the buffer runs full return from their Receive() function if the buffer runs full
for reporting a crash in case there is no DVB hardware present for reporting a crash in case there is no DVB hardware present
for his support in debugging the the "Unknown picture type error"
Malcolm Caldwell <malcolm.caldwell@ntu.edu.au> Malcolm Caldwell <malcolm.caldwell@ntu.edu.au>
for modifying LOF handling to allow for C-band reception for modifying LOF handling to allow for C-band reception
@ -921,3 +922,14 @@ Christian Tramnitz <maillist@tramnitz.com>
for terrestrial transponders for terrestrial transponders
for his support in debugging a problem in setting the source type for newly for his support in debugging a problem in setting the source type for newly
detected terrestrial transponders detected terrestrial transponders
Jens Rosenboom <me@jayr.de>
for fixing the SVDRP command 'STAT DISK' to avoid a 'division by 0' in case
the disk is full
Andreas Regel <andreas.regel@gmx.de>
for fixing handling bitmap indexes for 256 color mode
Thomas Bergwinkl <Thomas.Bergwinkl@t-online.de>
for fixing the validity check for channel IDs, because some providers use TIDs
with value 0

25
HISTORY
View File

@ -2626,3 +2626,28 @@ Video Disk Recorder Revision History
code (see man vdr(5)). Currently this is only stored and not yet used otherwise. code (see man vdr(5)). Currently this is only stored and not yet used otherwise.
- Added a call to cStatus::MsgOsdCurrentItem() to cMenuEditItem::SetValue() - Added a call to cStatus::MsgOsdCurrentItem() to cMenuEditItem::SetValue()
(thanks to Martin Hammerschmid). (thanks to Martin Hammerschmid).
2004-02-08: Version 1.3.4
- Fixed handling language codes in case there is no audio or Dolby PID.
- Fixed handling CA ids (was broken in 1.3.3).
- Fixed the SVDRP command 'STAT DISK' to avoid a 'division by 0' in case the
disk is full (thanks to Jens Rosenboom).
- Fixed handling bitmap indexes for 256 color mode (thanks to Andreas Regel).
- Now handling "linked services" (based on the 'autopid' patch from Andreas
Schultz). Linked channels are detected and added to 'channels.conf', but
currently they are not yet presented to the user other than being in the
normal channel list (this will come later).
- Preliminary fix for the "Unknown picture type error" (thanks to Sascha
Volkenandt for his support in debugging this one). This may slow down switching
between channels on different transponders for now, but a better solution will
come later.
- Fixed the validity check for channel IDs, because some providers use TIDs with
value 0 (thanks to Thomas Bergwinkl).
- Enabled switching to a channel even if it has no Vpid or Apid set, because these
might be automatically set when tuned to that transponder.
- No longer closing the Channels menu after trying to switch to a channel that
is currently not available.
- Removed the now obsolete CaCaps stuff. The Setup/CICAM menu now displays the
actual CAM type as reported by the CAM. The 'ca.conf' file has been stripped
down to the values 0..4.

View File

@ -30,7 +30,7 @@ Here's a list of the highlights - and what _not_ to expect yet
to have them start at some high number. to have them start at some high number.
- Improved CAM support. Channels with conditional access now automatically - Improved CAM support. Channels with conditional access now automatically
use the device that contains the proper CAM. use the device that contains the proper CAM.
- No NVOD or "linked services" support yet. - No NVOD support yet.
Note that this is currently work in progress, so there may be some Note that this is currently work in progress, so there may be some
areas that don't work as smooth as expected, yet. areas that don't work as smooth as expected, yet.
@ -47,7 +47,7 @@ Known issues:
EURO1080:12168:v:S19.2E:27500:308:256:0:FF:21100:1:1088:0 EURO1080:12168:v:S19.2E:27500:308:256:0:FF:21100:1:1088:0
in your 'channels.conf' file. Note the Ca parameter 'F' (255 in hex), in your 'channels.conf' file. Note the Ca parameter 'FF' (255 in hex),
which gives this channel a non-existent Ca mode, so that it won't which gives this channel a non-existent Ca mode, so that it won't
be tuned to at all. If you really want to tune to this channel for be tuned to at all. If you really want to tune to this channel for
tests, do it on your own risk. tests, do it on your own risk.

83
ca.conf
View File

@ -9,89 +9,6 @@
0 Free To Air 0 Free To Air
# BetaCrypt
101 Premiere World
102 ORF
103 DIGI-Kabel
# Cryptoworks
201 GOD-DIGITAL
202 Slovak Link
203 Czech Link
# Videoguard
301 Sky Digital
# Viaccess 1
401 SRG Swiss
402 NTV Plus
403 Viasat
404 Parabole Reunion
405 Hrvatska radiotelevizija
406 RTV Slovenija
407 Visat
# Viaccess 2
501 Alpha Digital Greece
# Cryptoworks
601 UPC Direct
602 DigiTurk
# Mediaguard
701 CanalSatellite Reunion
# Mediaguard 2
801 Orbit Network
# Nagravision
901 PolSat Cyfrowy
902 TV Cabo
# Irdeto 2
1001 ADD
1002 Nova Greece
1003 Multichoice Africa
# Conax
1101 Canal Digital Scandinavia
# Mediaguard, Viaccess 1, Viaccess 2
10001 AB Sat France
10002 TPS France
# Videoguard, Mediaguard 2, Irdeto 2
12001 Sky Italia
# Mediaguard 1, Irdeto 1
13001 Canal Digitaal Satelliet NL
# Mediaguard 1, Mediaguard 2, Viaccess 1
14001 Canal Satellite France
# Mediaguard 2, Nagravision
15001 Digital+ Espana
# Mediaguard 2, Cryptoworks
16001 Cyfra+ Polska
# Special values to "hard code" a channel to a specific DVB card: # Special values to "hard code" a channel to a specific DVB card:
1 DVB 1 1 DVB 1

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: channels.c 1.20 2004/01/25 15:32:08 kls Exp $ * $Id: channels.c 1.23 2004/02/08 11:05:22 kls Exp $
*/ */
#include "channels.h" #include "channels.h"
@ -169,11 +169,13 @@ cChannel::cChannel(void)
guard = GUARD_INTERVAL_AUTO; guard = GUARD_INTERVAL_AUTO;
hierarchy = HIERARCHY_AUTO; hierarchy = HIERARCHY_AUTO;
modification = CHANNELMOD_NONE; modification = CHANNELMOD_NONE;
linkChannels = NULL;
refChannel = NULL;
} }
cChannel::cChannel(const cChannel *Channel) cChannel::cChannel(const cChannel &Channel)
{ {
*this = *Channel; *this = Channel;
*name = 0; *name = 0;
vpid = 0; vpid = 0;
ppid = 0; ppid = 0;
@ -188,6 +190,28 @@ cChannel::cChannel(const cChannel *Channel)
number = 0; number = 0;
groupSep = false; groupSep = false;
modification = CHANNELMOD_NONE; modification = CHANNELMOD_NONE;
linkChannels = NULL;
refChannel = NULL;
}
cChannel::~cChannel()
{
delete linkChannels;
linkChannels = NULL; // more than one channel can link to this one, so we need the following loop
for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) {
if (Channel->linkChannels) {
for (cLinkChannel *lc = Channel->linkChannels->First(); lc; lc = Channel->linkChannels->Next(lc)) {
if (lc->Channel() == this) {
Channel->linkChannels->Del(lc);
break;
}
}
if (Channel->linkChannels->Count() == 0) {
delete Channel->linkChannels;
Channel->linkChannels = NULL;
}
}
}
} }
cChannel& cChannel::operator= (const cChannel &Channel) cChannel& cChannel::operator= (const cChannel &Channel)
@ -320,8 +344,10 @@ static int IntArrayToString(char *s, const int *a, int Base = 10, const char n[]
int i = 0; int i = 0;
while (a[i] || i == 0) { while (a[i] || i == 0) {
q += sprintf(q, Base == 16 ? "%s%X" : "%s%d", i ? "," : "", a[i]); q += sprintf(q, Base == 16 ? "%s%X" : "%s%d", i ? "," : "", a[i]);
if (n && *n[i]) if (a[i] && n && *n[i])
q += sprintf(q, "=%s", n[i]); q += sprintf(q, "=%s", n[i]);
if (!a[i])
break;
i++; i++;
} }
*q = 0; *q = 0;
@ -375,8 +401,11 @@ void cChannel::SetCaIds(const int *CaIds)
IntArrayToString(OldCaIdsBuf, caids, 16); IntArrayToString(OldCaIdsBuf, caids, 16);
IntArrayToString(NewCaIdsBuf, CaIds, 16); IntArrayToString(NewCaIdsBuf, CaIds, 16);
dsyslog("changing caids of channel %d from %s to %s", Number(), OldCaIdsBuf, NewCaIdsBuf); dsyslog("changing caids of channel %d from %s to %s", Number(), OldCaIdsBuf, NewCaIdsBuf);
for (int i = 0; i <= MAXCAIDS && CaIds[i]; i++) // <= to copy the terminating 0 for (int i = 0; i <= MAXCAIDS; i++) { // <= to copy the terminating 0
caids[i] = CaIds[i]; caids[i] = CaIds[i];
if (!CaIds[i])
break;
}
modification |= CHANNELMOD_CA; modification |= CHANNELMOD_CA;
Channels.SetModified(); Channels.SetModified();
} }
@ -392,6 +421,57 @@ void cChannel::SetCaDescriptors(int Level)
} }
} }
void cChannel::SetLinkChannels(cLinkChannels *LinkChannels)
{
if (!linkChannels && !LinkChannels)
return;
if (linkChannels && LinkChannels) {
cLinkChannel *lca = linkChannels->First();
cLinkChannel *lcb = LinkChannels->First();
while (lca && lcb) {
if (lca->Channel() != lcb->Channel()) {
lca = NULL;
break;
}
lca = linkChannels->Next(lca);
lcb = LinkChannels->Next(lcb);
}
if (!lca && !lcb) {
delete LinkChannels;
return; // linkage has not changed
}
}
char buffer[((linkChannels ? linkChannels->Count() : 0) + (LinkChannels ? LinkChannels->Count() : 0)) * 6 + 256]; // 6: 5 digit channel number plus blank, 256: other texts (see below) plus reserve
char *q = buffer;
q += sprintf(q, "linking channel %d from", Number());
if (linkChannels) {
for (cLinkChannel *lc = linkChannels->First(); lc; lc = linkChannels->Next(lc)) {
lc->Channel()->SetRefChannel(NULL);
q += sprintf(q, " %d", lc->Channel()->Number());
}
delete linkChannels;
}
else
q += sprintf(q, " none");
q += sprintf(q, " to");
linkChannels = LinkChannels;
if (linkChannels) {
for (cLinkChannel *lc = linkChannels->First(); lc; lc = linkChannels->Next(lc)) {
lc->Channel()->SetRefChannel(this);
q += sprintf(q, " %d", lc->Channel()->Number());
//dsyslog("link %4d -> %4d: %s", Number(), lc->Channel()->Number(), lc->Channel()->Name());
}
}
else
q += sprintf(q, " none");
dsyslog(buffer);
}
void cChannel::SetRefChannel(cChannel *RefChannel)
{
refChannel = RefChannel;
}
static int PrintParameter(char *p, char Name, int Value) static int PrintParameter(char *p, char Name, int Value)
{ {
return Value >= 0 && Value != 999 ? sprintf(p, "%c%d", Name, Value) : 0; return Value >= 0 && Value != 999 ? sprintf(p, "%c%d", Name, Value) : 0;
@ -771,7 +851,7 @@ cChannel *cChannels::NewChannel(const cChannel *Transponder, const char *Name, i
{ {
if (Transponder) { if (Transponder) {
dsyslog("creating new channel '%s' on %s transponder %d with id %d-%d-%d-%d", Name, cSource::ToString(Transponder->Source()), Transponder->Transponder(), Nid, Tid, Sid, Rid); dsyslog("creating new channel '%s' on %s transponder %d with id %d-%d-%d-%d", Name, cSource::ToString(Transponder->Source()), Transponder->Transponder(), Nid, Tid, Sid, Rid);
cChannel *NewChannel = new cChannel(Transponder); cChannel *NewChannel = new cChannel(*Transponder);
Add(NewChannel); Add(NewChannel);
ReNumber(); ReNumber();
NewChannel->SetId(Nid, Tid, Sid, Rid, false); NewChannel->SetId(Nid, Tid, Sid, Rid, false);

View File

@ -11,7 +11,7 @@ WDR K
BR-alpha:11836:hC34:S19.2E:27500:701:702=deu:704:0:28112:1:1101:0 BR-alpha:11836:hC34:S19.2E:27500:701:702=deu:704:0:28112:1:1101:0
SÜDWEST BW:11836:hC34:S19.2E:27500:801:802=deu:804:0:28113:1:1101:0 SÜDWEST BW:11836:hC34:S19.2E:27500:801:802=deu:804:0:28113:1:1101:0
Phoenix:11836:hC34:S19.2E:27500:901:902=deu:904:0:28114:1:1101:0 Phoenix:11836:hC34:S19.2E:27500:901:902=deu:904:0:28114:1:1101:0
ZDF:11953:hC34:S19.2E:27500:110:120=deu;125=deu:130:3:28006:1:1079:0 ZDF:11953:hC34:S19.2E:27500:110:120=deu;125=deu:130:0:28006:1:1079:0
3sat:11953:hC34:S19.2E:27500:210:220=deu:230:0:28007:1:1079:0 3sat:11953:hC34:S19.2E:27500:210:220=deu:230:0:28007:1:1079:0
KiKa:11953:hC34:S19.2E:27500:310:320=deu:330:0:28008:1:1079:0 KiKa:11953:hC34:S19.2E:27500:310:320=deu:330:0:28008:1:1079:0
arte:11836:hC34:S19.2E:27500:401:402=deu,403=fra:404:0:28109:1:1101:0 arte:11836:hC34:S19.2E:27500:401:402=deu,403=fra:404:0:28109:1:1101:0
@ -30,7 +30,7 @@ EURONEWS:11817:vC34:S19.2E:27500:163:92=fra,93=eng,94=ita,95=esl,91=rus,98=por,9
Sky News:11597:vC56:S19.2E:22000:305:306=eng:0:0:28707:1:1026:0 Sky News:11597:vC56:S19.2E:22000:305:306=eng:0:0:28707:1:1026:0
Veronica/FoxKids:12574:hC56:S19.2E:22000:518+8190:92=dut:38:622,602,100:5020:53:1109:0 Veronica/FoxKids:12574:hC56:S19.2E:22000:518+8190:92=dut:38:622,602,100:5020:53:1109:0
BVN:12574:hC56:S19.2E:22000:515+8190:96=dut:36:0:5025:53:1109:0 BVN:12574:hC56:S19.2E:22000:515+8190:96=dut:36:0:5025:53:1109:0
CNBC Europe:12610:vC56:S19.2E:22000:944:945=eng:0:0:12200:1:1112:0 CNBC Europe:12610:vC56:S19.2E:22000:944:945=eng:946:0:12200:1:1112:0
n-tv:12669:vC56:S19.2E:22000:162:96=deu:55:0:12730:1:1116:0 n-tv:12669:vC56:S19.2E:22000:162:96=deu:55:0:12730:1:1116:0
Al Jazeera:11567:vC56:S19.2E:22000:55:56=ara:0:0:9021:1:1024:0 Al Jazeera:11567:vC56:S19.2E:22000:55:56=ara:0:0:9021:1:1024:0
TW1:12692:hC56:S19.2E:22000:166:167=deu:168:0:13013:1:1117:0 TW1:12692:hC56:S19.2E:22000:166:167=deu:168:0:13013:1:1117:0
@ -47,7 +47,7 @@ RBB Berlin:12109:hC34:S19.2E:27500:601:602=deu:604:0:28206:1:1073:0
START,PREMIERE START:11797:hC34:S19.2E:27500:255:256=deu:32:1702,1722,1801:8:133:2:0 START,PREMIERE START:11797:hC34:S19.2E:27500:255:256=deu:32:1702,1722,1801:8:133:2:0
PREM 1,PREMIERE 1:11797:hC34:S19.2E:27500:511:512=deu;515=deu:0:1702,1722,1801:10:133:2:0 PREM 1,PREMIERE 1:11797:hC34:S19.2E:27500:511:512=deu;515=deu:0:1702,1722,1801:10:133:2:0
PREM 2,PREMIERE 2:11797:hC34:S19.2E:27500:1791:1792=deu;1795=deu:0:1702,1722,1801:11:133:2:0 PREM 2,PREMIERE 2:11797:hC34:S19.2E:27500:1791:1792=deu;1795=deu:0:1702,1722,1801:11:133:2:0
PREM 3,PREMIERE 3:11797:hC34:S19.2E:27500:2303:2304=deu,2305=deu:0:1702,1722,1801:43:133:2:0 PREM 3,PREMIERE 3:11797:hC34:S19.2E:27500:2303:2304=deu:0:1702,1722,1801:43:133:2:0
PREM 4,PREMIERE 4:11797:hC34:S19.2E:27500:767:768=deu:0:1702,1722,1801:9:133:2:0 PREM 4,PREMIERE 4:11797:hC34:S19.2E:27500:767:768=deu:0:1702,1722,1801:9:133:2:0
PREM 5,PREMIERE 5:11797:hC34:S19.2E:27500:1279:1280=deu:0:1702,1722,1801:29:133:2:0 PREM 5,PREMIERE 5:11797:hC34:S19.2E:27500:1279:1280=deu:0:1702,1722,1801:29:133:2:0
PREM 6,PREMIERE 6:11797:hC34:S19.2E:27500:1535:1536=deu:0:1702,1722,1801:41:133:2:0 PREM 6,PREMIERE 6:11797:hC34:S19.2E:27500:1535:1536=deu:0:1702,1722,1801:41:133:2:0
@ -59,7 +59,7 @@ DIREKT,PREMIERE DIREKT:12031:hC34:S19.2E:27500:2815:2816=deu,2817=deu;2819=deu:0
B-UHSE,BEATE-UHSE.TV:12070:hC34:S19.2E:27500:1023:1024=deu:0:1702,1722,1801:21:133:1:0 B-UHSE,BEATE-UHSE.TV:12070:hC34:S19.2E:27500:1023:1024=deu:0:1702,1722,1801:21:133:1:0
EROTIK,PREMIERE EROTIK:12031:hC34:S19.2E:27500:1279:0:0:1702,1722,1801:513:133:4:0 EROTIK,PREMIERE EROTIK:12031:hC34:S19.2E:27500:1279:0:0:1702,1722,1801:513:133:4:0
:Sportsworld :Sportsworld
SPORT 1,PREMIERE SPORT 1:11719:hC34:S19.2E:27500:255:256=deu,257=deu:0:1702,1722,1801:17:133:3:0 Konferenz:11719:hC34:S19.2E:27500:255:256=deu,257=deu:0:1702,1722,1801:17:133:3:0
SPORT 2,PREMIERE SPORT 2:12031:hC34:S19.2E:27500:3839:3840=deu,3841=deu:0:1702,1722,1801:27:133:4:0 SPORT 2,PREMIERE SPORT 2:12031:hC34:S19.2E:27500:3839:3840=deu,3841=deu:0:1702,1722,1801:27:133:4:0
:Beta Digital :Beta Digital
N24:12480:vC34:S19.2E:27500:2047:2048:36:0:47:133:33:0 N24:12480:vC34:S19.2E:27500:2047:2048:36:0:47:133:33:0
@ -68,7 +68,7 @@ Liberty TV.com:12610:vC56:S19.2E:22000:941:943=deu:0:0:12199:1:1112:0
ProSieben Austria:12051:vC34:S19.2E:27500:161:84=deu:36:0:20002:1:1082:0 ProSieben Austria:12051:vC34:S19.2E:27500:161:84=deu:36:0:20002:1:1082:0
Kabel 1 Schweiz:12051:vC34:S19.2E:27500:162:163=deu:165:0:20003:1:1082:0 Kabel 1 Schweiz:12051:vC34:S19.2E:27500:162:163=deu:165:0:20003:1:1082:0
Kabel 1 Austria:12051:vC34:S19.2E:27500:166:167=deu:169:0:20004:1:1082:0 Kabel 1 Austria:12051:vC34:S19.2E:27500:166:167=deu:169:0:20004:1:1082:0
ProSieben Schweiz:12051:vC34:S19.2E:27500:289:290:33:0:20001:1:1082:0 ProSieben Schweiz:12051:vC34:S19.2E:27500:289:290=deu:33:0:20001:1:1082:0
FRANCE 5:12207:vC34:S19.2E:27500:160:80=fra:32:0:8501:1:1090:0 FRANCE 5:12207:vC34:S19.2E:27500:160:80=fra:32:0:8501:1:1090:0
LCP:12207:vC34:S19.2E:27500:165:100=fra:0:0:8506:1:1090:0 LCP:12207:vC34:S19.2E:27500:165:100=fra:0:0:8506:1:1090:0
ESCALES:12285:vC34:S19.2E:27500:165:100:0:500,100:17025:1:1094:0 ESCALES:12285:vC34:S19.2E:27500:165:100:0:500,100:17025:1:1094: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.13 2004/01/25 15:31:16 kls Exp $ * $Id: channels.h 1.15 2004/02/08 12:20:22 kls Exp $
*/ */
#ifndef __CHANNELS_H #ifndef __CHANNELS_H
@ -59,13 +59,26 @@ public:
tChannelID(void) { source = nid = tid = sid = rid = 0; } 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; } 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 operator== (const tChannelID &arg) const;
bool Valid(void) { return tid && sid; } // nid and rid are optional and source may be 0//XXX source may not be 0??? bool Valid(void) { return (nid || tid) && sid; } // rid is optional and source may be 0//XXX source may not be 0???
tChannelID &ClrRid(void) { rid = 0; return *this; } tChannelID &ClrRid(void) { rid = 0; return *this; }
static tChannelID FromString(const char *s); static tChannelID FromString(const char *s);
const char *ToString(void); const char *ToString(void);
static const tChannelID InvalidID; static const tChannelID InvalidID;
}; };
class cChannel;
class cLinkChannel : public cListObject {
private:
cChannel *channel;
public:
cLinkChannel(cChannel *Channel) { channel = Channel; }
cChannel *Channel(void) { return channel; }
};
class cLinkChannels : public cList<cLinkChannel> {
};
class cChannel : public cListObject { class cChannel : public cListObject {
friend class cMenuEditChannel; friend class cMenuEditChannel;
private: private:
@ -102,11 +115,14 @@ private:
int hierarchy; int hierarchy;
int __EndData__; int __EndData__;
int modification; int modification;
cLinkChannels *linkChannels;
cChannel *refChannel;
const char *ParametersToString(void); const char *ParametersToString(void);
bool StringToParameters(const char *s); bool StringToParameters(const char *s);
public: public:
cChannel(void); cChannel(void);
cChannel(const cChannel *Channel); cChannel(const cChannel &Channel);
~cChannel();
cChannel& operator= (const cChannel &Channel); cChannel& operator= (const cChannel &Channel);
const char *ToText(void); const char *ToText(void);
bool Parse(const char *s, bool AllowNonUniqueID = false); bool Parse(const char *s, bool AllowNonUniqueID = false);
@ -153,6 +169,8 @@ public:
void SetPids(int Vpid, int Ppid, int *Apids, char ALangs[][4], int *Dpids, char DLangs[][4], int Tpid); void SetPids(int Vpid, int Ppid, int *Apids, char ALangs[][4], int *Dpids, char DLangs[][4], int Tpid);
void SetCaIds(const int *CaIds); // list must be zero-terminated void SetCaIds(const int *CaIds); // list must be zero-terminated
void SetCaDescriptors(int Level); void SetCaDescriptors(int Level);
void SetLinkChannels(cLinkChannels *LinkChannels);
void SetRefChannel(cChannel *RefChannel);
}; };
class cChannels : public cRwLock, public cConfig<cChannel> { class cChannels : public cRwLock, public cConfig<cChannel> {

10
ci.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: ci.c 1.21 2004/01/02 15:07:36 kls Exp $ * $Id: ci.c 1.22 2004/02/08 15:02:04 kls Exp $
*/ */
#include "ci.h" #include "ci.h"
@ -763,6 +763,7 @@ public:
virtual ~cCiApplicationInformation(); virtual ~cCiApplicationInformation();
virtual bool Process(int Length = 0, const uint8_t *Data = NULL); virtual bool Process(int Length = 0, const uint8_t *Data = NULL);
bool EnterMenu(void); bool EnterMenu(void);
const char *GetMenuString(void) { return menuString; }
}; };
cCiApplicationInformation::cCiApplicationInformation(int SessionId, cCiTransportConnection *Tc) cCiApplicationInformation::cCiApplicationInformation(int SessionId, cCiTransportConnection *Tc)
@ -1559,6 +1560,13 @@ cCiEnquiry *cCiHandler::GetEnquiry(void)
return NULL; return NULL;
} }
const char *cCiHandler::GetCamName(int Slot)
{
cMutexLock MutexLock(&mutex);
cCiApplicationInformation *ai = (cCiApplicationInformation *)GetSessionByResourceId(RI_APPLICATION_INFORMATION, Slot);
return ai ? ai->GetMenuString() : NULL;
}
const unsigned short *cCiHandler::GetCaSystemIds(int Slot) const unsigned short *cCiHandler::GetCaSystemIds(int Slot)
{ {
cMutexLock MutexLock(&mutex); cMutexLock MutexLock(&mutex);

3
ci.h
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: ci.h 1.12 2003/12/31 13:49:49 kls Exp $ * $Id: ci.h 1.13 2004/02/08 14:36:23 kls Exp $
*/ */
#ifndef __CI_H #ifndef __CI_H
@ -110,6 +110,7 @@ public:
bool EnterMenu(int Slot); bool EnterMenu(int Slot);
cCiMenu *GetMenu(void); cCiMenu *GetMenu(void);
cCiEnquiry *GetEnquiry(void); cCiEnquiry *GetEnquiry(void);
const char *GetCamName(int Slot);
const unsigned short *GetCaSystemIds(int Slot); const unsigned short *GetCaSystemIds(int Slot);
bool ProvidesCa(const unsigned short *CaSystemIds); //XXX Slot??? bool ProvidesCa(const unsigned short *CaSystemIds); //XXX Slot???
bool SetCaPmt(cCiCaPmt &CaPmt, int Slot); bool SetCaPmt(cCiCaPmt &CaPmt, int Slot);

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.c 1.121 2004/01/25 14:41:10 kls Exp $ * $Id: config.c 1.122 2004/02/08 15:04:41 kls Exp $
*/ */
#include "config.h" #include "config.h"
@ -286,7 +286,6 @@ cSetup::cSetup(void)
MultiSpeedMode = 0; MultiSpeedMode = 0;
ShowReplayMode = 0; ShowReplayMode = 0;
ResumeID = 0; ResumeID = 0;
memset(CaCaps, sizeof(CaCaps), 0);
CurrentChannel = -1; CurrentChannel = -1;
CurrentVolume = MAXVOLUME; CurrentVolume = MAXVOLUME;
} }
@ -352,50 +351,6 @@ bool cSetup::Load(const char *FileName)
return false; return false;
} }
void cSetup::StoreCaCaps(const char *Name)
{
cSetupLine *l;
while ((l = Get(Name)) != NULL)
Del(l);
for (int d = 0; d < MAXDEVICES; d++) {
char buffer[MAXPARSEBUFFER];
char *q = buffer;
*buffer = 0;
for (int i = 0; i < MAXCACAPS; i++) {
if (CaCaps[d][i]) {
if (!*buffer)
q += snprintf(buffer, sizeof(buffer), "%d", d + 1);
q += snprintf(q, sizeof(buffer) - (q - buffer), " %d", CaCaps[d][i]);
}
}
if (*buffer)
Store(Name, buffer, NULL, true);
}
}
bool cSetup::ParseCaCaps(const char *Value)
{
char *p;
int d = strtol(Value, &p, 10);
if (d > 0 && d <= MAXDEVICES) {
d--;
int i = 0;
while (p != Value && p && *p) {
if (i < MAXCACAPS) {
int c = strtol(p, &p, 10);
if (c > 0)
CaCaps[d][i++] = c;
else
return false;
}
else
return false;
}
return true;
}
return false;
}
void cSetup::StoreLanguages(const char *Name, int *Values) void cSetup::StoreLanguages(const char *Name, int *Values)
{ {
char buffer[I18nNumLanguages * 4]; char buffer[I18nNumLanguages * 4];
@ -473,7 +428,6 @@ bool cSetup::Parse(const char *Name, const char *Value)
else if (!strcasecmp(Name, "MultiSpeedMode")) MultiSpeedMode = atoi(Value); else if (!strcasecmp(Name, "MultiSpeedMode")) MultiSpeedMode = atoi(Value);
else if (!strcasecmp(Name, "ShowReplayMode")) ShowReplayMode = atoi(Value); else if (!strcasecmp(Name, "ShowReplayMode")) ShowReplayMode = atoi(Value);
else if (!strcasecmp(Name, "ResumeID")) ResumeID = atoi(Value); else if (!strcasecmp(Name, "ResumeID")) ResumeID = atoi(Value);
else if (!strcasecmp(Name, "CaCaps")) return ParseCaCaps(Value);
else if (!strcasecmp(Name, "CurrentChannel")) CurrentChannel = atoi(Value); else if (!strcasecmp(Name, "CurrentChannel")) CurrentChannel = atoi(Value);
else if (!strcasecmp(Name, "CurrentVolume")) CurrentVolume = atoi(Value); else if (!strcasecmp(Name, "CurrentVolume")) CurrentVolume = atoi(Value);
else else
@ -525,7 +479,6 @@ bool cSetup::Save(void)
Store("MultiSpeedMode", MultiSpeedMode); Store("MultiSpeedMode", MultiSpeedMode);
Store("ShowReplayMode", ShowReplayMode); Store("ShowReplayMode", ShowReplayMode);
Store("ResumeID", ResumeID); Store("ResumeID", ResumeID);
StoreCaCaps("CaCaps");
Store("CurrentChannel", CurrentChannel); Store("CurrentChannel", CurrentChannel);
Store("CurrentVolume", CurrentVolume); Store("CurrentVolume", CurrentVolume);

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.184 2004/01/24 10:03:55 kls Exp $ * $Id: config.h 1.186 2004/02/08 15:04:52 kls Exp $
*/ */
#ifndef __CONFIG_H #ifndef __CONFIG_H
@ -20,8 +20,8 @@
#include "i18n.h" #include "i18n.h"
#include "tools.h" #include "tools.h"
#define VDRVERSION "1.3.3" #define VDRVERSION "1.3.4"
#define VDRVERSNUM 10303 // Version * 10000 + Major * 100 + Minor #define VDRVERSNUM 10304 // Version * 10000 + Major * 100 + Minor
#define MAXPRIORITY 99 #define MAXPRIORITY 99
#define MAXLIFETIME 99 #define MAXLIFETIME 99
@ -194,8 +194,6 @@ public:
class cSetup : public cConfig<cSetupLine> { class cSetup : public cConfig<cSetupLine> {
friend class cPlugin; // needs to be able to call Store() friend class cPlugin; // needs to be able to call Store()
private: private:
void StoreCaCaps(const char *Name);
bool ParseCaCaps(const char *Value);
void StoreLanguages(const char *Name, int *Values); void StoreLanguages(const char *Name, int *Values);
bool ParseLanguages(const char *Value, int *Values); bool ParseLanguages(const char *Value, int *Values);
bool Parse(const char *Name, const char *Value); bool Parse(const char *Name, const char *Value);
@ -242,7 +240,6 @@ public:
int MultiSpeedMode; int MultiSpeedMode;
int ShowReplayMode; int ShowReplayMode;
int ResumeID; int ResumeID;
int CaCaps[MAXDEVICES][MAXCACAPS];
int CurrentChannel; int CurrentChannel;
int CurrentVolume; int CurrentVolume;
int __EndData__; int __EndData__;

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: device.c 1.52 2004/01/11 13:21:12 kls Exp $ * $Id: device.c 1.53 2004/02/08 15:05:11 kls Exp $
*/ */
#include "device.h" #include "device.h"
@ -56,10 +56,8 @@ cDevice::cDevice(void)
for (int i = 0; i < MAXRECEIVERS; i++) for (int i = 0; i < MAXRECEIVERS; i++)
receiver[i] = NULL; receiver[i] = NULL;
if (numDevices < MAXDEVICES) { if (numDevices < MAXDEVICES)
device[numDevices++] = this; device[numDevices++] = this;
SetCaCaps(cardIndex);
}
else else
esyslog("ERROR: too many devices!"); esyslog("ERROR: too many devices!");
} }
@ -200,16 +198,6 @@ cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool *NeedsDe
return d; return d;
} }
void cDevice::SetCaCaps(int Index)
{
for (int d = 0; d < numDevices; d++) {
if (Index < 0 || Index == device[d]->CardIndex()) {
for (int i = 0; i < MAXCACAPS; i++)
device[d]->caCaps[i] = Setup.CaCaps[device[d]->CardIndex()][i];
}
}
}
void cDevice::Shutdown(void) void cDevice::Shutdown(void)
{ {
for (int i = 0; i < numDevices; i++) { for (int i = 0; i < numDevices; i++) {

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: device.h 1.38 2004/01/10 14:15:10 kls Exp $ * $Id: device.h 1.39 2004/02/08 15:05:49 kls Exp $
*/ */
#ifndef __DEVICE_H #ifndef __DEVICE_H
@ -21,7 +21,6 @@
#include "tools.h" #include "tools.h"
#define MAXDEVICES 16 // the maximum number of devices in the system #define MAXDEVICES 16 // the maximum number of devices in the system
#define MAXCACAPS 16 // the maximum number of different CA values per device
#define MAXPIDHANDLES 16 // the maximum number of different PIDs per device #define MAXPIDHANDLES 16 // the maximum number of different PIDs per device
#define MAXRECEIVERS 16 // the maximum number of receivers per device #define MAXRECEIVERS 16 // the maximum number of receivers per device
#define MAXVOLUME 255 #define MAXVOLUME 255
@ -97,16 +96,12 @@ public:
///< given Priority. ///< given Priority.
///< See ProvidesChannel() for more information on how ///< See ProvidesChannel() for more information on how
///< priorities are handled, and the meaning of NeedsDetachReceivers. ///< priorities are handled, and the meaning of NeedsDetachReceivers.
static void SetCaCaps(int Index = -1);
///< Sets the CaCaps of the given device according to the Setup data.
///< By default the CaCaps of all devices are set.
static void Shutdown(void); static void Shutdown(void);
///< Closes down all devices. ///< Closes down all devices.
///< Must be called at the end of the program. ///< Must be called at the end of the program.
private: private:
static int nextCardIndex; static int nextCardIndex;
int cardIndex; int cardIndex;
int caCaps[MAXCACAPS];
protected: protected:
cDevice(void); cDevice(void);
virtual ~cDevice(); virtual ~cDevice();

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: dvbdevice.c 1.79 2004/01/25 13:50:21 kls Exp $ * $Id: dvbdevice.c 1.81 2004/02/08 14:07:07 kls Exp $
*/ */
#include "dvbdevice.h" #include "dvbdevice.h"
@ -680,7 +680,7 @@ bool cDvbDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *Ne
bool hasPriority = Priority < 0 || Priority > this->Priority(); bool hasPriority = Priority < 0 || Priority > this->Priority();
bool needsDetachReceivers = false; bool needsDetachReceivers = false;
if ((Channel->Vpid() || Channel->Apid1()) && ProvidesSource(Channel->Source()) && ProvidesCa(Channel)) { if (ProvidesSource(Channel->Source()) && ProvidesCa(Channel)) {
result = hasPriority; result = hasPriority;
if (Priority >= 0 && Receiving()) { if (Priority >= 0 && Receiving()) {
if (dvbTuner->IsTunedTo(Channel)) { if (dvbTuner->IsTunedTo(Channel)) {
@ -751,6 +751,11 @@ bool cDvbDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
dvbTuner->Set(Channel, DoTune, !EITScanner.UsesDevice(this)); //XXX 1.3: this is an ugly hack - find a cleaner solution//XXX dvbTuner->Set(Channel, DoTune, !EITScanner.UsesDevice(this)); //XXX 1.3: this is an ugly hack - find a cleaner solution//XXX
//XXX TODO preliminary fix for the "Unknown picture type" error
time_t t0 = time(NULL);
while (!dvbTuner->Locked() && time(NULL) - t0 < 5)
usleep(100);
//XXX
// PID settings: // PID settings:
if (TurnOnLivePIDs) { if (TurnOnLivePIDs) {

36
eit.c
View File

@ -8,7 +8,7 @@
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>. * Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
* Adapted to 'libsi' for VDR 1.3.0 by Marcel Wiesweg <marcel.wiesweg@gmx.de>. * Adapted to 'libsi' for VDR 1.3.0 by Marcel Wiesweg <marcel.wiesweg@gmx.de>.
* *
* $Id: eit.c 1.85 2004/01/09 15:44:43 kls Exp $ * $Id: eit.c 1.86 2004/02/08 10:26:54 kls Exp $
*/ */
#include "eit.h" #include "eit.h"
@ -95,6 +95,7 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data)
SI::Descriptor *d; SI::Descriptor *d;
SI::ExtendedEventDescriptors *ExtendedEventDescriptors = NULL; SI::ExtendedEventDescriptors *ExtendedEventDescriptors = NULL;
SI::ShortEventDescriptor *ShortEventDescriptor = NULL; SI::ShortEventDescriptor *ShortEventDescriptor = NULL;
cLinkChannels *LinkChannels = NULL;
for (SI::Loop::Iterator it2; (d = SiEitEvent.eventDescriptors.getNext(it2)); ) { for (SI::Loop::Iterator it2; (d = SiEitEvent.eventDescriptors.getNext(it2)); ) {
switch (d->getDescriptorTag()) { switch (d->getDescriptorTag()) {
case SI::ExtendedEventDescriptorTag: { case SI::ExtendedEventDescriptorTag: {
@ -138,6 +139,36 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data)
pEvent->SetDescription(rEvent->Description()); pEvent->SetDescription(rEvent->Description());
} }
break; break;
case SI::LinkageDescriptorTag: {
SI::LinkageDescriptor *ld = (SI::LinkageDescriptor *)d;
tChannelID linkID(Source, ld->getOriginalNetworkId(), ld->getTransportStreamId(), ld->getServiceId());
if (ld->getLinkageType() == 0xB0) { // Premiere World
time_t now = time(NULL);
bool hit = SiEitEvent.getStartTime() <= now && now < SiEitEvent.getStartTime() + SiEitEvent.getDuration();
if (hit) {
cChannel *link = Channels.GetByChannelID(linkID);
if (link != channel) { // only link to other channels, not the same one
char linkName[ld->privateData.getLength() + 1];
strn0cpy(linkName, (const char *)ld->privateData.getData(), sizeof(linkName));
//fprintf(stderr, "Linkage %s %4d %4d %5d %5d %5d %5d %02X '%s'\n", hit ? "*" : "", channel->Number(), link ? link->Number() : -1, SiEitEvent.getEventId(), ld->getOriginalNetworkId(), ld->getTransportStreamId(), ld->getServiceId(), ld->getLinkageType(), linkName);//XXX
if (link) {
if (Setup.UpdateChannels >= 1)
link->SetName(linkName);
}
else if (Setup.UpdateChannels >= 3) {
link = Channels.NewChannel(channel, linkName, ld->getOriginalNetworkId(), ld->getTransportStreamId(), ld->getServiceId());
//XXX patFilter->Trigger();
}
if (link) {
if (!LinkChannels)
LinkChannels = new cLinkChannels;
LinkChannels->Add(new cLinkChannel(link));
}
}
}
}
}
break;
default: ; default: ;
} }
delete d; delete d;
@ -167,6 +198,9 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data)
else if (SiEitEvent.getRunningStatus() == SI::RunningStatusStartsInAFewSeconds) else if (SiEitEvent.getRunningStatus() == SI::RunningStatusStartsInAFewSeconds)
pSchedule->SetFollowingEvent(pEvent); pSchedule->SetFollowingEvent(pEvent);
} }
if (LinkChannels)
channel->SetLinkChannels(LinkChannels);
} }
} }

View File

@ -6048,4 +6048,3 @@ cFont::tPixelData FontFix_iso8859_5[][26] = {
0x00000000, // 0x00000000, //
}, },
}; };

21
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.282 2004/01/24 13:22:04 kls Exp $ * $Id: menu.c 1.284 2004/02/08 15:06:42 kls Exp $
*/ */
#include "menu.h" #include "menu.h"
@ -723,7 +723,7 @@ eOSState cMenuChannels::Switch(void)
return osContinue; return osContinue;
cChannel *ch = GetChannel(Current()); cChannel *ch = GetChannel(Current());
if (ch) if (ch)
cDevice::PrimaryDevice()->SwitchChannel(ch, true); return cDevice::PrimaryDevice()->SwitchChannel(ch, true) ? osEnd : osContinue;
return osEnd; return osEnd;
} }
@ -2216,11 +2216,16 @@ cMenuSetupCICAM::cMenuSetupCICAM(void)
helpKeys = -1; helpKeys = -1;
SetSection(tr("CICAM")); SetSection(tr("CICAM"));
for (int d = 0; d < cDevice::NumDevices(); d++) { for (int d = 0; d < cDevice::NumDevices(); d++) {
for (int i = 0; i < 2; i++) { cDevice *Device = cDevice::GetDevice(d);
cCiHandler *CiHandler = Device->CiHandler();
for (int Slot = 0; Slot < 2; Slot++) {
char buffer[32]; char buffer[32];
int CardIndex = cDevice::GetDevice(d)->CardIndex(); int CardIndex = Device->CardIndex();
snprintf(buffer, sizeof(buffer), "%s%d %d", tr("Setup.CICAM$CICAM DVB"), CardIndex + 1, i + 1); const char *CamName = CiHandler ? CiHandler->GetCamName(Slot) : NULL;
Add(new cMenuEditCaItem(buffer, &data.CaCaps[CardIndex][i])); if (!CamName)
CamName = "-";
snprintf(buffer, sizeof(buffer), "%s%d %d\t%s", tr("Setup.CICAM$CICAM DVB"), CardIndex + 1, Slot + 1, CamName);
Add(new cOsdItem(buffer));
} }
} }
SetHelpKeys(); SetHelpKeys();
@ -2275,9 +2280,7 @@ eOSState cMenuSetupCICAM::ProcessKey(eKeys Key)
{ {
eOSState state = cMenuSetupBase::ProcessKey(Key); eOSState state = cMenuSetupBase::ProcessKey(Key);
if (state == osBack && Key == kOk) if (state == osUnknown) {
cDevice::SetCaCaps();
else if (state == osUnknown) {
switch (Key) { switch (Key) {
case kRed: if (helpKeys == 1) case kRed: if (helpKeys == 1)
return Menu(); return Menu();

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: osdbase.c 1.11 2003/10/19 14:32:32 kls Exp $ * $Id: osdbase.c 1.12 2004/01/31 10:31:13 kls Exp $
*/ */
#include "osdbase.h" #include "osdbase.h"
@ -116,7 +116,7 @@ cBitmap::cBitmap(int Width, int Height, int Bpp, bool ClearWithBackground)
fontType = fontOsd; fontType = fontOsd;
font = NULL; font = NULL;
if (width > 0 && height > 0) { if (width > 0 && height > 0) {
bitmap = MALLOC(char, width * height); bitmap = MALLOC(u_char, width * height);
if (bitmap) { if (bitmap) {
Clean(); Clean();
memset(bitmap, 0x00, width * height); memset(bitmap, 0x00, width * height);
@ -186,7 +186,7 @@ void cBitmap::Clean(void)
dirtyY2 = -1; dirtyY2 = -1;
} }
void cBitmap::SetIndex(int x, int y, char Index) void cBitmap::SetIndex(int x, int y, u_char Index)
{ {
if (bitmap) { if (bitmap) {
if (0 <= x && x < width && 0 <= y && y < height) { if (0 <= x && x < width && 0 <= y && y < height) {
@ -231,8 +231,8 @@ int cBitmap::Width(const char *s)
void cBitmap::Text(int x, int y, const char *s, eDvbColor ColorFg, eDvbColor ColorBg) void cBitmap::Text(int x, int y, const char *s, eDvbColor ColorFg, eDvbColor ColorBg)
{ {
if (bitmap) { if (bitmap) {
char fg = Index(ColorFg); u_char fg = Index(ColorFg);
char bg = Index(ColorBg); u_char bg = Index(ColorBg);
int h = font->Height(s); int h = font->Height(s);
while (s && *s) { while (s && *s) {
const cFont::tCharData *CharData = font->CharData(*s++); const cFont::tCharData *CharData = font->CharData(*s++);
@ -253,7 +253,7 @@ void cBitmap::Text(int x, int y, const char *s, eDvbColor ColorFg, eDvbColor Col
void cBitmap::Fill(int x1, int y1, int x2, int y2, eDvbColor Color) void cBitmap::Fill(int x1, int y1, int x2, int y2, eDvbColor Color)
{ {
if (bitmap) { if (bitmap) {
char c = Index(Color); u_char c = Index(Color);
for (int y = y1; y <= y2; y++) for (int y = y1; y <= y2; y++)
for (int x = x1; x <= x2; x++) for (int x = x1; x <= x2; x++)
SetIndex(x, y, c); SetIndex(x, y, c);
@ -267,7 +267,7 @@ void cBitmap::Clear(void)
Fill(0, 0, width - 1, height - 1, clrBackground); Fill(0, 0, width - 1, height - 1, clrBackground);
} }
const char *cBitmap::Data(int x, int y) const u_char *cBitmap::Data(int x, int y)
{ {
return &bitmap[y * width + x]; return &bitmap[y * width + x];
} }
@ -327,7 +327,7 @@ void cWindow::Text(int x, int y, const char *s, eDvbColor ColorFg, eDvbColor Col
cBitmap::Text(x, y, s, ColorFg, ColorBg); cBitmap::Text(x, y, s, ColorFg, ColorBg);
} }
const char *cWindow::Data(int x, int y) const u_char *cWindow::Data(int x, int y)
{ {
return cBitmap::Data(x, y); return cBitmap::Data(x, y);
} }

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: osdbase.h 1.8 2004/01/04 14:22:43 kls Exp $ * $Id: osdbase.h 1.9 2004/01/31 10:28:49 kls Exp $
*/ */
#ifndef __OSDBASE_H #ifndef __OSDBASE_H
@ -49,7 +49,7 @@ private:
bool fetched[MAXNUMCOLORS]; bool fetched[MAXNUMCOLORS];
bool full; bool full;
protected: protected:
typedef unsigned char tIndexes[MAXNUMCOLORS]; typedef u_char tIndexes[MAXNUMCOLORS];
public: public:
cPalette(int Bpp); cPalette(int Bpp);
int Index(eDvbColor Color); int Index(eDvbColor Color);
@ -75,7 +75,7 @@ class cBitmap : public cPalette {
private: private:
const cFont *font; const cFont *font;
eDvbFont fontType; eDvbFont fontType;
char *bitmap; u_char *bitmap;
bool clearWithBackground; bool clearWithBackground;
protected: protected:
int width, height; int width, height;
@ -86,7 +86,7 @@ public:
bool ClearWithBackground(void) { return clearWithBackground; } bool ClearWithBackground(void) { return clearWithBackground; }
eDvbFont SetFont(eDvbFont Font); eDvbFont SetFont(eDvbFont Font);
bool Dirty(int &x1, int &y1, int &x2, int &y2); bool Dirty(int &x1, int &y1, int &x2, int &y2);
void SetIndex(int x, int y, char Index); void SetIndex(int x, int y, u_char Index);
void SetPixel(int x, int y, eDvbColor Color); void SetPixel(int x, int y, eDvbColor Color);
void SetBitmap(int x, int y, const cBitmap &Bitmap); void SetBitmap(int x, int y, const cBitmap &Bitmap);
int Width(void) { return width; } int Width(void) { return width; }
@ -97,7 +97,7 @@ public:
void Fill(int x1, int y1, int x2, int y2, eDvbColor Color); void Fill(int x1, int y1, int x2, int y2, eDvbColor Color);
void Clean(void); void Clean(void);
void Clear(void); void Clear(void);
const char *Data(int x, int y); const u_char *Data(int x, int y);
}; };
#define MAXNUMWINDOWS 7 // OSD windows are counted 1...7 #define MAXNUMWINDOWS 7 // OSD windows are counted 1...7
@ -122,7 +122,7 @@ public:
void Fill(int x1, int y1, int x2, int y2, eDvbColor Color); void Fill(int x1, int y1, int x2, int y2, eDvbColor Color);
void SetBitmap(int x, int y, const cBitmap &Bitmap); void SetBitmap(int x, int y, const cBitmap &Bitmap);
void Text(int x, int y, const char *s, eDvbColor ColorFg = clrWhite, eDvbColor ColorBg = clrBackground); void Text(int x, int y, const char *s, eDvbColor ColorFg = clrWhite, eDvbColor ColorBg = clrBackground);
const char *Data(int x, int y); const u_char *Data(int x, int y);
}; };
typedef int tWindowHandle; typedef int tWindowHandle;

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: sections.c 1.4 2004/01/11 13:22:13 kls Exp $ * $Id: sections.c 1.5 2004/02/07 15:51:57 kls Exp $
*/ */
#include "sections.h" #include "sections.h"
@ -133,7 +133,7 @@ void cSectionHandler::Detach(cFilter *Filter)
void cSectionHandler::SetChannel(const cChannel *Channel) void cSectionHandler::SetChannel(const cChannel *Channel)
{ {
Lock(); Lock();
shp->channel = Channel? *Channel : cChannel(); shp->channel = Channel ? *Channel : cChannel();
Unlock(); Unlock();
} }

View File

@ -10,7 +10,7 @@
* and interact with the Video Disk Recorder - or write a full featured * and interact with the Video Disk Recorder - or write a full featured
* graphical interface that sits on top of an SVDRP connection. * graphical interface that sits on top of an SVDRP connection.
* *
* $Id: svdrp.c 1.58 2004/01/17 13:47:39 kls Exp $ * $Id: svdrp.c 1.59 2004/01/31 10:13:50 kls Exp $
*/ */
#include "svdrp.h" #include "svdrp.h"
@ -968,10 +968,9 @@ void cSVDRP::CmdSTAT(const char *Option)
{ {
if (*Option) { if (*Option) {
if (strcasecmp(Option, "DISK") == 0) { if (strcasecmp(Option, "DISK") == 0) {
int FreeMB; int FreeMB, UsedMB;
int Percent = VideoDiskSpace(&FreeMB); int Percent = VideoDiskSpace(&FreeMB, &UsedMB);
int Total = (FreeMB / (100 - Percent)) * 100; Reply(250, "%dMB %dMB %d%%", FreeMB + UsedMB, FreeMB, Percent);
Reply(250, "%dMB %dMB %d%%", Total, FreeMB, Percent);
} }
else else
Reply(501, "Invalid Option \"%s\"", Option); Reply(501, "Invalid Option \"%s\"", Option);

4
vdr.c
View File

@ -22,7 +22,7 @@
* *
* The project's page is at http://www.cadsoft.de/vdr * The project's page is at http://www.cadsoft.de/vdr
* *
* $Id: vdr.c 1.174 2004/01/17 16:56:57 kls Exp $ * $Id: vdr.c 1.175 2004/02/08 11:23:29 kls Exp $
*/ */
#include <getopt.h> #include <getopt.h>
@ -518,7 +518,7 @@ int main(int argc, char *argv[])
Channels.Save(); //XXX only after user changes??? Channels.Save(); //XXX only after user changes???
Timers.Save(); Timers.Save();
for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) { for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) {
if (Channel && Channel->Modification(CHANNELMOD_RETUNE)) { if (Channel->Modification(CHANNELMOD_RETUNE)) {
cRecordControls::ChannelDataModified(Channel); cRecordControls::ChannelDataModified(Channel);
if (Channel->Number() == cDevice::CurrentChannel()) { if (Channel->Number() == cDevice::CurrentChannel()) {
if (!cDevice::PrimaryDevice()->Replaying() || cTransferControl::ReceiverDevice()) { if (!cDevice::PrimaryDevice()->Replaying() || cTransferControl::ReceiverDevice()) {