@@ -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);
@@ -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;
@@ -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;
@@ -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);
@@ -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
@@ -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';