summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKlaus Schmidinger <kls (at) cadsoft (dot) de>2004-02-08 18:00:00 +0100
committerKlaus Schmidinger <kls (at) cadsoft (dot) de>2004-02-08 18:00:00 +0100
commit3fc29659759abb10154b78f9e3568407e523e1fc (patch)
treefdc9df96602026fc353d90733b74b61a8f679cf7
parent7c5ef5dbbada89f55aa15a7c5ac653f4390ce9b4 (diff)
downloadvdr-patch-lnbsharing-3fc29659759abb10154b78f9e3568407e523e1fc.tar.gz
vdr-patch-lnbsharing-3fc29659759abb10154b78f9e3568407e523e1fc.tar.bz2
Version 1.3.4vdr-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.
-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()) {