diff options
| author | ghost <andreas.monzner@multimedia-labs.de> | 2008-11-24 22:04:28 +0100 |
|---|---|---|
| committer | ghost <andreas.monzner@multimedia-labs.de> | 2008-11-24 22:04:28 +0100 |
| commit | 08d4f4729ac8c417f767628ef521dc71f232cf98 (patch) | |
| tree | 6670152cd65a041b4e2329196d1dd499fb94aa36 /lib | |
| parent | 14cf6c3b6887b94bcdd65ee251207d9309e2ae24 (diff) | |
| download | enigma2-08d4f4729ac8c417f767628ef521dc71f232cf98.tar.gz enigma2-08d4f4729ac8c417f767628ef521dc71f232cf98.zip | |
add possibility to request tsid/onid for iDVBChannel
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/dvb/dvb.cpp | 53 | ||||
| -rw-r--r-- | lib/dvb/dvb.h | 11 | ||||
| -rw-r--r-- | lib/dvb/idvb.h | 1 |
3 files changed, 65 insertions, 0 deletions
diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp index 66ec1d2d..fd509d5d 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> @@ -1499,6 +1500,58 @@ RESULT eDVBChannel::setCIRouting(const eDVBCIRouting &routing) return -1; } +void eDVBChannel::SDTready(int result) +{ + ePyObject args = PyTuple_New(2); + 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); + } + PyObject_CallObject(m_tsid_onid_callback, args); + 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 + { + 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; 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/idvb.h b/lib/dvb/idvb.h index cda05894..5fc633aa 100644 --- a/lib/dvb/idvb.h +++ b/lib/dvb/idvb.h @@ -504,6 +504,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 { |
