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

CICAM setup for conditional access channels

This commit is contained in:
Klaus Schmidinger 2002-03-03 16:12:29 +01:00
parent 9f5397b510
commit 9d4456a0a3
12 changed files with 415 additions and 117 deletions

19
FORMATS
View File

@ -29,8 +29,9 @@ Video Disk Recorder File Formats
If this channel also carries Dolby Digital sound, the Dolby PIDs follow If this channel also carries Dolby Digital sound, the Dolby PIDs follow
the audio PIDs, separated by a semicolon, as in "...:101,102;103,104:..." the audio PIDs, separated by a semicolon, as in "...:101,102;103,104:..."
- Teletext PID - Teletext PID
- Conditional Access (0 = Free To Air, 1 = can be decrypted by the first - Conditional Access (0 = Free To Air, 1..4 = explicitly requires the DVB card
DVB card, 2 = can be decrypted by the second DVB card) with the given number, >=100 = requires a specific decryption method defined
in 'ca.conf').
- Program Number - Program Number
Fields marked with ** are only meaningful for DVB-S receivers. Fields marked with ** are only meaningful for DVB-S receivers.
@ -38,6 +39,20 @@ Video Disk Recorder File Formats
Fields marked with *** are only meaningful for DVB-S and DVB-C receivers. Fields marked with *** are only meaningful for DVB-S and DVB-C receivers.
DVB-T receivers simply ignore these. DVB-T receivers simply ignore these.
* ca.conf
This file contains the definitions of the various conditional access code
numbers. Anything after (and including) a '#' character is comment.
Value lines consist of an integer number, followed by a text describing
this decryption method (typically the name of the pay tv service using this
decryption method).
The special value 0 means "Free To Air", i.e. can be used for channels that
don't require additional decryption hardware.
The values 1..4 can be used for channels that for some reason explicitly
need a given DVB card (for backward compatibility).
The values defined in this file are the ones used in the 'Ca' parameter of
'channels.conf'.
* timers.conf * timers.conf
This file contains the timer setup. This file contains the timer setup.

14
HISTORY
View File

@ -1048,8 +1048,20 @@ Video Disk Recorder Revision History
- Fixed a crash in case there is no 'epg.data' at program start (thanks to - Fixed a crash in case there is no 'epg.data' at program start (thanks to
Andreas Schultz). Andreas Schultz).
2002-03-01: Version 1.0.0pre3 2002-03-03: Version 1.0.0pre3
- Fixed parsing 'E' records in epg2html.pl. - Fixed parsing 'E' records in epg2html.pl.
- Fixed a deadlock when switching channels via Schedule/Now|Next/Switch (reported - Fixed a deadlock when switching channels via Schedule/Now|Next/Switch (reported
by Martin Hammerschmid). by Martin Hammerschmid).
- Changed the meaning of the 'Ca' parameter in 'channels.conf'. Each channel can
now define which decryption method it needs in order to be accessed. The new
configuration file 'ca.conf' contains the defined values, and the default
'channels.conf' has been modifed to contain the new values for 'Premiere World'
and 'ORF'. If you use the default 'channels.conf' and have the conditional
access hardware to receive encrypted channels, please make sure you copy the
file 'ca.conf' into your /video directory (or wherever your configuration files
are located) and go into the "Setup" menu and set the CICAM values according
to your hardware setup. Currently there are two possible CICAM entries per
DVB card, so any card can implement up to two different conditional access
modes (besides the default "Free To Air" mode, which is always assumed to be
available on any DVB card).

8
MANUAL
View File

@ -526,6 +526,14 @@ Video Disk Recorder User's Manual
0 = off 0 = off
1 = on 1 = on
CaCaps (no default) Defines the "Conditional Access Capabilities" of a DVB
card. The value consists of the card number, followed by
a list of decryption method values (defined in 'ca.conf').
For instance
CaCaps = 3 101 102
would define that card number 3 is able to decrypt
"Premiere World" and the "ORF".
* Executing system commands * Executing system commands
The "Main" menu option "Commands" allows you to execute any system commands The "Main" menu option "Commands" allows you to execute any system commands

22
ca.conf Normal file
View File

@ -0,0 +1,22 @@
# Conditional Access configuration for VDR
#
# Format:
#
# number description
#
# Please contact kls@cadsoft.de before assigning a new number
# to a description, in order to keep them unique.
0 Free To Air
# BetaCrypt
101 Premiere World
102 ORF
# Special values to "hard code" a channel to a specific DVB card:
1 DVB 1
2 DVB 2
3 DVB 3
4 DVB 4

View File

@ -15,8 +15,8 @@ ZDF:11954:h:0:27500:110:120:130:0:28006
3sat:11954:h:0:27500:210:220:230:0:28007 3sat:11954:h:0:27500:210:220:230:0:28007
KiKa:11954:h:0:27500:310:320:330:0:28008 KiKa:11954:h:0:27500:310:320:330:0:28008
arte:11836:h:0:27500:401:402:404:0:28109 arte:11836:h:0:27500:401:402:404:0:28109
ORF1:12692:h:0:22000:160:161:165:3:13001 ORF1:12692:h:0:22000:160:161:165:102:13001
ORF2:12692:h:0:22000:500:501:505:3:13002 ORF2:12692:h:0:22000:500:501:505:102:13002
ORF Sat:11954:h:0:27500:506:507:0:0:28010 ORF Sat:11954:h:0:27500:506:507:0:0:28010
ZDF.info:11954:h:0:27500:610:620:0:0:28011 ZDF.info:11954:h:0:27500:610:620:0:0:28011
CNN:12168:v:0:27500:165:100:0:0:28512 CNN:12168:v:0:27500:165:100:0:0:28512
@ -49,82 +49,82 @@ B1:12110:h:0:27500:601:602:604:0:28206
ARD Online-Kanal:12722:h:0:22000:0:701:0:0:0 ARD Online-Kanal:12722:h:0:22000:0:701:0:0:0
:Premiere World :Premiere World
Premiere World:11797:h:0:27500:255:256:32:0:8 Premiere World:11797:h:0:27500:255:256:32:0:8
Premiere 1:11797:h:0:27500:511:512:0:3:10 Premiere 1:11797:h:0:27500:511:512:0:101:10
Premiere 2:11797:h:0:27500:1791:1792:0:3:11 Premiere 2:11797:h:0:27500:1791:1792:0:101:11
Premiere 3:11797:h:0:27500:2303:2304:0:3:43 Premiere 3:11797:h:0:27500:2303:2304:0:101:43
Premiere One:12032:h:0:27500:3071:3072:0:3:51 Premiere One:12032:h:0:27500:3071:3072:0:101:51
Premiere Star:11797:h:0:27500:767:768:0:3:9 Premiere Star:11797:h:0:27500:767:768:0:101:9
Premiere Sci-Fi:11797:h:0:27500:1535:1536:0:3:41 Premiere Sci-Fi:11797:h:0:27500:1535:1536:0:101:41
Premiere Action:11797:h:0:27500:1023:1024:0:3:20 Premiere Action:11797:h:0:27500:1023:1024:0:101:20
Premiere X-Action:11798:h:0:27500:2047:2048:0:3:50 Premiere X-Action:11798:h:0:27500:2047:2048:0:101:50
Premiere Comedy:11797:h:0:27500:1279:1280:0:3:29 Premiere Comedy:11797:h:0:27500:1279:1280:0:101:29
13th Street:12031:h:0:27500:2303:2304:0:3:42 13th Street:12031:h:0:27500:2303:2304:0:101:42
Studio Universal:12090:V:0:27500:255:256:0:3:36 Studio Universal:12090:V:0:27500:255:256:0:101:36
Filmpalast:12031:h:0:27500:2559:2560:0:3:516 Filmpalast:12031:h:0:27500:2559:2560:0:101:516
Heimatkanal:12031:h:0:27500:2815:2816:0:3:517 Heimatkanal:12031:h:0:27500:2815:2816:0:101:517
Discovery Channel:12031:h:0:27500:1791:1792:0:3:14 Discovery Channel:12031:h:0:27500:1791:1792:0:101:14
Planet:12090:V:0:27500:1279:1280:0:3:13 Planet:12090:V:0:27500:1279:1280:0:101:13
Fox Kids:12031:h:0:27500:1279:1280:0:3:28 Fox Kids:12031:h:0:27500:1279:1280:0:101:28
Fox Kids Türkce:11914:H:0:27500:767:768:8191:3:54 Fox Kids Türkce:11914:H:0:27500:767:768:8191:101:54
Junior:12031:h:0:27500:255:256:0:3:19 Junior:12031:h:0:27500:255:256:0:101:19
K-Toon:12031:h:0:27500:511:512:0:3:12 K-Toon:12031:h:0:27500:511:512:0:101:12
Disney Channel:12090:V:0:27500:767:768:0:3:34 Disney Channel:12090:V:0:27500:767:768:0:101:34
Sunset:12031:h:0:27500:1023:1024:0:3:16 Sunset:12031:h:0:27500:1023:1024:0:101:16
Krimi&Co:12031:h:0:27500:1535:1536:0:3:23 Krimi&Co:12031:h:0:27500:1535:1536:0:101:23
Goldstar TV:12031:h:0:27500:3839:3840:0:3:518 Goldstar TV:12031:h:0:27500:3839:3840:0:101:518
Classica:12031:h:0:27500:767:768:0:3:15 Classica:12031:h:0:27500:767:768:0:101:15
Seasons:12090:V:0:27500:511:512:0:3:33 Seasons:12090:V:0:27500:511:512:0:101:33
:Cinedom :Cinedom
Cinedom Deluxe:11758:h:0:27500:255:256,257;259:0:3:189 Cinedom Deluxe:11758:h:0:27500:255:256,257;259:0:101:189
Cinedom 1A:11758:h:0:27500:511:512,513:0:3:190 Cinedom 1A:11758:h:0:27500:511:512,513:0:101:190
Cinedom 1B:12070:h:0:27500:1535:1536,1537:0:3:178 Cinedom 1B:12070:h:0:27500:1535:1536,1537:0:101:178
Cinedom 1C:11720:h:0:27500:511:512,513:0:3:180 Cinedom 1C:11720:h:0:27500:511:512,513:0:101:180
Cinedom 1D:11720:h:0:27500:1535:1536,1537:0:3:176 Cinedom 1D:11720:h:0:27500:1535:1536,1537:0:101:176
Cinedom 2A:11758:h:0:27500:1023:1024,1025:0:3:193 Cinedom 2A:11758:h:0:27500:1023:1024,1025:0:101:193
Cinedom 2B:11720:h:0:27500:1279:1280:0:3:183 Cinedom 2B:11720:h:0:27500:1279:1280:0:101:183
Cinedom 2C:12070:h:0:27500:1791:1792:0:3:179 Cinedom 2C:12070:h:0:27500:1791:1792:0:101:179
Cinedom 2D:12070:h:0:27500:511:512:0:3:184 Cinedom 2D:12070:h:0:27500:511:512:0:101:184
Cinedom 2E:12070:h:0:27500:1279:1280:0:3:188 Cinedom 2E:12070:h:0:27500:1279:1280:0:101:188
Cinedom 3A:11758:h:0:27500:2559:2560:0:3:192 Cinedom 3A:11758:h:0:27500:2559:2560:0:101:192
Cinedom 3B:11758:h:0:27500:1535:1536:0:3:195 Cinedom 3B:11758:h:0:27500:1535:1536:0:101:195
Cinedom 3C:12070:h:0:27500:767:768:0:3:185 Cinedom 3C:12070:h:0:27500:767:768:0:101:185
Cinedom 3D:11720:h:0:27500:1023:1024:0:3:182 Cinedom 3D:11720:h:0:27500:1023:1024:0:101:182
Cinedom 4A:11758:h:0:27500:767:768:0:3:191 Cinedom 4A:11758:h:0:27500:767:768:0:101:191
Cinedom 4B:11720:h:0:27500:767:768:0:3:181 Cinedom 4B:11720:h:0:27500:767:768:0:101:181
Cinedom 4C:12070:h:0:27500:2047:2048:0:3:187 Cinedom 4C:12070:h:0:27500:2047:2048:0:101:187
Cinedom 5A:11758:h:0:27500:1279:1280:0:3:194 Cinedom 5A:11758:h:0:27500:1279:1280:0:101:194
Cinedom 5B:11720:h:0:27500:1791:1792:0:3:177 Cinedom 5B:11720:h:0:27500:1791:1792:0:101:177
Cinedom 5C:12070:h:0:27500:1023:1024:0:3:186 Cinedom 5C:12070:h:0:27500:1023:1024:0:101:186
:Beta Digital :Beta Digital
N24:12480:v:0:27500:2047:2048:0:0:47 N24:12480:v:0:27500:2047:2048:0:0:47
CNBC:11954:h:0:27500:510:520:0:0:28010 CNBC:11954:h:0:27500:510:520:0:0:28010
Liberty TV.com:12610:V:0:22000:941:943,942:0:0:12199 Liberty TV.com:12610:V:0:22000:941:943,942:0:0:12199
:PW Erotic :PW Erotic
Beate-Uhse.TV:11758:h:0:27500:3839:3840:0:3:21 Beate-Uhse.TV:11758:h:0:27500:3839:3840:0:101:21
Blue Movie 1:11758:h:0:27500:1791:1792:0:3:513 Blue Movie 1:11758:h:0:27500:1791:1792:0:101:513
Blue Movie 2:11758:h:0:27500:2047:2048:0:3:514 Blue Movie 2:11758:h:0:27500:2047:2048:0:101:514
Blue Movie 3:11758:h:0:27500:2303:2304:0:3:515 Blue Movie 3:11758:h:0:27500:2303:2304:0:101:515
:Sportsworld :Sportsworld
Premiere Sport 1:11720:h:0:27500:255:256,257:0:3:17 Premiere Sport 1:11720:h:0:27500:255:256,257:0:101:17
Premiere Sport 2:12070:h:0:27500:3839:3840:0:3:27 Premiere Sport 2:12070:h:0:27500:3839:3840:0:101:27
Premiere Sport 3:12070:h:0:27500:255:256:0:3:26 Premiere Sport 3:12070:h:0:27500:255:256:0:101:26
:Formel 1 :Formel 1
Infokanal:11720:h:0:27500:3071:3072:0:3:244 Infokanal:11720:h:0:27500:3071:3072:0:101:244
Multikanal:11720:h:0:27500:2815:2816:0:3:243 Multikanal:11720:h:0:27500:2815:2816:0:101:243
Supersignal:11720:h:0:27500:255:256:0:3:17 Supersignal:11720:h:0:27500:255:256:0:101:17
Verfolgerfeld:11720:h:0:27500:2303:2304:0:3:241 Verfolgerfeld:11720:h:0:27500:2303:2304:0:101:241
Cockpitkanal:11720:h:0:27500:2559:2560:0:3:242 Cockpitkanal:11720:h:0:27500:2559:2560:0:101:242
Boxengasse:11720:h:0:27500:2047:2048:0:3:240 Boxengasse:11720:h:0:27500:2047:2048:0:101:240
:Premiere World Bundesliga :Premiere World Bundesliga
Superdom:11758:h:0:27500:2815:8192:0:3:18 Superdom:11758:h:0:27500:2815:8192:0:101:18
BuLi-Konferenz:11758:h:0:27500:3327:3328,3329:0:3:215 BuLi-Konferenz:11758:h:0:27500:3327:3328,3329:0:101:215
BuLi-Spiel 1:11720:h:0:27500:255:256,257:0:3:17 BuLi-Spiel 1:11720:h:0:27500:255:256,257:0:101:17
BuLi-Spiel 2:11720:h:0:27500:2047:2048,2049:0:3:240 BuLi-Spiel 2:11720:h:0:27500:2047:2048,2049:0:101:240
BuLi-Spiel 3:11720:h:0:27500:2303:2304,2305:0:3:241 BuLi-Spiel 3:11720:h:0:27500:2303:2304,2305:0:101:241
BuLi-Spiel 4:11720:h:0:27500:2559:2560,2561:0:3:242 BuLi-Spiel 4:11720:h:0:27500:2559:2560,2561:0:101:242
BuLi-Spiel 5:11720:h:0:27500:2815:2816,2817:0:3:243 BuLi-Spiel 5:11720:h:0:27500:2815:2816,2817:0:101:243
BuLi-Spiel 6:11720:h:0:27500:3071:3072,3073:0:3:244 BuLi-Spiel 6:11720:h:0:27500:3071:3072,3073:0:101:244
BuLi-Spiel 7:11758:h:0:27500:3071:3072,3073:0:3:214 BuLi-Spiel 7:11758:h:0:27500:3071:3072,3073:0:101:214
: :
TV Niepokalanow:11876:h:0:27500:305:321:0:0:20601 TV Niepokalanow:11876:h:0:27500:305:321:0:0:20601
Mosaico:11934:v:0:27500:165:100:0:0:29010 Mosaico:11934:v:0:27500:165:100:0:0:29010

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.87 2002/02/24 11:59:14 kls Exp $ * $Id: config.c 1.88 2002/03/03 16:04:21 kls Exp $
*/ */
#include "config.h" #include "config.h"
@ -732,6 +732,24 @@ bool cSVDRPhost::Accepts(in_addr_t Address)
return (Address & mask) == addr.s_addr; return (Address & mask) == addr.s_addr;
} }
// -- cCaDefinition ----------------------------------------------------------
cCaDefinition::cCaDefinition(void)
{
number = 0;
description = NULL;
}
cCaDefinition::~cCaDefinition()
{
delete description;
}
bool cCaDefinition::Parse(const char *s)
{
return 2 == sscanf(s, "%d %a[^\n]", &number, &description) && description && *description;
}
// -- cKeys ------------------------------------------------------------------ // -- cKeys ------------------------------------------------------------------
cKeys Keys; cKeys Keys;
@ -879,6 +897,21 @@ bool cSVDRPhosts::Acceptable(in_addr_t Address)
return false; return false;
} }
// -- cCaDefinitions ---------------------------------------------------------
cCaDefinitions CaDefinitions;
const cCaDefinition *cCaDefinitions::Get(int Number)
{
cCaDefinition *p = First();
while (p) {
if (p->Number() == Number)
return p;
p = (cCaDefinition *)p->Next();
}
return NULL;
}
// -- cSetup ----------------------------------------------------------------- // -- cSetup -----------------------------------------------------------------
cSetup Setup; cSetup Setup;
@ -921,10 +954,46 @@ cSetup::cSetup(void)
MinUserInactivity = 120; MinUserInactivity = 120;
MultiSpeedMode = 0; MultiSpeedMode = 0;
ShowReplayMode = 0; ShowReplayMode = 0;
memset(CaCaps, sizeof(CaCaps), 0);
CurrentChannel = -1; CurrentChannel = -1;
CurrentVolume = MAXVOLUME; CurrentVolume = MAXVOLUME;
} }
void cSetup::PrintCaCaps(FILE *f, const char *Name)
{
for (int d = 0; d < MAXDVBAPI; d++) {
if (CaCaps[d][0]) {
fprintf(f, "CaCaps = %d", d + 1);
for (int i = 0; i < MAXCACAPS && CaCaps[d][i]; i++)
fprintf(f, " %d", CaCaps[d][i]);
fprintf(f, "\n");
}
}
}
bool cSetup::ParseCaCaps(const char *Value)
{
char *p;
int d = strtol(Value, &p, 10);
if (d > 0 && d < MAXDVBAPI) {
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;
}
bool cSetup::Parse(char *s) bool cSetup::Parse(char *s)
{ {
char *p = strchr(s, '='); char *p = strchr(s, '=');
@ -967,6 +1036,7 @@ bool cSetup::Parse(char *s)
else if (!strcasecmp(Name, "MinUserInactivity")) MinUserInactivity = atoi(Value); else if (!strcasecmp(Name, "MinUserInactivity")) MinUserInactivity = atoi(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, "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
@ -1047,6 +1117,7 @@ bool cSetup::Save(const char *FileName)
fprintf(f, "MinUserInactivity = %d\n", MinUserInactivity); fprintf(f, "MinUserInactivity = %d\n", MinUserInactivity);
fprintf(f, "MultiSpeedMode = %d\n", MultiSpeedMode); fprintf(f, "MultiSpeedMode = %d\n", MultiSpeedMode);
fprintf(f, "ShowReplayMode = %d\n", ShowReplayMode); fprintf(f, "ShowReplayMode = %d\n", ShowReplayMode);
PrintCaCaps(f, "CaCaps");
fprintf(f, "CurrentChannel = %d\n", CurrentChannel); fprintf(f, "CurrentChannel = %d\n", CurrentChannel);
fprintf(f, "CurrentVolume = %d\n", CurrentVolume); fprintf(f, "CurrentVolume = %d\n", CurrentVolume);
if (f.Close()) { if (f.Close()) {

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.101 2002/02/26 17:25:30 kls Exp $ * $Id: config.h 1.102 2002/03/03 16:04:43 kls Exp $
*/ */
#ifndef __CONFIG_H #ifndef __CONFIG_H
@ -195,6 +195,18 @@ public:
bool Accepts(in_addr_t Address); bool Accepts(in_addr_t Address);
}; };
class cCaDefinition : public cListObject {
private:
int number;
char *description;
public:
cCaDefinition(void);
~cCaDefinition();
bool Parse(const char *s);
int Number(void) const { return number; }
const char *Description(void) const { return description; }
};
template<class T> class cConfig : public cList<T> { template<class T> class cConfig : public cList<T> {
private: private:
char *fileName; char *fileName;
@ -297,15 +309,23 @@ public:
bool Acceptable(in_addr_t Address); bool Acceptable(in_addr_t Address);
}; };
class cCaDefinitions : public cConfig<cCaDefinition> {
public:
const cCaDefinition *Get(int Number);
};
extern cChannels Channels; extern cChannels Channels;
extern cTimers Timers; extern cTimers Timers;
extern cKeys Keys; extern cKeys Keys;
extern cCommands Commands; extern cCommands Commands;
extern cSVDRPhosts SVDRPhosts; extern cSVDRPhosts SVDRPhosts;
extern cCaDefinitions CaDefinitions;
class cSetup { class cSetup {
private: private:
static char *fileName; static char *fileName;
void PrintCaCaps(FILE *f, const char *Name);
bool ParseCaCaps(const char *Value);
bool Parse(char *s); bool Parse(char *s);
public: public:
// Also adjust cMenuSetup (menu.c) when adding parameters here! // Also adjust cMenuSetup (menu.c) when adding parameters here!
@ -339,6 +359,7 @@ public:
int MinEventTimeout, MinUserInactivity; int MinEventTimeout, MinUserInactivity;
int MultiSpeedMode; int MultiSpeedMode;
int ShowReplayMode; int ShowReplayMode;
int CaCaps[MAXDVBAPI][MAXCACAPS];
int CurrentChannel; int CurrentChannel;
int CurrentVolume; int CurrentVolume;
cSetup(void); cSetup(void);

126
dvbapi.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: dvbapi.c 1.153 2002/03/02 09:37:56 kls Exp $ * $Id: dvbapi.c 1.154 2002/03/03 15:43:24 kls Exp $
*/ */
#include "dvbapi.h" #include "dvbapi.h"
@ -1684,9 +1684,10 @@ cDvbApi::cDvbApi(int n)
replayBuffer = NULL; replayBuffer = NULL;
transferBuffer = NULL; transferBuffer = NULL;
transferringFromDvbApi = NULL; transferringFromDvbApi = NULL;
ca = 0; ca = -1;
priority = -1; priority = -1;
cardIndex = n; cardIndex = n;
SetCaCaps();
// Devices that are only present on DVB-C or DVB-S cards: // Devices that are only present on DVB-C or DVB-S cards:
@ -1783,37 +1784,93 @@ bool cDvbApi::SetPrimaryDvbApi(int n)
return false; return false;
} }
int cDvbApi::CanShift(int Ca, int Priority)
{
// Test whether a recording on this DVB device can be shifted to another one
// in order to perform a new recording with the given Ca and Priority on this device:
int ShiftLevel = -1; // default means this device can't be shifted
if (Recording()) {
if (ProvidesCa(Ca) // this device provides the requested Ca
&& (Ca != this->Ca() // the requested Ca is different from the one currently used...
|| Priority > this->Priority())) { // ...or the request comes from a higher priority
cDvbApi *d = NULL;
int Provides[MAXDVBAPI];
for (int i = 0; i < NumDvbApis; i++) {
if ((Provides[i] = dvbApi[i]->ProvidesCa(this->Ca())) != 0) { // this device is basicly able to do the job
if (dvbApi[i] != this) { // it is not _this_ device
int sl = dvbApi[i]->CanShift(this->Ca(), Priority); // this is the original Priority!
if (sl >= 0 && (ShiftLevel < 0 || sl < ShiftLevel)) {
d = dvbApi[i];
ShiftLevel = sl;
}
}
}
}
if (ShiftLevel >= 0)
ShiftLevel++; // adds the device's own shift
}
}
else if (Priority > this->Priority())
ShiftLevel = 0; // no shifting necessary, this device can do the job
return ShiftLevel;
}
cDvbApi *cDvbApi::GetDvbApi(int Ca, int Priority) cDvbApi *cDvbApi::GetDvbApi(int Ca, int Priority)
{ {
cDvbApi *d = NULL, *dMinPriority = NULL; cDvbApi *d = NULL;
int index = Ca - 1; int Provides[MAXDVBAPI];
for (int i = 0; i < MAXDVBAPI; i++) { // Check which devices provide Ca:
if (dvbApi[i]) { for (int i = 0; i < NumDvbApis; i++) {
if (dvbApi[i]->CardIndex() == index) { // means we need exactly _this_ device if ((Provides[i] = dvbApi[i]->ProvidesCa(Ca)) != 0) { // this device is basicly able to do the job
if (Priority > dvbApi[i]->Priority() // Priority is high enough to use this device
&& (!d // we don't have a device yet, or...
|| dvbApi[i]->Priority() < d->Priority() // ...this one has an even lower Priority
|| (dvbApi[i]->Priority() == d->Priority() // ...same Priority...
&& Provides[i] < Provides[d->CardIndex()]))) // ...but this one provides fewer Ca values
d = dvbApi[i]; d = dvbApi[i];
}
}
if (!d && Ca > MAXDVBAPI) {
// We didn't find one the easy way, so now we have to try harder:
int ShiftLevel = -1;
for (int i = 0; i < NumDvbApis; i++) {
if (Provides[i]) { // this device is basicly able to do the job, but for some reason we didn't get it above
int sl = dvbApi[i]->CanShift(Ca, Priority); // asks this device to shift its job to another device
if (sl >= 0 && (ShiftLevel < 0 || sl < ShiftLevel)) {
d = dvbApi[i]; // found one that can be shifted with the fewest number of subsequent shifts
ShiftLevel = sl;
}
}
}
}
return d;
}
void cDvbApi::SetCaCaps(void)
{
for (int i = 0; i < MAXCACAPS; i++)
caCaps[i] = Setup.CaCaps[CardIndex()][i];
}
int cDvbApi::ProvidesCa(int Ca)
{
if (Ca == CardIndex() + 1)
return 1; // exactly _this_ card was requested
if (Ca && Ca <= MAXDVBAPI)
return 0; // a specific card was requested, but not _this_ one
int result = Ca ? 0 : 1; // by default every card can provide FTA
int others = Ca ? 1 : 0;
for (int i = 0; i < MAXCACAPS; i++) {
if (caCaps[i]) {
if (caCaps[i] == Ca)
result = 1;
else
others++;
}
else
break; break;
} }
else if (Ca == 0) { // means any device would be acceptable return result ? result + others : 0;
if (!d || !dvbApi[i]->Recording() || (d->Recording() && d->Priority() > dvbApi[i]->Priority()))
d = dvbApi[i]; // this is one that is either not currently recording or has the lowest priority
if (d && d != PrimaryDvbApi && !d->Recording()) // avoids the PrimaryDvbApi if possible
break;
if (d && d->Recording() && d->Priority() < Setup.PrimaryLimit && (!dMinPriority || d->Priority() < dMinPriority->Priority()))
dMinPriority = d; // this is the one with the lowest priority below Setup.PrimaryLimit
}
}
}
if (d == PrimaryDvbApi) { // the PrimaryDvbApi was the only one that was free
if (Priority < Setup.PrimaryLimit)
return NULL; // not enough priority to use the PrimaryDvbApi
if (dMinPriority) // there's one that must not use the PrimaryDvbApi...
d = dMinPriority; // ...so let's kick out that one
}
return (d // we found one...
&& (!d->Recording() // ...that's either not currently recording...
|| d->Priority() < Priority // ...or has a lower priority...
|| (!d->Ca() && Ca))) // ...or doesn't need this card
? d : NULL;
} }
bool cDvbApi::Probe(const char *FileName) bool cDvbApi::Probe(const char *FileName)
@ -1854,7 +1911,7 @@ bool cDvbApi::Init(void)
void cDvbApi::Cleanup(void) void cDvbApi::Cleanup(void)
{ {
for (int i = 0; i < MAXDVBAPI; i++) { for (int i = 0; i < NumDvbApis; i++) {
delete dvbApi[i]; delete dvbApi[i];
dvbApi[i] = NULL; dvbApi[i] = NULL;
} }
@ -2148,6 +2205,11 @@ void cDvbApi::Flush(void)
#endif #endif
} }
int cDvbApi::Priority(void)
{
return (this == PrimaryDvbApi && !Recording()) ? Setup.PrimaryLimit - 1 : priority;
}
int cDvbApi::SetModeRecord(void) int cDvbApi::SetModeRecord(void)
{ {
// Sets up the DVB device for recording // Sets up the DVB device for recording
@ -2262,7 +2324,7 @@ eSetChannelResult cDvbApi::SetChannel(int ChannelNumber, int Frequency, char Pol
// If this card can't receive this channel, we must not actually switch // If this card can't receive this channel, we must not actually switch
// the channel here, because that would irritate the driver when we // the channel here, because that would irritate the driver when we
// start replaying in Transfer Mode immediately after switching the channel: // start replaying in Transfer Mode immediately after switching the channel:
bool NeedsTransferMode = (this == PrimaryDvbApi && Ca && Ca != CardIndex() + 1); bool NeedsTransferMode = (this == PrimaryDvbApi && !ProvidesCa(Ca));
if (!NeedsTransferMode) { if (!NeedsTransferMode) {
@ -2504,7 +2566,7 @@ void cDvbApi::StopRecord(void)
if (recordBuffer) { if (recordBuffer) {
delete recordBuffer; delete recordBuffer;
recordBuffer = NULL; recordBuffer = NULL;
ca = 0; ca = -1;
priority = -1; priority = -1;
} }
} }
@ -2703,7 +2765,7 @@ void cEITScanner::Process(void)
time_t now = time(NULL); time_t now = time(NULL);
if (now - lastScan > ScanTimeout && now - lastActivity > ActivityTimeout) { if (now - lastScan > ScanTimeout && now - lastActivity > ActivityTimeout) {
for (int i = 0; i < MAXDVBAPI; i++) { for (int i = 0; i < MAXDVBAPI; i++) {
cDvbApi *DvbApi = cDvbApi::GetDvbApi(i + 1, MAXPRIORITY); cDvbApi *DvbApi = cDvbApi::GetDvbApi(i + 1, MAXPRIORITY + 1);
if (DvbApi) { if (DvbApi) {
if (DvbApi != cDvbApi::PrimaryDvbApi || (cDvbApi::NumDvbApis == 1 && Setup.EPGScanTimeout && now - lastActivity > Setup.EPGScanTimeout * 3600)) { if (DvbApi != cDvbApi::PrimaryDvbApi || (cDvbApi::NumDvbApis == 1 && Setup.EPGScanTimeout && now - lastActivity > Setup.EPGScanTimeout * 3600)) {
if (!(DvbApi->Recording() || DvbApi->Replaying() || DvbApi->Transferring())) { if (!(DvbApi->Recording() || DvbApi->Replaying() || DvbApi->Transferring())) {

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: dvbapi.h 1.63 2002/02/24 12:38:08 kls Exp $ * $Id: dvbapi.h 1.64 2002/03/03 14:51:20 kls Exp $
*/ */
#ifndef __DVBAPI_H #ifndef __DVBAPI_H
@ -94,12 +94,16 @@ private:
public: public:
~cDvbApi(); ~cDvbApi();
#define MAXDVBAPI 4 #define MAXDVBAPI 4 // the maximum number of DVB cards in the system
#define MAXCACAPS 16 // the maximum number of different CA values per DVB card
static int NumDvbApis; static int NumDvbApis;
private: private:
static cDvbApi *dvbApi[MAXDVBAPI]; static cDvbApi *dvbApi[MAXDVBAPI];
static int useDvbApi; static int useDvbApi;
int cardIndex; int cardIndex;
int caCaps[MAXCACAPS];
int CanShift(int Ca, int Priority);
public: public:
static cDvbApi *PrimaryDvbApi; static cDvbApi *PrimaryDvbApi;
static void SetUseDvbApi(int n); static void SetUseDvbApi(int n);
@ -110,9 +114,10 @@ public:
// Sets the primary DVB device to 'n' (which must be in the range // Sets the primary DVB device to 'n' (which must be in the range
// 1...NumDvbApis) and returns true if this was possible. // 1...NumDvbApis) and returns true if this was possible.
static cDvbApi *GetDvbApi(int Ca, int Priority); static cDvbApi *GetDvbApi(int Ca, int Priority);
// Selects a free DVB device, starting with the highest device number // Selects a free DVB device, avoiding the PrimaryDvbApi if possible.
// (but avoiding, if possible, the PrimaryDvbApi). // If Ca is not 0, the device with the given number will be returned
// If Ca is not 0, the device with the given number will be returned. // in case Ca is <= MAXDVBAPI, or the device that provides the given
// value in its caCaps.
// If all DVB devices are currently recording, the one recording the // If all DVB devices are currently recording, the one recording the
// lowest priority timer (if any) that is lower than the given Priority // lowest priority timer (if any) that is lower than the given Priority
// will be returned. // will be returned.
@ -120,6 +125,15 @@ public:
// recording and stop recording if necessary. // recording and stop recording if necessary.
int CardIndex(void) { return cardIndex; } int CardIndex(void) { return cardIndex; }
// Returns the card index of this DvbApi (0 ... MAXDVBAPI - 1). // Returns the card index of this DvbApi (0 ... MAXDVBAPI - 1).
void SetCaCaps(void);
// Sets the CaCaps of this DVB device according to the Setup data.
int ProvidesCa(int Ca);
// Checks whether this DVB device provides the given value in its
// caCaps. Returns 0 if the value is not provided, 1 if only this
// value is provided, and > 1 if this and other values are provided.
// If the given value is equal to the number of this DVB device,
// 1 is returned. If it is 0 (FTA), 1 plus the number of other values
// in caCaps is returned.
static bool Probe(const char *FileName); static bool Probe(const char *FileName);
// Probes for existing DVB devices. // Probes for existing DVB devices.
static bool Init(void); static bool Init(void);
@ -204,16 +218,17 @@ private:
cPlayBuffer *replayBuffer; cPlayBuffer *replayBuffer;
int ca; int ca;
int priority; int priority;
int Priority(void) { return priority; } int Priority(void);
// Returns the priority of the current recording session (0..MAXPRIORITY), // Returns the priority of the current recording session (0..MAXPRIORITY),
// or -1 if no recording is currently active. // or -1 if no recording is currently active. The primary DVB device will
// always return at least Setup.PrimaryLimit-1.
int SetModeRecord(void); int SetModeRecord(void);
// Initiates recording mode and returns the file handle to read from. // Initiates recording mode and returns the file handle to read from.
void SetModeReplay(void); void SetModeReplay(void);
void SetModeNormal(bool FromRecording); void SetModeNormal(bool FromRecording);
public: public:
int Ca(void) { return ca; } int Ca(void) { return ca; }
// Returns the ca of the current recording session (0..MAXDVBAPI). // Returns the ca of the current recording session.
int SecondsToFrames(int Seconds); int SecondsToFrames(int Seconds);
// Returns the number of frames corresponding to the given number of seconds. // Returns the number of frames corresponding to the given number of seconds.
bool Recording(void); bool Recording(void);

12
i18n.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: i18n.c 1.57 2002/02/24 12:54:12 kls Exp $ * $Id: i18n.c 1.58 2002/03/03 16:12:00 kls Exp $
* *
* Slovenian translations provided by Miha Setina <mihasetina@softhome.net> * Slovenian translations provided by Miha Setina <mihasetina@softhome.net>
* Italian translations provided by Alberto Carraro <bertocar@tin.it> * Italian translations provided by Alberto Carraro <bertocar@tin.it>
@ -1176,6 +1176,16 @@ const tPhrase Phrases[] = {
"", // TODO "", // TODO
"Näytä toiston tila", "Näytä toiston tila",
}, },
{ "CICAM DVB",
"CICAM DVB",
"", // TODO
"", // TODO
"", // TODO
"", // TODO
"", // TODO
"", // TODO
"", // TODO
},
// The days of the week: // The days of the week:
{ "MTWTFSS", { "MTWTFSS",
"MDMDFSS", "MDMDFSS",

65
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.159 2002/02/24 12:55:49 kls Exp $ * $Id: menu.c 1.160 2002/03/03 16:12:29 kls Exp $
*/ */
#include "menu.h" #include "menu.h"
@ -585,6 +585,60 @@ void cMenuEditStraItem::Set(void)
SetValue(strings[*value]); SetValue(strings[*value]);
} }
// --- cMenuEditCaItem -------------------------------------------------------
class cMenuEditCaItem : public cMenuEditIntItem {
private:
const cCaDefinition *ca;
bool allowCardNr;
protected:
virtual void Set(void);
public:
cMenuEditCaItem(const char *Name, int *Value, bool AllowCardNr = false);
eOSState ProcessKey(eKeys Key);
};
cMenuEditCaItem::cMenuEditCaItem(const char *Name, int *Value, bool AllowCardNr)
:cMenuEditIntItem(Name, Value, 0)
{
ca = CaDefinitions.Get(*Value);
allowCardNr = AllowCardNr;
Set();
}
void cMenuEditCaItem::Set(void)
{
if (ca)
SetValue(ca->Description());
else
cMenuEditIntItem::Set();
}
eOSState cMenuEditCaItem::ProcessKey(eKeys Key)
{
eOSState state = cMenuEditItem::ProcessKey(Key);
if (state == osUnknown) {
if (NORMALKEY(Key) == kLeft) { // TODO might want to increase the delta if repeated quickly?
if (ca && ca->Prev()) {
ca = (cCaDefinition *)ca->Prev();
*value = ca->Number();
}
}
else if (NORMALKEY(Key) == kRight) {
if (ca && ca->Next() && (allowCardNr || ((cCaDefinition *)ca->Next())->Number() > MAXDVBAPI)) {
ca = (cCaDefinition *)ca->Next();
*value = ca->Number();
}
}
else
return cMenuEditIntItem::ProcessKey(Key);
Set();
state = osContinue;
}
return state;
}
// --- cMenuEditChannel ------------------------------------------------------ // --- cMenuEditChannel ------------------------------------------------------
class cMenuEditChannel : public cOsdMenu { class cMenuEditChannel : public cOsdMenu {
@ -613,7 +667,7 @@ cMenuEditChannel::cMenuEditChannel(int Index)
Add(new cMenuEditIntItem( tr("Dpid1"), &data.dpid1, 0, 0x1FFF)); Add(new cMenuEditIntItem( tr("Dpid1"), &data.dpid1, 0, 0x1FFF));
Add(new cMenuEditIntItem( tr("Dpid2"), &data.dpid2, 0, 0x1FFF)); Add(new cMenuEditIntItem( tr("Dpid2"), &data.dpid2, 0, 0x1FFF));
Add(new cMenuEditIntItem( tr("Tpid"), &data.tpid, 0, 0x1FFF)); Add(new cMenuEditIntItem( tr("Tpid"), &data.tpid, 0, 0x1FFF));
Add(new cMenuEditIntItem( tr("CA"), &data.ca, 0, cDvbApi::NumDvbApis)); Add(new cMenuEditCaItem( tr("CA"), &data.ca, true));
Add(new cMenuEditIntItem( tr("Pnr"), &data.pnr, 0)); Add(new cMenuEditIntItem( tr("Pnr"), &data.pnr, 0));
} }
} }
@ -1880,6 +1934,13 @@ void cMenuSetup::Set(void)
Add(new cMenuEditIntItem( tr("MinUserInactivity"), &data.MinUserInactivity)); Add(new cMenuEditIntItem( tr("MinUserInactivity"), &data.MinUserInactivity));
Add(new cMenuEditBoolItem(tr("MultiSpeedMode"), &data.MultiSpeedMode)); Add(new cMenuEditBoolItem(tr("MultiSpeedMode"), &data.MultiSpeedMode));
Add(new cMenuEditBoolItem(tr("ShowReplayMode"), &data.ShowReplayMode)); Add(new cMenuEditBoolItem(tr("ShowReplayMode"), &data.ShowReplayMode));
for (int d = 0; d < cDvbApi::NumDvbApis; d++) {
for (int i = 0; i < 2; i++) {
char buffer[32];
snprintf(buffer, sizeof(buffer), "%s%d %d", tr("CICAM DVB"), d + 1, i + 1);
Add(new cMenuEditCaItem(buffer, &data.CaCaps[d][i]));
}
}
} }
eOSState cMenuSetup::ProcessKey(eKeys Key) eOSState cMenuSetup::ProcessKey(eKeys Key)

3
vdr.c
View File

@ -22,7 +22,7 @@
* *
* The project's page is at http://www.cadsoft.de/people/kls/vdr * The project's page is at http://www.cadsoft.de/people/kls/vdr
* *
* $Id: vdr.c 1.97 2002/02/24 12:55:10 kls Exp $ * $Id: vdr.c 1.98 2002/03/03 14:56:03 kls Exp $
*/ */
#include <getopt.h> #include <getopt.h>
@ -252,6 +252,7 @@ int main(int argc, char *argv[])
Timers.Load(AddDirectory(ConfigDirectory, "timers.conf")); Timers.Load(AddDirectory(ConfigDirectory, "timers.conf"));
Commands.Load(AddDirectory(ConfigDirectory, "commands.conf")); Commands.Load(AddDirectory(ConfigDirectory, "commands.conf"));
SVDRPhosts.Load(AddDirectory(ConfigDirectory, "svdrphosts.conf"), true); SVDRPhosts.Load(AddDirectory(ConfigDirectory, "svdrphosts.conf"), true);
CaDefinitions.Load(AddDirectory(ConfigDirectory, "ca.conf"), true);
#if defined(REMOTE_LIRC) #if defined(REMOTE_LIRC)
Keys.SetDummyValues(); Keys.SetDummyValues();
#elif !defined(REMOTE_NONE) #elif !defined(REMOTE_NONE)