add onid/tsid polling
authorStefan Pluecken <stefan.pluecken@multimedia-labs.de>
Mon, 24 Nov 2008 22:52:26 +0000 (23:52 +0100)
committerStefan <stefan@tuxboxls.(none)>
Tue, 16 Dec 2008 18:55:34 +0000 (19:55 +0100)
lib/dvb/dvb.cpp
lib/python/Components/TuneTest.py

index eac4554d1216bc0f5e35704b545a43134c010915..246094386ae834378a9b329fd0ab333c4a2303d6 100644 (file)
@@ -70,19 +70,19 @@ eDVBResourceManager::eDVBResourceManager()
 
        if (!instance)
                instance = this;
 
        if (!instance)
                instance = this;
-               
+
                /* search available adapters... */
 
                // add linux devices
                /* search available adapters... */
 
                // add linux devices
-       
+
        int num_adapter = 0;
        while (eDVBAdapterLinux::exist(num_adapter))
        {
                addAdapter(new eDVBAdapterLinux(num_adapter));
                num_adapter++;
        }
        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);
                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;
 {
                // scan frontends
        int num_fe = 0;
-       
+
        eDebug("scanning for frontends..");
        while (1)
        {
        eDebug("scanning for frontends..");
        while (1)
        {
@@ -133,7 +133,7 @@ eDVBAdapterLinux::eDVBAdapterLinux(int nr): m_nr(nr)
                }
                ++num_fe;
        }
                }
                ++num_fe;
        }
-       
+
                // scan demux
        int num_demux = 0;
        while (1)
                // 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;
                if (stat(filename, &s))
                        break;
                ePtr<eDVBDemux> demux;
-               
+
                demux = new eDVBDemux(m_nr, num_demux);
                m_demux.push_back(demux);
                demux = new eDVBDemux(m_nr, num_demux);
                m_demux.push_back(demux);
-                       
+
                ++num_demux;
        }
 }
                ++num_demux;
        }
 }
@@ -169,12 +169,12 @@ RESULT eDVBAdapterLinux::getDemux(ePtr<eDVBDemux> &demux, int nr)
                --nr;
                ++i;
        }
                --nr;
                ++i;
        }
-       
+
        if (i != m_demux.end())
                demux = *i;
        else
                return -1;
        if (i != m_demux.end())
                demux = *i;
        else
                return -1;
-               
+
        return 0;
 }
 
        return 0;
 }
 
@@ -191,12 +191,12 @@ RESULT eDVBAdapterLinux::getFrontend(ePtr<eDVBFrontend> &fe, int nr, bool simula
                --nr;
                ++i;
        }
                --nr;
                ++i;
        }
-       
+
        if (i != m_frontend.end())
                fe = *i;
        else
                return -1;
        if (i != m_frontend.end())
                fe = *i;
        else
                return -1;
-               
+
        return 0;
 }
 
        return 0;
 }
 
@@ -224,9 +224,9 @@ void eDVBResourceManager::addAdapter(iDVBAdapter *adapter)
 {
        int num_fe = adapter->getNumFrontends();
        int num_demux = adapter->getNumDemux();
 {
        int num_fe = adapter->getNumFrontends();
        int num_demux = adapter->getNumDemux();
-       
+
        m_adapter.push_back(adapter);
        m_adapter.push_back(adapter);
-       
+
        int i;
        for (i=0; i<num_demux; ++i)
        {
        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;
 
        if (i == m_demux.end())
                return -1;
-       
+
        ePtr<eDVBRegisteredDemux> unused;
        ePtr<eDVBRegisteredDemux> unused;
-       
+
        if (m_demux.size() < 5)
        {
                /* FIXME: hardware demux policy */
        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;
                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;
                        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;
                        if ((!in_use) && ((!fe) || (i->m_adapter == fe->m_adapter)))
                        {
                                if ((cap & iDVBChannel::capDecode) && !is_decode)
                                        continue;
-                               unused = i;     
+                               unused = i;
                                break;
                        }
                }
                                break;
                        }
                }
@@ -467,7 +467,7 @@ RESULT eDVBResourceManager::allocateDemux(eDVBRegisteredFrontend *fe, ePtr<eDVBA
                                        if (!unused)
                                                unused = i;
                                }
                                        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);
                                    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. */
        }
 
        /* allocate a frontend. */
-       
+
        ePtr<eDVBAllocatedFrontend> fe;
 
        int err = allocateFrontend(fe, feparm, simulate);
        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)
                        {
 
                        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;
                                           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_frontend = frontend;
 
        m_pvr_thread = 0;
-       
+
        m_skipmode_n = m_skipmode_m = 0;
        m_skipmode_n = m_skipmode_m = 0;
-       
+
        if (m_frontend)
                m_frontend->get().connectStateChange(slot(*this, &eDVBChannel::frontendStateChanged), m_conn_frontendStateChanged);
 }
        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;
 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 we are already in shutdown, don't change state. */
        if (m_state == state_release)
                return;
-       
+
        if (fe->getState(state))
                return;
        if (fe->getState(state))
                return;
-       
+
        if (state == iDVBFrontend::stateLock)
        {
                eDebug("OURSTATE: ok");
        if (state == iDVBFrontend::stateLock)
        {
                eDebug("OURSTATE: ok");
@@ -1118,7 +1118,7 @@ void eDVBChannel::frontendStateChanged(iDVBFrontend*fe)
                ourstate = state_failed;
        } else
                eFatal("state unknown");
                ourstate = state_failed;
        } else
                eFatal("state unknown");
-       
+
        if (ourstate != m_state)
        {
                m_state = ourstate;
        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);
        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");
        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;
                        }
                }
                                continue;
                        }
                }
-               
+
                if (relative == 1) /* pts relative */
                {
                        pts += now;
                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)
                        if (pts < 0)
                                pts = 0;
-               
+
                if (relative == 2) /* AP relative */
                {
                        eDebug("AP relative seeking: %lld, at %lld", pts, now);
                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;
                        }
                }
                                pts = nextap;
                        }
                }
-               
+
                off_t offset = 0;
                if (m_tstools.getOffset(offset, pts))
                {
                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);
        {
                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;
                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 (m_channel_id)
                m_mgr->removeChannel(this);
-               
+
        if (!channelid)
                return 0;
 
        if (!channelid)
                return 0;
 
@@ -1458,7 +1458,7 @@ RESULT eDVBChannel::setChannel(const eDVBChannelID &channelid, ePtr<iDVBFrontend
                eDebug("no frontend to tune!");
                return -ENODEV;
        }
                eDebug("no frontend to tune!");
                return -ENODEV;
        }
-       
+
        m_channel_id = channelid;
        m_mgr->addChannel(channelid, this);
        m_state = state_tuning;
        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;
        int res;
        res = m_frontend->get().tune(*feparm);
        m_current_frontend_parameters = feparm;
-       
+
        if (res)
        {
                m_state = state_release;
                m_stateChanged(this);
                return res;
        }
        if (res)
        {
                m_state = state_release;
                m_stateChanged(this);
                return res;
        }
-       
+
        return 0;
 }
 
        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;
 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 (!our_demux)
        {
                demux = 0;
-               
+
                if (m_mgr->allocateDemux(m_frontend ? (eDVBRegisteredFrontend*)*m_frontend : (eDVBRegisteredFrontend*)0, our_demux, cap))
                        return -1;
        }
                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. */
        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',
                /* 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;
                   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;
        }
                delete m_pvr_thread;
                m_pvr_thread = 0;
        }
-       
+
        m_tstools.openFile(file);
        m_tstools.openFile(file);
-       
+
                /* DON'T EVEN THINK ABOUT FIXING THIS. FIX THE ATI SOURCES FIRST,
                   THEN DO A REAL FIX HERE! */
                /* 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);
                /* (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;
 {
        if (!decoding_demux)
                return -1;
-       
+
        pts_t now;
        pts_t now;
-       
+
        int r;
        int r;
-       
+
        if (mode == 0) /* demux */
        {
                r = decoding_demux->getSTC(now, 0);
        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 */
                }
        } else
                now = pos; /* fixup supplied */
-       
+
        off_t off = 0; /* TODO: fixme */
        r = m_tstools.fixupPTS(off, now);
        if (r)
        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;
        }
                eDebug("fixup PTS failed");
                return -1;
        }
-       
+
        pos = now;
        pos = now;
-       
+
        return 0;
 }
 
        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)
                           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.
                           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);
        m_pvr_thread->flush();
                /* HACK: flush PVR buffer */
        ::ioctl(m_pvr_fd_dst, 0);
-       
+
                /* flush ratebuffers (video, audio) */
        if (decoding_demux)
                decoding_demux->flush();
                /* 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);
 }
        m_lock.Unlock();
        m_event(evtSeek);
 }
-       
+
 void eCueSheet::clear()
 {
        m_lock.WrLock();
 void eCueSheet::clear()
 {
        m_lock.WrLock();
index 7b087b9823ec744aed1de4ef4befb67e1bcfa4aa..2d448e8f2b8edb8533b6ab29d52698630b3dc8a2 100644 (file)
@@ -51,21 +51,32 @@ class TuneTest:
                self.tuner = Tuner(self.frontend)
                self.timer = eTimer()
                self.timer.callback.append(self.updateStatus)
                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)
                        
        def updateStatus(self):
                dict = {}
                self.frontend.getFrontendStatus(dict)
-               print "status:", dict
-
                stop = False
                
                stop = False
                
+               print "status:", dict
                if dict["tuner_state"] == "TUNING":
                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:
                        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"
                        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
                                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:
                        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):  
                                                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:
                        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"
                else:
                        self.progressCallback((len(self.transponderlist), self.tuningtransponder, self.STATUS_DONE, self.currTuned))
                        print "finishedChecking"