*.rej
*.bak
version.c
-i18n.c
FFdecsa/FFdecsa_test
FFdecsa/FFdecsa_test.done
dump.*
PODIR = po
I18Npot = $(PODIR)/$(PLUGIN).pot
-ifeq ($(strip $(APIVERSION)),1.5.7)
- I18Nmo = $(PLUGIN).mo
-else
- I18Nmo = vdr-$(PLUGIN).mo
-endif
+I18Nmo = vdr-$(PLUGIN).mo
I18Nmsgs = $(addprefix $(LOCALEDIR)/,$(addsuffix /LC_MESSAGES/$(I18Nmo),$(notdir $(foreach file, $(wildcard $(PODIR)/*.po), $(basename $(file))))))
LOCALEDIR = $(VDRDIR)/locale
-HASLOCALE = $(shell grep -l 'I18N_DEFAULT_LOCALE' $(VDRDIR)/include/vdr/i18n.h)
-
-ifeq ($(strip $(HASLOCALE)),)
- OBJS += i18n.o
-endif
### VDR version dependant
else
BUILDTARGETS = $(LIBDIR)/libvdr-$(PLUGIN).so.$(APIVERSION) systems-pre
endif
-BUILDTARGETS += $(FFDECSATEST) systems
-
-ifneq ($(strip $(HASLOCALE)),)
-BUILDTARGETS += i18n
-endif
+BUILDTARGETS += $(FFDECSATEST) systems i18n
all: $(BUILDTARGETS)
.PHONY: i18n systems systems-pre contrib clean clean-core clean-systems clean-pre dist srcdist
i18n: $(I18Nmsgs)
-i18n.c: $(PODIR)/*.po i18n-template.c po2i18n.pl
- perl ./po2i18n.pl <i18n-template.c >i18n.c
-
version.c: FORCE
@echo >$@.new "/* generated file, do not edit */"; \
echo >>$@.new 'const char *ScVersion =' '"'$(VERSION)'";'; \
@if test -d $(FFDECSADIR); then $(MAKE) -C $(FFDECSADIR) clean; fi
@-rm -f $(LIBDIR)/libsc-*-$(SCAPIVERS).so.$(APIVERSION)
@-rm -f $(LIBDIR)/libvdr-$(PLUGIN).a $(LIBDIR)/libsc-*.a
- @-rm -f $(OBJS) $(DEPFILE) version.c i18n.c *.so *.tar.gz core* *~
+ @-rm -f $(OBJS) $(DEPFILE) version.c *.so *.tar.gz core* *~
@-rm -f $(PODIR)/*.mo
clean-pre:
* DVB driver from dvb-kernel 2.6 or 2.4 branch with applied patches
* a patched firmware version 2620 or newer
-* VDR 1.5.0 or newer (VDR 1.4.6+ in compatibility mode, see 1.4.x setup section)
+* VDR 1.6.0 or newer
* Openssl package version 0.9.7 or newer
Contrary to older plugin versions (before 0.7.0) you MUST NOT apply patches to
the VDR core (neither vdr-sc nor ffdecsa/softcsa) except if:
-- you are using VDR 1.4.x (see section below)
- you are using VDR 1.7.8 or lower and want to view channels with split ECM
To correctly decode channels with split ECM (i.e. audio and video encrypted
with different CW) you need to apply a patch to the VDR core if you are using
a VDR version before 1.7.9. You can find the "vdr-1.6.0-2-streamca.diff" file
in the patches subdirectory. It has been tested with VDR 1.6.0-2 only, but
-probably will apply to other VDR versions as well. This feature is explicitely
-not supported for VDR 1.4.x.
+probably will apply to other VDR versions as well.
You must have installed the openssl development files. For most distributions
this means to install openssl-devel package. You should use a openssl package
-How to setup for VDR 1.4.x ?
-----------------------------
-
-NOTE: support for VDR 1.4.7 is deprecated. As development requires, the support
-will be removed.
-
-Additional to the points mentioned above, you have to patch the VDR core with
-the supplied patch (vdr-1.4.x-sc7.diff). Recompile VDR and use the new binary.
-Patches from older SC releases are not going to work.
-
-Even with VDR 1.4.x you don't have to use a softcsa/ffdecsa patch.
-
-Activating/deactivating DVB cards in the plugin setup menu needs a VDR restart
-to take effect.
-
-
-
Pre-compiled libraries
----------------------
+++ /dev/null
-
- po2i18n - Converter for po files
-
-
-Written by: Udo Richter <udo_richter@gmx.de>
-Project's homepage: http://www.udo-richter.de/vdr/scripts.html#po2i18n
- http://www.udo-richter.de/vdr/scripts.en.html#po2i18n
-
-
-
-About
---------------------------------------------------------------------------
-po2i18n is a perl script that generates an i18n.c file compatible to the i18n
-system of VDR 1.2.0 - VDR 1.5.6, based on the .po files of VDR 1.5.7. This
-allows plugins to transit to the translation system of VDR 1.5.7 while
-maintaining compatibility to earlier versions. The script can be used manually
-or automatically as part of the Makefile.
-
-
-Use
---------------------------------------------------------------------------
-po2i18n.pl is a filter and can be used manually like this:
-
- ./po2i18n.pl < i18n-template.c > i18n.c
-
-The filter reads all relevant ./po/*.po files and writes the i18n strings
-into the template file. Strings will be added between the following two lines:
-
- // START I18N
- // END I18N
-
-See also the sample i18n.h and i18n-template.c file. Note that the phrases data
-structure is encapsulated in #if VDRVERSNUM < 10507, so the i18n strings won't
-be in the plugin file after 1.5.7. The call to RegisterI18n() of your plugin
-should also be encapsulated like this.
-
-po2i18n can also generate the i18n.c file on the fly while compiling. The
-changes to the Makefile are demonstrated by the included Makefile.diff sample.
-With these changes, the i18n.c file will be generated on VDR up to 1.5.6, and
-the whole gettext conversion is skipped. From 1.5.7 on, the i18n-template.c
-file will be simply copied as a dummy, and the new locale system will run.
-
-As a drawback, the automatic .dependencies for i18n.c won't work.
-
#include <vdr/ci.h>
#include <vdr/dvbdevice.h>
#ifndef SASC
-#if APIVERSNUM >= 10500
#include <vdr/dvbci.h>
-#endif
#include <vdr/thread.h>
#include "FFdecsa/FFdecsa.h"
// --- cChannelCaids -----------------------------------------------------------
-#if APIVERSNUM >= 10500
-
class cChannelCaids : public cSimpleItem {
private:
int prg, source, transponder;
return Device ? (Device==device) : true;
}
-#endif //APIVERSNUM >= 10500
-
// -- cDeCSA -------------------------------------------------------------------
#define MAX_CSA_PIDS 8192
#endif
{
decsa=0; tsBuffer=0; cam=0; fullts=false;
-#if APIVERSNUM >= 10500
ciadapter=0; hwciadapter=0;
-#else
- memset(lrucaid,0,sizeof(lrucaid));
-#endif
fd_ca=cafd; fd_ca2=dup(fd_ca); fd_dvr=-1;
softcsa=(fd_ca<0);
}
EarlyShutdown();
delete decsa;
if(fd_ca>=0) close(fd_ca);
-#if APIVERSNUM >= 10500
if(fd_ca2>=0) close(fd_ca2);
-#endif
}
void cScDevice::EarlyShutdown(void)
{
-#if APIVERSNUM >= 10500
SetCamSlot(0);
delete ciadapter; ciadapter=0;
delete hwciadapter; hwciadapter=0;
-#endif
if(cam) cam->Stop();
delete cam; cam=0;
}
softcsa=true;
}
-#if APIVERSNUM >= 10500
if(fd_ca2>=0) hwciadapter=cDvbCiAdapter::CreateCiAdapter(this,fd_ca2);
cam=new cCam(this,n);
ciadapter=new cScCiAdapter(this,n,cam);
-#else
- if(fd_ca2>=0) {
- ciHandler=cCiHandler::CreateCiHandler(fd_ca2);
- if(!ciHandler) close(fd_ca2);
- }
- cam=ScSetup.CapCheck(n) ? new cCam(this,n):0;
-#endif
if(softcsa) {
decsa=new cDeCSA(n);
if(IsPrimaryDevice() && HasDecoder()) {
}
}
-#if APIVERSNUM >= 10501
bool cScDevice::HasCi(void)
{
return ciadapter || hwciadapter;
}
-#endif
-#if APIVERSNUM >= 10500
bool cScDevice::Ready(void)
{
return (ciadapter ? ciadapter->Ready():true) &&
(hwciadapter ? hwciadapter->Ready():true);
}
-#endif
bool cScDevice::SetPid(cPidHandle *Handle, int Type, bool On)
{
bool cScDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
{
-#if APIVERSNUM < 10500
- SetChannelLRU(Channel);
-#endif
if(cam) cam->Tune(Channel);
bool ret=cDvbDevice::SetChannelDevice(Channel,LiveView);
if(ret && cam) cam->PostTune();
return ret;
}
-#if APIVERSNUM < 10500
-int cScDevice::ProvidesCa(const cChannel *Channel) const
-{
- if(cam && Channel->Ca()>=CA_ENCRYPTED_MIN) {
- int caid;
- for(int j=0; (caid=Channel->Ca(j)); j++)
- if(!overrides.Ignore(Channel->Source(),Channel->Transponder(),caid)) {
- int n=cSystems::CanHandle(caid,!softcsa);
- if(n<0) break;
- if(n>0) return 2;
- }
- }
- return cDvbDevice::ProvidesCa(Channel);
-}
-
-bool cScDevice::CiAllowConcurrent(void) const
-{
- return softcsa || ScSetup.ConcurrentFF>0;
-}
-
-bool cScDevice::GetPrgCaids(int source, int transponder, int prg, caid_t *c)
-{
- cMutexLock lock(&lruMutex);
- int i=FindLRUPrg(source,transponder,prg);
- if(i>=0) {
- for(int j=0; j<MAXCAIDS && lrucaid[i].caids[j]; j++) *c++=lrucaid[i].caids[j];
- *c=0;
- return true;
- }
- return false;
-}
-
-int cScDevice::FindLRUPrg(int source, int transponder, int prg)
-{
- for(int i=0; i<MAX_LRU_CAID; i++)
- if(lrucaid[i].src==source && lrucaid[i].tr==transponder && lrucaid[i].prg==prg) return i;
- return -1;
-}
-
-void cScDevice::SetChannelLRU(const cChannel *Channel)
-{
- lruMutex.Lock();
- int i=FindLRUPrg(Channel->Source(),Channel->Transponder(),Channel->Sid());
- if(i<0) i=MAX_LRU_CAID-1;
- if(i>0) memmove(&lrucaid[1],&lrucaid[0],sizeof(struct LruCaid)*i);
- for(i=0; i<=MAXCAIDS; i++) if((lrucaid[0].caids[i]=Channel->Ca(i))==0) break;
- lrucaid[0].src=Channel->Source();
- lrucaid[0].tr=Channel->Transponder();
- lrucaid[0].prg=Channel->Sid();
- lruMutex.Unlock();
-}
-
-void cScDevice::CiStartDecrypting(void)
-{
- if(cam) {
- cSimpleList<cPrg> prgList;
- for(cCiCaProgramData *p=ciProgramList.First(); p; p=ciProgramList.Next(p)) {
- if(p->modified) {
- cPrg *prg=new cPrg(p->programNumber,cam->HasPrg(p->programNumber));
- if(prg) {
- bool haspid=false;
- for(cCiCaPidData *q=p->pidList.First(); q; q=p->pidList.Next(q)) {
- if(q->active) {
- prg->pids.Add(new cPrgPid(q->streamType,q->pid));
- haspid=true;
- }
- }
- if(haspid) {
- caid_t casys[MAXCAIDS+1];
- if(GetPrgCaids(ciSource,ciTransponder,p->programNumber,casys)) {
- unsigned char buff[2048];
- bool streamflag;
- int len=GetCaDescriptors(ciSource,ciTransponder,p->programNumber,casys,sizeof(buff),buff,streamflag);
- if(len>0) prg->caDescr.Set(buff,len);
- }
- }
- prgList.Add(prg);
- }
- p->modified=false;
- }
- }
- for(int loop=1; loop<=2; loop++) // first delete, then add
- for(cPrg *prg=prgList.First(); prg; prg=prgList.Next(prg))
- if((loop==1)!=(prg->pids.Count()>0))
- cam->AddPrg(prg);
- }
- cDvbDevice::CiStartDecrypting();
-}
-#endif //APIVERSNUM < 10500
-
bool cScDevice::ScActive(void)
{
-#if APIVERSNUM >= 10500
return dynamic_cast<cScCamSlot *>(CamSlot())!=0;
-#else
- return cam && softcsa;
-#endif
}
bool cScDevice::OpenDvr(void)
void cScDevice::CaidsChanged(void)
{
-#if APIVERSNUM >= 10500
if(ciadapter) ciadapter->CaidsChanged();
PRINTF(L_CORE_CAIDS,"caid list rebuild triggered");
-#endif
}
bool cScDevice::SetCaDescr(ca_descr_t *ca_descr, bool initial)
// ----------------------------------------------------------------
-#if APIVERSNUM >= 10500
typedef int caid_t;
-#else
-typedef unsigned short caid_t;
-#endif
#define MAX_CW_IDX 16
#define MAX_CI_SLOTS 8
cDeCSA *decsa;
cDeCsaTSBuffer *tsBuffer;
cMutex tsMutex;
-#if APIVERSNUM >= 10500
cScCiAdapter *ciadapter;
cCiAdapter *hwciadapter;
-#endif
cCam *cam;
int fd_dvr, fd_ca, fd_ca2;
bool softcsa, fullts;
bool ScActive(void);
#endif //SASC
//
-#if APIVERSNUM < 10500
-#define MAX_LRU_CAID 10
- struct LruCaid {
- int src, tr, prg;
- caid_t caids[MAXCAIDS+1];
- } lrucaid[MAX_LRU_CAID];
- cMutex lruMutex;
- //
- int FindLRUPrg(int source, int transponder, int prg);
- bool GetPrgCaids(int source, int transponder, int prg, caid_t *c);
- void SetChannelLRU(const cChannel *Channel);
-#endif
protected:
#ifndef SASC
-#if APIVERSNUM >= 10500
virtual bool Ready(void);
-#else
- virtual void CiStartDecrypting(void);
- virtual bool CiAllowConcurrent(void) const;
-#endif
virtual bool SetPid(cPidHandle *Handle, int Type, bool On);
virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView);
virtual bool OpenDvr(void);
cScDevice(int Adapter, int Frontend, int cafd);
~cScDevice();
#ifndef SASC
-#if APIVERSNUM >= 10501
virtual bool HasCi(void);
-#endif
-#if APIVERSNUM < 10500
- virtual int ProvidesCa(const cChannel *Channel) const;
-#endif
#endif //SASC
virtual bool SetCaDescr(ca_descr_t *ca_descr, bool initial);
virtual bool SetCaPid(ca_pid_t *ca_pid);
// VDR's own version number:
-#define VDRVERSION "1.5.5"
-#define VDRVERSNUM 10505 // Version * 10000 + Major * 100 + Minor
+#define VDRVERSION "1.6.0"
+#define VDRVERSNUM 10600 // Version * 10000 + Major * 100 + Minor
// The plugin API's version number:
-#define APIVERSION "1.5.5"
-#define APIVERSNUM 10505 // Version * 10000 + Major * 100 + Minor
+#define APIVERSION "1.6.0"
+#define APIVERSNUM 10600 // Version * 10000 + Major * 100 + Minor
// When loading plugins, VDR searches them by their APIVERSION, which
// may be smaller than VDRVERSION in case there have been no changes to
#define tr(s) I18nTranslate(s)
#endif
+#define trNOOP(s) (s)
+
#endif //__I18N_H
+++ /dev/null
-/*
- * Auto generated file, do not edit
- * Will be overwritten/deleted without warning
- *
- * Edit the .po files if you want to update translations!!
- */
-
-#include "i18n.h"
-
-#if VDRVERSNUM < 10507
-
-const tI18nPhrase ScPhrases[] = {
-// START I18N
-// END I18N
- { NULL }
- };
-
-#endif
#include <vdr/i18n.h>
-#if APIVERSNUM < 10507
-extern const tI18nPhrase ScPhrases[];
-#define trNOOP(s) (s)
-#endif
-
#endif //___I18N_H
+++ /dev/null
-diff -urN -X ex.vdr-sc7 vdr-1.4.7-orig/ci.c vdr-1.4.7-sc7/ci.c
---- vdr-1.4.7-orig/ci.c 2007-04-30 14:58:41.000000000 +0200
-+++ vdr-1.4.7-sc7/ci.c 2007-05-13 18:04:04.000000000 +0200
-@@ -1502,9 +1502,8 @@
- close(fd);
- }
-
--cCiHandler *cCiHandler::CreateCiHandler(const char *FileName)
-+cCiHandler *cCiHandler::CreateCiHandler(int fd_ca)
- {
-- int fd_ca = open(FileName, O_RDWR);
- if (fd_ca >= 0) {
- ca_caps_t Caps;
- if (ioctl(fd_ca, CA_GET_CAP, &Caps) == 0) {
-@@ -1520,8 +1519,7 @@
- esyslog("ERROR: no CAM slots found");
- }
- else
-- LOG_ERROR_STR(FileName);
-- close(fd_ca);
-+ LOG_ERROR_STR("CA_GET_CAP");
- }
- return NULL;
- }
-diff -urN -X ex.vdr-sc7 vdr-1.4.7-orig/ci.h vdr-1.4.7-sc7/ci.h
---- vdr-1.4.7-orig/ci.h 2006-08-12 11:43:31.000000000 +0200
-+++ vdr-1.4.7-sc7/ci.h 2007-06-24 19:46:39.000000000 +0200
-@@ -85,10 +85,12 @@
- class cCiCaProgramData : public cListObject {
- public:
- int programNumber;
-+ bool modified;
- cList<cCiCaPidData> pidList;
- cCiCaProgramData(int ProgramNumber)
- {
- programNumber = ProgramNumber;
-+ modified = true;
- }
- };
-
-@@ -96,6 +98,8 @@
- class cCiTransportLayer;
- class cCiTransportConnection;
-
-+#define VDR_IS_SC_PATCHED 402
-+
- class cCiHandler {
- private:
- cMutex mutex;
-@@ -123,7 +127,7 @@
- void SendCaPmt(void);
- public:
- ~cCiHandler();
-- static cCiHandler *CreateCiHandler(const char *FileName);
-+ static cCiHandler *CreateCiHandler(int fd_ca);
- ///< Creates a new cCiHandler for the given CA device.
- int NumSlots(void) { return numSlots; }
- ///< Returns the number of CAM slots provided by this CA device.
-diff -urN -X ex.vdr-sc7 vdr-1.4.7-orig/device.c vdr-1.4.7-sc7/device.c
---- vdr-1.4.7-orig/device.c 2006-09-03 12:13:25.000000000 +0200
-+++ vdr-1.4.7-sc7/device.c 2007-05-13 18:30:57.000000000 +0200
-@@ -395,6 +395,54 @@
- return false;
- }
-
-+void cDevice::CiStartDecrypting(void)
-+{
-+ if (ciHandler)
-+ ciHandler->StartDecrypting();
-+}
-+
-+void cDevice::CiSetSource(int Source, int Transponder)
-+{
-+ cMutexLock MutexLock(&ciListMutex);
-+ if (ciSource != Source || ciTransponder != Transponder)
-+ ciProgramList.Clear();
-+ ciSource = Source;
-+ ciTransponder = Transponder;
-+}
-+
-+void cDevice::CiAddPid(int ProgramNumber, int Pid, int StreamType)
-+{
-+ cMutexLock MutexLock(&ciListMutex);
-+ cCiCaProgramData *ProgramData = NULL;
-+ for (cCiCaProgramData *p = ciProgramList.First(); p; p = ciProgramList.Next(p)) {
-+ if (p->programNumber == ProgramNumber) {
-+ ProgramData = p;
-+ for (cCiCaPidData *q = p->pidList.First(); q; q = p->pidList.Next(q)) {
-+ if (q->pid == Pid)
-+ return;
-+ }
-+ }
-+ }
-+ if (!ProgramData)
-+ ciProgramList.Add(ProgramData = new cCiCaProgramData(ProgramNumber));
-+ ProgramData->pidList.Add(new cCiCaPidData(Pid, StreamType));
-+ ProgramData->modified=true;
-+}
-+
-+void cDevice::CiSetPid(int Pid, bool Active)
-+{
-+ cMutexLock MutexLock(&ciListMutex);
-+ for (cCiCaProgramData *p = ciProgramList.First(); p; p = ciProgramList.Next(p)) {
-+ for (cCiCaPidData *q = p->pidList.First(); q; q = p->pidList.Next(q)) {
-+ if (q->pid == Pid) {
-+ q->active = Active;
-+ p->modified = true;
-+ return;
-+ }
-+ }
-+ }
-+}
-+
- bool cDevice::AddPid(int Pid, ePidType PidType)
- {
- if (Pid || PidType == ptPcr) {
-@@ -424,6 +472,7 @@
- }
- if (ciHandler)
- ciHandler->SetPid(Pid, true);
-+ CiSetPid(Pid, true);
- }
- PRINTPIDS("a");
- return true;
-@@ -453,6 +502,7 @@
- }
- if (ciHandler)
- ciHandler->SetPid(Pid, true);
-+ CiSetPid(Pid, true);
- }
- }
- return true;
-@@ -481,6 +531,7 @@
- pidHandles[n].pid = 0;
- if (ciHandler)
- ciHandler->SetPid(Pid, false);
-+ CiSetPid(Pid, false);
- }
- }
- PRINTPIDS("E");
-@@ -663,6 +714,16 @@
- }
- #endif
- }
-+
-+ CiSetSource(Channel->Source(), Channel->Transponder());
-+ if (Channel->Ca() >= CA_ENCRYPTED_MIN) {
-+ CiAddPid(Channel->Sid(), Channel->Vpid(), 2);
-+ for (const int *Apid = Channel->Apids(); *Apid; Apid++)
-+ CiAddPid(Channel->Sid(), *Apid, 4);
-+ for (const int *Dpid = Channel->Dpids(); *Dpid; Dpid++)
-+ CiAddPid(Channel->Sid(), *Dpid, 0);
-+ }
-+
- if (NeedsDetachReceivers)
- DetachAllReceivers();
- if (SetChannelDevice(Channel, LiveView)) {
-@@ -672,8 +733,7 @@
- sectionHandler->SetStatus(true);
- }
- // Start decrypting any PIDs that might have been set in SetChannelDevice():
-- if (ciHandler)
-- ciHandler->StartDecrypting();
-+ CiStartDecrypting();
- }
- else
- Result = scrFailed;
-@@ -1258,8 +1318,7 @@
- Unlock();
- if (!Running())
- Start();
-- if (ciHandler)
-- ciHandler->StartDecrypting();
-+ CiStartDecrypting();
- return true;
- }
- }
-@@ -1286,8 +1345,7 @@
- else if (receiver[i])
- receiversLeft = true;
- }
-- if (ciHandler)
-- ciHandler->StartDecrypting();
-+ CiStartDecrypting();
- if (!receiversLeft)
- Cancel(3);
- }
-diff -urN -X ex.vdr-sc7 vdr-1.4.7-orig/device.h vdr-1.4.7-sc7/device.h
---- vdr-1.4.7-orig/device.h 2006-06-15 11:32:48.000000000 +0200
-+++ vdr-1.4.7-sc7/device.h 2007-05-13 18:04:04.000000000 +0200
-@@ -311,6 +311,14 @@
-
- protected:
- cCiHandler *ciHandler;
-+ int ciSource, ciTransponder;
-+ cList<cCiCaProgramData> ciProgramList;
-+ cMutex ciListMutex;
-+ virtual void CiStartDecrypting(void);
-+ virtual bool CiAllowConcurrent(void) const { return false; }
-+ void CiSetSource(int Source, int Transponder);
-+ void CiAddPid(int ProgramNumber, int Pid, int StreamType);
-+ void CiSetPid(int Pid, bool Active);
- public:
- cCiHandler *CiHandler(void) { return ciHandler; }
-
-diff -urN -X ex.vdr-sc7 vdr-1.4.7-orig/dvbdevice.c vdr-1.4.7-sc7/dvbdevice.c
---- vdr-1.4.7-orig/dvbdevice.c 2007-02-24 12:10:14.000000000 +0100
-+++ vdr-1.4.7-sc7/dvbdevice.c 2007-06-24 19:42:24.000000000 +0200
-@@ -419,7 +419,11 @@
- dvb_frontend_info feinfo;
- if (ioctl(fd_frontend, FE_GET_INFO, &feinfo) >= 0) {
- frontendType = feinfo.type;
-- ciHandler = cCiHandler::CreateCiHandler(*cDvbName(DEV_DVB_CA, n));
-+ int fd_ca = DvbOpen(DEV_DVB_CA, n, O_RDWR);
-+ if(fd_ca>=0) {
-+ ciHandler = cCiHandler::CreateCiHandler(fd_ca);
-+ if(!ciHandler) close(fd_ca);
-+ }
- dvbTuner = new cDvbTuner(fd_frontend, CardIndex(), frontendType, ciHandler);
- }
- else
-@@ -776,8 +780,12 @@
- if (Channel->Vpid() && !HasPid(Channel->Vpid()) || Channel->Apid(0) && !HasPid(Channel->Apid(0))) {
- #ifdef DO_MULTIPLE_RECORDINGS
- #ifndef DO_MULTIPLE_CA_CHANNELS
-- if (Ca() >= CA_ENCRYPTED_MIN || Channel->Ca() >= CA_ENCRYPTED_MIN)
-- needsDetachReceivers = Ca() != Channel->Ca();
-+ if (Ca() >= CA_ENCRYPTED_MIN || Channel->Ca() >= CA_ENCRYPTED_MIN) {
-+ if(Channel->Ca()<CA_ENCRYPTED_MIN || CiAllowConcurrent())
-+ result = true;
-+ else
-+ needsDetachReceivers = Ca() != Channel->Ca();
-+ }
- else
- #endif
- if (!IsPrimaryDevice())
-@@ -927,7 +935,7 @@
- SetPid(&pidHandles[ptAudio], ptAudio, true);
- if (ciHandler) {
- ciHandler->SetPid(pidHandles[ptAudio].pid, true);
-- ciHandler->StartDecrypting();
-+ CiStartDecrypting();
- }
- }
- }
-diff -urN -X ex.vdr-sc7 vdr-1.4.7-orig/tools.c vdr-1.4.7-sc7/tools.c
---- vdr-1.4.7-orig/tools.c 2006-12-02 12:12:59.000000000 +0100
-+++ vdr-1.4.7-sc7/tools.c 2007-05-13 18:04:04.000000000 +0200
-@@ -542,9 +542,9 @@
-
- // --- cTimeMs ---------------------------------------------------------------
-
--cTimeMs::cTimeMs(void)
-+cTimeMs::cTimeMs(int Ms)
- {
-- Set();
-+ Set(Ms);
- }
-
- uint64_t cTimeMs::Now(void)
-diff -urN -X ex.vdr-sc7 vdr-1.4.7-orig/tools.h vdr-1.4.7-sc7/tools.h
---- vdr-1.4.7-orig/tools.h 2006-12-03 18:38:38.000000000 +0100
-+++ vdr-1.4.7-sc7/tools.h 2007-05-13 18:04:04.000000000 +0200
-@@ -162,7 +162,7 @@
- private:
- uint64_t begin;
- public:
-- cTimeMs(void);
-+ cTimeMs(int Ms = 0);
- static uint64_t Now(void);
- void Set(int Ms = 0);
- bool TimedOut(void);
+++ /dev/null
-#!/usr/bin/perl
-#
-# po2i18n - Convert plugin po files in into i18n.c-format
-#
-# See the README file for copyright information and how to reach the author.
-#
-
-use strict;
-use warnings;
-
-my @LANGS = (
- "en_US",
- "de_DE",
- "sl_SI",
- "it_IT",
- "nl_NL",
- "pt_PT",
- "fr_FR",
- "nn_NO",
- "fi_FI",
- "pl_PL",
- "es_ES",
- "el_GR",
- "sv_SE",
- "ro_RO",
- "hu_HU",
- "ca_ES",
- "ru_RU",
- "hr_HR",
- "et_EE",
- "da_DK",
- "cs_CZ",
- "tr_TR"
- );
-
-my %VERS = (
- "en_US" => 10200,
- "de_DE" => 10200,
- "sl_SI" => 10200,
- "it_IT" => 10200,
- "nl_NL" => 10200,
- "pt_PT" => 10200,
- "fr_FR" => 10200,
- "nn_NO" => 10200,
- "fi_FI" => 10200,
- "pl_PL" => 10200,
- "es_ES" => 10200,
- "el_GR" => 10200,
- "sv_SE" => 10200,
- "ro_RO" => 10200,
- "hu_HU" => 10200,
- "ca_ES" => 10200,
- "ru_RU" => 10302,
- "hr_HR" => 10307,
- "et_EE" => 10313,
- "da_DK" => 10316,
- "cs_CZ" => 10342,
- "tr_TR" => 10502
- );
-
-
-my %strings;
-
-foreach my $lang (@LANGS) { $strings{$lang} = { }; }
-
-
-sub LoadLanguage(*) {
- my ($lang) = @_;
-
- if (!open FILE, "<", "po/$lang.po") {
- return 0;
- }
-
- my $msgid = "";
- my $msgstr = "";
- my $last = 0; # 0=init, 1=msgid was last, 2=msgstr was last
-
- while (<FILE>) {
- chomp;
- my $line = $_;
-
- if ($line =~ /^msgid "(.*)"$/) {
- if ($last eq 2) {
- $strings{$lang}->{$msgid} = $msgstr;
- $strings{"en_US"}->{$msgid} = $msgid;
- }
- $msgid = $1;
- $last = 1;
- } elsif ($line =~ /^msgstr "(.*)"/) {
- $msgstr = $1;
- $last = 2;
- } elsif ($line =~ /^"(.*)"/) {
- if ($last eq 1) {
- $msgid = $msgid . $1;
- } elsif ($last eq 2) {
- $msgstr = $msgstr . $1;
- }
- }
- }
- if ($last eq 2) {
- $strings{$lang}->{$msgid} = $msgstr;
- $strings{"en_US"}->{$msgid} = $msgid;
- }
-
- close FILE;
-}
-
-
-
-foreach my $lang (@LANGS) {
- LoadLanguage($lang);
-}
-
-my @msgids = sort keys %{$strings{"en_US"}};
-
-
-my $silent = 0;
-
-while (<>) {
- my $line = $_;
-
- if ($line =~ /^\/\/ START I18N/) {
- print "// START I18N - automatically generated by po2i18n.pl\n";
- for my $msgid (@msgids) {
- next if $msgid eq "";
-
- my $head = " { ";
- my $endif = "";
- my $versnum = 10200;
-
- for my $lang (@LANGS) {
- if ($VERS{$lang} ne $versnum) {
- $versnum = $VERS{$lang};
- print $endif;
- print "#if VDRVERSNUM >= $versnum\n";
- $endif = "#endif\n";
- }
- my $msgstr = $strings{$lang}->{$msgid};
- $msgstr = "" if !defined $msgstr;
-
- print "$head\"$msgstr\",\n";
- $head = " ";
- }
- print $endif;
- print " },\n";
- }
- $silent = 1;
- }
-
- if (!$silent) { print $line; }
-
- if ($line =~ /^\/\/ END I18N/) {
- print "// END I18N - automatically generated by po2i18n.pl\n";
- $silent = 0;
- }
-}
#include "version.h"
#define MIN_VERS 1 // required VDR version
-#define MIN_MAJOR 4
-#define MIN_MINOR 6
-#define MINAPIVERSNUM 10405
+#define MIN_MAJOR 6
+#define MIN_MINOR 0
+#define MINAPIVERSNUM 10600
// some sanity checks
#ifdef HAVE_SOFTCSA
#error softcsa/ffdecsa patch MUST NOT be applied. Next time read the README first.
#endif
-#if APIVERSNUM >= 10500
#ifdef VDR_IS_SC_PATCHED
#error You MUST NOT patch the VDR core. Next time read the README first.
#endif
-#else //APIVERSNUM >= 10500
-#if !defined(VDR_IS_SC_PATCHED)
-#error You MUST patch the VDR core with the supplied patch. Next time read the README first.
-#endif
-#if VDR_IS_SC_PATCHED<402
-#error Your VDR core is patched with an outdated patch version. Please upgrade to the supplied version.
-#endif
-#endif //APIVERSNUM >= 10500
#if APIVERSNUM<MINAPIVERSNUM
#error Your VDR API version is too old. See README.
#endif
}
ScPlugin=this;
-#if APIVERSNUM < 10507
- RegisterI18n(ScPhrases);
-#endif
const char *cfgdir=ConfigDirectory(cfgsub);
filemaps.SetCfgDir(cfgdir);
cStructLoaders::SetCfgDir(cfgdir);
cScDevices::Shutdown();
LogStatsDown();
cSoftCAM::Shutdown();
-#if APIVERSNUM < 10507
- RegisterI18n(NULL);
-#endif
PRINTF(L_GEN_DEBUG,"SC cleanup done");
}