aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Pluecken <stefan.pluecken@multimedia-labs.de>2008-11-24 23:52:26 +0100
committerStefan <stefan@tuxboxls.(none)>2008-12-16 19:55:34 +0100
commit1d07f28ae2ebe4fd075f24f601cd37770435eb52 (patch)
tree848ef44432256a55975652542cea25107fa2c6e2
parent216dbbfd18a36835b8a48d2f2e1e1ce2c65c8f14 (diff)
downloadenigma2-1d07f28ae2ebe4fd075f24f601cd37770435eb52.tar.gz
enigma2-1d07f28ae2ebe4fd075f24f601cd37770435eb52.zip
add onid/tsid polling
-rw-r--r--lib/dvb/dvb.cpp110
-rw-r--r--lib/python/Components/TuneTest.py28
2 files changed, 75 insertions, 63 deletions
diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp
index eac4554d..24609438 100644
--- a/lib/dvb/dvb.cpp
+++ b/lib/dvb/dvb.cpp
@@ -70,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);
@@ -104,7 +104,7 @@ eDVBAdapterLinux::eDVBAdapterLinux(int nr): m_nr(nr)
{
// scan frontends
int num_fe = 0;
-
+
eDebug("scanning for frontends..");
while (1)
{
@@ -133,7 +133,7 @@ eDVBAdapterLinux::eDVBAdapterLinux(int nr): m_nr(nr)
}
++num_fe;
}
-
+
// scan demux
int num_demux = 0;
while (1)
@@ -148,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;
}
}
@@ -169,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;
}
@@ -191,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;
}
@@ -224,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)
{
@@ -426,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 */
@@ -444,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;
}
}
@@ -467,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);
@@ -573,7 +573,7 @@ RESULT eDVBResourceManager::allocateChannel(const eDVBChannelID &channelid, eUse
}
/* allocate a frontend. */
-
+
ePtr<eDVBAllocatedFrontend> fe;
int err = allocateFrontend(fe, feparm, simulate);
@@ -999,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;
@@ -1064,9 +1064,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);
}
@@ -1082,14 +1082,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");
@@ -1118,7 +1118,7 @@ void eDVBChannel::frontendStateChanged(iDVBFrontend*fe)
ourstate = state_failed;
} else
eFatal("state unknown");
-
+
if (ourstate != m_state)
{
m_state = ourstate;
@@ -1235,7 +1235,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");
@@ -1306,7 +1306,7 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off
continue;
}
}
-
+
if (relative == 1) /* pts relative */
{
pts += now;
@@ -1317,7 +1317,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);
@@ -1332,7 +1332,7 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off
pts = nextap;
}
}
-
+
off_t offset = 0;
if (m_tstools.getOffset(offset, pts))
{
@@ -1350,7 +1350,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;
@@ -1449,7 +1449,7 @@ RESULT eDVBChannel::setChannel(const eDVBChannelID &channelid, ePtr<iDVBFrontend
{
if (m_channel_id)
m_mgr->removeChannel(this);
-
+
if (!channelid)
return 0;
@@ -1458,7 +1458,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;
@@ -1466,14 +1466,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;
}
@@ -1558,21 +1558,21 @@ RESULT eDVBChannel::requestTsidOnid(ePyObject callback)
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;
@@ -1605,12 +1605,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);
@@ -1671,11 +1671,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);
@@ -1686,7 +1686,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)
@@ -1694,9 +1694,9 @@ RESULT eDVBChannel::getCurrentPosition(iDVBDemux *decoding_demux, pts_t &pos, in
eDebug("fixup PTS failed");
return -1;
}
-
+
pos = now;
-
+
return 0;
}
@@ -1707,7 +1707,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.
@@ -1718,7 +1718,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();
@@ -1742,7 +1742,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/python/Components/TuneTest.py b/lib/python/Components/TuneTest.py
index 7b087b98..2d448e8f 100644
--- a/lib/python/Components/TuneTest.py
+++ b/lib/python/Components/TuneTest.py
@@ -51,21 +51,32 @@ class TuneTest:
self.tuner = Tuner(self.frontend)
self.timer = eTimer()
self.timer.callback.append(self.updateStatus)
+
+ def gotTsidOnid(self, tsid, onid):
+ print "******** got tsid, onid:", tsid, onid
+ self.tsid = tsid
+ self.onid = onid
+ if tsid is not None and onid is not None:
+ self.pidStatus = self.INTERNAL_PID_STATUS_SUCCESSFUL
+ else:
+ self.pidStatus = self.INTERNAL_PID_STATUS_FAILED
+ self.timer.start(100, True)
def updateStatus(self):
dict = {}
self.frontend.getFrontendStatus(dict)
- print "status:", dict
-
stop = False
+ print "status:", dict
if dict["tuner_state"] == "TUNING":
+ print "TUNING"
self.timer.start(100, True)
self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_TUNING, self.currTuned))
elif self.checkPIDs and self.pidStatus == self.INTERNAL_PID_STATUS_NOOP:
+ print "2nd choice"
if dict["tuner_state"] == "LOCKED":
print "acquiring TSID/ONID"
- # TODO start getting TSID/ONID
+ self.raw_channel.requestTsidOnid(self.gotTsidOnid)
self.pidStatus = self.INTERNAL_PID_STATUS_WAITING
else:
self.pidStatus = self.INTERNAL_PID_STATUS_FAILED
@@ -80,9 +91,7 @@ class TuneTest:
elif dict["tuner_state"] == "LOCKED":
pidsFailed = False
if self.checkPIDs:
- tsid = 0 # TODO read values
- onid = 0 # TODO read values
- if tsid != self.currTuned[8] or onid != self.currTuned[9]:
+ if self.tsid != self.currTuned[8] or self.onid != self.currTuned[9]:
self.failedTune.append([self.currTuned, self.oldTuned, "pids_failed"])
pidsFailes = True
elif not self.checkPIDs or (self.checkPids and not pidsFailed):
@@ -98,8 +107,11 @@ class TuneTest:
if not stop:
self.tune()
if self.tuningtransponder < len(self.transponderlist) and not stop:
- self.timer.start(100, True)
- print "restart timer"
+ if self.pidStatus != self.INTERNAL_PID_STATUS_WAITING:
+ self.timer.start(100, True)
+ print "restart timer"
+ else:
+ print "not restarting timers (waiting for pids)"
else:
self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_DONE, self.currTuned))
print "finishedChecking"