@@ -385,6 +385,7 @@ void PatFilter::Process(u_short Pid, u_c
switch (stream.getStreamType()) {
case 1: // STREAMTYPE_11172_VIDEO
case 2: // STREAMTYPE_13818_VIDEO
+ case 0x1b: //MPEG4
Vpid = stream.getPid();
break;
case 3: // STREAMTYPE_11172_AUDIO
@@ -503,6 +504,7 @@ void SdtFilter::Process(u_short Pid, u_c
case 0x02: // digital radio sound service
case 0x04: // NVOD reference service
case 0x05: // NVOD time-shifted service
+ case 0x19: // digital HD television service
{
char NameBuf[1024];
char ShortNameBuf[1024];
@@ -35,10 +35,10 @@ void cMenuSetupRotor::Setup(void)
void cMenuSetupRotor::Store(void)
{
- if (data.DvbCard!=newDvbCard-1)
+ if (data.DvbCard!=newDvbCard-1 && cDevice::GetDevice(newDvbCard-1))
{
static char buffer[PATH_MAX];
- snprintf(buffer, sizeof(buffer), "%s%d/%s%d", "/dev/dvb/adapter",newDvbCard-1,"frontend",0);
+ snprintf(buffer, sizeof(buffer), "%s%d/%s%d", "/dev/dvb/adapter",cDevice::GetDevice(newDvbCard-1)->CardIndex(),"frontend",0);
close(data.fd_frontend);
data.fd_frontend = open(buffer,0);
}
@@ -144,6 +144,7 @@ cMainMenuRotor::cMainMenuRotor(void):cOs
else
Pol='H';
Symbolrate=OldChannel->Srate();
+ System=OldChannel->System();
m_Active = false;
/*
@@ -180,7 +181,7 @@ cMainMenuRotor::~cMainMenuRotor()
}
Setup.UpdateChannels=oldupdate;
if (HasSwitched)
- cDevice::GetDevice(data.DvbCard)->SwitchChannel(OldChannel,true);
+ cDevice::PrimaryDevice()->SwitchChannel(OldChannel,true);
/*
cFont::SetFont(fontSml);
cFont::SetFont(fontOsd);
@@ -212,6 +213,7 @@ void cMainMenuRotor::AddMenuItems()
Add(n[5]);
Add(new cMenuEditFreqItem(tr("Frequency"),&Frequenz,&Pol,osUser1));
Add(new cMenuEditSymbItem(tr("Symbolrate"),&Symbolrate,0,50000,osUser1));
+ Add(new cMenuEditRotorMapItem(tr("System"),&System,SystemValues,osUser1));
Add(new cOsdItem(CenterText(tr("Scan Transponder"),edw),osUser2));
CursorDown();
}
@@ -301,25 +303,25 @@ eOSState cMainMenuRotor::ProcessKey(eKey
{
cChannel *SChannel = new cChannel;
*SChannel = *OldChannel;
- SChannel->cChannel::SetSatTransponderData(RotorPos->R_Code(),Frequenz,Pol,Symbolrate,FEC_AUTO);
- if (cDevice::GetDevice(data.DvbCard)==cDevice::ActualDevice())
- HasSwitched=true;
+ SChannel->SetNumber(0);
+ SChannel->cChannel::SetSatTransponderData(RotorPos->R_Code(),Frequenz,Pol,Symbolrate,DVBFE_FEC_AUTO,DVBFE_MOD_AUTO,System,DVBFE_ROLLOFF_UNKNOWN);
bool UseDiseqc=Setup.DiSEqC;
Setup.DiSEqC=false;
- cDevice::GetDevice(data.DvbCard)->SwitchChannel(SChannel,HasSwitched);
+ cDevice::PrimaryDevice()->SwitchChannel(SChannel,cDevice::GetDevice(data.DvbCard));
+ HasSwitched=true;
Setup.DiSEqC=UseDiseqc;
}
if (state == osUser2)
{
cChannel *SChannel = new cChannel;
*SChannel = *OldChannel;
- SChannel->cChannel::SetSatTransponderData(RotorPos->R_Code(),Frequenz,Pol,Symbolrate,FEC_AUTO);
- if (cDevice::GetDevice(data.DvbCard)==cDevice::ActualDevice())
- HasSwitched=true;
+ SChannel->SetNumber(0);
+ SChannel->cChannel::SetSatTransponderData(RotorPos->R_Code(),Frequenz,Pol,Symbolrate,DVBFE_FEC_AUTO,DVBFE_MOD_AUTO,System,DVBFE_ROLLOFF_UNKNOWN);
bool UseDiseqc=Setup.DiSEqC;
Setup.DiSEqC=false;
data.ActualSource=RotorPos->GetCode();
- cDevice::GetDevice(data.DvbCard)->SwitchChannel(SChannel,HasSwitched);
+ cDevice::PrimaryDevice()->SwitchChannel(SChannel,cDevice::GetDevice(data.DvbCard));
+ HasSwitched=true;
Setup.DiSEqC=UseDiseqc;
AddSubMenu(new cMenuScan);
}
@@ -388,7 +390,7 @@ eOSState cMenuScan::ProcessKey(eKeys Key
cDevice::GetDevice(data.DvbCard)->Detach(SFilter);
SFilter=NULL;
}
- cDevice::GetDevice(data.DvbCard)->SwitchChannel(&Channel[Current()],true);
+ cDevice::PrimaryDevice()->SwitchChannel(&Channel[Current()],cDevice::GetDevice(data.DvbCard));
break;
default: return state;
}
@@ -83,6 +83,7 @@ public:
class cMainMenuRotor : public cOsdMenu, public cThread {
private:
int oldupdate,Position,Frequenz,Symbolrate,edw;
+ int System;
cRotorPos *RotorPos;
char Pol;
cChannel *OldChannel;
@@ -463,3 +463,40 @@ eOSState cMenuEditRotorConfItem::Process
return osContinue;
}
+// --- cMenuEditRotorMapItem ------------------------------------------------------
+
+cMenuEditRotorMapItem::cMenuEditRotorMapItem(const char *Name, int *Value, const tChannelParameterMap *Map, eOSState State)
+:cMenuEditMapItem(Name, Value, Map)
+{
+ edw=cSkinDisplay::Current()->EditableWidth();
+ state = State;
+ MangleText();
+}
+
+void cMenuEditRotorMapItem::Set(void)
+{
+ cMenuEditMapItem::Set();
+ MangleText();
+}
+
+void cMenuEditRotorMapItem::MangleText(void)
+{
+ char text[700];
+ strcpy(text, Text());
+ char txt[50];
+ char *p = strchr(text, '\t');
+ strcpy(txt, p + 1);
+ *p = '\0';
+ int w=Width(text)+Width(txt);
+ for (int i=1; (i*Width(BLANK))<=(edw-w);i++) sprintf(text,"%s%c",text,edw>100 ? BLANK : ' ');
+ sprintf(text,"%s%s",text,txt);
+ SetText(text);
+}
+
+eOSState cMenuEditRotorMapItem::ProcessKey(eKeys Key)
+{
+ if (Key == kOk)
+ return state;
+
+ return cMenuEditMapItem::ProcessKey(Key);
+}
@@ -88,4 +88,16 @@ public:
eOSState ProcessKey(eKeys Key);
};
+class cMenuEditRotorMapItem : public cMenuEditMapItem {
+private:
+ eOSState state;
+ int edw;
+ void MangleText(void);
+protected:
+ virtual void Set(void);
+public:
+ cMenuEditRotorMapItem(const char *Name, int *Value, const tChannelParameterMap *Map, eOSState State = osUnknown);
+ virtual eOSState ProcessKey(eKeys Key);
+};
+
#endif
@@ -0,0 +1,130 @@
+--- ../vdr-1.5.14-orig/device.h 2008-01-27 11:35:18.000000000 +0100
++++ device.h 2008-01-27 22:57:29.000000000 +0100
+@@ -23,6 +23,7 @@
+ #include "spu.h"
+ #include "thread.h"
+ #include "tools.h"
++#include <linux/dvb/frontend.h>
+
+ #define MAXDEVICES 16 // the maximum number of devices in the system
+ #define MAXPIDHANDLES 64 // the maximum number of different PIDs per device
+@@ -199,6 +200,7 @@ public:
+
+ protected:
+ static int currentChannel;
++ bool SwitchChannel(const cChannel *Channel, bool LiveView, cDevice *SpecificSourceDevice);
+ public:
+ virtual bool ProvidesSource(int Source) const;
+ ///< Returns true if this device can provide the given source.
+@@ -239,13 +241,17 @@ public:
+ bool SwitchChannel(const cChannel *Channel, bool LiveView);
+ ///< Switches the device to the given Channel, initiating transfer mode
+ ///< if necessary.
++ bool SwitchChannel(const cChannel *Channel, cDevice *SpecificSourceDevice);
++ ///< Switches the device to the given Channel for live view, initiating
++ ///< transfer mode if necessary. SpecificSourceDevice will be used to
++ ///< provide the channel.
+ static bool SwitchChannel(int Direction);
+ ///< Switches the primary device to the next available channel in the given
+ ///< Direction (only the sign of Direction is evaluated, positive values
+ ///< switch to higher channel numbers).
+ private:
+- eSetChannelResult SetChannel(const cChannel *Channel, bool LiveView);
+- ///< Sets the device to the given channel (general setup).
++ eSetChannelResult SetChannel(const cChannel *Channel, bool LiveView, cDevice *SpecificSourceDevice = NULL);
++ ///< Sets the device to the given channel (general setup).
+ protected:
+ virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView);
+ ///< Sets the device to the given channel (actual physical setup).
+@@ -267,6 +273,7 @@ public:
+ virtual bool HasProgramme(void);
+ ///< Returns true if the device is currently showing any programme to
+ ///< the user, either through replaying or live.
++ virtual bool SendDiseqcCmd(dvb_diseqc_master_cmd cmd) {return false;}
+
+ // PID handle facilities
+
+--- ../vdr-1.5.14-orig/dvbdevice.h 2008-01-27 11:21:02.000000000 +0100
++++ dvbdevice.h 2008-01-27 22:57:29.000000000 +0100
+@@ -73,6 +73,7 @@ protected:
+ virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView);
+ public:
+ virtual bool HasLock(int TimeoutMs = 0);
++ virtual bool SendDiseqcCmd(dvb_diseqc_master_cmd cmd);
+
+ // PID handle facilities
+
+--- ../vdr-1.5.14-orig/dvbdevice.c 2008-01-27 15:35:54.000000000 +0100
++++ dvbdevice.c 2008-01-27 22:57:29.000000000 +0100
+@@ -71,6 +71,7 @@ static int DvbOpen(const char *Name, int
+ class cDvbTuner : public cThread {
+ private:
+ enum eTunerStatus { tsIdle, tsSet, tsTuned, tsLocked };
++ bool SendDiseqc;
+ int fd_frontend;
+ int cardIndex;
+ int tuneTimeout;
+@@ -83,6 +84,7 @@ private:
+ cMutex mutex;
+ cCondVar locked;
+ cCondVar newSet;
++ dvb_diseqc_master_cmd diseqc_cmd;
+ bool GetFrontendStatus(fe_status_t &Status, int TimeoutMs = 0);
+ bool SetFrontend(void);
+ virtual void Action(void);
+@@ -91,12 +93,14 @@ public:
+ virtual ~cDvbTuner();
+ bool IsTunedTo(const cChannel *Channel) const;
+ void Set(const cChannel *Channel, bool Tune);
++ bool SendDiseqcCmd(dvb_diseqc_master_cmd cmd);
+ bool Locked(int TimeoutMs = 0);
+ };
+
+ cDvbTuner::cDvbTuner(int Fd_Frontend, int CardIndex, dvbfe_delsys FrontendType)
+ {
+ fd_frontend = Fd_Frontend;
++ SendDiseqc = false;
+ cardIndex = CardIndex;
+ frontendType = FrontendType;
+ tuneTimeout = 0;
+@@ -164,6 +168,17 @@ bool cDvbTuner::Locked(int TimeoutMs)
+ return tunerStatus >= tsLocked;
+ }
+
++bool cDvbTuner::SendDiseqcCmd(dvb_diseqc_master_cmd cmd)
++{
++ cMutexLock MutexLock(&mutex);
++ if (!(frontendType & (DVBFE_DELSYS_DVBS | DVBFE_DELSYS_DVBS2)) || SendDiseqc)
++ return false;
++ diseqc_cmd=cmd;
++ SendDiseqc=true;
++ newSet.Broadcast();
++ return true;
++}
++
+ bool cDvbTuner::GetFrontendStatus(fe_status_t &Status, int TimeoutMs)
+ {
+ if (TimeoutMs) {
+@@ -328,6 +343,10 @@ void cDvbTuner::Action(void)
+ if (GetFrontendStatus(NewStatus, 10))
+ Status = NewStatus;
+ cMutexLock MutexLock(&mutex);
++ if (SendDiseqc) {
++ CHECK(ioctl(fd_frontend, FE_DISEQC_SEND_MASTER_CMD, &diseqc_cmd));
++ SendDiseqc=false;
++ }
+ switch (tunerStatus) {
+ case tsIdle:
+ break;
+@@ -937,6 +956,11 @@ bool cDvbDevice::HasLock(int TimeoutMs)
+ return dvbTuner ? dvbTuner->Locked(TimeoutMs) : false;
+ }
+
++bool cDvbDevice::SendDiseqcCmd(dvb_diseqc_master_cmd cmd)
++{
++ return dvbTuner->SendDiseqcCmd(cmd);
++}
++
+ int cDvbDevice::GetAudioChannelDevice(void)
+ {
+ if (HasDecoder()) {
@@ -1,106 +0,0 @@
-diff -ubw vdr-1.5.5/device.h vdr-1.5.5-Rotor/device.h
---- vdr-1.5.5/device.h 2007-01-13 12:33:57.000000000 +0100
-+++ vdr-1.5.5-Rotor/device.h 2007-06-30 21:27:45.000000000 +0200
-@@ -22,6 +22,7 @@
- #include "spu.h"
- #include "thread.h"
- #include "tools.h"
-+#include <linux/dvb/frontend.h>
-
- #define MAXDEVICES 16 // the maximum number of devices in the system
- #define MAXPIDHANDLES 64 // the maximum number of different PIDs per device
-@@ -256,6 +257,7 @@
- virtual bool HasProgramme(void);
- ///< Returns true if the device is currently showing any programme to
- ///< the user, either through replaying or live.
-+ virtual bool SendDiseqcCmd(dvb_diseqc_master_cmd cmd) {return false;}
-
- // PID handle facilities
-
-diff -ubw vdr-1.5.5/dvbdevice.c vdr-1.5.5-Rotor/dvbdevice.c
---- vdr-1.5.5/dvbdevice.c 2007-02-25 12:46:52.000000000 +0100
-+++ vdr-1.5.5-Rotor/dvbdevice.c 2007-06-30 21:28:47.000000000 +0200
-@@ -71,6 +71,7 @@
- class cDvbTuner : public cThread {
- private:
- enum eTunerStatus { tsIdle, tsSet, tsTuned, tsLocked };
-+ bool SendDiseqc;
- int fd_frontend;
- int cardIndex;
- int tuneTimeout;
-@@ -83,6 +84,7 @@
- cMutex mutex;
- cCondVar locked;
- cCondVar newSet;
-+ dvb_diseqc_master_cmd diseqc_cmd;
- bool GetFrontendStatus(fe_status_t &Status, int TimeoutMs = 0);
- bool SetFrontend(void);
- virtual void Action(void);
-@@ -91,12 +93,14 @@
- virtual ~cDvbTuner();
- bool IsTunedTo(const cChannel *Channel) const;
- void Set(const cChannel *Channel, bool Tune);
-+ bool SendDiseqcCmd(dvb_diseqc_master_cmd cmd);
- bool Locked(int TimeoutMs = 0);
- };
-
- cDvbTuner::cDvbTuner(int Fd_Frontend, int CardIndex, fe_type_t FrontendType)
- {
- fd_frontend = Fd_Frontend;
-+ SendDiseqc=false;
- cardIndex = CardIndex;
- frontendType = FrontendType;
- tuneTimeout = 0;
-@@ -145,6 +149,17 @@
- return tunerStatus >= tsLocked;
- }
-
-+bool cDvbTuner::SendDiseqcCmd(dvb_diseqc_master_cmd cmd)
-+{
-+ cMutexLock MutexLock(&mutex);
-+ if (frontendType!=FE_QPSK || SendDiseqc)
-+ return false;
-+ diseqc_cmd=cmd;
-+ SendDiseqc=true;
-+ newSet.Broadcast();
-+ return true;
-+}
-+
- bool cDvbTuner::GetFrontendStatus(fe_status_t &Status, int TimeoutMs)
- {
- if (TimeoutMs) {
-@@ -297,6 +312,10 @@
- if (GetFrontendStatus(NewStatus, 10))
- Status = NewStatus;
- cMutexLock MutexLock(&mutex);
-+ if (SendDiseqc) {
-+ CHECK(ioctl(fd_frontend, FE_DISEQC_SEND_MASTER_CMD, &diseqc_cmd));
-+ SendDiseqc=false;
-+ }
- switch (tunerStatus) {
- case tsIdle:
- break;
-@@ -858,6 +877,11 @@
- return dvbTuner ? dvbTuner->Locked(TimeoutMs) : false;
- }
-
-+bool cDvbDevice::SendDiseqcCmd(dvb_diseqc_master_cmd cmd)
-+{
-+ return dvbTuner->SendDiseqcCmd(cmd);
-+}
-+
- int cDvbDevice::GetAudioChannelDevice(void)
- {
- if (HasDecoder()) {
-Nur in vdr-1.5.5-Rotor/: dvbdevice.c.rej.
-diff -ubw vdr-1.5.5/dvbdevice.h vdr-1.5.5-Rotor/dvbdevice.h
---- vdr-1.5.5/dvbdevice.h 2007-02-25 13:23:57.000000000 +0100
-+++ vdr-1.5.5-Rotor/dvbdevice.h 2007-06-30 21:27:45.000000000 +0200
-@@ -71,6 +71,7 @@
- virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView);
- public:
- virtual bool HasLock(int TimeoutMs = 0);
-+ virtual bool SendDiseqcCmd(dvb_diseqc_master_cmd cmd);
-
- // PID handle facilities
-
@@ -97,7 +97,7 @@ bool cPluginRotor::Start(void)
if ((diseqc=Diseqcs.Get(source->Code(),12000,'h')) || (diseqc=Diseqcs.Get(source->Code(),12000,'v')) || (diseqc=Diseqcs.Get(source->Code(),12000,'l')) || (diseqc=Diseqcs.Get(source->Code(),12000,'r')))
{
char *c=strdup(diseqc->Commands());
- while (c = strchr(c, '['))
+ while ((c = strchr(c, '[')))
{
char *e = strchr(++c, ']');
int n = 0;
@@ -142,8 +142,9 @@ bool cPluginRotor::Start(void)
p->AddDescription(buf);
}
RotorPositions.Save();
- char buffer[PATH_MAX];
- snprintf(buffer, sizeof(buffer), "/dev/dvb/adapter%d/frontend0", data.DvbCard);
+ char buffer[PATH_MAX] = "";
+ if (cDevice::GetDevice(data.DvbCard))
+ snprintf(buffer, sizeof(buffer), "/dev/dvb/adapter%d/frontend0", cDevice::GetDevice(data.DvbCard)->CardIndex());
data.fd_frontend = open(buffer,0);
return true;
}