aboutsummaryrefslogtreecommitdiff
path: root/lib/dvb
diff options
context:
space:
mode:
authorFelix Domke <tmbinc@elitedvb.net>2009-02-11 12:52:48 +0100
committerFelix Domke <tmbinc@elitedvb.net>2009-02-11 12:52:48 +0100
commitbbfcb7ea1f040d030277e2b6f2efa9ea0967bf2b (patch)
treec5945c791698c14723e989449e6b4bfcc275c05d /lib/dvb
parent4f7990ff2a55874b9eb65e3c9cd47dacb9f76deb (diff)
parent5e6f814d005a01caa437a532e61f4b338617ff67 (diff)
downloadenigma2-bbfcb7ea1f040d030277e2b6f2efa9ea0967bf2b.tar.gz
enigma2-bbfcb7ea1f040d030277e2b6f2efa9ea0967bf2b.zip
Merge branch 'master' of /home/tmbinc/enigma2-git into tmbinc/FixTimingBugs
Conflicts: lib/dvb/decoder.cpp
Diffstat (limited to 'lib/dvb')
-rw-r--r--lib/dvb/db.cpp125
-rw-r--r--lib/dvb/decoder.cpp177
-rw-r--r--lib/dvb/decoder.h15
-rw-r--r--lib/dvb/demux.cpp19
-rw-r--r--lib/dvb/demux.h4
-rw-r--r--lib/dvb/dvb.cpp166
-rw-r--r--lib/dvb/dvb.h11
-rw-r--r--lib/dvb/dvbtime.cpp16
-rw-r--r--lib/dvb/dvbtime.h2
-rw-r--r--lib/dvb/epgcache.cpp114
-rw-r--r--lib/dvb/frontend.cpp668
-rw-r--r--lib/dvb/frontend.h20
-rw-r--r--lib/dvb/frontendparms.h125
-rw-r--r--lib/dvb/idemux.h2
-rw-r--r--lib/dvb/idvb.h26
-rw-r--r--lib/dvb/metaparser.cpp23
-rw-r--r--lib/dvb/metaparser.h3
-rw-r--r--lib/dvb/pmt.cpp94
-rw-r--r--lib/dvb/pmt.h4
-rw-r--r--lib/dvb/pvrparse.cpp17
-rw-r--r--lib/dvb/pvrparse.h3
-rw-r--r--lib/dvb/scan.cpp2
-rw-r--r--lib/dvb/sec.cpp504
-rw-r--r--lib/dvb/sec.h31
24 files changed, 1306 insertions, 865 deletions
diff --git a/lib/dvb/db.cpp b/lib/dvb/db.cpp
index 1c332033..e6108ab5 100644
--- a/lib/dvb/db.cpp
+++ b/lib/dvb/db.cpp
@@ -327,10 +327,10 @@ void eDVBDB::loadServicelist(const char *file)
eDVBFrontendParametersSatellite sat;
int frequency, symbol_rate, polarisation, fec, orbital_position, inversion,
flags=0,
- system=eDVBFrontendParametersSatellite::System::DVB_S,
- modulation=eDVBFrontendParametersSatellite::Modulation::QPSK,
- rolloff=eDVBFrontendParametersSatellite::RollOff::alpha_0_35,
- pilot=eDVBFrontendParametersSatellite::Pilot::Unknown;
+ system=eDVBFrontendParametersSatellite::System_DVB_S,
+ modulation=eDVBFrontendParametersSatellite::Modulation_QPSK,
+ rolloff=eDVBFrontendParametersSatellite::RollOff_alpha_0_35,
+ pilot=eDVBFrontendParametersSatellite::Pilot_Unknown;
if (version == 3)
sscanf(line+3, "%d:%d:%d:%d:%d:%d:%d:%d:%d:%d", &frequency, &symbol_rate, &polarisation, &fec, &orbital_position, &inversion, &system, &modulation, &rolloff, &pilot);
else
@@ -368,9 +368,9 @@ void eDVBDB::loadServicelist(const char *file)
{
eDVBFrontendParametersCable cab;
int frequency, symbol_rate,
- inversion=eDVBFrontendParametersCable::Inversion::Unknown,
- modulation=eDVBFrontendParametersCable::Modulation::Auto,
- fec_inner=eDVBFrontendParametersCable::FEC::fAuto,
+ inversion=eDVBFrontendParametersCable::Inversion_Unknown,
+ modulation=eDVBFrontendParametersCable::Modulation_Auto,
+ fec_inner=eDVBFrontendParametersCable::FEC_Auto,
flags=0;
sscanf(line+3, "%d:%d:%d:%d:%d:%d", &frequency, &symbol_rate, &inversion, &modulation, &fec_inner, &flags);
cab.frequency = frequency;
@@ -495,9 +495,9 @@ void eDVBDB::saveServicelist(const char *file)
ch.m_frontendParameters->getFlags(flags);
if (!ch.m_frontendParameters->getDVBS(sat))
{
- if (sat.system == eDVBFrontendParametersSatellite::System::DVB_S2)
+ if (sat.system == eDVBFrontendParametersSatellite::System_DVB_S2)
{
- fprintf(f, "\ts %d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d",
+ fprintf(f, "\ts %d:%d:%d:%d:%d:%d:%d:%d:%d:%d:%d\n",
sat.frequency, sat.symbol_rate,
sat.polarisation, sat.fec,
sat.orbital_position > 1800 ? sat.orbital_position - 3600 : sat.orbital_position,
@@ -786,7 +786,7 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje
return Py_False;
}
int tmp, *dest = NULL,
- modulation, system, freq, sr, pol, fec, inv, pilot, rolloff;
+ modulation, system, freq, sr, pol, fec, inv, pilot, rolloff, tsid, onid;
char *end_ptr;
const Attribute *at;
std::string name;
@@ -842,18 +842,21 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje
// eDebug("\telement: %s", (*it)->name().c_str());
const AttributeList &tp_attributes = (*it)->getAttributeList();
AttributeConstIterator end = tp_attributes.end();
- modulation = 1; // QPSK default
- system = 0; // DVB-S default
+ modulation = eDVBFrontendParametersSatellite::Modulation_QPSK;
+ system = eDVBFrontendParametersSatellite::System_DVB_S;
freq = 0;
sr = 0;
pol = -1;
- fec = 0; // AUTO default
- inv = 2; // AUTO default
- pilot = 2; // AUTO default
- rolloff = 0; // alpha 0.35
+ fec = eDVBFrontendParametersSatellite::FEC_Auto;
+ inv = eDVBFrontendParametersSatellite::Inversion_Unknown;
+ pilot = eDVBFrontendParametersSatellite::Pilot_Unknown;
+ rolloff = eDVBFrontendParametersSatellite::RollOff_alpha_0_35;
+ tsid = -1;
+ onid = -1;
+
for (AttributeConstIterator it(tp_attributes.begin()); it != end; ++it)
{
-// eDebug("\t\tattr: %s", at->name().c_str());
+ //eDebug("\t\tattr: %s", at->name().c_str());
at = *it;
name = at->name();
if (name == "modulation") dest = &modulation;
@@ -865,6 +868,8 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje
else if (name == "inversion") dest = &inv;
else if (name == "rolloff") dest = &rolloff;
else if (name == "pilot") dest = &pilot;
+ else if (name == "tsid") dest = &tsid;
+ else if (name == "onid") dest = &onid;
if (dest)
{
tmp = strtol(at->value().c_str(), &end_ptr, 10);
@@ -874,7 +879,7 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje
}
if (freq && sr && pol != -1)
{
- tuple = PyTuple_New(10);
+ tuple = PyTuple_New(12);
PyTuple_SET_ITEM(tuple, 0, PyInt_FromLong(0));
PyTuple_SET_ITEM(tuple, 1, PyInt_FromLong(freq));
PyTuple_SET_ITEM(tuple, 2, PyInt_FromLong(sr));
@@ -885,6 +890,8 @@ PyObject *eDVBDB::readSatellites(ePyObject sat_list, ePyObject sat_dict, ePyObje
PyTuple_SET_ITEM(tuple, 7, PyInt_FromLong(inv));
PyTuple_SET_ITEM(tuple, 8, PyInt_FromLong(rolloff));
PyTuple_SET_ITEM(tuple, 9, PyInt_FromLong(pilot));
+ PyTuple_SET_ITEM(tuple, 10, PyInt_FromLong(tsid));
+ PyTuple_SET_ITEM(tuple, 11, PyInt_FromLong(onid));
PyList_Append(tplist, tuple);
Py_DECREF(tuple);
}
@@ -974,8 +981,8 @@ PyObject *eDVBDB::readCables(ePyObject cab_list, ePyObject tp_dict)
// eDebug("\telement: %s", (*it)->name().c_str());
const AttributeList &tp_attributes = (*it)->getAttributeList();
AttributeConstIterator end = tp_attributes.end();
- modulation = 3; // QAM64 default
- fec = 0; // AUTO default
+ modulation = eDVBFrontendParametersCable::Modulation_QAM64;
+ fec = eDVBFrontendParametersCable::FEC_Auto;
freq = 0;
sr = 0;
for (AttributeConstIterator it(tp_attributes.begin()); it != end; ++it)
@@ -1088,14 +1095,14 @@ PyObject *eDVBDB::readTerrestrials(ePyObject ter_list, ePyObject tp_dict)
const AttributeList &tp_attributes = (*it)->getAttributeList();
AttributeConstIterator end = tp_attributes.end();
freq = 0;
- bw = 3; // AUTO
- constellation = 1; // AUTO
- crh = 5; // AUTO
- crl = 5; // AUTO
- guard = 4; // AUTO
- transm = 2; // AUTO
- hierarchy = 4; // AUTO
- inv = 2; // AUTO
+ bw = eDVBFrontendParametersTerrestrial::Bandwidth_Auto;
+ constellation = eDVBFrontendParametersTerrestrial::Modulation_Auto;
+ crh = eDVBFrontendParametersTerrestrial::FEC_Auto;
+ crl = eDVBFrontendParametersTerrestrial::FEC_Auto;
+ guard = eDVBFrontendParametersTerrestrial::GuardInterval_Auto;
+ transm = eDVBFrontendParametersTerrestrial::TransmissionMode_Auto;
+ hierarchy = eDVBFrontendParametersTerrestrial::Hierarchy_Auto;
+ inv = eDVBFrontendParametersTerrestrial::Inversion_Unknown;
for (AttributeConstIterator it(tp_attributes.begin()); it != end; ++it)
{
// eDebug("\t\tattr: %s", at->name().c_str());
@@ -1497,7 +1504,7 @@ int eDVBDBQueryBase::compareLessEqual(const eServiceReferenceDVB &a, const eServ
{
ePtr<eDVBService> a_service, b_service;
int sortmode = m_query ? m_query->m_sort : eDVBChannelQuery::tName;
-
+
if ((sortmode == eDVBChannelQuery::tName) || (sortmode == eDVBChannelQuery::tProvider))
{
if (a.name.empty() && m_db->getService(a, a_service))
@@ -1505,7 +1512,7 @@ int eDVBDBQueryBase::compareLessEqual(const eServiceReferenceDVB &a, const eServ
if (b.name.empty() && m_db->getService(b, b_service))
return 1;
}
-
+
switch (sortmode)
{
case eDVBChannelQuery::tName:
@@ -1747,10 +1754,10 @@ static int decodeType(const std::string &type)
RESULT parseExpression(ePtr<eDVBChannelQuery> &res, std::list<std::string>::const_iterator begin, std::list<std::string>::const_iterator end)
{
std::list<std::string>::const_iterator end_of_exp;
-
+
if (begin == end)
return 0;
-
+
if (*begin == "(")
{
end_of_exp = begin;
@@ -1759,36 +1766,36 @@ RESULT parseExpression(ePtr<eDVBChannelQuery> &res, std::list<std::string>::cons
break;
else
++end_of_exp;
-
+
if (end_of_exp == end)
{
eDebug("expression parse: end of expression while searching for closing brace");
return -1;
}
-
+
++begin;
// begin..end_of_exp
int r = parseExpression(res, begin, end_of_exp);
if (r)
return r;
++end_of_exp;
-
+
/* we had only one sub expression */
if (end_of_exp == end)
{
// eDebug("only one sub expression");
return 0;
}
-
+
/* otherwise we have an operator here.. */
-
+
ePtr<eDVBChannelQuery> r2 = res;
res = new eDVBChannelQuery();
res->m_sort = 0;
res->m_p1 = r2;
res->m_inverse = 0;
r2 = 0;
-
+
if (*end_of_exp == "||")
res->m_type = eDVBChannelQuery::tOR;
else if (*end_of_exp == "&&")
@@ -1799,18 +1806,18 @@ RESULT parseExpression(ePtr<eDVBChannelQuery> &res, std::list<std::string>::cons
res = 0;
return 1;
}
-
+
++end_of_exp;
-
+
return parseExpression(res->m_p2, end_of_exp, end);
}
-
+
// "begin" <op> "end"
std::string type, op, val;
-
+
res = new eDVBChannelQuery();
res->m_sort = 0;
-
+
int cnt = 0;
while (begin != end)
{
@@ -1832,23 +1839,23 @@ RESULT parseExpression(ePtr<eDVBChannelQuery> &res, std::list<std::string>::cons
++begin;
++cnt;
}
-
+
if (cnt != 3)
{
eDebug("malformed query: missing stuff");
res = 0;
return 1;
}
-
+
res->m_type = decodeType(type);
-
+
if (res->m_type == -1)
{
eDebug("malformed query: invalid type %s", type.c_str());
res = 0;
return 1;
}
-
+
if (op == "==")
res->m_inverse = 0;
else if (op == "!=")
@@ -1859,7 +1866,7 @@ RESULT parseExpression(ePtr<eDVBChannelQuery> &res, std::list<std::string>::cons
res = 0;
return 1;
}
-
+
res->m_string = val;
if (res->m_type == eDVBChannelQuery::tChannelID)
@@ -1879,7 +1886,7 @@ RESULT parseExpression(ePtr<eDVBChannelQuery> &res, std::list<std::string>::cons
RESULT eDVBChannelQuery::compile(ePtr<eDVBChannelQuery> &res, std::string query)
{
std::list<std::string> tokens;
-
+
std::string current_token;
std::string bouquet_name;
@@ -1891,34 +1898,34 @@ RESULT eDVBChannelQuery::compile(ePtr<eDVBChannelQuery> &res, std::string query)
{
int c = (i < query.size()) ? query[i] : ' ';
++i;
-
+
int issplit = !!strchr(splitchars, c);
int isaln = isalnum(c);
int iswhite = c == ' ';
int isquot = c == '\"';
-
+
if (quotemode)
{
iswhite = issplit = 0;
isaln = lastalnum;
}
-
+
if (issplit || iswhite || isquot || lastsplit || (lastalnum != isaln))
{
if (current_token.size())
tokens.push_back(current_token);
current_token.clear();
}
-
+
if (!(iswhite || isquot))
current_token += c;
-
+
if (isquot)
quotemode = !quotemode;
lastsplit = issplit;
lastalnum = isaln;
}
-
+
// for (std::list<std::string>::const_iterator a(tokens.begin()); a != tokens.end(); ++a)
// {
// printf("%s\n", a->c_str());
@@ -1970,12 +1977,12 @@ RESULT eDVBChannelQuery::compile(ePtr<eDVBChannelQuery> &res, std::string query)
res = 0;
return -1;
}
-
+
// eDebug("sort by %d", sort);
-
+
/* now we recursivly parse that. */
int r = parseExpression(res, tokens.begin(), tokens.end());
-
+
/* we have an empty (but valid!) expression */
if (!r && !res)
{
@@ -1983,7 +1990,7 @@ RESULT eDVBChannelQuery::compile(ePtr<eDVBChannelQuery> &res, std::string query)
res->m_inverse = 0;
res->m_type = eDVBChannelQuery::tAny;
}
-
+
if (res)
{
res->m_sort = sort;
diff --git a/lib/dvb/decoder.cpp b/lib/dvb/decoder.cpp
index 66b923a6..f73dbdd9 100644
--- a/lib/dvb/decoder.cpp
+++ b/lib/dvb/decoder.cpp
@@ -187,11 +187,15 @@ int eDVBAudio::startPid(int pid, int type)
case aAC3:
bypass = 0;
break;
- /*
case aDTS:
bypass = 2;
break;
- */
+ case aAAC:
+ bypass = 8;
+ break;
+ case aAACHE:
+ bypass = 9;
+ break;
}
eDebugNoNewLine("AUDIO_SET_BYPASS(%d) - ", bypass);
@@ -291,7 +295,9 @@ eDVBAudio::~eDVBAudio()
DEFINE_REF(eDVBVideo);
eDVBVideo::eDVBVideo(eDVBDemux *demux, int dev)
- :m_demux(demux), m_dev(dev)
+<<<<<<< HEAD:lib/dvb/decoder.cpp
+ : m_demux(demux), m_dev(dev),
+ m_width(-1), m_height(-1), m_framerate(-1), m_aspect(-1), m_progressive(-1)
{
char filename[128];
#if HAVE_DVB_API_VERSION < 3
@@ -325,6 +331,10 @@ eDVBVideo::eDVBVideo(eDVBDemux *demux, int dev)
// not finally values i think.. !!
#define VIDEO_STREAMTYPE_MPEG2 0
#define VIDEO_STREAMTYPE_MPEG4_H264 1
+#define VIDEO_STREAMTYPE_VC1 3
+#define VIDEO_STREAMTYPE_MPEG4_Part2 4
+#define VIDEO_STREAMTYPE_VC1_SM 5
+#define VIDEO_STREAMTYPE_MPEG1 6
#if HAVE_DVB_API_VERSION < 3
int eDVBVideo::setPid(int pid)
@@ -386,13 +396,36 @@ int eDVBVideo::stopPid()
#else
int eDVBVideo::startPid(int pid, int type)
{
+ int streamtype = VIDEO_STREAMTYPE_MPEG2;
+
if ((m_fd < 0) || (m_fd_demux < 0))
return -1;
dmx_pes_filter_params pes;
- eDebugNoNewLine("VIDEO_SET_STREAMTYPE %d - ",type == MPEG4_H264 ? VIDEO_STREAMTYPE_MPEG4_H264 : VIDEO_STREAMTYPE_MPEG2);
- if (::ioctl(m_fd, VIDEO_SET_STREAMTYPE,
- type == MPEG4_H264 ? VIDEO_STREAMTYPE_MPEG4_H264 : VIDEO_STREAMTYPE_MPEG2) < 0)
+ switch(type)
+ {
+ default:
+ case MPEG2:
+ break;
+ case MPEG4_H264:
+ streamtype = VIDEO_STREAMTYPE_MPEG4_H264;
+ break;
+ case MPEG1:
+ streamtype = VIDEO_STREAMTYPE_MPEG1;
+ break;
+ case MPEG4_Part2:
+ streamtype = VIDEO_STREAMTYPE_MPEG4_Part2;
+ break;
+ case VC1:
+ streamtype = VIDEO_STREAMTYPE_VC1;
+ break;
+ case VC1_SM:
+ streamtype = VIDEO_STREAMTYPE_VC1_SM;
+ break;
+ }
+
+ eDebugNoNewLine("VIDEO_SET_STREAMTYPE %d - ", streamtype);
+ if (::ioctl(m_fd, VIDEO_SET_STREAMTYPE, streamtype) < 0)
eDebug("failed (%m)");
else
eDebug("ok");
@@ -533,23 +566,23 @@ void eDVBVideo::video_event(int)
{
struct iTSMPEGDecoder::videoEvent event;
event.type = iTSMPEGDecoder::videoEvent::eventSizeChanged;
- event.aspect = evt.u.size.aspect_ratio;
- event.height = evt.u.size.h;
- event.width = evt.u.size.w;
+ m_aspect = event.aspect = evt.u.size.aspect_ratio == 0 ? 2 : 3; // convert dvb api to etsi
+ m_height = event.height = evt.u.size.h;
+ m_width = event.width = evt.u.size.w;
/* emit */ m_event(event);
}
else if (evt.type == VIDEO_EVENT_FRAME_RATE_CHANGED)
{
struct iTSMPEGDecoder::videoEvent event;
event.type = iTSMPEGDecoder::videoEvent::eventFrameRateChanged;
- event.framerate = evt.u.frame_rate;
+ m_framerate = event.framerate = evt.u.frame_rate;
/* emit */ m_event(event);
}
else if (evt.type == 16 /*VIDEO_EVENT_PROGRESSIVE_CHANGED*/)
{
struct iTSMPEGDecoder::videoEvent event;
event.type = iTSMPEGDecoder::videoEvent::eventProgressiveChanged;
- event.progressive = evt.u.frame_rate;
+ m_progressive = event.progressive = evt.u.frame_rate;
/* emit */ m_event(event);
}
else
@@ -566,6 +599,93 @@ RESULT eDVBVideo::connectEvent(const Slot1<void, struct iTSMPEGDecoder::videoEve
return 0;
}
+static int readMpegProc(char *str, int decoder)
+{
+ int val = -1;
+ char tmp[64];
+ sprintf(tmp, "/proc/stb/vmpeg/%d/%s", decoder, str);
+ FILE *f = fopen(tmp, "r");
+ if (f)
+ {
+ fscanf(f, "%x", &val);
+ fclose(f);
+ }
+ return val;
+}
+
+static int readApiSize(int fd, int &xres, int &yres, int &aspect)
+{
+#if HAVE_DVB_API_VERSION >= 3
+ video_size_t size;
+ if (!::ioctl(fd, VIDEO_GET_SIZE, &size))
+ {
+ xres = size.w;
+ yres = size.h;
+ aspect = size.aspect_ratio == 0 ? 2 : 3; // convert dvb api to etsi
+ return 0;
+ }
+// eDebug("VIDEO_GET_SIZE failed (%m)");
+#endif
+ return -1;
+}
+
+static int readApiFrameRate(int fd, int &framerate)
+{
+#if HAVE_DVB_API_VERSION >= 3
+ unsigned int frate;
+ if (!::ioctl(fd, VIDEO_GET_FRAME_RATE, &frate))
+ {
+ framerate = frate;
+ return 0;
+ }
+// eDebug("VIDEO_GET_FRAME_RATE failed (%m)");
+#endif
+ return -1;
+}
+
+int eDVBVideo::getWidth()
+{
+ if (m_width == -1)
+ readApiSize(m_fd, m_width, m_height, m_aspect);
+ if (m_width == -1)
+ m_width = readMpegProc("xres", m_dev);
+ return m_width;
+}
+
+int eDVBVideo::getHeight()
+{
+ if (m_height == -1)
+ readApiSize(m_fd, m_width, m_height, m_aspect);
+ if (m_height == -1)
+ m_height = readMpegProc("yres", m_dev);
+ return m_height;
+}
+
+int eDVBVideo::getAspect()
+{
+ if (m_aspect == -1)
+ readApiSize(m_fd, m_width, m_height, m_aspect);
+ if (m_aspect == -1)
+ m_aspect = readMpegProc("aspect", m_dev);
+ return m_aspect;
+}
+
+int eDVBVideo::getProgressive()
+{
+ if (m_progressive == -1)
+ m_progressive = readMpegProc("progressive", m_dev);
+ return m_progressive;
+}
+
+int eDVBVideo::getFrameRate()
+{
+ if (m_framerate == -1)
+ readApiFrameRate(m_fd, m_framerate);
+ if (m_framerate == -1)
+ m_framerate = readMpegProc("framerate", m_dev);
+ return m_framerate;
+}
+
DEFINE_REF(eDVBPCR);
eDVBPCR::eDVBPCR(eDVBDemux *demux): m_demux(demux)
@@ -1227,3 +1347,38 @@ void eTSMPEGDecoder::video_event(struct videoEvent event)
{
/* emit */ m_video_event(event);
}
+
+int eTSMPEGDecoder::getVideoWidth()
+{
+ if (m_video)
+ return m_video->getWidth();
+ return -1;
+}
+
+int eTSMPEGDecoder::getVideoHeight()
+{
+ if (m_video)
+ return m_video->getHeight();
+ return -1;
+}
+
+int eTSMPEGDecoder::getVideoProgressive()
+{
+ if (m_video)
+ return m_video->getProgressive();
+ return -1;
+}
+
+int eTSMPEGDecoder::getVideoFrameRate()
+{
+ if (m_video)
+ return m_video->getFrameRate();
+ return -1;
+}
+
+int eTSMPEGDecoder::getVideoAspect()
+{
+ if (m_video)
+ return m_video->getAspect();
+ return -1;
+}
diff --git a/lib/dvb/decoder.h b/lib/dvb/decoder.h
index 04501fe6..51be5141 100644
--- a/lib/dvb/decoder.h
+++ b/lib/dvb/decoder.h
@@ -13,7 +13,7 @@ private:
ePtr<eDVBDemux> m_demux;
int m_fd, m_fd_demux, m_dev, m_is_freezed;
public:
- enum { aMPEG, aAC3, aDTS, aAAC };
+ enum { aMPEG, aAC3, aDTS, aAAC, aAACHE };
eDVBAudio(eDVBDemux *demux, int dev);
enum { aMonoLeft, aStereo, aMonoRight };
void setChannel(int channel);
@@ -47,8 +47,9 @@ private:
ePtr<eSocketNotifier> m_sn;
void video_event(int what);
Signal1<void, struct iTSMPEGDecoder::videoEvent> m_event;
+ int m_width, m_height, m_framerate, m_aspect, m_progressive;
public:
- enum { MPEG2, MPEG4_H264 };
+ enum { MPEG2, MPEG4_H264, MPEG1, MPEG4_Part2, VC1, VC1_SM };
eDVBVideo(eDVBDemux *demux, int dev);
void stop();
#if HAVE_DVB_API_VERSION < 3
@@ -67,6 +68,11 @@ public:
int getPTS(pts_t &now);
virtual ~eDVBVideo();
RESULT connectEvent(const Slot1<void, struct iTSMPEGDecoder::videoEvent> &event, ePtr<eConnection> &conn);
+ int getWidth();
+ int getHeight();
+ int getProgressive();
+ int getFrameRate();
+ int getAspect();
};
class eDVBPCR: public iObject
@@ -182,6 +188,11 @@ public:
/* what 0=auto, 1=video, 2=audio. */
RESULT getPTS(int what, pts_t &pts);
RESULT connectVideoEvent(const Slot1<void, struct videoEvent> &event, ePtr<eConnection> &connection);
+ int getVideoWidth();
+ int getVideoHeight();
+ int getVideoProgressive();
+ int getVideoFrameRate();
+ int getVideoAspect();
};
#endif
diff --git a/lib/dvb/demux.cpp b/lib/dvb/demux.cpp
index a0f1c326..810b10a5 100644
--- a/lib/dvb/demux.cpp
+++ b/lib/dvb/demux.cpp
@@ -405,12 +405,14 @@ public:
void setTimingPID(int pid);
void saveTimingInformation(const std::string &filename);
+ int getLastPTS(pts_t &pts);
protected:
int filterRecordData(const unsigned char *data, int len, size_t &current_span_remaining);
private:
eMPEGStreamParserTS m_ts_parser;
eMPEGStreamInformation m_stream_info;
off_t m_current_offset;
+ pts_t m_last_pcr; /* very approximate.. */
int m_pid;
};
@@ -430,6 +432,11 @@ void eDVBRecordFileThread::saveTimingInformation(const std::string &filename)
m_stream_info.save(filename.c_str());
}
+int eDVBRecordFileThread::getLastPTS(pts_t &pts)
+{
+ return m_ts_parser.getLastPTS(pts);
+}
+
int eDVBRecordFileThread::filterRecordData(const unsigned char *data, int len, size_t &current_span_remaining)
{
m_ts_parser.parseData(m_current_offset, data, len);
@@ -589,6 +596,18 @@ RESULT eDVBTSRecorder::stop()
return 0;
}
+RESULT eDVBTSRecorder::getCurrentPCR(pts_t &pcr)
+{
+ if (!m_running)
+ return 0;
+ if (!m_thread)
+ return 0;
+ /* XXX: we need a lock here */
+
+ /* we don't filter PCR data, so just use the last received PTS, which is not accurate, but better than nothing */
+ return m_thread->getLastPTS(pcr);
+}
+
RESULT eDVBTSRecorder::connectEvent(const Slot1<void,int> &event, ePtr<eConnection> &conn)
{
conn = new eConnection(this, m_event.connect(event));
diff --git a/lib/dvb/demux.h b/lib/dvb/demux.h
index 1a7db979..14501b98 100644
--- a/lib/dvb/demux.h
+++ b/lib/dvb/demux.h
@@ -101,7 +101,9 @@ public:
RESULT setBoundary(off_t max);
RESULT stop();
-
+
+ RESULT getCurrentPCR(pts_t &pcr);
+
RESULT connectEvent(const Slot1<void,int> &event, ePtr<eConnection> &conn);
private:
RESULT startPID(int pid);
diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp
index 28012e7a..c320fc78 100644
--- a/lib/dvb/dvb.cpp
+++ b/lib/dvb/dvb.cpp
@@ -4,6 +4,7 @@
#include <lib/dvb/dvb.h>
#include <lib/dvb/pmt.h>
#include <lib/dvb/sec.h>
+#include <lib/dvb/specs.h>
#include <errno.h>
#include <sys/types.h>
@@ -69,19 +70,19 @@ eDVBResourceManager::eDVBResourceManager()
if (!instance)
instance = this;
-
+
/* search available adapters... */
// add linux devices
-
+
int num_adapter = 0;
while (eDVBAdapterLinux::exist(num_adapter))
{
addAdapter(new eDVBAdapterLinux(num_adapter));
num_adapter++;
}
-
- eDebug("found %d adapter, %d frontends(%d sim) and %d demux",
+
+ eDebug("found %d adapter, %d frontends(%d sim) and %d demux",
m_adapter.size(), m_frontend.size(), m_simulate_frontend.size(), m_demux.size());
eDVBCAService::registerChannelCallback(this);
@@ -103,7 +104,7 @@ eDVBAdapterLinux::eDVBAdapterLinux(int nr): m_nr(nr)
{
// scan frontends
int num_fe = 0;
-
+
eDebug("scanning for frontends..");
while (1)
{
@@ -132,7 +133,7 @@ eDVBAdapterLinux::eDVBAdapterLinux(int nr): m_nr(nr)
}
++num_fe;
}
-
+
// scan demux
int num_demux = 0;
while (1)
@@ -147,10 +148,10 @@ eDVBAdapterLinux::eDVBAdapterLinux(int nr): m_nr(nr)
if (stat(filename, &s))
break;
ePtr<eDVBDemux> demux;
-
+
demux = new eDVBDemux(m_nr, num_demux);
m_demux.push_back(demux);
-
+
++num_demux;
}
}
@@ -168,12 +169,12 @@ RESULT eDVBAdapterLinux::getDemux(ePtr<eDVBDemux> &demux, int nr)
--nr;
++i;
}
-
+
if (i != m_demux.end())
demux = *i;
else
return -1;
-
+
return 0;
}
@@ -190,12 +191,12 @@ RESULT eDVBAdapterLinux::getFrontend(ePtr<eDVBFrontend> &fe, int nr, bool simula
--nr;
++i;
}
-
+
if (i != m_frontend.end())
fe = *i;
else
return -1;
-
+
return 0;
}
@@ -223,9 +224,9 @@ void eDVBResourceManager::addAdapter(iDVBAdapter *adapter)
{
int num_fe = adapter->getNumFrontends();
int num_demux = adapter->getNumDemux();
-
+
m_adapter.push_back(adapter);
-
+
int i;
for (i=0; i<num_demux; ++i)
{
@@ -425,9 +426,9 @@ RESULT eDVBResourceManager::allocateDemux(eDVBRegisteredFrontend *fe, ePtr<eDVBA
if (i == m_demux.end())
return -1;
-
+
ePtr<eDVBRegisteredDemux> unused;
-
+
if (m_demux.size() < 5)
{
/* FIXME: hardware demux policy */
@@ -443,14 +444,14 @@ RESULT eDVBResourceManager::allocateDemux(eDVBRegisteredFrontend *fe, ePtr<eDVBA
for (; i != m_demux.end(); ++i, ++n)
{
int is_decode = n < 2;
-
+
int in_use = is_decode ? (i->m_demux->getRefCount() != 2) : i->m_inuse;
-
+
if ((!in_use) && ((!fe) || (i->m_adapter == fe->m_adapter)))
{
if ((cap & iDVBChannel::capDecode) && !is_decode)
continue;
- unused = i;
+ unused = i;
break;
}
}
@@ -466,7 +467,7 @@ RESULT eDVBResourceManager::allocateDemux(eDVBRegisteredFrontend *fe, ePtr<eDVBA
if (!unused)
unused = i;
}
- else if (i->m_adapter == fe->m_adapter &&
+ else if (i->m_adapter == fe->m_adapter &&
i->m_demux->getSource() == fe->m_frontend->getDVBID())
{
demux = new eDVBAllocatedDemux(i);
@@ -572,7 +573,7 @@ RESULT eDVBResourceManager::allocateChannel(const eDVBChannelID &channelid, eUse
}
/* allocate a frontend. */
-
+
ePtr<eDVBAllocatedFrontend> fe;
int err = allocateFrontend(fe, feparm, simulate);
@@ -998,7 +999,7 @@ int eDVBChannelFilePush::filterRecordData(const unsigned char *_data, int len, s
if (m_iframe_state == 1)
{
- /* we are allowing data, and stop allowing data on the next frame.
+ /* we are allowing data, and stop allowing data on the next frame.
we now found a frame. so stop here. */
memset(data + offset, 0, 188 - (offset%188)); /* zero out rest of TS packet */
current_span_remaining = 0;
@@ -1072,9 +1073,9 @@ eDVBChannel::eDVBChannel(eDVBResourceManager *mgr, eDVBAllocatedFrontend *fronte
m_frontend = frontend;
m_pvr_thread = 0;
-
+
m_skipmode_n = m_skipmode_m = 0;
-
+
if (m_frontend)
m_frontend->get().connectStateChange(slot(*this, &eDVBChannel::frontendStateChanged), m_conn_frontendStateChanged);
}
@@ -1090,14 +1091,14 @@ eDVBChannel::~eDVBChannel()
void eDVBChannel::frontendStateChanged(iDVBFrontend*fe)
{
int state, ourstate = 0;
-
+
/* if we are already in shutdown, don't change state. */
if (m_state == state_release)
return;
-
+
if (fe->getState(state))
return;
-
+
if (state == iDVBFrontend::stateLock)
{
eDebug("OURSTATE: ok");
@@ -1126,7 +1127,7 @@ void eDVBChannel::frontendStateChanged(iDVBFrontend*fe)
ourstate = state_failed;
} else
eFatal("state unknown");
-
+
if (ourstate != m_state)
{
m_state = ourstate;
@@ -1243,7 +1244,7 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off
const int blocksize = 188;
unsigned int max = align(10*1024*1024, blocksize);
current_offset = align(current_offset, blocksize);
-
+
if (!m_cue)
{
eDebug("no cue sheet. forcing normal play");
@@ -1314,7 +1315,7 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off
continue;
}
}
-
+
if (relative == 1) /* pts relative */
{
pts += now;
@@ -1325,7 +1326,7 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off
if (relative != 2)
if (pts < 0)
pts = 0;
-
+
if (relative == 2) /* AP relative */
{
eDebug("AP relative seeking: %lld, at %lld", pts, now);
@@ -1340,7 +1341,7 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off
eDebug("next ap is %llx\n", pts);
}
}
-
+
off_t offset = 0;
if (m_tstools.getOffset(offset, pts, -1))
{
@@ -1358,7 +1359,7 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off
{
long long aligned_start = align(i->first, blocksize);
long long aligned_end = align(i->second, blocksize);
-
+
if ((current_offset >= aligned_start) && (current_offset < aligned_end))
{
start = current_offset;
@@ -1470,7 +1471,7 @@ RESULT eDVBChannel::setChannel(const eDVBChannelID &channelid, ePtr<iDVBFrontend
{
if (m_channel_id)
m_mgr->removeChannel(this);
-
+
if (!channelid)
return 0;
@@ -1479,7 +1480,7 @@ RESULT eDVBChannel::setChannel(const eDVBChannelID &channelid, ePtr<iDVBFrontend
eDebug("no frontend to tune!");
return -ENODEV;
}
-
+
m_channel_id = channelid;
m_mgr->addChannel(channelid, this);
m_state = state_tuning;
@@ -1487,14 +1488,14 @@ RESULT eDVBChannel::setChannel(const eDVBChannelID &channelid, ePtr<iDVBFrontend
int res;
res = m_frontend->get().tune(*feparm);
m_current_frontend_parameters = feparm;
-
+
if (res)
{
m_state = state_release;
m_stateChanged(this);
return res;
}
-
+
return 0;
}
@@ -1521,24 +1522,79 @@ RESULT eDVBChannel::setCIRouting(const eDVBCIRouting &routing)
return -1;
}
+void eDVBChannel::SDTready(int result)
+{
+ ePyObject args = PyTuple_New(2), ret;
+ bool ok=false;
+ if (!result)
+ {
+ for (std::vector<ServiceDescriptionSection*>::const_iterator i = m_SDT->getSections().begin(); i != m_SDT->getSections().end(); ++i)
+ {
+ ok = true;
+ PyTuple_SET_ITEM(args, 0, PyInt_FromLong((*i)->getTransportStreamId()));
+ PyTuple_SET_ITEM(args, 1, PyInt_FromLong((*i)->getOriginalNetworkId()));
+ break;
+ }
+ }
+ if (!ok)
+ {
+ PyTuple_SET_ITEM(args, 0, Py_None);
+ PyTuple_SET_ITEM(args, 1, Py_None);
+ Py_INCREF(Py_None);
+ Py_INCREF(Py_None);
+ }
+ ret = PyObject_CallObject(m_tsid_onid_callback, args);
+ if (ret)
+ Py_DECREF(ret);
+ Py_DECREF(args);
+ Py_DECREF(m_tsid_onid_callback);
+ m_tsid_onid_callback = ePyObject();
+ m_tsid_onid_demux = 0;
+ m_SDT = 0;
+}
+
+RESULT eDVBChannel::requestTsidOnid(ePyObject callback)
+{
+ if (PyCallable_Check(callback))
+ {
+ if (!getDemux(m_tsid_onid_demux, 0))
+ {
+ m_SDT = new eTable<ServiceDescriptionSection>;
+ CONNECT(m_SDT->tableReady, eDVBChannel::SDTready);
+ if (m_SDT->start(m_tsid_onid_demux, eDVBSDTSpec()))
+ {
+ m_tsid_onid_demux = 0;
+ m_SDT = 0;
+ }
+ else
+ {
+ Py_INCREF(callback);
+ m_tsid_onid_callback = callback;
+ return 0;
+ }
+ }
+ }
+ return -1;
+}
+
RESULT eDVBChannel::getDemux(ePtr<iDVBDemux> &demux, int cap)
{
ePtr<eDVBAllocatedDemux> &our_demux = (cap & capDecode) ? m_decoder_demux : m_demux;
-
+
if (!our_demux)
{
demux = 0;
-
+
if (m_mgr->allocateDemux(m_frontend ? (eDVBRegisteredFrontend*)*m_frontend : (eDVBRegisteredFrontend*)0, our_demux, cap))
return -1;
}
-
+
demux = *our_demux;
/* don't hold a reference to the decoding demux, we don't need it. */
-
+
/* FIXME: by dropping the 'allocated demux' in favour of the 'iDVBDemux',
- the refcount is lost. thus, decoding demuxes are never allocated.
-
+ the refcount is lost. thus, decoding demuxes are never allocated.
+
this poses a big problem for PiP. */
if (cap & capDecode)
our_demux = 0;
@@ -1571,12 +1627,12 @@ RESULT eDVBChannel::playFile(const char *file)
delete m_pvr_thread;
m_pvr_thread = 0;
}
-
+
m_tstools.openFile(file);
-
+
/* DON'T EVEN THINK ABOUT FIXING THIS. FIX THE ATI SOURCES FIRST,
THEN DO A REAL FIX HERE! */
-
+
/* (this codepath needs to be improved anyway.) */
#if HAVE_DVB_API_VERSION < 3
m_pvr_fd_dst = open("/dev/pvr", O_WRONLY);
@@ -1637,11 +1693,11 @@ RESULT eDVBChannel::getCurrentPosition(iDVBDemux *decoding_demux, pts_t &pos, in
{
if (!decoding_demux)
return -1;
-
+
pts_t now;
-
+
int r;
-
+
if (mode == 0) /* demux */
{
r = decoding_demux->getSTC(now, 0);
@@ -1652,7 +1708,7 @@ RESULT eDVBChannel::getCurrentPosition(iDVBDemux *decoding_demux, pts_t &pos, in
}
} else
now = pos; /* fixup supplied */
-
+
off_t off = 0; /* TODO: fixme */
r = m_tstools.fixupPTS(off, now);
if (r)
@@ -1660,9 +1716,9 @@ RESULT eDVBChannel::getCurrentPosition(iDVBDemux *decoding_demux, pts_t &pos, in
eDebug("fixup PTS failed");
return -1;
}
-
+
pos = now;
-
+
return 0;
}
@@ -1673,7 +1729,7 @@ void eDVBChannel::flushPVR(iDVBDemux *decoding_demux)
a.) the filepush's internal buffer
b.) the PVR buffer (before demux)
c.) the ratebuffer (after demux)
-
+
it's important to clear them in the correct order, otherwise
the ratebuffer (for example) would immediately refill from
the not-yet-flushed PVR buffer.
@@ -1684,7 +1740,7 @@ void eDVBChannel::flushPVR(iDVBDemux *decoding_demux)
m_pvr_thread->flush();
/* HACK: flush PVR buffer */
::ioctl(m_pvr_fd_dst, 0);
-
+
/* flush ratebuffers (video, audio) */
if (decoding_demux)
decoding_demux->flush();
@@ -1708,7 +1764,7 @@ void eCueSheet::seekTo(int relative, const pts_t &pts)
m_lock.Unlock();
m_event(evtSeek);
}
-
+
void eCueSheet::clear()
{
m_lock.WrLock();
diff --git a/lib/dvb/dvb.h b/lib/dvb/dvb.h
index 13556c26..fa1801db 100644
--- a/lib/dvb/dvb.h
+++ b/lib/dvb/dvb.h
@@ -10,8 +10,11 @@
#include <lib/dvb/demux.h>
#include <lib/dvb/frontend.h>
#include <lib/dvb/tstools.h>
+#include <lib/dvb/esection.h>
#include <connection.h>
+#include <dvbsi++/service_description_section.h>
+
class eDVBChannel;
/* we do NOT handle resource conflicts here. instead, the allocateChannel
@@ -259,6 +262,8 @@ public:
RESULT getCurrentPosition(iDVBDemux *decoding_demux, pts_t &pos, int mode);
int getUseCount() { return m_use_count; }
+
+ RESULT requestTsidOnid(ePyObject callback);
private:
ePtr<eDVBAllocatedFrontend> m_frontend;
ePtr<eDVBAllocatedDemux> m_demux, m_decoder_demux;
@@ -299,6 +304,12 @@ private:
oRefCount m_use_count;
void AddUse();
void ReleaseUse();
+
+ /* for tsid/onid read */
+ ePyObject m_tsid_onid_callback;
+ ePtr<iDVBDemux> m_tsid_onid_demux;
+ ePtr<eTable<ServiceDescriptionSection> > m_SDT;
+ void SDTready(int err);
};
#endif // SWIG
diff --git a/lib/dvb/dvbtime.cpp b/lib/dvb/dvbtime.cpp
index c4335795..d879cfac 100644
--- a/lib/dvb/dvbtime.cpp
+++ b/lib/dvb/dvbtime.cpp
@@ -11,6 +11,8 @@
#define FP_IOCTL_SET_RTC 0x101
#define FP_IOCTL_GET_RTC 0x102
+#define TIME_UPDATE_INTERVAL (30*60*1000)
+
static time_t prev_time;
void setRTC(time_t time)
@@ -143,7 +145,7 @@ eDVBLocalTimeHandler *eDVBLocalTimeHandler::instance;
DEFINE_REF(eDVBLocalTimeHandler);
eDVBLocalTimeHandler::eDVBLocalTimeHandler()
- :m_time_ready(false)
+ :m_time_ready(false), m_updateNonTunedTimer(eTimer::create(eApp))
{
if ( !instance )
instance=this;
@@ -164,6 +166,7 @@ eDVBLocalTimeHandler::eDVBLocalTimeHandler()
/*emit*/ m_timeUpdated();
}
}
+ CONNECT(m_updateNonTunedTimer->timeout, eDVBLocalTimeHandler::updateNonTuned);
}
eDVBLocalTimeHandler::~eDVBLocalTimeHandler()
@@ -211,6 +214,12 @@ void eDVBLocalTimeHandler::writeTimeOffsetData( const char* filename )
}
}
+void eDVBLocalTimeHandler::updateNonTuned()
+{
+ updateTime(-1, 0, 0);
+ m_updateNonTunedTimer->start(TIME_UPDATE_INTERVAL, true);
+}
+
void eDVBLocalTimeHandler::updateTime( time_t tp_time, eDVBChannel *chan, int update_count )
{
int time_difference;
@@ -397,7 +406,7 @@ void eDVBLocalTimeHandler::updateTime( time_t tp_time, eDVBChannel *chan, int up
int updateCount = it->second.tdt->getUpdateCount();
it->second.tdt = 0;
it->second.tdt = new TDT(chan, updateCount);
- it->second.tdt->startTimer(60*60*1000); // restart TDT for this transponder in 60min
+ it->second.tdt->startTimer(TIME_UPDATE_INTERVAL); // restart TDT for this transponder in 30min
}
}
}
@@ -430,12 +439,15 @@ void eDVBLocalTimeHandler::DVBChannelStateChanged(iDVBChannel *chan)
{
case iDVBChannel::state_ok:
eDebug("[eDVBLocalTimerHandler] channel %p running", chan);
+ m_updateNonTunedTimer->stop();
it->second.tdt = new TDT(it->second.channel);
it->second.tdt->start();
break;
case iDVBChannel::state_release:
eDebug("[eDVBLocalTimerHandler] remove channel %p", chan);
m_knownChannels.erase(it);
+ if (m_knownChannels.empty())
+ m_updateNonTunedTimer->start(TIME_UPDATE_INTERVAL, true);
break;
default: // ignore all other events
return;
diff --git a/lib/dvb/dvbtime.h b/lib/dvb/dvbtime.h
index f403ffd4..3f8d9b7d 100644
--- a/lib/dvb/dvbtime.h
+++ b/lib/dvb/dvbtime.h
@@ -54,6 +54,7 @@ class eDVBLocalTimeHandler: public Object
ePtr<eConnection> m_stateChangedConn;
int m_prevChannelState;
};
+ ePtr<eTimer> m_updateNonTunedTimer;
friend class TDT;
std::map<iDVBChannel*, channel_data> m_knownChannels;
std::map<eDVBChannelID,int> m_timeOffsetMap;
@@ -66,6 +67,7 @@ class eDVBLocalTimeHandler: public Object
void readTimeOffsetData(const char*);
void writeTimeOffsetData(const char*);
void updateTime(time_t tp_time, eDVBChannel*, int updateCount);
+ void updateNonTuned();
static eDVBLocalTimeHandler *instance;
#ifdef SWIG
eDVBLocalTimeHandler();
diff --git a/lib/dvb/epgcache.cpp b/lib/dvb/epgcache.cpp
index 0bb6e25b..fdcbe0e9 100644
--- a/lib/dvb/epgcache.cpp
+++ b/lib/dvb/epgcache.cpp
@@ -1672,7 +1672,7 @@ int handleEvent(eServiceEvent *ptr, ePyObject dest_list, const char* argstring,
{
fillTuple(convertFuncArgs, argstring, argcount, service, ptr, nowTime, service_name);
ePyObject result = PyObject_CallObject(convertFunc, convertFuncArgs);
- if (result)
+ if (!result)
{
if (service_name)
Py_DECREF(service_name);
@@ -2047,6 +2047,8 @@ PyObject *eEPGCache::search(ePyObject arg)
int querytype=-1;
bool needServiceEvent=false;
int maxmatches=0;
+ int must_get_service_name = 0;
+ bool must_get_service_reference = false;
if (PyTuple_Check(arg))
{
@@ -2056,7 +2058,11 @@ PyObject *eEPGCache::search(ePyObject arg)
ePyObject obj = PyTuple_GET_ITEM(arg,0);
if (PyString_Check(obj))
{
+#if PY_VERSION_HEX < 0x02060000
argcount = PyString_GET_SIZE(obj);
+#else
+ argcount = PyString_Size(obj);
+#endif
argstring = PyString_AS_STRING(obj);
for (int i=0; i < argcount; ++i)
switch(argstring[i])
@@ -2065,6 +2071,16 @@ PyObject *eEPGCache::search(ePyObject arg)
case 'E':
case 'T':
needServiceEvent=true;
+ break;
+ case 'N':
+ must_get_service_name = 1;
+ break;
+ case 'n':
+ must_get_service_name = 2;
+ break;
+ case 'R':
+ must_get_service_reference = true;
+ break;
default:
break;
}
@@ -2144,7 +2160,11 @@ PyObject *eEPGCache::search(ePyObject arg)
{
int casetype = PyLong_AsLong(PyTuple_GET_ITEM(arg, 4));
const char *str = PyString_AS_STRING(obj);
+#if PY_VERSION_HEX < 0x02060000
int textlen = PyString_GET_SIZE(obj);
+#else
+ int textlen = PyString_Size(obj);
+#endif
if (querytype == 1)
eDebug("lookup for events with '%s' as title(%s)", str, casetype?"ignore case":"case sensitive");
else
@@ -2159,22 +2179,32 @@ PyObject *eEPGCache::search(ePyObject arg)
int title_len = data[5];
if ( querytype == 1 )
{
- if (title_len > textlen)
- continue;
- else if (title_len < textlen)
+ int offs = 6;
+ // skip DVB-Text Encoding!
+ if (data[6] == 0x10)
+ {
+ offs+=3;
+ title_len-=3;
+ }
+ else if(data[6] > 0 && data[6] < 0x20)
+ {
+ offs+=1;
+ title_len-=1;
+ }
+ if (title_len != textlen)
continue;
if ( casetype )
{
- if ( !strncasecmp((const char*)data+6, str, title_len) )
+ if ( !strncasecmp((const char*)data+offs, str, title_len) )
{
-// std::string s((const char*)data+6, title_len);
+// std::string s((const char*)data+offs, title_len);
// eDebug("match1 %s %s", str, s.c_str() );
descr[++descridx] = it->first;
}
}
- else if ( !strncmp((const char*)data+6, str, title_len) )
+ else if ( !strncmp((const char*)data+offs, str, title_len) )
{
-// std::string s((const char*)data+6, title_len);
+// std::string s((const char*)data+offs, title_len);
// eDebug("match2 %s %s", str, s.c_str() );
descr[++descridx] = it->first;
}
@@ -2193,13 +2223,13 @@ PyObject *eEPGCache::search(ePyObject arg)
// eDebug("match 3 %s %s", str, s.c_str() );
break;
}
- else if (!strncmp((const char*)data+6+idx, str, textlen) )
- {
- descr[++descridx] = it->first;
-// std::string s((const char*)data+6, title_len);
-// eDebug("match 4 %s %s", str, s.c_str() );
- break;
- }
+ }
+ else if (!strncmp((const char*)data+6+idx, str, textlen) )
+ {
+ descr[++descridx] = it->first;
+// std::string s((const char*)data+6, title_len);
+// eDebug("match 4 %s %s", str, s.c_str() );
+ break;
}
++idx;
}
@@ -2303,44 +2333,40 @@ PyObject *eEPGCache::search(ePyObject arg)
}
}
// create service name
- if (!service_name)
+ if (must_get_service_name && !service_name)
{
- int must_get_service_name = strchr(argstring, 'N') ? 1 : strchr(argstring, 'n') ? 2 : 0;
- if (must_get_service_name)
+ ePtr<iStaticServiceInformation> sptr;
+ eServiceCenterPtr service_center;
+ eServiceCenter::getPrivInstance(service_center);
+ if (service_center)
{
- ePtr<iStaticServiceInformation> sptr;
- eServiceCenterPtr service_center;
- eServiceCenter::getPrivInstance(service_center);
- if (service_center)
+ service_center->info(ref, sptr);
+ if (sptr)
{
- service_center->info(ref, sptr);
- if (sptr)
- {
- std::string name;
- sptr->getName(ref, name);
+ std::string name;
+ sptr->getName(ref, name);
- if (must_get_service_name == 1)
- {
- size_t pos;
- // filter short name brakets
- while((pos = name.find("\xc2\x86")) != std::string::npos)
- name.erase(pos,2);
- while((pos = name.find("\xc2\x87")) != std::string::npos)
- name.erase(pos,2);
- }
- else
- name = buildShortName(name);
-
- if (name.length())
- service_name = PyString_FromString(name.c_str());
+ if (must_get_service_name == 1)
+ {
+ size_t pos;
+ // filter short name brakets
+ while((pos = name.find("\xc2\x86")) != std::string::npos)
+ name.erase(pos,2);
+ while((pos = name.find("\xc2\x87")) != std::string::npos)
+ name.erase(pos,2);
}
+ else
+ name = buildShortName(name);
+
+ if (name.length())
+ service_name = PyString_FromString(name.c_str());
}
- if (!service_name)
- service_name = PyString_FromString("<n/a>");
}
+ if (!service_name)
+ service_name = PyString_FromString("<n/a>");
}
// create servicereference string
- if (!service_reference && strchr(argstring,'R'))
+ if (must_get_service_reference && !service_reference)
service_reference = PyString_FromString(ref.toString().c_str());
// create list
if (!ret)
diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp
index b0e92d39..e0291ec1 100644
--- a/lib/dvb/frontend.cpp
+++ b/lib/dvb/frontend.cpp
@@ -1,4 +1,5 @@
#include <lib/dvb/dvb.h>
+#include <lib/dvb/frontendparms.h>
#include <lib/base/eerror.h>
#include <lib/base/nconfig.h> // access to python config
#include <errno.h>
@@ -148,10 +149,10 @@ void eDVBFrontendParametersSatellite::set(const SatelliteDeliverySystemDescripto
symbol_rate = descriptor.getSymbolRate() * 100;
polarisation = descriptor.getPolarization();
fec = descriptor.getFecInner();
- if ( fec != FEC::fNone && fec > FEC::f9_10 )
- fec = FEC::fAuto;
- inversion = Inversion::Unknown;
- pilot = Pilot::Unknown;
+ if ( fec != eDVBFrontendParametersSatellite::FEC_None && fec > eDVBFrontendParametersSatellite::FEC_9_10 )
+ fec = eDVBFrontendParametersSatellite::FEC_Auto;
+ inversion = eDVBFrontendParametersSatellite::Inversion_Unknown;
+ pilot = eDVBFrontendParametersSatellite::Pilot_Unknown;
orbital_position = ((descriptor.getOrbitalPosition() >> 12) & 0xF) * 1000;
orbital_position += ((descriptor.getOrbitalPosition() >> 8) & 0xF) * 100;
orbital_position += ((descriptor.getOrbitalPosition() >> 4) & 0xF) * 10;
@@ -160,13 +161,13 @@ void eDVBFrontendParametersSatellite::set(const SatelliteDeliverySystemDescripto
orbital_position = 3600 - orbital_position;
system = descriptor.getModulationSystem();
modulation = descriptor.getModulation();
- if (system == System::DVB_S && modulation == Modulation::M8PSK)
+ if (system == eDVBFrontendParametersSatellite::System_DVB_S && modulation == eDVBFrontendParametersSatellite::Modulation_8PSK)
{
eDebug("satellite_delivery_descriptor non valid modulation type.. force QPSK");
- modulation=QPSK;
+ modulation=eDVBFrontendParametersSatellite::Modulation_QPSK;
}
rolloff = descriptor.getRollOff();
- if (system == System::DVB_S2)
+ if (system == eDVBFrontendParametersSatellite::System_DVB_S2)
{
eDebug("SAT DVB-S2 freq %d, %s, pos %d, sr %d, fec %d, modulation %d, rolloff %d",
frequency,
@@ -191,12 +192,12 @@ void eDVBFrontendParametersCable::set(const CableDeliverySystemDescriptor &descr
frequency = descriptor.getFrequency() / 10;
symbol_rate = descriptor.getSymbolRate() * 100;
fec_inner = descriptor.getFecInner();
- if ( fec_inner == 0xF )
- fec_inner = FEC::fNone;
+ if ( fec_inner != eDVBFrontendParametersCable::FEC_None && fec_inner > eDVBFrontendParametersCable::FEC_8_9 )
+ fec_inner = eDVBFrontendParametersCable::FEC_Auto;
modulation = descriptor.getModulation();
if ( modulation > 0x5 )
- modulation = Modulation::Auto;
- inversion = Inversion::Unknown;
+ modulation = eDVBFrontendParametersCable::Modulation_Auto;
+ inversion = eDVBFrontendParametersCable::Inversion_Unknown;
eDebug("Cable freq %d, mod %d, sr %d, fec %d",
frequency,
modulation, symbol_rate, fec_inner);
@@ -207,24 +208,24 @@ void eDVBFrontendParametersTerrestrial::set(const TerrestrialDeliverySystemDescr
frequency = descriptor.getCentreFrequency() * 10;
bandwidth = descriptor.getBandwidth();
if ( bandwidth > 2 ) // 5Mhz forced to auto
- bandwidth = Bandwidth::BwAuto;
+ bandwidth = eDVBFrontendParametersTerrestrial::Bandwidth_Auto;
code_rate_HP = descriptor.getCodeRateHpStream();
if (code_rate_HP > 4)
- code_rate_HP = FEC::fAuto;
+ code_rate_HP = eDVBFrontendParametersTerrestrial::FEC_Auto;
code_rate_LP = descriptor.getCodeRateLpStream();
if (code_rate_LP > 4)
- code_rate_LP = FEC::fAuto;
+ code_rate_LP = eDVBFrontendParametersTerrestrial::FEC_Auto;
transmission_mode = descriptor.getTransmissionMode();
if (transmission_mode > 1) // TM4k forced to auto
- transmission_mode = TransmissionMode::TMAuto;
+ transmission_mode = eDVBFrontendParametersTerrestrial::TransmissionMode_Auto;
guard_interval = descriptor.getGuardInterval();
if (guard_interval > 3)
- guard_interval = GuardInterval::GI_Auto;
+ guard_interval = eDVBFrontendParametersTerrestrial::GuardInterval_Auto;
hierarchy = descriptor.getHierarchyInformation()&3;
modulation = descriptor.getConstellation();
if (modulation > 2)
- modulation = Modulation::Auto;
- inversion = Inversion::Unknown;
+ modulation = eDVBFrontendParametersTerrestrial::Modulation_Auto;
+ inversion = eDVBFrontendParametersTerrestrial::Inversion_Unknown;
eDebug("Terr freq %d, bw %d, cr_hp %d, cr_lp %d, tm_mode %d, guard %d, hierarchy %d, const %d",
frequency, bandwidth, code_rate_HP, code_rate_LP, transmission_mode,
guard_interval, hierarchy, modulation);
@@ -316,9 +317,9 @@ RESULT eDVBFrontendParameters::calculateDifference(const iDVBFrontendParameters
diff = 1<<29;
else if (sat.polarisation != osat.polarisation)
diff = 1<<28;
- else if (exact && sat.fec != osat.fec && sat.fec != eDVBFrontendParametersSatellite::FEC::fAuto && osat.fec != eDVBFrontendParametersSatellite::FEC::fAuto)
+ else if (exact && sat.fec != osat.fec && sat.fec != eDVBFrontendParametersSatellite::FEC_Auto && osat.fec != eDVBFrontendParametersSatellite::FEC_Auto)
diff = 1<<27;
- else if (exact && sat.modulation != osat.modulation && sat.modulation != eDVBFrontendParametersSatellite::Modulation::Auto && osat.modulation != eDVBFrontendParametersSatellite::Modulation::Auto)
+ else if (exact && sat.modulation != osat.modulation && sat.modulation != eDVBFrontendParametersSatellite::Modulation_Auto && osat.modulation != eDVBFrontendParametersSatellite::Modulation_Auto)
diff = 1<<27;
else
{
@@ -333,10 +334,10 @@ RESULT eDVBFrontendParameters::calculateDifference(const iDVBFrontendParameters
return -2;
if (exact && cable.modulation != ocable.modulation
- && cable.modulation != eDVBFrontendParametersCable::Modulation::Auto
- && ocable.modulation != eDVBFrontendParametersCable::Modulation::Auto)
+ && cable.modulation != eDVBFrontendParametersCable::Modulation_Auto
+ && ocable.modulation != eDVBFrontendParametersCable::Modulation_Auto)
diff = 1 << 29;
- else if (exact && cable.fec_inner != ocable.fec_inner && cable.fec_inner != eDVBFrontendParametersCable::FEC::fAuto && ocable.fec_inner != eDVBFrontendParametersCable::FEC::fAuto)
+ else if (exact && cable.fec_inner != ocable.fec_inner && cable.fec_inner != eDVBFrontendParametersCable::FEC_Auto && ocable.fec_inner != eDVBFrontendParametersCable::FEC_Auto)
diff = 1 << 27;
else
{
@@ -350,32 +351,32 @@ RESULT eDVBFrontendParameters::calculateDifference(const iDVBFrontendParameters
return -2;
if (exact && oterrestrial.bandwidth != terrestrial.bandwidth &&
- oterrestrial.bandwidth != eDVBFrontendParametersTerrestrial::Bandwidth::BwAuto &&
- terrestrial.bandwidth != eDVBFrontendParametersTerrestrial::Bandwidth::BwAuto)
+ oterrestrial.bandwidth != eDVBFrontendParametersTerrestrial::Bandwidth_Auto &&
+ terrestrial.bandwidth != eDVBFrontendParametersTerrestrial::Bandwidth_Auto)
diff = 1 << 30;
else if (exact && oterrestrial.modulation != terrestrial.modulation &&
- oterrestrial.modulation != eDVBFrontendParametersTerrestrial::Modulation::Auto &&
- terrestrial.modulation != eDVBFrontendParametersTerrestrial::Modulation::Auto)
+ oterrestrial.modulation != eDVBFrontendParametersTerrestrial::Modulation_Auto &&
+ terrestrial.modulation != eDVBFrontendParametersTerrestrial::Modulation_Auto)
diff = 1 << 30;
else if (exact && oterrestrial.transmission_mode != terrestrial.transmission_mode &&
- oterrestrial.transmission_mode != eDVBFrontendParametersTerrestrial::TransmissionMode::TMAuto &&
- terrestrial.transmission_mode != eDVBFrontendParametersTerrestrial::TransmissionMode::TMAuto)
+ oterrestrial.transmission_mode != eDVBFrontendParametersTerrestrial::TransmissionMode_Auto &&
+ terrestrial.transmission_mode != eDVBFrontendParametersTerrestrial::TransmissionMode_Auto)
diff = 1 << 30;
else if (exact && oterrestrial.guard_interval != terrestrial.guard_interval &&
- oterrestrial.guard_interval != eDVBFrontendParametersTerrestrial::GuardInterval::GI_Auto &&
- terrestrial.guard_interval != eDVBFrontendParametersTerrestrial::GuardInterval::GI_Auto)
+ oterrestrial.guard_interval != eDVBFrontendParametersTerrestrial::GuardInterval_Auto &&
+ terrestrial.guard_interval != eDVBFrontendParametersTerrestrial::GuardInterval_Auto)
diff = 1 << 30;
else if (exact && oterrestrial.hierarchy != terrestrial.hierarchy &&
- oterrestrial.hierarchy != eDVBFrontendParametersTerrestrial::Hierarchy::HAuto &&
- terrestrial.hierarchy != eDVBFrontendParametersTerrestrial::Hierarchy::HAuto)
+ oterrestrial.hierarchy != eDVBFrontendParametersTerrestrial::Hierarchy_Auto &&
+ terrestrial.hierarchy != eDVBFrontendParametersTerrestrial::Hierarchy_Auto)
diff = 1 << 30;
else if (exact && oterrestrial.code_rate_LP != terrestrial.code_rate_LP &&
- oterrestrial.code_rate_LP != eDVBFrontendParametersTerrestrial::FEC::fAuto &&
- terrestrial.code_rate_LP != eDVBFrontendParametersTerrestrial::FEC::fAuto)
+ oterrestrial.code_rate_LP != eDVBFrontendParametersTerrestrial::FEC_Auto &&
+ terrestrial.code_rate_LP != eDVBFrontendParametersTerrestrial::FEC_Auto)
diff = 1 << 30;
else if (exact && oterrestrial.code_rate_HP != terrestrial.code_rate_HP &&
- oterrestrial.code_rate_HP != eDVBFrontendParametersTerrestrial::FEC::fAuto &&
- terrestrial.code_rate_HP != eDVBFrontendParametersTerrestrial::FEC::fAuto)
+ oterrestrial.code_rate_HP != eDVBFrontendParametersTerrestrial::FEC_Auto &&
+ terrestrial.code_rate_HP != eDVBFrontendParametersTerrestrial::FEC_Auto)
diff = 1 << 30;
else
diff = abs(terrestrial.frequency - oterrestrial.frequency);
@@ -587,6 +588,10 @@ int eDVBFrontend::closeFrontend(bool force)
if (m_fd >= 0)
{
eDebugNoSimulate("close frontend %d", m_dvbid);
+ if (m_data[SATCR] != -1)
+ {
+ turnOffSatCR(m_data[SATCR]);
+ }
setTone(iDVBFrontend::toneOff);
setVoltage(iDVBFrontend::voltageOff);
m_tuneTimer->stop();
@@ -695,6 +700,12 @@ void eDVBFrontend::timeout()
#define INRANGE(X,Y,Z) (((X<=Y) && (Y<=Z))||((Z<=Y) && (Y<=X)) ? 1 : 0)
+/* unsigned 32 bit division */
+static inline uint32_t fe_udiv(uint32_t a, uint32_t b)
+{
+ return (a + b / 2) / b;
+}
+
int eDVBFrontend::readFrontendData(int type)
{
switch(type)
@@ -710,25 +721,18 @@ int eDVBFrontend::readFrontendData(int type)
return ber;
}
case signalQuality:
- {
- uint16_t snr=0;
- if (!m_simulate)
- {
- if (ioctl(m_fd, FE_READ_SNR, &snr) < 0 && errno != ERANGE)
- eDebug("FE_READ_SNR failed (%m)");
- }
- return snr;
- }
case signalQualitydB: /* this will move into the driver */
{
+ int sat_max = 1600; // for stv0288 / bsbe2
+ int ret = 0x12345678;
uint16_t snr=0;
if (m_simulate)
return 0;
if (ioctl(m_fd, FE_READ_SNR, &snr) < 0 && errno != ERANGE)
eDebug("FE_READ_SNR failed (%m)");
- if (!strcmp(m_description, "BCM4501 (internal)"))
+ else if (!strcmp(m_description, "BCM4501 (internal)"))
{
- unsigned int SDS_SNRE = snr << 16;
+ float SDS_SNRE = snr << 16;
float snr_in_db;
if (parm_u_qpsk_fec_inner <= FEC_AUTO) // DVB-S1 / QPSK
@@ -748,7 +752,7 @@ int eDVBFrontend::readFrontendData(int type)
if (fval1 < 10.0)
{
fval2 = SNR_COEFF[0];
- for (int i=0; i<6; ++i)
+ for (int i=1; i<6; ++i)
{
fval2 *= fval1;
fval2 += SNR_COEFF[i];
@@ -781,15 +785,16 @@ int eDVBFrontend::readFrontendData(int type)
snr_in_db = fval1;
}
#endif
- return (int)(snr_in_db * 100.0);
+ sat_max = 1750;
+ ret = (int)(snr_in_db * 100);
}
else if (strstr(m_description, "Alps BSBE1 C01A") ||
!strcmp(m_description, "Alps -S(STV0288)"))
{
if (snr == 0)
- return 0;
+ ret = 0;
else if (snr == 0xFFFF) // i think this should not happen
- return 100*100;
+ ret = 100*100;
else
{
enum { REALVAL, REGVAL };
@@ -817,28 +822,60 @@ int eDVBFrontend::readFrontendData(int type)
else
Imin = i;
}
- return (((regval - CN_lookup[Imin][REGVAL])
+ ret = (((regval - CN_lookup[Imin][REGVAL])
* (CN_lookup[Imax][REALVAL] - CN_lookup[Imin][REALVAL])
/ (CN_lookup[Imax][REGVAL] - CN_lookup[Imin][REGVAL]))
+ CN_lookup[Imin][REALVAL]) * 10;
}
- return 100;
+ else
+ ret = 100;
}
- return 0;
}
else if (!strcmp(m_description, "Alps BSBE1 702A") || // some frontends with STV0299
!strcmp(m_description, "Alps -S") ||
!strcmp(m_description, "Philips -S") ||
!strcmp(m_description, "LG -S") )
{
- float snr_in_db=(snr-39075)/1764.7;
- return (int)(snr_in_db * 100.0);
+ sat_max = 1500;
+ ret = (int)((snr-39075)/17.647);
} else if (!strcmp(m_description, "Alps BSBE2"))
{
- return (int)((snr >> 7) * 10.0);
- } /* else
+ ret = (int)((snr >> 7) * 10);
+ } else if (!strcmp(m_description, "Philips CU1216Mk3"))
+ {
+ int mse = (~snr) & 0xFF;
+ switch (parm_u_qam_modulation) {
+ case QAM_16: ret = fe_udiv(1950000, (32 * mse) + 138) + 1000; break;
+ case QAM_32: ret = fe_udiv(2150000, (40 * mse) + 500) + 1350; break;
+ case QAM_64: ret = fe_udiv(2100000, (40 * mse) + 500) + 1250; break;
+ case QAM_128: ret = fe_udiv(1850000, (38 * mse) + 400) + 1380; break;
+ case QAM_256: ret = fe_udiv(1800000, (100 * mse) + 40) + 2030; break;
+ default: break;
+ }
+ } else if (!strcmp(m_description, "Philips TU1216"))
+ {
+ snr = 0xFF - (snr & 0xFF);
+ if (snr != 0)
+ ret = 10 * (int)(-100 * (log10(snr) - log10(255)));
+ }
+
+ if (type == signalQuality)
+ {
+ if (ret == 0x12345678) // no snr db calculation avail.. return untouched snr value..
+ return snr;
+ switch(m_type)
+ {
+ case feSatellite:
+ return ret >= sat_max ? 65536 : ret * 65536 / sat_max;
+ case feCable: // we assume a max of 42db here
+ return ret >= 4200 ? 65536 : ret * 65536 / 4200;
+ case feTerrestrial: // we assume a max of 24db here
+ return ret >= 2400 ? 65536 : ret * 65536 / 2400;
+ }
+ }
+/* else
eDebug("no SNR dB calculation for frontendtype %s yet", m_description); */
- return 0x12345678;
+ return ret;
}
case signalPower:
{
@@ -927,120 +964,79 @@ void PutToDict(ePyObject &dict, const char*key, const char *value)
void fillDictWithSatelliteData(ePyObject dict, const FRONTENDPARAMETERS &parm, eDVBFrontend *fe)
{
long freq_offset=0;
- const char *tmp=0;
+ long tmp=0;
fe->getData(eDVBFrontend::FREQ_OFFSET, freq_offset);
int frequency = parm_frequency + freq_offset;
PutToDict(dict, "frequency", frequency);
PutToDict(dict, "symbol_rate", parm_u_qpsk_symbol_rate);
switch(parm_u_qpsk_fec_inner)
{
- case FEC_1_2:
- tmp = "FEC_1_2";
- break;
- case FEC_2_3:
- tmp = "FEC_2_3";
- break;
- case FEC_3_4:
- tmp = "FEC_3_4";
- break;
- case FEC_5_6:
- tmp = "FEC_5_6";
- break;
- case FEC_7_8:
- tmp = "FEC_7_8";
- break;
- case FEC_NONE:
- tmp = "FEC_NONE";
+ case FEC_1_2: tmp = eDVBFrontendParametersSatellite::FEC_1_2; break;
+ case FEC_2_3: tmp = eDVBFrontendParametersSatellite::FEC_2_3; break;
+ case FEC_3_4: tmp = eDVBFrontendParametersSatellite::FEC_3_4; break;
+ case FEC_5_6: tmp = eDVBFrontendParametersSatellite::FEC_5_6; break;
+ case FEC_7_8: tmp = eDVBFrontendParametersSatellite::FEC_7_8; break;
+ case FEC_NONE: tmp = eDVBFrontendParametersSatellite::FEC_None; break;
default:
- case FEC_AUTO:
- tmp = "FEC_AUTO";
- break;
+ case FEC_AUTO: tmp = eDVBFrontendParametersSatellite::FEC_Auto; break;
#if HAVE_DVB_API_VERSION >=3
- case FEC_S2_8PSK_1_2:
- case FEC_S2_QPSK_1_2:
- tmp = "FEC_1_2";
- break;
+ case FEC_S2_8PSK_1_2:
+ case FEC_S2_QPSK_1_2: tmp = eDVBFrontendParametersSatellite::FEC_1_2; break;
case FEC_S2_8PSK_2_3:
- case FEC_S2_QPSK_2_3:
- tmp = "FEC_2_3";
- break;
+ case FEC_S2_QPSK_2_3: tmp = eDVBFrontendParametersSatellite::FEC_2_3; break;
case FEC_S2_8PSK_3_4:
- case FEC_S2_QPSK_3_4:
- tmp = "FEC_3_4";
- break;
+ case FEC_S2_QPSK_3_4: tmp = eDVBFrontendParametersSatellite::FEC_3_4; break;
case FEC_S2_8PSK_5_6:
- case FEC_S2_QPSK_5_6:
- tmp = "FEC_5_6";
- break;
+ case FEC_S2_QPSK_5_6: tmp = eDVBFrontendParametersSatellite::FEC_5_6; break;
case FEC_S2_8PSK_7_8:
- case FEC_S2_QPSK_7_8:
- tmp = "FEC_7_8";
- break;
+ case FEC_S2_QPSK_7_8: tmp = eDVBFrontendParametersSatellite::FEC_7_8; break;
case FEC_S2_8PSK_8_9:
- case FEC_S2_QPSK_8_9:
- tmp = "FEC_8_9";
- break;
+ case FEC_S2_QPSK_8_9: tmp = eDVBFrontendParametersSatellite::FEC_8_9; break;
case FEC_S2_8PSK_3_5:
- case FEC_S2_QPSK_3_5:
- tmp = "FEC_3_5";
- break;
+ case FEC_S2_QPSK_3_5: tmp = eDVBFrontendParametersSatellite::FEC_3_5; break;
case FEC_S2_8PSK_4_5:
- case FEC_S2_QPSK_4_5:
- tmp = "FEC_4_5";
- break;
+ case FEC_S2_QPSK_4_5: tmp = eDVBFrontendParametersSatellite::FEC_4_5; break;
case FEC_S2_8PSK_9_10:
- case FEC_S2_QPSK_9_10:
- tmp = "FEC_9_10";
- break;
+ case FEC_S2_QPSK_9_10: tmp = eDVBFrontendParametersSatellite::FEC_9_10; break;
#endif
}
PutToDict(dict, "fec_inner", tmp);
#if HAVE_DVB_API_VERSION >=3
PutToDict(dict, "modulation",
- parm_u_qpsk_fec_inner > FEC_S2_QPSK_9_10 ? "8PSK": "QPSK" );
+ parm_u_qpsk_fec_inner > FEC_S2_QPSK_9_10 ?
+ eDVBFrontendParametersSatellite::Modulation_8PSK :
+ eDVBFrontendParametersSatellite::Modulation_QPSK );
if (parm_u_qpsk_fec_inner > FEC_AUTO)
{
switch(parm_inversion & 0xc)
{
default: // unknown rolloff
- case 0: // 0.35
- tmp = "ROLLOFF_0_35";
- break;
- case 4: // 0.25
- tmp = "ROLLOFF_0_25";
- break;
- case 8: // 0.20
- tmp = "ROLLOFF_0_20";
- break;
+ case 0: tmp = eDVBFrontendParametersSatellite::RollOff_alpha_0_35; break;
+ case 4: tmp = eDVBFrontendParametersSatellite::RollOff_alpha_0_25; break;
+ case 8: tmp = eDVBFrontendParametersSatellite::RollOff_alpha_0_20; break;
}
PutToDict(dict, "rolloff", tmp);
switch(parm_inversion & 0x30)
{
- case 0: // pilot off
- tmp = "PILOT_OFF";
- break;
- case 0x10: // pilot on
- tmp = "PILOT_ON";
- break;
- case 0x20: // pilot auto
- tmp = "PILOT_AUTO";
- break;
+ case 0: tmp = eDVBFrontendParametersSatellite::Pilot_Off; break;
+ case 0x10: tmp = eDVBFrontendParametersSatellite::Pilot_On; break;
+ case 0x20: tmp = eDVBFrontendParametersSatellite::Pilot_Unknown; break;
}
PutToDict(dict, "pilot", tmp);
- tmp = "DVB-S2";
+ tmp = eDVBFrontendParametersSatellite::System_DVB_S2;
}
else
- tmp = "DVB-S";
+ tmp = eDVBFrontendParametersSatellite::System_DVB_S;
#else
- PutToDict(dict, "modulation", "QPSK" );
- tmp = "DVB-S";
+ PutToDict(dict, "modulation", eDVBFrontendParametersSatellite::Modulation_QPSK );
+ tmp = eDVBFrontendParametersSatellite::System_DVB_S;
#endif
PutToDict(dict, "system", tmp);
}
void fillDictWithCableData(ePyObject dict, const FRONTENDPARAMETERS &parm)
{
- const char *tmp=0;
+ long tmp=0;
#if HAVE_DVB_API_VERSION < 3
PutToDict(dict, "frequency", parm_frequency);
#else
@@ -1049,196 +1045,102 @@ void fillDictWithCableData(ePyObject dict, const FRONTENDPARAMETERS &parm)
PutToDict(dict, "symbol_rate", parm_u_qam_symbol_rate);
switch(parm_u_qam_fec_inner)
{
- case FEC_NONE:
- tmp = "FEC_NONE";
- break;
- case FEC_1_2:
- tmp = "FEC_1_2";
- break;
- case FEC_2_3:
- tmp = "FEC_2_3";
- break;
- case FEC_3_4:
- tmp = "FEC_3_4";
- break;
- case FEC_5_6:
- tmp = "FEC_5_6";
- break;
- case FEC_7_8:
- tmp = "FEC_7_8";
- break;
+ case FEC_NONE: tmp = eDVBFrontendParametersCable::FEC_None; break;
+ case FEC_1_2: tmp = eDVBFrontendParametersCable::FEC_1_2; break;
+ case FEC_2_3: tmp = eDVBFrontendParametersCable::FEC_2_3; break;
+ case FEC_3_4: tmp = eDVBFrontendParametersCable::FEC_3_4; break;
+ case FEC_5_6: tmp = eDVBFrontendParametersCable::FEC_5_6; break;
+ case FEC_7_8: tmp = eDVBFrontendParametersCable::FEC_7_8; break;
#if HAVE_DVB_API_VERSION >= 3
- case FEC_8_9:
- tmp = "FEC_8_9";
- break;
+ case FEC_8_9: tmp = eDVBFrontendParametersCable::FEC_7_8; break;
#endif
default:
- case FEC_AUTO:
- tmp = "FEC_AUTO";
- break;
+ case FEC_AUTO: tmp = eDVBFrontendParametersCable::FEC_Auto; break;
}
PutToDict(dict, "fec_inner", tmp);
switch(parm_u_qam_modulation)
{
- case QAM_16:
- tmp = "QAM_16";
- break;
- case QAM_32:
- tmp = "QAM_32";
- break;
- case QAM_64:
- tmp = "QAM_64";
- break;
- case QAM_128:
- tmp = "QAM_128";
- break;
- case QAM_256:
- tmp = "QAM_256";
- break;
+ case QAM_16: tmp = eDVBFrontendParametersCable::Modulation_QAM16; break;
+ case QAM_32: tmp = eDVBFrontendParametersCable::Modulation_QAM32; break;
+ case QAM_64: tmp = eDVBFrontendParametersCable::Modulation_QAM64; break;
+ case QAM_128: tmp = eDVBFrontendParametersCable::Modulation_QAM128; break;
+ case QAM_256: tmp = eDVBFrontendParametersCable::Modulation_QAM256; break;
default:
- case QAM_AUTO:
- tmp = "QAM_AUTO";
- break;
+ case QAM_AUTO: tmp = eDVBFrontendParametersCable::Modulation_Auto; break;
}
PutToDict(dict, "modulation", tmp);
}
void fillDictWithTerrestrialData(ePyObject dict, const FRONTENDPARAMETERS &parm)
{
- const char *tmp=0;
+ long tmp=0;
PutToDict(dict, "frequency", parm_frequency);
switch (parm_u_ofdm_bandwidth)
{
- case BANDWIDTH_8_MHZ:
- tmp = "BANDWIDTH_8_MHZ";
- break;
- case BANDWIDTH_7_MHZ:
- tmp = "BANDWIDTH_7_MHZ";
- break;
- case BANDWIDTH_6_MHZ:
- tmp = "BANDWIDTH_6_MHZ";
- break;
+ case BANDWIDTH_8_MHZ: tmp = eDVBFrontendParametersTerrestrial::Bandwidth_8MHz; break;
+ case BANDWIDTH_7_MHZ: tmp = eDVBFrontendParametersTerrestrial::Bandwidth_7MHz; break;
+ case BANDWIDTH_6_MHZ: tmp = eDVBFrontendParametersTerrestrial::Bandwidth_6MHz; break;
default:
- case BANDWIDTH_AUTO:
- tmp = "BANDWIDTH_AUTO";
- break;
+ case BANDWIDTH_AUTO: tmp = eDVBFrontendParametersTerrestrial::Bandwidth_Auto; break;
}
PutToDict(dict, "bandwidth", tmp);
switch (parm_u_ofdm_code_rate_LP)
{
- case FEC_1_2:
- tmp = "FEC_1_2";
- break;
- case FEC_2_3:
- tmp = "FEC_2_3";
- break;
- case FEC_3_4:
- tmp = "FEC_3_4";
- break;
- case FEC_5_6:
- tmp = "FEC_5_6";
- break;
- case FEC_7_8:
- tmp = "FEC_7_8";
- break;
+ case FEC_1_2: tmp = eDVBFrontendParametersTerrestrial::FEC_1_2; break;
+ case FEC_2_3: tmp = eDVBFrontendParametersTerrestrial::FEC_2_3; break;
+ case FEC_3_4: tmp = eDVBFrontendParametersTerrestrial::FEC_3_4; break;
+ case FEC_5_6: tmp = eDVBFrontendParametersTerrestrial::FEC_5_6; break;
+ case FEC_7_8: tmp = eDVBFrontendParametersTerrestrial::FEC_7_8; break;
default:
- case FEC_AUTO:
- tmp = "FEC_AUTO";
- break;
+ case FEC_AUTO: tmp = eDVBFrontendParametersTerrestrial::FEC_Auto; break;
}
PutToDict(dict, "code_rate_lp", tmp);
switch (parm_u_ofdm_code_rate_HP)
{
- case FEC_1_2:
- tmp = "FEC_1_2";
- break;
- case FEC_2_3:
- tmp = "FEC_2_3";
- break;
- case FEC_3_4:
- tmp = "FEC_3_4";
- break;
- case FEC_5_6:
- tmp = "FEC_5_6";
- break;
- case FEC_7_8:
- tmp = "FEC_7_8";
- break;
+ case FEC_1_2: tmp = eDVBFrontendParametersTerrestrial::FEC_1_2; break;
+ case FEC_2_3: tmp = eDVBFrontendParametersTerrestrial::FEC_2_3; break;
+ case FEC_3_4: tmp = eDVBFrontendParametersTerrestrial::FEC_3_4; break;
+ case FEC_5_6: tmp = eDVBFrontendParametersTerrestrial::FEC_5_6; break;
+ case FEC_7_8: tmp = eDVBFrontendParametersTerrestrial::FEC_7_8; break;
default:
- case FEC_AUTO:
- tmp = "FEC_AUTO";
- break;
+ case FEC_AUTO: tmp = eDVBFrontendParametersTerrestrial::FEC_Auto; break;
}
PutToDict(dict, "code_rate_hp", tmp);
switch (parm_u_ofdm_constellation)
{
- case QPSK:
- tmp = "QPSK";
- break;
- case QAM_16:
- tmp = "QAM_16";
- break;
- case QAM_64:
- tmp = "QAM_64";
- break;
+ case QPSK: tmp = eDVBFrontendParametersTerrestrial::Modulation_QPSK; break;
+ case QAM_16: tmp = eDVBFrontendParametersTerrestrial::Modulation_QAM16; break;
+ case QAM_64: tmp = eDVBFrontendParametersTerrestrial::Modulation_QAM64; break;
default:
- case QAM_AUTO:
- tmp = "QAM_AUTO";
- break;
+ case QAM_AUTO: tmp = eDVBFrontendParametersTerrestrial::Modulation_Auto; break;
}
PutToDict(dict, "constellation", tmp);
switch (parm_u_ofdm_transmission_mode)
{
- case TRANSMISSION_MODE_2K:
- tmp = "TRANSMISSION_MODE_2K";
- break;
- case TRANSMISSION_MODE_8K:
- tmp = "TRANSMISSION_MODE_8K";
- break;
+ case TRANSMISSION_MODE_2K: tmp = eDVBFrontendParametersTerrestrial::TransmissionMode_2k; break;
+ case TRANSMISSION_MODE_8K: tmp = eDVBFrontendParametersTerrestrial::TransmissionMode_8k; break;
default:
- case TRANSMISSION_MODE_AUTO:
- tmp = "TRANSMISSION_MODE_AUTO";
- break;
+ case TRANSMISSION_MODE_AUTO: tmp = eDVBFrontendParametersTerrestrial::TransmissionMode_Auto; break;
}
PutToDict(dict, "transmission_mode", tmp);
switch (parm_u_ofdm_guard_interval)
{
- case GUARD_INTERVAL_1_32:
- tmp = "GUARD_INTERVAL_1_32";
- break;
- case GUARD_INTERVAL_1_16:
- tmp = "GUARD_INTERVAL_1_16";
- break;
- case GUARD_INTERVAL_1_8:
- tmp = "GUARD_INTERVAL_1_8";
- break;
- case GUARD_INTERVAL_1_4:
- tmp = "GUARD_INTERVAL_1_4";
- break;
+ case GUARD_INTERVAL_1_32: tmp = eDVBFrontendParametersTerrestrial::GuardInterval_1_32; break;
+ case GUARD_INTERVAL_1_16: tmp = eDVBFrontendParametersTerrestrial::GuardInterval_1_16; break;
+ case GUARD_INTERVAL_1_8: tmp = eDVBFrontendParametersTerrestrial::GuardInterval_1_8; break;
+ case GUARD_INTERVAL_1_4: tmp = eDVBFrontendParametersTerrestrial::GuardInterval_1_4; break;
default:
- case GUARD_INTERVAL_AUTO:
- tmp = "GUARD_INTERVAL_AUTO";
- break;
+ case GUARD_INTERVAL_AUTO: tmp = eDVBFrontendParametersTerrestrial::GuardInterval_Auto; break;
}
PutToDict(dict, "guard_interval", tmp);
switch (parm_u_ofdm_hierarchy_information)
{
- case HIERARCHY_NONE:
- tmp = "HIERARCHY_NONE";
- break;
- case HIERARCHY_1:
- tmp = "HIERARCHY_1";
- break;
- case HIERARCHY_2:
- tmp = "HIERARCHY_2";
- break;
- case HIERARCHY_4:
- tmp = "HIERARCHY_4";
- break;
+ case HIERARCHY_NONE: tmp = eDVBFrontendParametersTerrestrial::Hierarchy_None; break;
+ case HIERARCHY_1: tmp = eDVBFrontendParametersTerrestrial::Hierarchy_1; break;
+ case HIERARCHY_2: tmp = eDVBFrontendParametersTerrestrial::Hierarchy_2; break;
+ case HIERARCHY_4: tmp = eDVBFrontendParametersTerrestrial::Hierarchy_4; break;
default:
- case HIERARCHY_AUTO:
- tmp = "HIERARCHY_AUTO";
- break;
+ case HIERARCHY_AUTO: tmp = eDVBFrontendParametersTerrestrial::Hierarchy_Auto; break;
}
PutToDict(dict, "hierarchy_information", tmp);
}
@@ -1306,20 +1208,18 @@ void eDVBFrontend::getTransponderData(ePyObject dest, bool original)
}
{
const FRONTENDPARAMETERS &parm = original || m_simulate ? this->parm : front;
- const char *tmp = "INVERSION_AUTO";
+ long tmp = eDVBFrontendParametersSatellite::Inversion_Unknown;
switch(parm_inversion & 3)
{
case INVERSION_ON:
- tmp = "INVERSION_ON";
+ tmp = eDVBFrontendParametersSatellite::Inversion_On;
break;
case INVERSION_OFF:
- tmp = "INVERSION_OFF";
- break;
+ tmp = eDVBFrontendParametersSatellite::Inversion_Off;
default:
break;
}
- if (tmp)
- PutToDict(dest, "inversion", tmp);
+ PutToDict(dest, "inversion", tmp);
switch(m_type)
{
@@ -1827,6 +1727,20 @@ RESULT eDVBFrontend::prepare_sat(const eDVBFrontendParametersSatellite &feparm,
res = m_sec->prepare(*this, parm, feparm, 1 << m_slotid, tunetimeout);
if (!res)
{
+#if HAVE_DVB_API_VERSION >= 3
+ eDebugNoSimulate("prepare_sat System %d Freq %d Pol %d SR %d INV %d FEC %d orbpos %d system %d modulation %d pilot %d, rolloff %d",
+ feparm.system,
+ feparm.frequency,
+ feparm.polarisation,
+ feparm.symbol_rate,
+ feparm.inversion,
+ feparm.fec,
+ feparm.orbital_position,
+ feparm.system,
+ feparm.modulation,
+ feparm.pilot,
+ feparm.rolloff);
+#else
eDebugNoSimulate("prepare_sat System %d Freq %d Pol %d SR %d INV %d FEC %d orbpos %d",
feparm.system,
feparm.frequency,
@@ -1835,44 +1749,45 @@ RESULT eDVBFrontend::prepare_sat(const eDVBFrontendParametersSatellite &feparm,
feparm.inversion,
feparm.fec,
feparm.orbital_position);
+#endif
parm_u_qpsk_symbol_rate = feparm.symbol_rate;
switch (feparm.inversion)
{
- case eDVBFrontendParametersSatellite::Inversion::On:
+ case eDVBFrontendParametersSatellite::Inversion_On:
parm_inversion = INVERSION_ON;
break;
- case eDVBFrontendParametersSatellite::Inversion::Off:
+ case eDVBFrontendParametersSatellite::Inversion_Off:
parm_inversion = INVERSION_OFF;
break;
default:
- case eDVBFrontendParametersSatellite::Inversion::Unknown:
+ case eDVBFrontendParametersSatellite::Inversion_Unknown:
parm_inversion = INVERSION_AUTO;
break;
}
- if (feparm.system == eDVBFrontendParametersSatellite::System::DVB_S)
+ if (feparm.system == eDVBFrontendParametersSatellite::System_DVB_S)
switch (feparm.fec)
{
- case eDVBFrontendParametersSatellite::FEC::fNone:
+ case eDVBFrontendParametersSatellite::FEC_None:
parm_u_qpsk_fec_inner = FEC_NONE;
break;
- case eDVBFrontendParametersSatellite::FEC::f1_2:
+ case eDVBFrontendParametersSatellite::FEC_1_2:
parm_u_qpsk_fec_inner = FEC_1_2;
break;
- case eDVBFrontendParametersSatellite::FEC::f2_3:
+ case eDVBFrontendParametersSatellite::FEC_2_3:
parm_u_qpsk_fec_inner = FEC_2_3;
break;
- case eDVBFrontendParametersSatellite::FEC::f3_4:
+ case eDVBFrontendParametersSatellite::FEC_3_4:
parm_u_qpsk_fec_inner = FEC_3_4;
break;
- case eDVBFrontendParametersSatellite::FEC::f5_6:
+ case eDVBFrontendParametersSatellite::FEC_5_6:
parm_u_qpsk_fec_inner = FEC_5_6;
break;
- case eDVBFrontendParametersSatellite::FEC::f7_8:
+ case eDVBFrontendParametersSatellite::FEC_7_8:
parm_u_qpsk_fec_inner = FEC_7_8;
break;
default:
eDebugNoSimulate("no valid fec for DVB-S set.. assume auto");
- case eDVBFrontendParametersSatellite::FEC::fAuto:
+ case eDVBFrontendParametersSatellite::FEC_Auto:
parm_u_qpsk_fec_inner = FEC_AUTO;
break;
}
@@ -1881,31 +1796,31 @@ RESULT eDVBFrontend::prepare_sat(const eDVBFrontendParametersSatellite &feparm,
{
switch (feparm.fec)
{
- case eDVBFrontendParametersSatellite::FEC::f1_2:
+ case eDVBFrontendParametersSatellite::FEC_1_2:
parm_u_qpsk_fec_inner = FEC_S2_QPSK_1_2;
break;
- case eDVBFrontendParametersSatellite::FEC::f2_3:
+ case eDVBFrontendParametersSatellite::FEC_2_3:
parm_u_qpsk_fec_inner = FEC_S2_QPSK_2_3;
break;
- case eDVBFrontendParametersSatellite::FEC::f3_4:
+ case eDVBFrontendParametersSatellite::FEC_3_4:
parm_u_qpsk_fec_inner = FEC_S2_QPSK_3_4;
break;
- case eDVBFrontendParametersSatellite::FEC::f3_5:
+ case eDVBFrontendParametersSatellite::FEC_3_5:
parm_u_qpsk_fec_inner = FEC_S2_QPSK_3_5;
break;
- case eDVBFrontendParametersSatellite::FEC::f4_5:
+ case eDVBFrontendParametersSatellite::FEC_4_5:
parm_u_qpsk_fec_inner = FEC_S2_QPSK_4_5;
break;
- case eDVBFrontendParametersSatellite::FEC::f5_6:
+ case eDVBFrontendParametersSatellite::FEC_5_6:
parm_u_qpsk_fec_inner = FEC_S2_QPSK_5_6;
break;
- case eDVBFrontendParametersSatellite::FEC::f7_8:
+ case eDVBFrontendParametersSatellite::FEC_7_8:
parm_u_qpsk_fec_inner = FEC_S2_QPSK_7_8;
break;
- case eDVBFrontendParametersSatellite::FEC::f8_9:
+ case eDVBFrontendParametersSatellite::FEC_8_9:
parm_u_qpsk_fec_inner = FEC_S2_QPSK_8_9;
break;
- case eDVBFrontendParametersSatellite::FEC::f9_10:
+ case eDVBFrontendParametersSatellite::FEC_9_10:
parm_u_qpsk_fec_inner = FEC_S2_QPSK_9_10;
break;
default:
@@ -1914,7 +1829,7 @@ RESULT eDVBFrontend::prepare_sat(const eDVBFrontendParametersSatellite &feparm,
}
parm_inversion |= (feparm.rolloff << 2); // Hack.. we use bit 2..3 of inversion param for rolloff
parm_inversion |= (feparm.pilot << 4); // Hack.. we use bit 4..5 of inversion param for pilot
- if (feparm.modulation == eDVBFrontendParametersSatellite::Modulation::M8PSK) {
+ if (feparm.modulation == eDVBFrontendParametersSatellite::Modulation_8PSK) {
parm_u_qpsk_fec_inner = (fe_code_rate_t)((int)parm_u_qpsk_fec_inner+9);
// 8PSK fec driver values are decimal 9 bigger
}
@@ -1941,66 +1856,66 @@ RESULT eDVBFrontend::prepare_cable(const eDVBFrontendParametersCable &feparm)
parm_u_qam_symbol_rate = feparm.symbol_rate;
switch (feparm.modulation)
{
- case eDVBFrontendParametersCable::Modulation::QAM16:
+ case eDVBFrontendParametersCable::Modulation_QAM16:
parm_u_qam_modulation = QAM_16;
break;
- case eDVBFrontendParametersCable::Modulation::QAM32:
+ case eDVBFrontendParametersCable::Modulation_QAM32:
parm_u_qam_modulation = QAM_32;
break;
- case eDVBFrontendParametersCable::Modulation::QAM64:
+ case eDVBFrontendParametersCable::Modulation_QAM64:
parm_u_qam_modulation = QAM_64;
break;
- case eDVBFrontendParametersCable::Modulation::QAM128:
+ case eDVBFrontendParametersCable::Modulation_QAM128:
parm_u_qam_modulation = QAM_128;
break;
- case eDVBFrontendParametersCable::Modulation::QAM256:
+ case eDVBFrontendParametersCable::Modulation_QAM256:
parm_u_qam_modulation = QAM_256;
break;
default:
- case eDVBFrontendParametersCable::Modulation::Auto:
+ case eDVBFrontendParametersCable::Modulation_Auto:
parm_u_qam_modulation = QAM_AUTO;
break;
}
switch (feparm.inversion)
{
- case eDVBFrontendParametersCable::Inversion::On:
+ case eDVBFrontendParametersCable::Inversion_On:
parm_inversion = INVERSION_ON;
break;
- case eDVBFrontendParametersCable::Inversion::Off:
+ case eDVBFrontendParametersCable::Inversion_Off:
parm_inversion = INVERSION_OFF;
break;
default:
- case eDVBFrontendParametersCable::Inversion::Unknown:
+ case eDVBFrontendParametersCable::Inversion_Unknown:
parm_inversion = INVERSION_AUTO;
break;
}
switch (feparm.fec_inner)
{
- case eDVBFrontendParametersCable::FEC::fNone:
+ case eDVBFrontendParametersCable::FEC_None:
parm_u_qam_fec_inner = FEC_NONE;
break;
- case eDVBFrontendParametersCable::FEC::f1_2:
+ case eDVBFrontendParametersCable::FEC_1_2:
parm_u_qam_fec_inner = FEC_1_2;
break;
- case eDVBFrontendParametersCable::FEC::f2_3:
+ case eDVBFrontendParametersCable::FEC_2_3:
parm_u_qam_fec_inner = FEC_2_3;
break;
- case eDVBFrontendParametersCable::FEC::f3_4:
+ case eDVBFrontendParametersCable::FEC_3_4:
parm_u_qam_fec_inner = FEC_3_4;
break;
- case eDVBFrontendParametersCable::FEC::f5_6:
+ case eDVBFrontendParametersCable::FEC_5_6:
parm_u_qam_fec_inner = FEC_5_6;
break;
- case eDVBFrontendParametersCable::FEC::f7_8:
+ case eDVBFrontendParametersCable::FEC_7_8:
parm_u_qam_fec_inner = FEC_7_8;
break;
#if HAVE_DVB_API_VERSION >= 3
- case eDVBFrontendParametersCable::FEC::f8_9:
+ case eDVBFrontendParametersCable::FEC_8_9:
parm_u_qam_fec_inner = FEC_8_9;
break;
#endif
default:
- case eDVBFrontendParametersCable::FEC::fAuto:
+ case eDVBFrontendParametersCable::FEC_Auto:
parm_u_qam_fec_inner = FEC_AUTO;
break;
}
@@ -2019,141 +1934,141 @@ RESULT eDVBFrontend::prepare_terrestrial(const eDVBFrontendParametersTerrestrial
switch (feparm.bandwidth)
{
- case eDVBFrontendParametersTerrestrial::Bandwidth::Bw8MHz:
+ case eDVBFrontendParametersTerrestrial::Bandwidth_8MHz:
parm_u_ofdm_bandwidth = BANDWIDTH_8_MHZ;
break;
- case eDVBFrontendParametersTerrestrial::Bandwidth::Bw7MHz:
+ case eDVBFrontendParametersTerrestrial::Bandwidth_7MHz:
parm_u_ofdm_bandwidth = BANDWIDTH_7_MHZ;
break;
- case eDVBFrontendParametersTerrestrial::Bandwidth::Bw6MHz:
+ case eDVBFrontendParametersTerrestrial::Bandwidth_6MHz:
parm_u_ofdm_bandwidth = BANDWIDTH_6_MHZ;
break;
default:
- case eDVBFrontendParametersTerrestrial::Bandwidth::BwAuto:
+ case eDVBFrontendParametersTerrestrial::Bandwidth_Auto:
parm_u_ofdm_bandwidth = BANDWIDTH_AUTO;
break;
}
switch (feparm.code_rate_LP)
{
- case eDVBFrontendParametersTerrestrial::FEC::f1_2:
+ case eDVBFrontendParametersTerrestrial::FEC_1_2:
parm_u_ofdm_code_rate_LP = FEC_1_2;
break;
- case eDVBFrontendParametersTerrestrial::FEC::f2_3:
+ case eDVBFrontendParametersTerrestrial::FEC_2_3:
parm_u_ofdm_code_rate_LP = FEC_2_3;
break;
- case eDVBFrontendParametersTerrestrial::FEC::f3_4:
+ case eDVBFrontendParametersTerrestrial::FEC_3_4:
parm_u_ofdm_code_rate_LP = FEC_3_4;
break;
- case eDVBFrontendParametersTerrestrial::FEC::f5_6:
+ case eDVBFrontendParametersTerrestrial::FEC_5_6:
parm_u_ofdm_code_rate_LP = FEC_5_6;
break;
- case eDVBFrontendParametersTerrestrial::FEC::f7_8:
+ case eDVBFrontendParametersTerrestrial::FEC_7_8:
parm_u_ofdm_code_rate_LP = FEC_7_8;
break;
default:
- case eDVBFrontendParametersTerrestrial::FEC::fAuto:
+ case eDVBFrontendParametersTerrestrial::FEC_Auto:
parm_u_ofdm_code_rate_LP = FEC_AUTO;
break;
}
switch (feparm.code_rate_HP)
{
- case eDVBFrontendParametersTerrestrial::FEC::f1_2:
+ case eDVBFrontendParametersTerrestrial::FEC_1_2:
parm_u_ofdm_code_rate_HP = FEC_1_2;
break;
- case eDVBFrontendParametersTerrestrial::FEC::f2_3:
+ case eDVBFrontendParametersTerrestrial::FEC_2_3:
parm_u_ofdm_code_rate_HP = FEC_2_3;
break;
- case eDVBFrontendParametersTerrestrial::FEC::f3_4:
+ case eDVBFrontendParametersTerrestrial::FEC_3_4:
parm_u_ofdm_code_rate_HP = FEC_3_4;
break;
- case eDVBFrontendParametersTerrestrial::FEC::f5_6:
+ case eDVBFrontendParametersTerrestrial::FEC_5_6:
parm_u_ofdm_code_rate_HP = FEC_5_6;
break;
- case eDVBFrontendParametersTerrestrial::FEC::f7_8:
+ case eDVBFrontendParametersTerrestrial::FEC_7_8:
parm_u_ofdm_code_rate_HP = FEC_7_8;
break;
default:
- case eDVBFrontendParametersTerrestrial::FEC::fAuto:
+ case eDVBFrontendParametersTerrestrial::FEC_Auto:
parm_u_ofdm_code_rate_HP = FEC_AUTO;
break;
}
switch (feparm.modulation)
{
- case eDVBFrontendParametersTerrestrial::Modulation::QPSK:
+ case eDVBFrontendParametersTerrestrial::Modulation_QPSK:
parm_u_ofdm_constellation = QPSK;
break;
- case eDVBFrontendParametersTerrestrial::Modulation::QAM16:
+ case eDVBFrontendParametersTerrestrial::Modulation_QAM16:
parm_u_ofdm_constellation = QAM_16;
break;
- case eDVBFrontendParametersTerrestrial::Modulation::QAM64:
+ case eDVBFrontendParametersTerrestrial::Modulation_QAM64:
parm_u_ofdm_constellation = QAM_64;
break;
default:
- case eDVBFrontendParametersTerrestrial::Modulation::Auto:
+ case eDVBFrontendParametersTerrestrial::Modulation_Auto:
parm_u_ofdm_constellation = QAM_AUTO;
break;
}
switch (feparm.transmission_mode)
{
- case eDVBFrontendParametersTerrestrial::TransmissionMode::TM2k:
+ case eDVBFrontendParametersTerrestrial::TransmissionMode_2k:
parm_u_ofdm_transmission_mode = TRANSMISSION_MODE_2K;
break;
- case eDVBFrontendParametersTerrestrial::TransmissionMode::TM8k:
+ case eDVBFrontendParametersTerrestrial::TransmissionMode_8k:
parm_u_ofdm_transmission_mode = TRANSMISSION_MODE_8K;
break;
default:
- case eDVBFrontendParametersTerrestrial::TransmissionMode::TMAuto:
+ case eDVBFrontendParametersTerrestrial::TransmissionMode_Auto:
parm_u_ofdm_transmission_mode = TRANSMISSION_MODE_AUTO;
break;
}
switch (feparm.guard_interval)
{
- case eDVBFrontendParametersTerrestrial::GuardInterval::GI_1_32:
+ case eDVBFrontendParametersTerrestrial::GuardInterval_1_32:
parm_u_ofdm_guard_interval = GUARD_INTERVAL_1_32;
break;
- case eDVBFrontendParametersTerrestrial::GuardInterval::GI_1_16:
+ case eDVBFrontendParametersTerrestrial::GuardInterval_1_16:
parm_u_ofdm_guard_interval = GUARD_INTERVAL_1_16;
break;
- case eDVBFrontendParametersTerrestrial::GuardInterval::GI_1_8:
+ case eDVBFrontendParametersTerrestrial::GuardInterval_1_8:
parm_u_ofdm_guard_interval = GUARD_INTERVAL_1_8;
break;
- case eDVBFrontendParametersTerrestrial::GuardInterval::GI_1_4:
+ case eDVBFrontendParametersTerrestrial::GuardInterval_1_4:
parm_u_ofdm_guard_interval = GUARD_INTERVAL_1_4;
break;
default:
- case eDVBFrontendParametersTerrestrial::GuardInterval::GI_Auto:
+ case eDVBFrontendParametersTerrestrial::GuardInterval_Auto:
parm_u_ofdm_guard_interval = GUARD_INTERVAL_AUTO;
break;
}
switch (feparm.hierarchy)
{
- case eDVBFrontendParametersTerrestrial::Hierarchy::HNone:
+ case eDVBFrontendParametersTerrestrial::Hierarchy_None:
parm_u_ofdm_hierarchy_information = HIERARCHY_NONE;
break;
- case eDVBFrontendParametersTerrestrial::Hierarchy::H1:
+ case eDVBFrontendParametersTerrestrial::Hierarchy_1:
parm_u_ofdm_hierarchy_information = HIERARCHY_1;
break;
- case eDVBFrontendParametersTerrestrial::Hierarchy::H2:
+ case eDVBFrontendParametersTerrestrial::Hierarchy_2:
parm_u_ofdm_hierarchy_information = HIERARCHY_2;
break;
- case eDVBFrontendParametersTerrestrial::Hierarchy::H4:
+ case eDVBFrontendParametersTerrestrial::Hierarchy_4:
parm_u_ofdm_hierarchy_information = HIERARCHY_4;
break;
default:
- case eDVBFrontendParametersTerrestrial::Hierarchy::HAuto:
+ case eDVBFrontendParametersTerrestrial::Hierarchy_Auto:
parm_u_ofdm_hierarchy_information = HIERARCHY_AUTO;
break;
}
switch (feparm.inversion)
{
- case eDVBFrontendParametersTerrestrial::Inversion::On:
+ case eDVBFrontendParametersTerrestrial::Inversion_On:
parm_inversion = INVERSION_ON;
break;
- case eDVBFrontendParametersTerrestrial::Inversion::Off:
+ case eDVBFrontendParametersTerrestrial::Inversion_Off:
parm_inversion = INVERSION_OFF;
break;
default:
- case eDVBFrontendParametersTerrestrial::Inversion::Unknown:
+ case eDVBFrontendParametersTerrestrial::Inversion_Unknown:
parm_inversion = INVERSION_AUTO;
break;
}
@@ -2463,10 +2378,10 @@ int eDVBFrontend::isCompatibleWith(ePtr<iDVBFrontendParameters> &feparm)
eDVBFrontendParametersSatellite sat_parm;
int ret = feparm->getDVBS(sat_parm);
ASSERT(!ret);
- if (sat_parm.system == eDVBFrontendParametersSatellite::System::DVB_S2 && !m_can_handle_dvbs2)
+ if (sat_parm.system == eDVBFrontendParametersSatellite::System_DVB_S2 && !m_can_handle_dvbs2)
return 0;
ret = m_sec->canTune(sat_parm, this, 1 << m_slotid);
- if (ret > 1 && sat_parm.system == eDVBFrontendParametersSatellite::System::DVB_S && m_can_handle_dvbs2)
+ if (ret > 1 && sat_parm.system == eDVBFrontendParametersSatellite::System_DVB_S && m_can_handle_dvbs2)
ret -= 1;
return ret;
}
@@ -2505,3 +2420,42 @@ arg_error:
"eDVBFrontend::setSlotInfo must get a tuple with first param slotid, second param slot description and third param enabled boolean");
return false;
}
+
+RESULT eDVBFrontend::turnOffSatCR(int satcr)
+{
+ eSecCommandList sec_sequence;
+ // check if voltage is disabled
+ eSecCommand::pair compare;
+ compare.steps = +9; //nothing to do
+ compare.voltage = iDVBFrontend::voltageOff;
+ sec_sequence.push_back( eSecCommand(eSecCommand::IF_NOT_VOLTAGE_GOTO, compare) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50 ) );
+
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage18_5) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, iDVBFrontend::toneOff) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 250) );
+
+ eDVBDiseqcCommand diseqc;
+ memset(diseqc.data, 0, MAX_DISEQC_LENGTH);
+ diseqc.len = 5;
+ diseqc.data[0] = 0xE0;
+ diseqc.data[1] = 0x10;
+ diseqc.data[2] = 0x5A;
+ diseqc.data[3] = satcr << 5;
+ diseqc.data[4] = 0x00;
+
+ sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50+20+14*diseqc.len) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13) );
+ setSecSequence(sec_sequence);
+ return 0;
+}
+
+RESULT eDVBFrontend::ScanSatCR()
+{
+ setFrontend();
+ usleep(20000);
+ setTone(iDVBFrontend::toneOff);
+ return 0;
+}
diff --git a/lib/dvb/frontend.h b/lib/dvb/frontend.h
index 06ed12cc..81334886 100644
--- a/lib/dvb/frontend.h
+++ b/lib/dvb/frontend.h
@@ -20,22 +20,22 @@ public:
{
}
- RESULT getSystem(int &type) const;
- RESULT getDVBS(eDVBFrontendParametersSatellite &) const;
- RESULT getDVBC(eDVBFrontendParametersCable &) const;
- RESULT getDVBT(eDVBFrontendParametersTerrestrial &) const;
+ SWIG_VOID(RESULT) getSystem(int &SWIG_OUTPUT) const;
+ SWIG_VOID(RESULT) getDVBS(eDVBFrontendParametersSatellite &SWIG_OUTPUT) const;
+ SWIG_VOID(RESULT) getDVBC(eDVBFrontendParametersCable &SWIG_OUTPUT) const;
+ SWIG_VOID(RESULT) getDVBT(eDVBFrontendParametersTerrestrial &SWIG_OUTPUT) const;
RESULT setDVBS(const eDVBFrontendParametersSatellite &p, bool no_rotor_command_on_tune=false);
RESULT setDVBC(const eDVBFrontendParametersCable &p);
RESULT setDVBT(const eDVBFrontendParametersTerrestrial &p);
-
+ SWIG_VOID(RESULT) getFlags(unsigned int &SWIG_NAMED_OUTPUT(flags)) const { flags = m_flags; return 0; }
+ RESULT setFlags(unsigned int flags) { m_flags = flags; return 0; }
+#ifndef SWIG
RESULT calculateDifference(const iDVBFrontendParameters *parm, int &, bool exact) const;
RESULT getHash(unsigned long &) const;
RESULT calcLockTimeout(unsigned int &) const;
-
- RESULT getFlags(unsigned int &flags) const { flags = m_flags; return 0; }
- RESULT setFlags(unsigned int flags) { m_flags = flags; return 0; }
+#endif
};
#ifndef SWIG
@@ -63,6 +63,7 @@ public:
FREQ_OFFSET, // current frequency offset
CUR_VOLTAGE, // current voltage
CUR_TONE, // current continuous tone
+ SATCR, // current SatCR
NUM_DATA_ENTRIES
};
Signal1<void,iDVBFrontend*> m_stateChanged;
@@ -142,6 +143,9 @@ public:
int closeFrontend(bool force=false);
const char *getDescription() const { return m_description; }
bool is_simulate() const { return m_simulate; }
+
+ RESULT turnOffSatCR(int satcr);
+ RESULT ScanSatCR();
};
#endif // SWIG
diff --git a/lib/dvb/frontendparms.h b/lib/dvb/frontendparms.h
index c963a251..b537963f 100644
--- a/lib/dvb/frontendparms.h
+++ b/lib/dvb/frontendparms.h
@@ -12,43 +12,35 @@ struct eDVBFrontendParametersSatellite
#ifndef SWIG
void set(const SatelliteDeliverySystemDescriptor &);
#endif
- struct Polarisation {
- enum {
- Horizontal, Vertical, CircularLeft, CircularRight
- };
+ enum {
+ Polarisation_Horizontal, Polarisation_Vertical, Polarisation_CircularLeft, Polarisation_CircularRight
};
- struct Inversion {
- enum {
- Off, On, Unknown
- };
+
+ enum {
+ Inversion_Off, Inversion_On, Inversion_Unknown
};
- struct FEC {
- enum {
- fAuto, f1_2, f2_3, f3_4, f5_6, f7_8, f8_9, f3_5, f4_5, f9_10, fNone=15
- };
+
+ enum {
+ FEC_Auto, FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_8_9, FEC_3_5, FEC_4_5, FEC_9_10, FEC_None=15
};
- struct System {
- enum {
- DVB_S, DVB_S2
- };
+
+ enum {
+ System_DVB_S, System_DVB_S2
};
- struct Modulation {
- enum {
- Auto, QPSK, M8PSK, QAM_16
- };
+
+ enum {
+ Modulation_Auto, Modulation_QPSK, Modulation_8PSK, Modulation_QAM16
};
+
// dvb-s2
- struct RollOff {
- enum {
- alpha_0_35, alpha_0_25, alpha_0_20
- };
+ enum {
+ RollOff_alpha_0_35, RollOff_alpha_0_25, RollOff_alpha_0_20
};
- // only 8psk
- struct Pilot {
- enum {
- Off, On, Unknown
- };
+
+ enum {
+ Pilot_Off, Pilot_On, Pilot_Unknown
};
+
bool no_rotor_command_on_tune;
unsigned int frequency, symbol_rate;
int polarisation, fec, inversion, orbital_position, system, modulation, rolloff, pilot;
@@ -60,21 +52,18 @@ struct eDVBFrontendParametersCable
#ifndef SWIG
void set(const CableDeliverySystemDescriptor &);
#endif
- struct Inversion {
- enum {
- Off, On, Unknown
- };
+ enum {
+ Inversion_Off, Inversion_On, Inversion_Unknown
};
- struct FEC {
- enum {
- fAuto, f1_2, f2_3, f3_4, f5_6, f7_8, f8_9, fNone=15
- };
+
+ enum {
+ FEC_Auto, FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_8_9, FEC_None=15
};
- struct Modulation {
- enum {
- Auto, QAM16, QAM32, QAM64, QAM128, QAM256
- };
+
+ enum {
+ Modulation_Auto, Modulation_QAM16, Modulation_QAM32, Modulation_QAM64, Modulation_QAM128, Modulation_QAM256
};
+
unsigned int frequency, symbol_rate;
int modulation, inversion, fec_inner;
};
@@ -85,42 +74,34 @@ struct eDVBFrontendParametersTerrestrial
#ifndef SWIG
void set(const TerrestrialDeliverySystemDescriptor &);
#endif
- struct Bandwidth {
- enum {
- Bw8MHz, Bw7MHz, Bw6MHz, /*Bw5MHz,*/ BwAuto
- }; // Bw5Mhz nyi (compatibilty with enigma1)
- };
- struct FEC {
- enum {
- f1_2, f2_3, f3_4, f5_6, f7_8, fAuto
- };
- };
- struct TransmissionMode {
- enum {
- TM2k, TM8k, /*TM4k,*/ TMAuto
- }; // TM4k nyi (compatibility with enigma1)
+ enum {
+ Bandwidth_8MHz, Bandwidth_7MHz, Bandwidth_6MHz, /*Bandwidth_5MHz,*/ Bandwidth_Auto
+ }; // Bw5Mhz nyi (compatibilty with enigma1)
+
+ enum {
+ FEC_1_2, FEC_2_3, FEC_3_4, FEC_5_6, FEC_7_8, FEC_Auto
};
- struct GuardInterval {
- enum {
- GI_1_32, GI_1_16, GI_1_8, GI_1_4, GI_Auto
- };
+
+ enum {
+ TransmissionMode_2k, TransmissionMode_8k, /*TransmissionMode_4k,*/ TransmissionMode_Auto
+ }; // TM4k nyi (compatibility with enigma1)
+
+ enum {
+ GuardInterval_1_32, GuardInterval_1_16, GuardInterval_1_8, GuardInterval_1_4, GuardInterval_Auto
};
- struct Hierarchy {
- enum {
- HNone, H1, H2, H4, HAuto
- };
+
+ enum {
+ Hierarchy_None, Hierarchy_1, Hierarchy_2, Hierarchy_4, Hierarchy_Auto
};
- struct Modulation {
- enum {
- QPSK, QAM16, QAM64, Auto
- };
+
+ enum {
+ Modulation_QPSK, Modulation_QAM16, Modulation_QAM64, Modulation_Auto
};
- struct Inversion
- {
- enum {
- Off, On, Unknown
- };
+
+ enum {
+ Inversion_Off, Inversion_On, Inversion_Unknown
};
+
unsigned int frequency;
int bandwidth;
int code_rate_HP, code_rate_LP;
diff --git a/lib/dvb/idemux.h b/lib/dvb/idemux.h
index 2b750882..9432afb6 100644
--- a/lib/dvb/idemux.h
+++ b/lib/dvb/idemux.h
@@ -38,6 +38,8 @@ public:
virtual RESULT setBoundary(off_t max) = 0;
virtual RESULT stop() = 0;
+
+ virtual RESULT getCurrentPCR(pts_t &pcr) = 0;
enum {
eventWriteError,
diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h
index bd1c7035..cfa98ecf 100644
--- a/lib/dvb/idvb.h
+++ b/lib/dvb/idvb.h
@@ -404,15 +404,16 @@ class iDVBFrontendParameters: public iObject
#endif
public:
enum { flagOnlyFree = 1 };
- virtual RESULT getSystem(int &SWIG_OUTPUT) const = 0;
- virtual RESULT getDVBS(eDVBFrontendParametersSatellite &SWIG_OUTPUT) const = 0;
- virtual RESULT getDVBC(eDVBFrontendParametersCable &SWIG_OUTPUT) const = 0;
- virtual RESULT getDVBT(eDVBFrontendParametersTerrestrial &SWIG_OUTPUT) const = 0;
-
- virtual RESULT calculateDifference(const iDVBFrontendParameters *parm, int &SWIG_OUTPUT, bool exact) const = 0;
- virtual RESULT getHash(unsigned long &SWIG_OUTPUT) const = 0;
- virtual RESULT calcLockTimeout(unsigned int &) const = 0;
- virtual RESULT getFlags(unsigned int &) const = 0;
+ virtual SWIG_VOID(RESULT) getSystem(int &SWIG_OUTPUT) const = 0;
+ virtual SWIG_VOID(RESULT) getDVBS(eDVBFrontendParametersSatellite &SWIG_OUTPUT) const = 0;
+ virtual SWIG_VOID(RESULT) getDVBC(eDVBFrontendParametersCable &SWIG_OUTPUT) const = 0;
+ virtual SWIG_VOID(RESULT) getDVBT(eDVBFrontendParametersTerrestrial &SWIG_OUTPUT) const = 0;
+ virtual SWIG_VOID(RESULT) getFlags(unsigned int &SWIG_OUTPUT) const = 0;
+#ifndef SWIG
+ virtual SWIG_VOID(RESULT) calculateDifference(const iDVBFrontendParameters *parm, int &, bool exact) const = 0;
+ virtual SWIG_VOID(RESULT) getHash(unsigned long &) const = 0;
+ virtual SWIG_VOID(RESULT) calcLockTimeout(unsigned int &) const = 0;
+#endif
};
SWIG_TEMPLATE_TYPEDEF(ePtr<iDVBFrontendParameters>, iDVBFrontendParametersPtr);
@@ -504,6 +505,7 @@ class iDVBChannel: public iObject
public:
/* direct frontend access for raw channels and/or status inquiries. */
virtual SWIG_VOID(RESULT) getFrontend(ePtr<iDVBFrontend> &SWIG_OUTPUT)=0;
+ virtual RESULT requestTsidOnid(SWIG_PYOBJECT(ePyObject) callback) { return -1; }
#ifndef SWIG
enum
{
@@ -701,6 +703,12 @@ public:
};
virtual RESULT connectVideoEvent(const Slot1<void, struct videoEvent> &event, ePtr<eConnection> &connection) = 0;
+
+ virtual int getVideoWidth() = 0;
+ virtual int getVideoHeight() = 0;
+ virtual int getVideoProgressive() = 0;
+ virtual int getVideoFrameRate() = 0;
+ virtual int getVideoAspect() = 0;
};
#endif //SWIG
diff --git a/lib/dvb/metaparser.cpp b/lib/dvb/metaparser.cpp
index 3e3f9a79..175c7cdb 100644
--- a/lib/dvb/metaparser.cpp
+++ b/lib/dvb/metaparser.cpp
@@ -6,6 +6,8 @@ eDVBMetaParser::eDVBMetaParser()
{
m_time_create = 0;
m_data_ok = 0;
+ m_length = 0;
+ m_filesize = 0;
}
int eDVBMetaParser::parseFile(const std::string &basename)
@@ -59,6 +61,12 @@ int eDVBMetaParser::parseMeta(const std::string &tsname)
case 4:
m_tags = line;
break;
+ case 5:
+ m_length = atoi(line); //movielength in pts
+ break;
+ case 6:
+ m_filesize = atoll(line);
+ break;
default:
break;
}
@@ -105,17 +113,19 @@ int eDVBMetaParser::parseRecordings(const std::string &filename)
ref = eServiceReferenceDVB(line + 10);
if (!strncmp(line, "#DESCRIPTION: ", 14))
description = line + 14;
-
- if ((line[0] == '/') && (ref.path == filename))
+ if ((line[0] == '/') && (ref.path.substr(ref.path.find_last_of('/')) == filename.substr(filename.find_last_of('/'))))
{
// eDebug("hit! ref %s descr %s", m_ref.toString().c_str(), m_name.c_str());
m_ref = ref;
m_name = description;
m_description = "";
m_time_create = 0;
-
+ m_length = 0;
+ m_filesize = 0;
+
m_data_ok = 1;
fclose(f);
+ updateMeta(filename.c_str());
return 0;
}
}
@@ -125,14 +135,17 @@ int eDVBMetaParser::parseRecordings(const std::string &filename)
int eDVBMetaParser::updateMeta(const std::string &tsname)
{
- if (!m_data_ok)
+ /* write meta file only if we have valid data. Note that we might convert recordings.epl data to .meta, which is fine. */
+ if (!m_data_ok)
return -1;
std::string filename = tsname + ".meta";
+ eServiceReference ref = m_ref;
+ ref.path = "";
FILE *f = fopen(filename.c_str(), "w");
if (!f)
return -ENOENT;
- fprintf(f, "%s\n%s\n%s\n%d\n%s\n", m_ref.toString().c_str(), m_name.c_str(), m_description.c_str(), m_time_create, m_tags.c_str());
+ fprintf(f, "%s\n%s\n%s\n%d\n%s\n%d\n%lld\n", ref.toString().c_str(), m_name.c_str(), m_description.c_str(), m_time_create, m_tags.c_str(), m_length, m_filesize );
fclose(f);
return 0;
}
diff --git a/lib/dvb/metaparser.h b/lib/dvb/metaparser.h
index 01fabde8..2ca94d6d 100644
--- a/lib/dvb/metaparser.h
+++ b/lib/dvb/metaparser.h
@@ -18,7 +18,8 @@ public:
eServiceReferenceDVB m_ref;
std::string m_name, m_description;
- int m_time_create;
+ int m_time_create, m_length;
+ long long m_filesize;
std::string m_tags;
};
diff --git a/lib/dvb/pmt.cpp b/lib/dvb/pmt.cpp
index 842d6979..279ec74f 100644
--- a/lib/dvb/pmt.cpp
+++ b/lib/dvb/pmt.cpp
@@ -16,6 +16,7 @@
#include <dvbsi++/stream_identifier_descriptor.h>
#include <dvbsi++/subtitling_descriptor.h>
#include <dvbsi++/teletext_descriptor.h>
+#include <dvbsi++/video_stream_descriptor.h>
eDVBServicePMTHandler::eDVBServicePMTHandler()
:m_ca_servicePtr(0), m_dvb_scan(0), m_decode_demux_num(0xFF)
@@ -50,10 +51,13 @@ void eDVBServicePMTHandler::channelStateChanged(iDVBChannel *channel)
{
eDebug("ok ... now we start!!");
- if (m_pmt_pid == -1)
- m_PAT.begin(eApp, eDVBPATSpec(), m_demux);
- else
- m_PMT.begin(eApp, eDVBPMTSpec(m_pmt_pid, m_reference.getServiceID().get()), m_demux);
+ if (!m_service || m_service->usePMT())
+ {
+ if (m_pmt_pid == -1)
+ m_PAT.begin(eApp, eDVBPATSpec(), m_demux);
+ else
+ m_PMT.begin(eApp, eDVBPMTSpec(m_pmt_pid, m_reference.getServiceID().get()), m_demux);
+ }
if ( m_service && !m_service->cacheEmpty() )
serviceEvent(eventNewProgramInfo);
@@ -214,25 +218,49 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program)
audioStream audio;
audio.component_tag=video.component_tag=-1;
video.type = videoStream::vtMPEG2;
+ audio.type = audioStream::atMPEG;
switch ((*es)->getType())
{
case 0x1b: // AVC Video Stream (MPEG4 H264)
video.type = videoStream::vtMPEG4_H264;
+ isvideo = 1;
+ //break; fall through !!!
+ case 0x10: // MPEG 4 Part 2
+ if (!isvideo)
+ {
+ video.type = videoStream::vtMPEG4_Part2;
+ isvideo = 1;
+ }
+ //break; fall through !!!
case 0x01: // MPEG 1 video
+ if (!isvideo)
+ video.type = videoStream::vtMPEG1;
+ //break; fall through !!!
case 0x02: // MPEG 2 video
isvideo = 1;
//break; fall through !!!
case 0x03: // MPEG 1 audio
case 0x04: // MPEG 2 audio:
if (!isvideo)
+ isaudio = 1;
+ //break; fall through !!!
+ case 0x0f: // MPEG 2 AAC
+ if (!isvideo && !isaudio)
{
isaudio = 1;
- audio.type = audioStream::atMPEG;
+ audio.type = audioStream::atAAC;
}
//break; fall through !!!
+ case 0x11: // MPEG 4 AAC
+ if (!isvideo && !isaudio)
+ {
+ isaudio = 1;
+ audio.type = audioStream::atAACHE;
+ }
case 0x06: // PES Private
case 0x81: // user private
+ case 0xEA: // TS_PSI_ST_SMPTE_VC1
for (DescriptorConstIterator desc = (*es)->getDescriptors()->begin();
desc != (*es)->getDescriptors()->end(); ++desc)
{
@@ -243,6 +271,17 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program)
check descriptors to get the exakt type. */
switch (tag)
{
+ case AUDIO_STREAM_DESCRIPTOR:
+ isaudio = 1;
+ break;
+ case VIDEO_STREAM_DESCRIPTOR:
+ {
+ isvideo = 1;
+ VideoStreamDescriptor *d = (VideoStreamDescriptor*)(*desc);
+ if (d->getMpeg1OnlyFlag())
+ video.type = videoStream::vtMPEG1;
+ break;
+ }
case SUBTITLING_DESCRIPTOR:
{
SubtitlingDescriptor *d = (SubtitlingDescriptor*)(*desc);
@@ -301,9 +340,14 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program)
isaudio = 1;
audio.type = audioStream::atDTS;
break;
+ case 0x2B: // TS_PSI_DT_MPEG2_AAC
+ isaudio = 1;
+ audio.type = audioStream::atAAC; // MPEG2-AAC
+ break;
+ case 0x1C: // TS_PSI_DT_MPEG4_Audio
case AAC_DESCRIPTOR:
isaudio = 1;
- audio.type = audioStream::atAAC;
+ audio.type = audioStream::atAACHE; // MPEG4-AAC
break;
case AC3_DESCRIPTOR:
isaudio = 1;
@@ -312,7 +356,7 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program)
case REGISTRATION_DESCRIPTOR: /* some services don't have a separate AC3 descriptor */
{
/* libdvbsi++ doesn't yet support this descriptor type, so work around. */
- if ((*desc)->getLength() != 4)
+ if ((*desc)->getLength() < 4)
break;
unsigned char descr[6];
(*desc)->writeToBuffer(descr);
@@ -323,11 +367,29 @@ int eDVBServicePMTHandler::getProgramInfo(struct program &program)
isaudio = 1;
audio.type = audioStream::atAC3;
break;
+ case 0x56432d31:
+ if (descr[6] == 0x01) // subdescriptor tag
+ {
+ if (descr[7] >= 0x90) // profile_level
+ video.type = videoStream::vtVC1; // advanced profile
+ else
+ video.type = videoStream::vtVC1_SM; // simple main
+ isvideo = 1;
+ }
+ break;
default:
break;
}
break;
}
+ case 0x28: // TS_PSI_DT_AVC
+ isvideo = 1;
+ video.type = videoStream::vtMPEG4_H264;
+ break;
+ case 0x1B: // TS_PSI_DT_MPEG4_Video
+ isvideo = 1;
+ video.type = videoStream::vtMPEG4_Part2;
+ break;
default:
break;
}
@@ -1143,8 +1205,8 @@ void eDVBCAService::sendCAPMT()
static PyObject *createTuple(int pid, const char *type)
{
PyObject *r = PyTuple_New(2);
- PyTuple_SetItem(r, 0, PyInt_FromLong(pid));
- PyTuple_SetItem(r, 1, PyString_FromString(type));
+ PyTuple_SET_ITEM(r, 0, PyInt_FromLong(pid));
+ PyTuple_SET_ITEM(r, 1, PyString_FromString(type));
return r;
}
@@ -1154,17 +1216,18 @@ static inline void PyList_AppendSteal(PyObject *list, PyObject *item)
Py_DECREF(item);
}
+extern void PutToDict(ePyObject &dict, const char*key, ePyObject item); // defined in dvb/frontend.cpp
+
PyObject *eDVBServicePMTHandler::program::createPythonObject()
{
- PyObject *r = PyDict_New();
+ ePyObject r = PyDict_New();
+ ePyObject l = PyList_New(0);
- PyObject *l = PyList_New(0);
-
PyList_AppendSteal(l, createTuple(0, "pat"));
if (pmtPid != -1)
PyList_AppendSteal(l, createTuple(pmtPid, "pmt"));
-
+
for (std::vector<eDVBServicePMTHandler::videoStream>::const_iterator
i(videoStreams.begin());
i != videoStreams.end(); ++i)
@@ -1184,7 +1247,8 @@ PyObject *eDVBServicePMTHandler::program::createPythonObject()
if (textPid != -1)
PyList_AppendSteal(l, createTuple(textPid, "text"));
-
- PyDict_SetItemString(r, "pids", l);
+
+ PutToDict(r, "pids", l);
+
return r;
}
diff --git a/lib/dvb/pmt.h b/lib/dvb/pmt.h
index ff0ef046..3e22174b 100644
--- a/lib/dvb/pmt.h
+++ b/lib/dvb/pmt.h
@@ -135,14 +135,14 @@ public:
{
int pid;
int component_tag;
- enum { vtMPEG2, vtMPEG4_H264 };
+ enum { vtMPEG2, vtMPEG4_H264, vtMPEG1, vtMPEG4_Part2, vtVC1, vtVC1_SM };
int type;
};
struct audioStream
{
int pid;
- enum { atMPEG, atAC3, atDTS, atAAC };
+ enum { atMPEG, atAC3, atDTS, atAAC, atAACHE };
int type; // mpeg2, ac3, dts, ...
int component_tag;
diff --git a/lib/dvb/pvrparse.cpp b/lib/dvb/pvrparse.cpp
index c7a37460..71cbd602 100644
--- a/lib/dvb/pvrparse.cpp
+++ b/lib/dvb/pvrparse.cpp
@@ -284,7 +284,7 @@ int eMPEGStreamInformation::getNextAccessPoint(pts_t &ts, const pts_t &start, in
return 0;
}
-eMPEGStreamParserTS::eMPEGStreamParserTS(eMPEGStreamInformation &streaminfo): m_streaminfo(streaminfo), m_pktptr(0), m_pid(-1), m_need_next_packet(0), m_skip(0)
+eMPEGStreamParserTS::eMPEGStreamParserTS(eMPEGStreamInformation &streaminfo): m_streaminfo(streaminfo), m_pktptr(0), m_pid(-1), m_need_next_packet(0), m_skip(0), m_last_pts_valid(0)
{
}
@@ -331,6 +331,9 @@ int eMPEGStreamParserTS::processPacket(const unsigned char *pkt, off_t offset)
pts |= ((unsigned long long)(pkt[12]&0xFF)) << 7;
pts |= ((unsigned long long)(pkt[13]&0xFE)) >> 1;
ptsvalid = 1;
+
+ m_last_pts = pts;
+ m_last_pts_valid = 1;
#if 0
int sec = pts / 90000;
@@ -522,3 +525,15 @@ void eMPEGStreamParserTS::setPid(int _pid)
m_pktptr = 0;
m_pid = _pid;
}
+
+int eMPEGStreamParserTS::getLastPTS(pts_t &last_pts)
+{
+ if (!m_last_pts_valid)
+ {
+ last_pts = 0;
+ return -1;
+ }
+ last_pts = m_last_pts;
+ return 0;
+}
+
diff --git a/lib/dvb/pvrparse.h b/lib/dvb/pvrparse.h
index b2ddd23d..20d33470 100644
--- a/lib/dvb/pvrparse.h
+++ b/lib/dvb/pvrparse.h
@@ -55,6 +55,7 @@ public:
eMPEGStreamParserTS(eMPEGStreamInformation &streaminfo);
void parseData(off_t offset, const void *data, unsigned int len);
void setPid(int pid);
+ int getLastPTS(pts_t &last_pts);
private:
eMPEGStreamInformation &m_streaminfo;
unsigned char m_pkt[188];
@@ -64,6 +65,8 @@ private:
int m_pid;
int m_need_next_packet;
int m_skip;
+ int m_last_pts_valid;
+ pts_t m_last_pts;
};
#endif
diff --git a/lib/dvb/scan.cpp b/lib/dvb/scan.cpp
index 71893f95..76c71011 100644
--- a/lib/dvb/scan.cpp
+++ b/lib/dvb/scan.cpp
@@ -40,6 +40,8 @@ int eDVBScan::isValidONIDTSID(int orbital_position, eOriginalNetworkID onid, eTr
case 0:
case 0x1111:
return 0;
+ case 0x13E: // workaround for 11258H and 11470V on hotbird with same ONID/TSID (0x13E/0x578)
+ return orbital_position != 130 || tsid != 0x578;
case 1:
return orbital_position == 192;
case 0x00B1:
diff --git a/lib/dvb/sec.cpp b/lib/dvb/sec.cpp
index 2b7f717b..ac1a2028 100644
--- a/lib/dvb/sec.cpp
+++ b/lib/dvb/sec.cpp
@@ -37,81 +37,11 @@ void eDVBSatelliteEquipmentControl::setParam(int param, int value)
}
eDVBSatelliteEquipmentControl::eDVBSatelliteEquipmentControl(eSmartPtrList<eDVBRegisteredFrontend> &avail_frontends, eSmartPtrList<eDVBRegisteredFrontend> &avail_simulate_frontends)
- :m_lnbidx(-1), m_curSat(m_lnbs[0].m_satellites.end()), m_avail_frontends(avail_frontends), m_avail_simulate_frontends(avail_simulate_frontends), m_rotorMoving(false)
+ :m_lnbidx((sizeof(m_lnbs) / sizeof(eDVBSatelliteLNBParameters))-1), m_curSat(m_lnbs[0].m_satellites.end()), m_avail_frontends(avail_frontends), m_avail_simulate_frontends(avail_simulate_frontends), m_rotorMoving(false)
{
if (!instance)
instance = this;
-
clear();
-
-// ASTRA
- addLNB();
- setLNBSlotMask(3);
- setLNBLOFL(9750000);
- setLNBThreshold(11700000);
- setLNBLOFH(10607000);
- setDiSEqCMode(eDVBSatelliteDiseqcParameters::V1_0);
- setToneburst(eDVBSatelliteDiseqcParameters::NO);
- setRepeats(0);
- setCommittedCommand(eDVBSatelliteDiseqcParameters::BB);
- setCommandOrder(0); // committed, toneburst
- setFastDiSEqC(true);
- setSeqRepeat(false);
- addSatellite(192);
- setVoltageMode(eDVBSatelliteSwitchParameters::HV);
- setToneMode(eDVBSatelliteSwitchParameters::HILO);
-
-// Hotbird
- addLNB();
- setLNBSlotMask(3);
- setLNBLOFL(9750000);
- setLNBThreshold(11700000);
- setLNBLOFH(10600000);
- setDiSEqCMode(eDVBSatelliteDiseqcParameters::V1_0);
- setToneburst(eDVBSatelliteDiseqcParameters::NO);
- setRepeats(0);
- setCommittedCommand(eDVBSatelliteDiseqcParameters::AB);
- setCommandOrder(0); // committed, toneburst
- setFastDiSEqC(true);
- setSeqRepeat(false);
- addSatellite(130);
- setVoltageMode(eDVBSatelliteSwitchParameters::HV);
- setToneMode(eDVBSatelliteSwitchParameters::HILO);
-
-// Rotor
- addLNB();
- setLNBSlotMask(3);
- setLNBLOFL(9750000);
- setLNBThreshold(11700000);
- setLNBLOFH(10600000);
- setDiSEqCMode(eDVBSatelliteDiseqcParameters::V1_2);
- setToneburst(eDVBSatelliteDiseqcParameters::NO);
- setRepeats(0);
- setCommittedCommand(eDVBSatelliteDiseqcParameters::AA);
- setCommandOrder(0); // committed, toneburst
- setFastDiSEqC(true);
- setSeqRepeat(false);
- setLaDirection(eDVBSatelliteRotorParameters::NORTH);
- setLoDirection(eDVBSatelliteRotorParameters::EAST);
- setLatitude(51.017);
- setLongitude(8.683);
- setUseInputpower(true);
- setInputpowerDelta(50);
-
- addSatellite(235);
- setVoltageMode(eDVBSatelliteSwitchParameters::HV);
- setToneMode(eDVBSatelliteSwitchParameters::HILO);
- setRotorPosNum(0);
-
- addSatellite(284);
- setVoltageMode(eDVBSatelliteSwitchParameters::HV);
- setToneMode(eDVBSatelliteSwitchParameters::HILO);
- setRotorPosNum(0);
-
- addSatellite(420);
- setVoltageMode(eDVBSatelliteSwitchParameters::HV);
- setToneMode(eDVBSatelliteSwitchParameters::HILO);
- setRotorPosNum(1); // stored pos 1
}
#define eSecDebugNoSimulate(x...) \
@@ -140,7 +70,7 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
{
bool rotor=false;
eDVBSatelliteLNBParameters &lnb_param = m_lnbs[idx];
- if ( lnb_param.slot_mask & slot_id ) // lnb for correct tuner?
+ if ( lnb_param.m_slot_mask & slot_id ) // lnb for correct tuner?
{
int ret = 0;
eDVBSatelliteDiseqcParameters &di_param = lnb_param.m_diseqc_parameters;
@@ -169,7 +99,7 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
if ( sat.frequency > lnb_param.m_lof_threshold )
band |= 1;
- if (!(sat.polarisation & eDVBFrontendParametersSatellite::Polarisation::Vertical))
+ if (!(sat.polarisation & eDVBFrontendParametersSatellite::Polarisation_Vertical))
band |= 2;
if (di_param.m_diseqc_mode >= eDVBSatelliteDiseqcParameters::V1_0)
@@ -283,7 +213,7 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
eSecDebugNoSimulate("ret5 %d", ret);
}
- if (ret && rotor && curRotorPos != -1 && (direct_connected || satpos_depends_ptr == -1) ) // direct conntected or loopthrough!
+ if (ret && rotor && curRotorPos != -1)
ret -= abs(curRotorPos-sat.orbital_position);
eSecDebugNoSimulate("ret6 %d", ret);
@@ -297,6 +227,9 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
ret=0;
}
+ if (ret && lnb_param.m_prio != -1)
+ ret = lnb_param.m_prio;
+
eSecDebugNoSimulate("ret %d, score old %d", ret, score);
if (ret > score)
{
@@ -309,7 +242,12 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
}
}
if (score && satcount)
- score -= (satcount-1);
+ {
+ if (score > (satcount-1))
+ score -= (satcount-1);
+ else
+ score = 1; // min score
+ }
if (score && direct_connected)
score += 5; // increase score for tuners with direct sat connection
eSecDebugNoSimulate("final score %d", score);
@@ -367,10 +305,16 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
lnb_param.m_satellites.find(sat.orbital_position);
if ( sit != lnb_param.m_satellites.end())
{
+ eSecCommandList sec_sequence;
+
+ lnb_param.guard_offset = 0; //HACK
+
+ frontend.setData(eDVBFrontend::SATCR, lnb_param.SatCR_idx);
+
eDVBSatelliteSwitchParameters &sw_param = sit->second;
bool doSetFrontend = true;
bool doSetVoltageToneFrontend = true;
- bool sendDiSEqC = false;
+ bool forceStaticMode = true;
bool forceChanged = false;
bool needDiSEqCReset = false;
long band=0,
@@ -388,6 +332,11 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
iDVBFrontend *sec_fe=&frontend;
eDVBRegisteredFrontend *linked_fe = 0;
eDVBSatelliteDiseqcParameters::t_diseqc_mode diseqc_mode = di_param.m_diseqc_mode;
+ eDVBSatelliteSwitchParameters::t_voltage_mode voltage_mode = sw_param.m_voltage_mode;
+ bool diseqc13V = voltage_mode == eDVBSatelliteSwitchParameters::HV_13;
+
+ if (diseqc13V)
+ voltage_mode = eDVBSatelliteSwitchParameters::HV;
frontend.getData(eDVBFrontend::SATPOS_DEPENDS_PTR, satposDependPtr);
@@ -424,35 +373,54 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
if ( sat.frequency > lnb_param.m_lof_threshold )
band |= 1;
+ if (!(sat.polarisation & eDVBFrontendParametersSatellite::Polarisation_Vertical))
+ band |= 2;
- if (band&1)
- parm.FREQUENCY = sat.frequency - lnb_param.m_lof_hi;
- else
- parm.FREQUENCY = sat.frequency - lnb_param.m_lof_lo;
-
- parm.FREQUENCY = abs(parm.FREQUENCY);
-
- frontend.setData(eDVBFrontend::FREQ_OFFSET, sat.frequency - parm.FREQUENCY);
+ int lof = (band&1)?lnb_param.m_lof_hi:lnb_param.m_lof_lo;
- if (!(sat.polarisation & eDVBFrontendParametersSatellite::Polarisation::Vertical))
- band |= 2;
+ int local=0;
- if ( sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::_14V
- || ( sat.polarisation & eDVBFrontendParametersSatellite::Polarisation::Vertical
- && sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::HV ) )
- voltage = VOLTAGE(13);
- else if ( sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::_18V
- || ( !(sat.polarisation & eDVBFrontendParametersSatellite::Polarisation::Vertical)
- && sw_param.m_voltage_mode == eDVBSatelliteSwitchParameters::HV ) )
- voltage = VOLTAGE(18);
- if ( (sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::ON)
- || ( sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::HILO && (band&1) ) )
- tone = iDVBFrontend::toneOn;
- else if ( (sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::OFF)
- || ( sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::HILO && !(band&1) ) )
- tone = iDVBFrontend::toneOff;
- eSecCommandList sec_sequence;
+ if(lnb_param.SatCR_idx == -1)
+ {
+ // calc Frequency
+ local = abs(sat.frequency
+ - ((lof - (lof % 1000)) + ((lof % 1000)>500 ? 1000 : 0)) ); //TODO für den Mist mal ein Macro schreiben
+ parm.FREQUENCY = (local - (local % 125)) + ((local % 125)>62 ? 125 : 0);
+ frontend.setData(eDVBFrontend::FREQ_OFFSET, sat.frequency - parm.FREQUENCY);
+
+ if ( voltage_mode == eDVBSatelliteSwitchParameters::_14V
+ || ( sat.polarisation & eDVBFrontendParametersSatellite::Polarisation_Vertical
+ && voltage_mode == eDVBSatelliteSwitchParameters::HV ) )
+ voltage = VOLTAGE(13);
+ else if ( voltage_mode == eDVBSatelliteSwitchParameters::_18V
+ || ( !(sat.polarisation & eDVBFrontendParametersSatellite::Polarisation_Vertical)
+ && voltage_mode == eDVBSatelliteSwitchParameters::HV ) )
+ voltage = VOLTAGE(18);
+ if ( (sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::ON)
+ || ( sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::HILO && (band&1) ) )
+ tone = iDVBFrontend::toneOn;
+ else if ( (sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::OFF)
+ || ( sw_param.m_22khz_signal == eDVBSatelliteSwitchParameters::HILO && !(band&1) ) )
+ tone = iDVBFrontend::toneOff;
+ }
+ else
+ {
+ unsigned int tmp = abs(sat.frequency
+ - ((lof - (lof % 1000)) + ((lof % 1000)>500 ? 1000 : 0)) )
+ + lnb_param.SatCRvco
+ - 1400000
+ + lnb_param.guard_offset;
+ parm.FREQUENCY = (lnb_param.SatCRvco - (tmp % 4000))+((tmp%4000)>2000?4000:0)+lnb_param.guard_offset;
+ lnb_param.UnicableTuningWord = (((tmp / 4000)+((tmp%4000)>2000?1:0))
+ | ((band & 1) ? 0x400 : 0) //HighLow
+ | ((band & 2) ? 0x800 : 0) //VertHor
+ | ((lnb_param.LNBNum & 1) ? 0 : 0x1000) //Umschaltung LNB1 LNB2
+ | (lnb_param.SatCR_idx << 13)); //Adresse des SatCR
+ eDebug("[prepare] UnicableTuningWord %#04x",lnb_param.UnicableTuningWord);
+ eDebug("[prepare] guard_offset %d",lnb_param.guard_offset);
+ frontend.setData(eDVBFrontend::FREQ_OFFSET, sat.frequency - ((lnb_param.UnicableTuningWord & 0x3FF) *4000 + 1400000 - lnb_param.SatCRvco + lof));
+ }
if (diseqc_mode >= eDVBSatelliteDiseqcParameters::V1_0)
{
@@ -597,7 +565,9 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, iDVBFrontend::toneOff) );
sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_CONT_TONE]) );
- if ( RotorCmd != -1 && RotorCmd != lastRotorCmd )
+ if (diseqc13V)
+ vlt = iDVBFrontend::voltage13;
+ else if ( RotorCmd != -1 && RotorCmd != lastRotorCmd )
{
if (rotor_param.m_inputpower_parameters.m_use)
vlt = VOLTAGE(18); // in input power mode set 18V for measure input power
@@ -723,14 +693,13 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
if (di_param.m_seq_repeat && seq_repeat == 0)
sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_BEFORE_SEQUENCE_REPEAT]) );
}
- sendDiSEqC = true;
}
eDebugNoSimulate("RotorCmd %02x, lastRotorCmd %02lx", RotorCmd, lastRotorCmd);
if ( RotorCmd != -1 && RotorCmd != lastRotorCmd )
{
eSecCommand::pair compare;
- if (!send_mask)
+ if (!send_mask && lnb_param.SatCR_idx == -1)
{
compare.steps = +3;
compare.tone = iDVBFrontend::toneOff;
@@ -784,107 +753,113 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
diseqc.data[3] = RotorCmd;
diseqc.data[4] = 0x00;
}
-
- if ( rotor_param.m_inputpower_parameters.m_use )
- { // use measure rotor input power to detect rotor state
- bool turn_fast = need_turn_fast(rotor_param.m_inputpower_parameters.m_turning_speed);
- eSecCommand::rotor cmd;
- eSecCommand::pair compare;
- compare.voltage = VOLTAGE(18);
- compare.steps = +3;
- sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) );
- sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, compare.voltage) );
-// measure idle power values
- sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_MEASURE_IDLE_INPUTPOWER]) ); // wait 150msec after voltage change
- sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_IDLE_INPUTPOWER, 1) );
- compare.val = 1;
- compare.steps = -2;
- sec_sequence.push_back( eSecCommand(eSecCommand::IF_MEASURE_IDLE_WAS_NOT_OK_GOTO, compare) );
- sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(13)) );
- sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_MEASURE_IDLE_INPUTPOWER]) ); // wait 150msec before measure
- sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_IDLE_INPUTPOWER, 0) );
- compare.val = 0;
- sec_sequence.push_back( eSecCommand(eSecCommand::IF_MEASURE_IDLE_WAS_NOT_OK_GOTO, compare) );
-////////////////////////////
- sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_DISEQC_RETRYS, m_params[MOTOR_COMMAND_RETRIES]) ); // 2 retries
- sec_sequence.push_back( eSecCommand(eSecCommand::INVALIDATE_CURRENT_ROTORPARMS) );
- sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) );
- sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, 40) ); // 2 seconds rotor start timout
-// rotor start loop
- sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) ); // 50msec delay
- sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_RUNNING_INPUTPOWER) );
- cmd.direction=1; // check for running rotor
- cmd.deltaA=rotor_param.m_inputpower_parameters.m_delta;
- cmd.steps=+5;
- cmd.okcount=0;
- sec_sequence.push_back( eSecCommand(eSecCommand::IF_INPUTPOWER_DELTA_GOTO, cmd ) ); // check if rotor has started
- sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +2 ) ); // timeout .. we assume now the rotor is already at the correct position
- sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) ); // goto loop start
- sec_sequence.push_back( eSecCommand(eSecCommand::IF_NO_MORE_ROTOR_DISEQC_RETRYS_GOTO, turn_fast ? 10 : 9 ) ); // timeout .. we assume now the rotor is already at the correct position
- sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -8) ); // goto loop start
-////////////////////
- sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_MOVING) );
- if (turn_fast)
- sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(18)) );
- sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, m_params[MOTOR_RUNNING_TIMEOUT]*20) ); // 2 minutes running timeout
-// rotor running loop
- sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) ); // wait 50msec
- sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_RUNNING_INPUTPOWER) );
- cmd.direction=0; // check for stopped rotor
- cmd.steps=+3;
- sec_sequence.push_back( eSecCommand(eSecCommand::IF_INPUTPOWER_DELTA_GOTO, cmd ) );
- sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +2 ) ); // timeout ? this should never happen
- sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) ); // running loop start
-/////////////////////
- sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_ROTORPARAMS) );
- sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_STOPPED) );
- }
- else
- { // use normal turning mode
- doSetVoltageToneFrontend=false;
- doSetFrontend=false;
- eSecCommand::rotor cmd;
- eSecCommand::pair compare;
- compare.voltage = VOLTAGE(13);
- compare.steps = +3;
- sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) );
- sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, compare.voltage) );
- sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_MOTOR_CMD]) ); // wait 150msec after voltage change
-
- sec_sequence.push_back( eSecCommand(eSecCommand::INVALIDATE_CURRENT_ROTORPARMS) );
- sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_MOVING) );
- sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) );
-
- compare.voltage = voltage;
- compare.steps = +3;
- sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); // correct final voltage?
- sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 2000) ); // wait 2 second before set high voltage
- sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, voltage) );
-
- compare.tone = tone;
- sec_sequence.push_back( eSecCommand(eSecCommand::IF_TONE_GOTO, compare) );
- sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, tone) );
- sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_CONT_TONE]) );
- sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) );
-
- cmd.direction=1; // check for running rotor
- cmd.deltaA=0;
- cmd.steps=+3;
- cmd.okcount=0;
- sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, m_params[MOTOR_RUNNING_TIMEOUT]*4) ); // 2 minutes running timeout
- sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 250) ); // 250msec delay
- sec_sequence.push_back( eSecCommand(eSecCommand::IF_TUNER_LOCKED_GOTO, cmd ) );
- sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +3 ) );
- sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -3) ); // goto loop start
- sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_ROTORPARAMS) );
- sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_STOPPED) );
- sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, +3) );
- sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) );
- sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) );
+ if(lnb_param.SatCR_idx == -1)
+ {
+ if ( rotor_param.m_inputpower_parameters.m_use )
+ { // use measure rotor input power to detect rotor state
+ bool turn_fast = need_turn_fast(rotor_param.m_inputpower_parameters.m_turning_speed);
+ eSecCommand::rotor cmd;
+ eSecCommand::pair compare;
+ if (turn_fast)
+ compare.voltage = VOLTAGE(18);
+ else
+ compare.voltage = VOLTAGE(13);
+ compare.steps = +3;
+ sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, compare.voltage) );
+ // measure idle power values
+ compare.steps = -2;
+ if (turn_fast) {
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_MEASURE_IDLE_INPUTPOWER]) ); // wait 150msec after voltage change
+ sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_IDLE_INPUTPOWER, 1) );
+ compare.val = 1;
+ sec_sequence.push_back( eSecCommand(eSecCommand::IF_MEASURE_IDLE_WAS_NOT_OK_GOTO, compare) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(13)) );
+ }
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_MEASURE_IDLE_INPUTPOWER]) ); // wait 150msec before measure
+ sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_IDLE_INPUTPOWER, 0) );
+ compare.val = 0;
+ sec_sequence.push_back( eSecCommand(eSecCommand::IF_MEASURE_IDLE_WAS_NOT_OK_GOTO, compare) );
+ ////////////////////////////
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_DISEQC_RETRYS, m_params[MOTOR_COMMAND_RETRIES]) ); // 2 retries
+ sec_sequence.push_back( eSecCommand(eSecCommand::INVALIDATE_CURRENT_ROTORPARMS) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, 40) ); // 2 seconds rotor start timout
+ // rotor start loop
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) ); // 50msec delay
+ sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_RUNNING_INPUTPOWER) );
+ cmd.direction=1; // check for running rotor
+ cmd.deltaA=rotor_param.m_inputpower_parameters.m_delta;
+ cmd.steps=+5;
+ cmd.okcount=0;
+ sec_sequence.push_back( eSecCommand(eSecCommand::IF_INPUTPOWER_DELTA_GOTO, cmd ) ); // check if rotor has started
+ sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +2 ) ); // timeout .. we assume now the rotor is already at the correct position
+ sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) ); // goto loop start
+ sec_sequence.push_back( eSecCommand(eSecCommand::IF_NO_MORE_ROTOR_DISEQC_RETRYS_GOTO, turn_fast ? 10 : 9 ) ); // timeout .. we assume now the rotor is already at the correct position
+ sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -8) ); // goto loop start
+ ////////////////////
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_MOVING) );
+ if (turn_fast)
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, VOLTAGE(18)) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, m_params[MOTOR_RUNNING_TIMEOUT]*20) ); // 2 minutes running timeout
+ // rotor running loop
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) ); // wait 50msec
+ sec_sequence.push_back( eSecCommand(eSecCommand::MEASURE_RUNNING_INPUTPOWER) );
+ cmd.direction=0; // check for stopped rotor
+ cmd.steps=+3;
+ sec_sequence.push_back( eSecCommand(eSecCommand::IF_INPUTPOWER_DELTA_GOTO, cmd ) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +2 ) ); // timeout ? this should never happen
+ sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) ); // running loop start
+ /////////////////////
+ sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_ROTORPARAMS) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_STOPPED) );
+ }
+ else
+ { // use normal turning mode
+ doSetVoltageToneFrontend=false;
+ doSetFrontend=false;
+ eSecCommand::rotor cmd;
+ eSecCommand::pair compare;
+ compare.voltage = VOLTAGE(13);
+ compare.steps = +3;
+ sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, compare.voltage) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_MOTOR_CMD]) ); // wait 150msec after voltage change
+
+ sec_sequence.push_back( eSecCommand(eSecCommand::INVALIDATE_CURRENT_ROTORPARMS) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_MOVING) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) );
+
+ compare.voltage = voltage;
+ compare.steps = +3;
+ sec_sequence.push_back( eSecCommand(eSecCommand::IF_VOLTAGE_GOTO, compare) ); // correct final voltage?
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 2000) ); // wait 2 second before set high voltage
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, voltage) );
+
+ compare.tone = tone;
+ sec_sequence.push_back( eSecCommand(eSecCommand::IF_TONE_GOTO, compare) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, tone) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_CONT_TONE]) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) );
+
+ cmd.direction=1; // check for running rotor
+ cmd.deltaA=0;
+ cmd.steps=+3;
+ cmd.okcount=0;
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_TIMEOUT, m_params[MOTOR_RUNNING_TIMEOUT]*4) ); // 2 minutes running timeout
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 250) ); // 250msec delay
+ sec_sequence.push_back( eSecCommand(eSecCommand::IF_TUNER_LOCKED_GOTO, cmd ) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::IF_TIMEOUT_GOTO, +3 ) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -3) ); // goto loop start
+ sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_ROTORPARAMS) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_ROTOR_STOPPED) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, +3) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::GOTO, -4) );
+ }
}
sec_fe->setData(eDVBFrontend::NEW_ROTOR_CMD, RotorCmd);
sec_fe->setData(eDVBFrontend::NEW_ROTOR_POS, sat.orbital_position);
- sendDiSEqC = true;
}
}
}
@@ -894,14 +869,11 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
csw = band;
}
-// if (sendDiSEqC)
- sec_sequence.push_front( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeStatic) );
-
sec_fe->setData(eDVBFrontend::NEW_CSW, csw);
sec_fe->setData(eDVBFrontend::NEW_UCSW, ucsw);
sec_fe->setData(eDVBFrontend::NEW_TONEBURST, di_param.m_toneburst_param);
- if (doSetVoltageToneFrontend)
+ if ((doSetVoltageToneFrontend) && (lnb_param.SatCR_idx == -1))
{
eSecCommand::pair compare;
compare.voltage = voltage;
@@ -917,16 +889,45 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
sec_sequence.push_back( eSecCommand(eSecCommand::UPDATE_CURRENT_SWITCHPARMS) );
+ if(lnb_param.SatCR_idx != -1)
+ {
+ // check if voltage is disabled
+ eSecCommand::pair compare;
+ compare.steps = +3;
+ compare.voltage = iDVBFrontend::voltageOff;
+ sec_sequence.push_back( eSecCommand(eSecCommand::IF_NOT_VOLTAGE_GOTO, compare) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50 ) );
+
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage18_5) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_TONE, iDVBFrontend::toneOff) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_VOLTAGE_CHANGE_BEFORE_MOTOR_CMD]) ); // wait 150msec after voltage change
+
+ eDVBDiseqcCommand diseqc;
+ memset(diseqc.data, 0, MAX_DISEQC_LENGTH);
+ diseqc.len = 5;
+ diseqc.data[0] = 0xE0;
+ diseqc.data[1] = 0x10;
+ diseqc.data[2] = 0x5A;
+ diseqc.data[3] = lnb_param.UnicableTuningWord >> 8;
+ diseqc.data[4] = lnb_param.UnicableTuningWord;
+
+ sec_sequence.push_back( eSecCommand(eSecCommand::SEND_DISEQC, diseqc) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, m_params[DELAY_AFTER_LAST_DISEQC_CMD]) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_VOLTAGE, iDVBFrontend::voltage13) );
+ }
+
if (doSetFrontend)
{
sec_sequence.push_back( eSecCommand(eSecCommand::START_TUNE_TIMEOUT, tunetimeout) );
sec_sequence.push_back( eSecCommand(eSecCommand::SET_FRONTEND) );
}
-
-// if (sendDiSEqC)
- sec_sequence.push_back( eSecCommand(eSecCommand::SLEEP, 50) );
- sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeDynamic) );
-
+
+ if (forceStaticMode)
+ {
+ sec_sequence.push_front( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeStatic) );
+ sec_sequence.push_back( eSecCommand(eSecCommand::SET_POWER_LIMITING_MODE, eSecCommand::modeDynamic) );
+ }
frontend.setSecSequence(sec_sequence);
return 0;
@@ -935,12 +936,12 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
eDebugNoSimulate("found no useable satellite configuration for %s freq %d%s %s on orbital position (%d)",
sat.system ? "DVB-S2" : "DVB-S",
sat.frequency,
- sat.polarisation == eDVBFrontendParametersSatellite::Polarisation::Horizontal ? "H" :
- eDVBFrontendParametersSatellite::Polarisation::Vertical ? "V" :
- eDVBFrontendParametersSatellite::Polarisation::CircularLeft ? "CL" : "CR",
- sat.modulation == eDVBFrontendParametersSatellite::Modulation::Auto ? "AUTO" :
- eDVBFrontendParametersSatellite::Modulation::QPSK ? "QPSK" :
- eDVBFrontendParametersSatellite::Modulation::M8PSK ? "8PSK" : "QAM16",
+ sat.polarisation == eDVBFrontendParametersSatellite::Polarisation_Horizontal ? "H" :
+ eDVBFrontendParametersSatellite::Polarisation_Vertical ? "V" :
+ eDVBFrontendParametersSatellite::Polarisation_CircularLeft ? "CL" : "CR",
+ sat.modulation == eDVBFrontendParametersSatellite::Modulation_Auto ? "AUTO" :
+ eDVBFrontendParametersSatellite::Modulation_QPSK ? "QPSK" :
+ eDVBFrontendParametersSatellite::Modulation_8PSK ? "8PSK" : "QAM16",
sat.orbital_position );
return -1;
}
@@ -951,7 +952,8 @@ RESULT eDVBSatelliteEquipmentControl::clear()
for (int i=0; i <= m_lnbidx; ++i)
{
m_lnbs[i].m_satellites.clear();
- m_lnbs[i].slot_mask = 0;
+ m_lnbs[i].m_slot_mask = 0;
+ m_lnbs[i].m_prio = -1; // auto
}
m_lnbidx=-1;
@@ -977,6 +979,7 @@ RESULT eDVBSatelliteEquipmentControl::clear()
it->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, -1);
it->m_frontend->setData(eDVBFrontend::ROTOR_POS, -1);
it->m_frontend->setData(eDVBFrontend::ROTOR_CMD, -1);
+ it->m_frontend->setData(eDVBFrontend::SATCR, -1);
}
for (eSmartPtrList<eDVBRegisteredFrontend>::iterator it(m_avail_simulate_frontends.begin()); it != m_avail_simulate_frontends.end(); ++it)
@@ -986,6 +989,7 @@ RESULT eDVBSatelliteEquipmentControl::clear()
it->m_frontend->setData(eDVBFrontend::LINKED_NEXT_PTR, -1);
it->m_frontend->setData(eDVBFrontend::ROTOR_POS, -1);
it->m_frontend->setData(eDVBFrontend::ROTOR_CMD, -1);
+ it->m_frontend->setData(eDVBFrontend::SATCR, -1);
}
return 0;
@@ -1009,7 +1013,7 @@ RESULT eDVBSatelliteEquipmentControl::setLNBSlotMask(int slotmask)
{
eSecDebug("eDVBSatelliteEquipmentControl::setLNBSlotMask(%d)", slotmask);
if ( currentLNBValid() )
- m_lnbs[m_lnbidx].slot_mask = slotmask;
+ m_lnbs[m_lnbidx].m_slot_mask = slotmask;
else
return -ENOENT;
return 0;
@@ -1055,6 +1059,28 @@ RESULT eDVBSatelliteEquipmentControl::setLNBIncreasedVoltage(bool onoff)
return 0;
}
+RESULT eDVBSatelliteEquipmentControl::setLNBPrio(int prio)
+{
+ eSecDebug("eDVBSatelliteEquipmentControl::setLNBPrio(%d)", prio);
+ if ( currentLNBValid() )
+ m_lnbs[m_lnbidx].m_prio = prio;
+ else
+ return -ENOENT;
+ return 0;
+}
+
+RESULT eDVBSatelliteEquipmentControl::setLNBNum(int LNBNum)
+{
+ eSecDebug("eDVBSatelliteEquipmentControl::setLNBNum(%d)", LNBNum);
+ if(!((LNBNum >= 1) && (LNBNum <= MAX_LNBNUM)))
+ return -EPERM;
+ if ( currentLNBValid() )
+ m_lnbs[m_lnbidx].LNBNum = LNBNum;
+ else
+ return -ENOENT;
+ return 0;
+}
+
/* DiSEqC Specific Parameters */
RESULT eDVBSatelliteEquipmentControl::setDiSEqCMode(int diseqcmode)
{
@@ -1197,6 +1223,46 @@ RESULT eDVBSatelliteEquipmentControl::setInputpowerDelta(int delta)
return 0;
}
+/* Unicable Specific Parameters */
+RESULT eDVBSatelliteEquipmentControl::setLNBSatCR(int SatCR_idx)
+{
+ eSecDebug("eDVBSatelliteEquipmentControl::setLNBSatCR(%d)", SatCR_idx);
+ if(!((SatCR_idx >=-1) && (SatCR_idx < MAX_SATCR)))
+ return -EPERM;
+ if ( currentLNBValid() )
+ m_lnbs[m_lnbidx].SatCR_idx = SatCR_idx;
+ else
+ return -ENOENT;
+ return 0;
+}
+
+RESULT eDVBSatelliteEquipmentControl::setLNBSatCRvco(int SatCRvco)
+{
+ eSecDebug("eDVBSatelliteEquipmentControl::setLNBSatCRvco(%d)", SatCRvco);
+ if(!((SatCRvco >= 950*1000) && (SatCRvco <= 2150*1000)))
+ return -EPERM;
+ if(!((m_lnbs[m_lnbidx].SatCR_idx >= 0) && (m_lnbs[m_lnbidx].SatCR_idx < MAX_SATCR)))
+ return -ENOENT;
+ if ( currentLNBValid() )
+ m_lnbs[m_lnbidx].SatCRvco = SatCRvco;
+ else
+ return -ENOENT;
+ return 0;
+}
+RESULT eDVBSatelliteEquipmentControl::getLNBSatCR()
+{
+ if ( currentLNBValid() )
+ return m_lnbs[m_lnbidx].SatCR_idx;
+ return -ENOENT;
+}
+
+RESULT eDVBSatelliteEquipmentControl::getLNBSatCRvco()
+{
+ if ( currentLNBValid() )
+ return m_lnbs[m_lnbidx].SatCRvco;
+ return -ENOENT;
+}
+
/* Satellite Specific Parameters */
RESULT eDVBSatelliteEquipmentControl::addSatellite(int orbital_position)
{
diff --git a/lib/dvb/sec.h b/lib/dvb/sec.h
index e68ed167..5bff6bf7 100644
--- a/lib/dvb/sec.h
+++ b/lib/dvb/sec.h
@@ -170,7 +170,7 @@ class eDVBSatelliteSwitchParameters
#endif
public:
enum t_22khz_signal { HILO=0, ON=1, OFF=2 }; // 22 Khz
- enum t_voltage_mode { HV=0, _14V=1, _18V=2, _0V=3 }; // 14/18 V
+ enum t_voltage_mode { HV=0, _14V=1, _18V=2, _0V=3, HV_13=4 }; // 14/18 V
#ifndef SWIG
t_voltage_mode m_voltage_mode;
t_22khz_signal m_22khz_signal;
@@ -231,7 +231,7 @@ public:
#ifndef SWIG
t_12V_relais_state m_12V_relais_state; // 12V relais output on/off
- __u8 slot_mask; // useable by slot ( 1 | 2 | 4...)
+ int m_slot_mask; // useable by slot ( 1 | 2 | 4...)
unsigned int m_lof_hi, // for 2 band universal lnb 10600 Mhz (high band offset frequency)
m_lof_lo, // for 2 band universal lnb 9750 Mhz (low band offset frequency)
@@ -242,7 +242,26 @@ public:
std::map<int, eDVBSatelliteSwitchParameters> m_satellites;
eDVBSatelliteDiseqcParameters m_diseqc_parameters;
eDVBSatelliteRotorParameters m_rotor_parameters;
+
+ int m_prio; // to override automatic tuner management ... -1 is Auto
#endif
+public:
+#define guard_offset_min -8000
+#define guard_offset_max 8000
+#define guard_offset_step 8000
+#define MAX_SATCR 8
+#define MAX_LNBNUM 32
+
+ int SatCR_idx;
+ unsigned int SatCRvco;
+ unsigned int UnicableTuningWord;
+ unsigned int UnicableConfigWord;
+ int old_frequency;
+ int old_polarisation;
+ int old_orbital_position;
+ int guard_offset_old;
+ int guard_offset;
+ int LNBNum;
};
class eDVBRegisteredFrontend;
@@ -304,6 +323,8 @@ public:
RESULT setLNBLOFH(int lofh);
RESULT setLNBThreshold(int threshold);
RESULT setLNBIncreasedVoltage(bool onoff);
+ RESULT setLNBPrio(int prio);
+ RESULT setLNBNum(int LNBNum);
/* DiSEqC Specific Parameters */
RESULT setDiSEqCMode(int diseqcmode);
RESULT setToneburst(int toneburst);
@@ -321,6 +342,12 @@ public:
RESULT setUseInputpower(bool onoff);
RESULT setInputpowerDelta(int delta); // delta between running and stopped rotor
RESULT setRotorTurningSpeed(int speed); // set turning speed..
+/* Unicable Specific Parameters */
+ RESULT setLNBSatCR(int SatCR_idx);
+ RESULT setLNBSatCRvco(int SatCRvco);
+// RESULT checkGuardOffset(const eDVBFrontendParametersSatellite &sat);
+ RESULT getLNBSatCR();
+ RESULT getLNBSatCRvco();
/* Satellite Specific Parameters */
RESULT addSatellite(int orbital_position);
RESULT setVoltageMode(int mode);