summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CONTRIBUTORS12
-rw-r--r--HISTORY25
-rw-r--r--README.developer4
-rw-r--r--ca.conf83
-rw-r--r--channels.c92
-rw-r--r--channels.conf10
-rw-r--r--channels.h24
-rw-r--r--ci.c10
-rw-r--r--ci.h3
-rw-r--r--config.c49
-rw-r--r--config.h9
-rw-r--r--device.c16
-rw-r--r--device.h7
-rw-r--r--dvbdevice.c9
-rw-r--r--eit.c36
-rw-r--r--fontfix-iso8859-5.c1
-rw-r--r--menu.c21
-rw-r--r--osdbase.c16
-rw-r--r--osdbase.h12
-rw-r--r--sections.c4
-rw-r--r--svdrp.c9
-rw-r--r--vdr.c4
22 files changed, 245 insertions, 211 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index 1f8e02a..bc4c2ee 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -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
return from their Receive() function if the buffer runs full
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>
for modifying LOF handling to allow for C-band reception
@@ -921,3 +922,14 @@ Christian Tramnitz <maillist@tramnitz.com>
for terrestrial transponders
for his support in debugging a problem in setting the source type for newly
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
diff --git a/HISTORY b/HISTORY
index ddabd53..317be40 100644
--- a/HISTORY
+++ b/HISTORY
@@ -2626,3 +2626,28 @@ Video Disk Recorder Revision History
code (see man vdr(5)). Currently this is only stored and not yet used otherwise.
- Added a call to cStatus::MsgOsdCurrentItem() to cMenuEditItem::SetValue()
(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.
diff --git a/README.developer b/README.developer
index d079d63..4fe75c8 100644
--- a/README.developer
+++ b/README.developer
@@ -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.
- Improved CAM support. Channels with conditional access now automatically
use the device that contains the proper CAM.
-- No NVOD or "linked services" support yet.
+- No NVOD support yet.
Note that this is currently work in progress, so there may be some
areas that don't work as smooth as expected, yet.
@@ -47,7 +47,7 @@ Known issues:
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
be tuned to at all. If you really want to tune to this channel for
tests, do it on your own risk.
diff --git a/ca.conf b/ca.conf
index af208f5..e4bab66 100644
--- a/ca.conf
+++ b/ca.conf
@@ -9,89 +9,6 @@
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:
1 DVB 1
diff --git a/channels.c b/channels.c
index d49d7a4..b5bd9bd 100644
--- a/channels.c
+++ b/channels.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* 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"
@@ -169,11 +169,13 @@ cChannel::cChannel(void)
guard = GUARD_INTERVAL_AUTO;
hierarchy = HIERARCHY_AUTO;
modification = CHANNELMOD_NONE;
+ linkChannels = NULL;
+ refChannel = NULL;
}
-cChannel::cChannel(const cChannel *Channel)
+cChannel::cChannel(const cChannel &Channel)
{
- *this = *Channel;
+ *this = Channel;
*name = 0;
vpid = 0;
ppid = 0;
@@ -188,6 +190,28 @@ cChannel::cChannel(const cChannel *Channel)
number = 0;
groupSep = false;
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)
@@ -320,8 +344,10 @@ static int IntArrayToString(char *s, const int *a, int Base = 10, const char n[]
int i = 0;
while (a[i] || i == 0) {
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]);
+ if (!a[i])
+ break;
i++;
}
*q = 0;
@@ -375,8 +401,11 @@ void cChannel::SetCaIds(const int *CaIds)
IntArrayToString(OldCaIdsBuf, caids, 16);
IntArrayToString(NewCaIdsBuf, CaIds, 16);
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];
+ if (!CaIds[i])
+ break;
+ }
modification |= CHANNELMOD_CA;
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)
{
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) {
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);
ReNumber();
NewChannel->SetId(Nid, Tid, Sid, Rid, false);
diff --git a/channels.conf b/channels.conf
index f5c6dd0..e7aa7f3 100644
--- a/channels.conf
+++ b/channels.conf
@@ -11,7 +11,7 @@ WDR Köln:11836:hC34:S19.2E:27500:601:602=deu:604:0:28111: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
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
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
@@ -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
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
-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
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
@@ -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
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 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 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
@@ -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
EROTIK,PREMIERE EROTIK:12031:hC34:S19.2E:27500:1279:0:0:1702,1722,1801:513:133:4:0
: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
:Beta Digital
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
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
-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
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
diff --git a/channels.h b/channels.h
index 532a112..6d6dd3a 100644
--- a/channels.h
+++ b/channels.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* 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
@@ -59,13 +59,26 @@ 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 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; }
static tChannelID FromString(const char *s);
const char *ToString(void);
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 {
friend class cMenuEditChannel;
private:
@@ -102,11 +115,14 @@ private:
int hierarchy;
int __EndData__;
int modification;
+ cLinkChannels *linkChannels;
+ cChannel *refChannel;
const char *ParametersToString(void);
bool StringToParameters(const char *s);
public:
cChannel(void);
- cChannel(const cChannel *Channel);
+ cChannel(const cChannel &Channel);
+ ~cChannel();
cChannel& operator= (const cChannel &Channel);
const char *ToText(void);
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 SetCaIds(const int *CaIds); // list must be zero-terminated
void SetCaDescriptors(int Level);
+ void SetLinkChannels(cLinkChannels *LinkChannels);
+ void SetRefChannel(cChannel *RefChannel);
};
class cChannels : public cRwLock, public cConfig<cChannel> {
diff --git a/ci.c b/ci.c
index 760052d..65ec687 100644
--- a/ci.c
+++ b/ci.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* 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"
@@ -763,6 +763,7 @@ public:
virtual ~cCiApplicationInformation();
virtual bool Process(int Length = 0, const uint8_t *Data = NULL);
bool EnterMenu(void);
+ const char *GetMenuString(void) { return menuString; }
};
cCiApplicationInformation::cCiApplicationInformation(int SessionId, cCiTransportConnection *Tc)
@@ -1559,6 +1560,13 @@ cCiEnquiry *cCiHandler::GetEnquiry(void)
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)
{
cMutexLock MutexLock(&mutex);
diff --git a/ci.h b/ci.h
index 71eccd8..7ae2b96 100644
--- a/ci.h
+++ b/ci.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* 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
@@ -110,6 +110,7 @@ public:
bool EnterMenu(int Slot);
cCiMenu *GetMenu(void);
cCiEnquiry *GetEnquiry(void);
+ const char *GetCamName(int Slot);
const unsigned short *GetCaSystemIds(int Slot);
bool ProvidesCa(const unsigned short *CaSystemIds); //XXX Slot???
bool SetCaPmt(cCiCaPmt &CaPmt, int Slot);
diff --git a/config.c b/config.c
index f6814e8..833a2bb 100644
--- a/config.c
+++ b/config.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* 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"
@@ -286,7 +286,6 @@ cSetup::cSetup(void)
MultiSpeedMode = 0;
ShowReplayMode = 0;
ResumeID = 0;
- memset(CaCaps, sizeof(CaCaps), 0);
CurrentChannel = -1;
CurrentVolume = MAXVOLUME;
}
@@ -352,50 +351,6 @@ bool cSetup::Load(const char *FileName)
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)
{
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, "ShowReplayMode")) ShowReplayMode = 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, "CurrentVolume")) CurrentVolume = atoi(Value);
else
@@ -525,7 +479,6 @@ bool cSetup::Save(void)
Store("MultiSpeedMode", MultiSpeedMode);
Store("ShowReplayMode", ShowReplayMode);
Store("ResumeID", ResumeID);
- StoreCaCaps("CaCaps");
Store("CurrentChannel", CurrentChannel);
Store("CurrentVolume", CurrentVolume);
diff --git a/config.h b/config.h
index 332c296..766126a 100644
--- a/config.h
+++ b/config.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: config.h 1.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
@@ -20,8 +20,8 @@
#include "i18n.h"
#include "tools.h"
-#define VDRVERSION "1.3.3"
-#define VDRVERSNUM 10303 // Version * 10000 + Major * 100 + Minor
+#define VDRVERSION "1.3.4"
+#define VDRVERSNUM 10304 // Version * 10000 + Major * 100 + Minor
#define MAXPRIORITY 99
#define MAXLIFETIME 99
@@ -194,8 +194,6 @@ public:
class cSetup : public cConfig<cSetupLine> {
friend class cPlugin; // needs to be able to call Store()
private:
- void StoreCaCaps(const char *Name);
- bool ParseCaCaps(const char *Value);
void StoreLanguages(const char *Name, int *Values);
bool ParseLanguages(const char *Value, int *Values);
bool Parse(const char *Name, const char *Value);
@@ -242,7 +240,6 @@ public:
int MultiSpeedMode;
int ShowReplayMode;
int ResumeID;
- int CaCaps[MAXDEVICES][MAXCACAPS];
int CurrentChannel;
int CurrentVolume;
int __EndData__;
diff --git a/device.c b/device.c
index 46d9ab8..871149e 100644
--- a/device.c
+++ b/device.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* 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"
@@ -56,10 +56,8 @@ cDevice::cDevice(void)
for (int i = 0; i < MAXRECEIVERS; i++)
receiver[i] = NULL;
- if (numDevices < MAXDEVICES) {
+ if (numDevices < MAXDEVICES)
device[numDevices++] = this;
- SetCaCaps(cardIndex);
- }
else
esyslog("ERROR: too many devices!");
}
@@ -200,16 +198,6 @@ cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool *NeedsDe
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)
{
for (int i = 0; i < numDevices; i++) {
diff --git a/device.h b/device.h
index 8599474..496e702 100644
--- a/device.h
+++ b/device.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* 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
@@ -21,7 +21,6 @@
#include "tools.h"
#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 MAXRECEIVERS 16 // the maximum number of receivers per device
#define MAXVOLUME 255
@@ -97,16 +96,12 @@ public:
///< given Priority.
///< See ProvidesChannel() for more information on how
///< 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);
///< Closes down all devices.
///< Must be called at the end of the program.
private:
static int nextCardIndex;
int cardIndex;
- int caCaps[MAXCACAPS];
protected:
cDevice(void);
virtual ~cDevice();
diff --git a/dvbdevice.c b/dvbdevice.c
index 01a9a6c..e1d5fc6 100644
--- a/dvbdevice.c
+++ b/dvbdevice.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* 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"
@@ -680,7 +680,7 @@ bool cDvbDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *Ne
bool hasPriority = Priority < 0 || Priority > this->Priority();
bool needsDetachReceivers = false;
- if ((Channel->Vpid() || Channel->Apid1()) && ProvidesSource(Channel->Source()) && ProvidesCa(Channel)) {
+ if (ProvidesSource(Channel->Source()) && ProvidesCa(Channel)) {
result = hasPriority;
if (Priority >= 0 && Receiving()) {
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
+ //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:
if (TurnOnLivePIDs) {
diff --git a/eit.c b/eit.c
index d71cad8..c24a3d0 100644
--- a/eit.c
+++ b/eit.c
@@ -8,7 +8,7 @@
* 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>.
*
- * $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"
@@ -95,6 +95,7 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data)
SI::Descriptor *d;
SI::ExtendedEventDescriptors *ExtendedEventDescriptors = NULL;
SI::ShortEventDescriptor *ShortEventDescriptor = NULL;
+ cLinkChannels *LinkChannels = NULL;
for (SI::Loop::Iterator it2; (d = SiEitEvent.eventDescriptors.getNext(it2)); ) {
switch (d->getDescriptorTag()) {
case SI::ExtendedEventDescriptorTag: {
@@ -138,6 +139,36 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data)
pEvent->SetDescription(rEvent->Description());
}
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: ;
}
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)
pSchedule->SetFollowingEvent(pEvent);
}
+
+ if (LinkChannels)
+ channel->SetLinkChannels(LinkChannels);
}
}
diff --git a/fontfix-iso8859-5.c b/fontfix-iso8859-5.c
index 08f7fd7..51cef24 100644
--- a/fontfix-iso8859-5.c
+++ b/fontfix-iso8859-5.c
@@ -6048,4 +6048,3 @@ cFont::tPixelData FontFix_iso8859_5[][26] = {
0x00000000, //
},
};
- \ No newline at end of file
diff --git a/menu.c b/menu.c
index f30d55a..6a7907f 100644
--- a/menu.c
+++ b/menu.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
- * $Id: menu.c 1.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"
@@ -723,7 +723,7 @@ eOSState cMenuChannels::Switch(void)
return osContinue;
cChannel *ch = GetChannel(Current());
if (ch)
- cDevice::PrimaryDevice()->SwitchChannel(ch, true);
+ return cDevice::PrimaryDevice()->SwitchChannel(ch, true) ? osEnd : osContinue;
return osEnd;
}
@@ -2216,11 +2216,16 @@ cMenuSetupCICAM::cMenuSetupCICAM(void)
helpKeys = -1;
SetSection(tr("CICAM"));
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];
- int CardIndex = cDevice::GetDevice(d)->CardIndex();
- snprintf(buffer, sizeof(buffer), "%s%d %d", tr("Setup.CICAM$CICAM DVB"), CardIndex + 1, i + 1);
- Add(new cMenuEditCaItem(buffer, &data.CaCaps[CardIndex][i]));
+ int CardIndex = Device->CardIndex();
+ const char *CamName = CiHandler ? CiHandler->GetCamName(Slot) : NULL;
+ 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();
@@ -2275,9 +2280,7 @@ eOSState cMenuSetupCICAM::ProcessKey(eKeys Key)
{
eOSState state = cMenuSetupBase::ProcessKey(Key);
- if (state == osBack && Key == kOk)
- cDevice::SetCaCaps();
- else if (state == osUnknown) {
+ if (state == osUnknown) {
switch (Key) {
case kRed: if (helpKeys == 1)
return Menu();
diff --git a/osdbase.c b/osdbase.c
index 2ba4de8..7179406 100644
--- a/osdbase.c
+++ b/osdbase.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* 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"
@@ -116,7 +116,7 @@ cBitmap::cBitmap(int Width, int Height, int Bpp, bool ClearWithBackground)
fontType = fontOsd;
font = NULL;
if (width > 0 && height > 0) {
- bitmap = MALLOC(char, width * height);
+ bitmap = MALLOC(u_char, width * height);
if (bitmap) {
Clean();
memset(bitmap, 0x00, width * height);
@@ -186,7 +186,7 @@ void cBitmap::Clean(void)
dirtyY2 = -1;
}
-void cBitmap::SetIndex(int x, int y, char Index)
+void cBitmap::SetIndex(int x, int y, u_char Index)
{
if (bitmap) {
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)
{
if (bitmap) {
- char fg = Index(ColorFg);
- char bg = Index(ColorBg);
+ u_char fg = Index(ColorFg);
+ u_char bg = Index(ColorBg);
int h = font->Height(s);
while (s && *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)
{
if (bitmap) {
- char c = Index(Color);
+ u_char c = Index(Color);
for (int y = y1; y <= y2; y++)
for (int x = x1; x <= x2; x++)
SetIndex(x, y, c);
@@ -267,7 +267,7 @@ void cBitmap::Clear(void)
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];
}
@@ -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);
}
-const char *cWindow::Data(int x, int y)
+const u_char *cWindow::Data(int x, int y)
{
return cBitmap::Data(x, y);
}
diff --git a/osdbase.h b/osdbase.h
index ce4bc90..3277d82 100644
--- a/osdbase.h
+++ b/osdbase.h
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* 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
@@ -49,7 +49,7 @@ private:
bool fetched[MAXNUMCOLORS];
bool full;
protected:
- typedef unsigned char tIndexes[MAXNUMCOLORS];
+ typedef u_char tIndexes[MAXNUMCOLORS];
public:
cPalette(int Bpp);
int Index(eDvbColor Color);
@@ -75,7 +75,7 @@ class cBitmap : public cPalette {
private:
const cFont *font;
eDvbFont fontType;
- char *bitmap;
+ u_char *bitmap;
bool clearWithBackground;
protected:
int width, height;
@@ -86,7 +86,7 @@ public:
bool ClearWithBackground(void) { return clearWithBackground; }
eDvbFont SetFont(eDvbFont Font);
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 SetBitmap(int x, int y, const cBitmap &Bitmap);
int Width(void) { return width; }
@@ -97,7 +97,7 @@ public:
void Fill(int x1, int y1, int x2, int y2, eDvbColor Color);
void Clean(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
@@ -122,7 +122,7 @@ public:
void Fill(int x1, int y1, int x2, int y2, eDvbColor Color);
void SetBitmap(int x, int y, const cBitmap &Bitmap);
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;
diff --git a/sections.c b/sections.c
index fb934a8..ead623d 100644
--- a/sections.c
+++ b/sections.c
@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* 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"
@@ -133,7 +133,7 @@ void cSectionHandler::Detach(cFilter *Filter)
void cSectionHandler::SetChannel(const cChannel *Channel)
{
Lock();
- shp->channel = Channel? *Channel : cChannel();
+ shp->channel = Channel ? *Channel : cChannel();
Unlock();
}
diff --git a/svdrp.c b/svdrp.c
index 4c2390a..4ade5ec 100644
--- a/svdrp.c
+++ b/svdrp.c
@@ -10,7 +10,7 @@
* and interact with the Video Disk Recorder - or write a full featured
* graphical interface that sits on top of an SVDRP connection.
*
- * $Id: svdrp.c 1.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"
@@ -968,10 +968,9 @@ void cSVDRP::CmdSTAT(const char *Option)
{
if (*Option) {
if (strcasecmp(Option, "DISK") == 0) {
- int FreeMB;
- int Percent = VideoDiskSpace(&FreeMB);
- int Total = (FreeMB / (100 - Percent)) * 100;
- Reply(250, "%dMB %dMB %d%%", Total, FreeMB, Percent);
+ int FreeMB, UsedMB;
+ int Percent = VideoDiskSpace(&FreeMB, &UsedMB);
+ Reply(250, "%dMB %dMB %d%%", FreeMB + UsedMB, FreeMB, Percent);
}
else
Reply(501, "Invalid Option \"%s\"", Option);
diff --git a/vdr.c b/vdr.c
index c444985..9167307 100644
--- a/vdr.c
+++ b/vdr.c
@@ -22,7 +22,7 @@
*
* 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>
@@ -518,7 +518,7 @@ int main(int argc, char *argv[])
Channels.Save(); //XXX only after user changes???
Timers.Save();
for (cChannel *Channel = Channels.First(); Channel; Channel = Channels.Next(Channel)) {
- if (Channel && Channel->Modification(CHANNELMOD_RETUNE)) {
+ if (Channel->Modification(CHANNELMOD_RETUNE)) {
cRecordControls::ChannelDataModified(Channel);
if (Channel->Number() == cDevice::CurrentChannel()) {
if (!cDevice::PrimaryDevice()->Replaying() || cTransferControl::ReceiverDevice()) {