SourceCaps patch for VDR 1.3.32.

Message ID 43246CE1.4050300@icem.com
State New
Headers

Commit Message

Carsten Koch Sept. 11, 2005, 5:44 p.m. UTC
  The attached patch allows a VDR system with multiple
cards to attach each card to an individual dish
pointing at a different satellite.

I have 3 DVB cards in my VDR system:

1) FF card connected to one output of LNB at a dish
     pointed at Astra 19.2E.

2) budget card connected to another output of LNB at a dish
     pointed at Astra 19.2E.

3) budget card connected to output of LNB at a dish
     pointed at Eutelsat 13.0E.

I am using the following entries for that in my setup.conf:

SourceCaps = 1 S19.2E
SourceCaps = 2 S19.2E
SourceCaps = 3 S13.0E
  

Comments

Frank Oct. 5, 2005, 11:23 a.m. UTC | #1
----- Original Message ----- 
From: "Carsten Koch" <Carsten.Koch@icem.com>
To: "Video Disk Recorder Mailing List" <vdr@linuxtv.org>
Sent: Sunday, September 11, 2005 7:44 PM
Subject: [vdr] SourceCaps patch for VDR 1.3.32.


> The attached patch allows a VDR system with multiple
> cards to attach each card to an individual dish
> pointing at a different satellite.

>
> I have 3 DVB cards in my VDR system:
>
> 1) FF card connected to one output of LNB at a dish
>      pointed at Astra 19.2E.
>
> 2) budget card connected to another output of LNB at a dish
>      pointed at Astra 19.2E.
>
> 3) budget card connected to output of LNB at a dish
>      pointed at Eutelsat 13.0E.
>
> I am using the following entries for that in my setup.conf:
>
> SourceCaps = 1 S19.2E
> SourceCaps = 2 S19.2E
> SourceCaps = 3 S13.0E
>

Hello,

I have 2 DVB cards in my VDR system

1) FF card for Astra 19.2E and Eutelsat 13.0E.

2) budget card for Astra 19.2E


> I am using the following entries for that in my setup.conf:
>
> SourceCaps = 1 S19.2E S13.0E
> SourceCaps = 2 S19.2E


With vdr 1.3.22 - included patch for vdr 1.3.18 - sourcecaps-patch works
fine (only the automatic scan for new channels produced mistakes).

Now i have tested this patch with vdr 1.3.34, but the first entry of
SourceCaps in setup.conf will be ignored and is deleted after shutdown vdr.

Any suggestions?



Thanks

Frank
  

Patch

diff -ru vdr-1.3.32/config.c vdr-1.3.32+SourceCaps/config.c
--- vdr-1.3.32/config.c	2005-09-09 17:08:59.000000000 +0200
+++ vdr-1.3.32+SourceCaps/config.c	2005-09-11 17:09:11.706656424 +0200
@@ -15,6 +15,7 @@ 
 #include "interface.h"
 #include "plugin.h"
 #include "recording.h"
+#include "sources.h"
 
 // IMPORTANT NOTE: in the 'sscanf()' calls there is a blank after the '%d'
 // format characters in order to allow any number of blanks after a numeric
@@ -300,6 +301,8 @@ 
   MultiSpeedMode = 0;
   ShowReplayMode = 0;
   ResumeID = 0;
+  memset(SourceCaps, 0, sizeof SourceCaps);
+  SourceCapsSet = false;
   CurrentChannel = -1;
   CurrentVolume = MAXVOLUME;
   CurrentDolby = 0;
@@ -401,6 +404,49 @@ 
   return true;
 }
 
+void cSetup::StoreSourceCaps(const char *Name)
+{
+  cSetupLine *l;
+  while ((l = Get(Name)) != NULL)
+        Del(l);
+
+  for (int i = 0; i < MAXDEVICES; i++) {
+      char buffer[MAXPARSEBUFFER]={0,}, *q = buffer;
+      int j = 0;
+      while (SourceCaps[i][j] && j < MAXSOURCECAPS) {
+            if (j==0) 
+               q += snprintf(buffer, sizeof(buffer), "%i ", i+1);
+            q += snprintf(q, sizeof(buffer) - (q-buffer), "%s ", *cSource::ToString(SourceCaps[i][j++]));
+      }
+      if (*buffer)
+         Store(Name, buffer, NULL, true);
+      }
+}
+
+bool cSetup::ParseSourceCaps(const char *Value)
+{
+  char *p;
+  int d = strtol(Value, &p, 10)-1, i = 0;
+  while (p < Value+strlen(Value)) {
+     	if (*p==0) return true;
+     	if (isblank(*p)) ++p;
+     	if (isalpha(*p)) {
+	   int source = cSource::FromString(p);
+	   if (source != cSource::stNone) {
+	      SourceCaps[d][i++] = source;
+	      SourceCapsSet = true;
+	      }
+	   else
+	      return false;
+	   while (!isblank(*p) && *p)
+		 ++p;
+	   if (i>MAXSOURCECAPS) 
+	      return false;
+     	   }
+        }
+  return true;
+}
+
 bool cSetup::Parse(const char *Name, const char *Value)
 {
   if      (!strcasecmp(Name, "OSDLanguage"))         OSDLanguage        = atoi(Value);
@@ -458,6 +504,7 @@ 
   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, "SourceCaps"))          return ParseSourceCaps(Value);
   else if (!strcasecmp(Name, "CurrentChannel"))      CurrentChannel     = atoi(Value);
   else if (!strcasecmp(Name, "CurrentVolume"))       CurrentVolume      = atoi(Value);
   else if (!strcasecmp(Name, "CurrentDolby"))        CurrentDolby       = atoi(Value);
@@ -523,6 +570,7 @@ 
   Store("MultiSpeedMode",     MultiSpeedMode);
   Store("ShowReplayMode",     ShowReplayMode);
   Store("ResumeID",           ResumeID);
+  if (SourceCapsSet) StoreSourceCaps("SourceCaps");
   Store("CurrentChannel",     CurrentChannel);
   Store("CurrentVolume",      CurrentVolume);
   Store("CurrentDolby",       CurrentDolby);
diff -ru vdr-1.3.32/config.h vdr-1.3.32+SourceCaps/config.h
--- vdr-1.3.32/config.h	2005-09-04 12:49:24.000000000 +0200
+++ vdr-1.3.32+SourceCaps/config.h	2005-09-11 17:25:40.184826168 +0200
@@ -30,6 +30,9 @@ 
 #define MINOSDHEIGHT 324
 #define MAXOSDHEIGHT 567
 
+#define MAXDEVICES         16 // the maximum number of devices in the system
+#define MAXSOURCECAPS     128 // the maximum number of different sources per device
+
 #define MaxFileName 256
 #define MaxSkinName 16
 #define MaxThemeName 16
@@ -198,6 +201,8 @@ 
   void StoreLanguages(const char *Name, int *Values);
   bool ParseLanguages(const char *Value, int *Values);
   bool Parse(const char *Name, const char *Value);
+  void StoreSourceCaps(const char *Name);
+  bool ParseSourceCaps(const char *Value);
   cSetupLine *Get(const char *Name, const char *Plugin = NULL);
   void Store(const char *Name, const char *Value, const char *Plugin = NULL, bool AllowMultiple = false);
   void Store(const char *Name, int Value, const char *Plugin = NULL);
@@ -252,6 +257,8 @@ 
   int MultiSpeedMode;
   int ShowReplayMode;
   int ResumeID;
+  int SourceCaps[MAXDEVICES][MAXSOURCECAPS];
+  bool SourceCapsSet;
   int CurrentChannel;
   int CurrentVolume;
   int CurrentDolby;
diff -ru vdr-1.3.32/device.c vdr-1.3.32+SourceCaps/device.c
--- vdr-1.3.32/device.c	2005-09-04 16:28:16.000000000 +0200
+++ vdr-1.3.32+SourceCaps/device.c	2005-09-11 17:09:11.709655968 +0200
@@ -174,8 +174,10 @@ 
   for (int i = 0; i < MAXRECEIVERS; i++)
       receiver[i] = NULL;
 
-  if (numDevices < MAXDEVICES)
+  if (numDevices < MAXDEVICES) {
      device[numDevices++] = this;
+     SetSourceCaps(cardIndex);
+     }
   else
      esyslog("ERROR: too many devices!");
 }
@@ -329,6 +331,17 @@ 
   return d;
 }
 
+void cDevice::SetSourceCaps(int Index)
+{
+  for (int d = 0; d < numDevices; d++) {
+      if (Index < 0 || Index == device[d]->CardIndex()) {
+	 for (int i = 0; i < MAXSOURCECAPS; i++)
+	     device[d]->sourceCaps[i] = Setup.SourceCaps[device[d]->CardIndex()][i];
+	 }
+      }
+}
+
+
 void cDevice::Shutdown(void)
 {
   primaryDevice = NULL;
diff -ru vdr-1.3.32/device.h vdr-1.3.32+SourceCaps/device.h
--- vdr-1.3.32/device.h	2005-09-10 13:54:02.000000000 +0200
+++ vdr-1.3.32+SourceCaps/device.h	2005-09-11 17:26:23.513239248 +0200
@@ -23,7 +23,6 @@ 
 #include "thread.h"
 #include "tools.h"
 
-#define MAXDEVICES         16 // the maximum number of devices in the system
 #define MAXPIDHANDLES      64 // the maximum number of different PIDs per device
 #define MAXRECEIVERS       16 // the maximum number of receivers per device
 #define MAXVOLUME         255
@@ -133,6 +132,8 @@ 
          ///< given Priority.
          ///< See ProvidesChannel() for more information on how
          ///< priorities are handled, and the meaning of NeedsDetachReceivers.
+  static void SetSourceCaps(int Index = -1);
+	 ///< Sets the SourceCaps of the given device according to the Setup data.
   static void Shutdown(void);
          ///< Closes down all devices.
          ///< Must be called at the end of the program.
@@ -140,6 +141,7 @@ 
   static int nextCardIndex;
   int cardIndex;
 protected:
+  int sourceCaps[MAXSOURCECAPS];
   cDevice(void);
   virtual ~cDevice();
   virtual bool Ready(void);
diff -ru vdr-1.3.32/dvbdevice.c vdr-1.3.32+SourceCaps/dvbdevice.c
--- vdr-1.3.32/dvbdevice.c	2005-08-21 11:17:20.000000000 +0200
+++ vdr-1.3.32+SourceCaps/dvbdevice.c	2005-09-11 17:09:11.712655512 +0200
@@ -754,10 +754,17 @@ 
 bool cDvbDevice::ProvidesSource(int Source) const
 {
   int type = Source & cSource::st_Mask;
-  return type == cSource::stNone
-      || type == cSource::stCable && frontendType == FE_QAM
-      || type == cSource::stSat   && frontendType == FE_QPSK
-      || type == cSource::stTerr  && frontendType == FE_OFDM;
+  if (Setup.SourceCapsSet && type == cSource::stSat && frontendType == FE_QPSK) {
+     for (int i = 0; i < MAXSOURCECAPS; i++)
+         if (sourceCaps[i] == Source)
+            return true;
+     return false;
+     }
+  else
+     return type == cSource::stNone				 
+    	 || type == cSource::stCable && frontendType == FE_QAM	 
+    	 || type == cSource::stSat   && frontendType == FE_QPSK  
+    	 || type == cSource::stTerr  && frontendType == FE_OFDM; 
 }
 
 bool cDvbDevice::ProvidesTransponder(const cChannel *Channel) const