Sophie

Sophie

distrib > Mandriva > 2007.1 > x86_64 > by-pkgid > fdddaca718fdaac56c6bff726f3554dd > files > 2

vdr-1.4.7-9mdv2007.1.src.rpm

diff -rNu vdr-1.3.39/config.c vdr-1.3.39+SourceCaps/config.c
--- vdr-1.3.39/config.c	2006-01-13 16:19:37.000000000 +0100
+++ vdr-1.3.39+SourceCaps/config.c	2006-01-21 13:50:24.433469136 +0100
@@ -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
@@ -269,6 +270,8 @@
   MultiSpeedMode = 0;
   ShowReplayMode = 0;
   ResumeID = 0;
+  memset(SourceCaps, 0, sizeof SourceCaps);
+  SourceCapsSet = false;
   CurrentChannel = -1;
   CurrentVolume = MAXVOLUME;
   CurrentDolby = 0;
@@ -370,6 +373,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[MAXSOURCECAPS*8]={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);
@@ -429,6 +475,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);
@@ -496,6 +543,7 @@
   Store("MultiSpeedMode",     MultiSpeedMode);
   Store("ShowReplayMode",     ShowReplayMode);
   Store("ResumeID",           ResumeID);
+  if (SourceCapsSet) StoreSourceCaps("SourceCaps");
   Store("CurrentChannel",     CurrentChannel);
   Store("CurrentVolume",      CurrentVolume);
   Store("CurrentDolby",       CurrentDolby);
diff -rNu vdr-1.3.39/config.h vdr-1.3.39+SourceCaps/config.h
--- vdr-1.3.39/config.h	2006-01-13 16:17:19.000000000 +0100
+++ vdr-1.3.39+SourceCaps/config.h	2006-01-21 13:50:24.440468072 +0100
@@ -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
@@ -179,6 +182,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);
@@ -235,6 +240,8 @@
   int MultiSpeedMode;
   int ShowReplayMode;
   int ResumeID;
+  int SourceCaps[MAXDEVICES][MAXSOURCECAPS];
+  bool SourceCapsSet;
   int CurrentChannel;
   int CurrentVolume;
   int CurrentDolby;
diff -rNu vdr-1.3.39/device.c vdr-1.3.39+SourceCaps/device.c
--- vdr-1.3.39/device.c	2006-01-08 12:39:37.000000000 +0100
+++ vdr-1.3.39+SourceCaps/device.c	2006-01-21 13:50:24.441467920 +0100
@@ -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!");
 }
@@ -313,6 +315,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 -rNu vdr-1.3.39/device.h vdr-1.3.39+SourceCaps/device.h
--- vdr-1.3.39/device.h	2006-01-08 11:10:26.000000000 +0100
+++ vdr-1.3.39+SourceCaps/device.h	2006-01-21 13:50:24.443467616 +0100
@@ -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.
 
 //ML
 private:
@@ -140,6 +141,7 @@
   static int nextCardIndex;
   int cardIndex;
 protected:
+  int sourceCaps[MAXSOURCECAPS];
   cDevice(void);
   virtual ~cDevice();
   virtual bool Ready(void);
diff -rNu vdr-1.3.39/dvbdevice.c vdr-1.3.39+SourceCaps/dvbdevice.c
--- vdr-1.3.39/dvbdevice.c	2006-01-14 16:57:36.000000000 +0100
+++ vdr-1.3.39+SourceCaps/dvbdevice.c	2006-01-21 13:50:24.444467464 +0100
@@ -751,10 +751,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
diff -rNu vdr-1.3.39/sources.c vdr-1.3.39+SourceCaps/sources.c
--- vdr-1.3.39/sources.c	2004-12-26 12:58:52.000000000 +0100
+++ vdr-1.3.39+SourceCaps/sources.c	2006-01-21 13:50:24.445467312 +0100
@@ -68,7 +68,7 @@
      int pos = 0;
      bool dot = false;
      bool neg = false;
-     while (*++s) {
+     while (*++s && !isblank(*s)) {
            switch (toupper(*s)) {
              case '0' ... '9': pos *= 10;
                                pos += *s - '0';