1 #include <lib/base/eerror.h>
2 #include <lib/base/object.h>
4 #include <lib/service/servicedvb.h>
5 #include <lib/service/service.h>
6 #include <lib/base/init_num.h>
7 #include <lib/base/init.h>
9 DEFINE_REF(eServiceFactoryDVB)
11 eServiceFactoryDVB::eServiceFactoryDVB(): ref(0)
13 ePtr<eServiceCenter> sc;
15 eServiceCenter::getInstance(sc);
17 sc->addServiceFactory(eServiceFactoryDVB::id, this);
20 eServiceFactoryDVB::~eServiceFactoryDVB()
22 ePtr<eServiceCenter> sc;
24 eServiceCenter::getInstance(sc);
26 sc->removeServiceFactory(eServiceFactoryDVB::id);
29 RESULT eServiceFactoryDVB::play(const eServiceReference &ref, ePtr<iPlayableService> &ptr)
33 ptr = new eDVBServicePlay(ref);
43 RESULT eServiceFactoryDVB::record(const eServiceReference &, ePtr<iRecordableService> &ptr)
49 RESULT eServiceFactoryDVB::list(const eServiceReference &, ePtr<iListableService> &ptr)
55 eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref):
56 ref(0), m_reference(ref)
58 CONNECT(m_serviceHandler.serviceEvent, eDVBServicePlay::serviceEvent);
59 eDebug("DVB start (play)");
62 eDVBServicePlay::~eDVBServicePlay()
64 eDebug("DVB stop (play)");
67 void eDVBServicePlay::serviceEvent(int event)
69 eDebug("service event %d", event);
72 case eDVBServicePMTHandler::eventNewProgramInfo:
74 int vpid = -1, apid = -1, pcrpid = -1;
75 eDVBServicePMTHandler::program program;
76 if (m_serviceHandler.getProgramInfo(program))
77 eDebug("getting program info failed.");
80 eDebugNoNewLine("have %d video stream(s)", program.videoStreams.size());
81 if (!program.videoStreams.empty())
83 eDebugNoNewLine(" (");
84 for (std::vector<eDVBServicePMTHandler::videoStream>::const_iterator
85 i(program.videoStreams.begin());
86 i != program.videoStreams.end(); ++i)
90 if (i != program.videoStreams.begin())
91 eDebugNoNewLine(", ");
92 eDebugNoNewLine("%04x", i->pid);
96 eDebugNoNewLine(", and %d audio stream(s)", program.audioStreams.size());
97 if (!program.audioStreams.empty())
99 eDebugNoNewLine(" (");
100 for (std::vector<eDVBServicePMTHandler::audioStream>::const_iterator
101 i(program.audioStreams.begin());
102 i != program.audioStreams.end(); ++i)
106 if (i != program.audioStreams.begin())
107 eDebugNoNewLine(", ");
108 eDebugNoNewLine("%04x", i->pid);
110 eDebugNoNewLine(")");
112 eDebug(", and the pcr pid is %04x", program.pcrPid);
113 if (program.pcrPid != 0x1fff)
114 pcrpid = program.pcrPid;
119 ePtr<iDVBDemux> demux;
120 m_serviceHandler.getDemux(demux);
122 demux->getMPEGDecoder(m_decoder);
127 m_decoder->setVideoPID(vpid);
128 m_decoder->setAudioPID(apid, 0);
129 m_decoder->setSyncPCR(pcrpid);
138 RESULT eDVBServicePlay::start()
140 eDebug("starting DVB service");
141 m_serviceHandler.tune((eServiceReferenceDVB&)m_reference);
145 RESULT eDVBServicePlay::getIPausableService(ePtr<iPauseableService> &ptr)
147 // not yet possible, maybe later...
152 DEFINE_REF(eDVBServicePlay)
154 eAutoInitP0<eServiceFactoryDVB> init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB");