diff options
Diffstat (limited to 'lib/service/servicedvb.cpp')
| -rw-r--r-- | lib/service/servicedvb.cpp | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp new file mode 100644 index 00000000..fc48fa66 --- /dev/null +++ b/lib/service/servicedvb.cpp @@ -0,0 +1,154 @@ +#include <lib/base/eerror.h> +#include <lib/base/object.h> +#include <string> +#include <lib/service/servicedvb.h> +#include <lib/service/service.h> +#include <lib/base/init_num.h> +#include <lib/base/init.h> + +DEFINE_REF(eServiceFactoryDVB) + +eServiceFactoryDVB::eServiceFactoryDVB(): ref(0) +{ + ePtr<eServiceCenter> sc; + + eServiceCenter::getInstance(sc); + if (sc) + sc->addServiceFactory(eServiceFactoryDVB::id, this); +} + +eServiceFactoryDVB::~eServiceFactoryDVB() +{ + ePtr<eServiceCenter> sc; + + eServiceCenter::getInstance(sc); + if (sc) + sc->removeServiceFactory(eServiceFactoryDVB::id); +} + +RESULT eServiceFactoryDVB::play(const eServiceReference &ref, ePtr<iPlayableService> &ptr) +{ + RESULT res; + // check resources... + ptr = new eDVBServicePlay(ref); + res = ptr->start(); + if (res) + { + ptr = 0; + return res; + } + return 0; +} + +RESULT eServiceFactoryDVB::record(const eServiceReference &, ePtr<iRecordableService> &ptr) +{ + ptr = 0; + return -1; +} + +RESULT eServiceFactoryDVB::list(const eServiceReference &, ePtr<iListableService> &ptr) +{ + ptr = 0; + return -1; +} + +eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref): + ref(0), m_reference(ref) +{ + CONNECT(m_serviceHandler.serviceEvent, eDVBServicePlay::serviceEvent); + eDebug("DVB start (play)"); +} + +eDVBServicePlay::~eDVBServicePlay() +{ + eDebug("DVB stop (play)"); +} + +void eDVBServicePlay::serviceEvent(int event) +{ + eDebug("service event %d", event); + switch (event) + { + case eDVBServicePMTHandler::eventNewProgramInfo: + { + int vpid = -1, apid = -1, pcrpid = -1; + eDVBServicePMTHandler::program program; + if (m_serviceHandler.getProgramInfo(program)) + eDebug("getting program info failed."); + else + { + eDebugNoNewLine("have %d video stream(s)", program.videoStreams.size()); + if (!program.videoStreams.empty()) + { + eDebugNoNewLine(" ("); + for (std::vector<eDVBServicePMTHandler::videoStream>::const_iterator + i(program.videoStreams.begin()); + i != program.videoStreams.end(); ++i) + { + if (vpid == -1) + vpid = i->pid; + if (i != program.videoStreams.begin()) + eDebugNoNewLine(", "); + eDebugNoNewLine("%04x", i->pid); + } + eDebugNoNewLine(")"); + } + eDebugNoNewLine(", and %d audio stream(s)", program.audioStreams.size()); + if (!program.audioStreams.empty()) + { + eDebugNoNewLine(" ("); + for (std::vector<eDVBServicePMTHandler::audioStream>::const_iterator + i(program.audioStreams.begin()); + i != program.audioStreams.end(); ++i) + { + if (apid == -1) + apid = i->pid; + if (i != program.audioStreams.begin()) + eDebugNoNewLine(", "); + eDebugNoNewLine("%04x", i->pid); + } + eDebugNoNewLine(")"); + } + eDebug(", and the pcr pid is %04x", program.pcrPid); + if (program.pcrPid != 0x1fff) + pcrpid = program.pcrPid; + } + + if (!m_decoder) + { + ePtr<iDVBDemux> demux; + m_serviceHandler.getDemux(demux); + if (demux) + demux->getMPEGDecoder(m_decoder); + } + + if (m_decoder) + { + m_decoder->setVideoPID(vpid); + m_decoder->setAudioPID(apid, 0); + m_decoder->setSyncPCR(pcrpid); + m_decoder->start(); + } + + break; + } + } +} + +RESULT eDVBServicePlay::start() +{ + eDebug("starting DVB service"); + m_serviceHandler.tune((eServiceReferenceDVB&)m_reference); + return 0; +} + +RESULT eDVBServicePlay::getIPausableService(ePtr<iPauseableService> &ptr) +{ + // not yet possible, maybe later... + ptr = 0; + return -1; +} + +DEFINE_REF(eDVBServicePlay) + +eAutoInitP0<eServiceFactoryDVB> init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB"); |
