import of enigma2
[vuplus_dvbapp] / lib / service / servicedvb.cpp
1 #include <lib/base/eerror.h>
2 #include <lib/base/object.h>
3 #include <string>
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>
8
9 DEFINE_REF(eServiceFactoryDVB)
10
11 eServiceFactoryDVB::eServiceFactoryDVB(): ref(0)
12 {
13         ePtr<eServiceCenter> sc;
14         
15         eServiceCenter::getInstance(sc);
16         if (sc)
17                 sc->addServiceFactory(eServiceFactoryDVB::id, this);
18 }
19
20 eServiceFactoryDVB::~eServiceFactoryDVB()
21 {
22         ePtr<eServiceCenter> sc;
23         
24         eServiceCenter::getInstance(sc);
25         if (sc)
26                 sc->removeServiceFactory(eServiceFactoryDVB::id);
27 }
28
29 RESULT eServiceFactoryDVB::play(const eServiceReference &ref, ePtr<iPlayableService> &ptr)
30 {
31         RESULT res;
32                 // check resources...
33         ptr = new eDVBServicePlay(ref);
34         res = ptr->start();
35         if (res)
36         {
37                 ptr = 0;
38                 return res;
39         }
40         return 0;
41 }
42
43 RESULT eServiceFactoryDVB::record(const eServiceReference &, ePtr<iRecordableService> &ptr)
44 {
45         ptr = 0;
46         return -1;
47 }
48
49 RESULT eServiceFactoryDVB::list(const eServiceReference &, ePtr<iListableService> &ptr)
50 {
51         ptr = 0;
52         return -1;
53 }
54
55 eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref): 
56         ref(0), m_reference(ref)
57 {
58         CONNECT(m_serviceHandler.serviceEvent, eDVBServicePlay::serviceEvent);
59         eDebug("DVB start (play)");
60 }
61
62 eDVBServicePlay::~eDVBServicePlay()
63 {
64         eDebug("DVB stop (play)");
65 }
66
67 void eDVBServicePlay::serviceEvent(int event)
68 {
69         eDebug("service event %d", event);
70         switch (event)
71         {
72         case eDVBServicePMTHandler::eventNewProgramInfo:
73         {
74                 int vpid = -1, apid = -1, pcrpid = -1;
75                 eDVBServicePMTHandler::program program;
76                 if (m_serviceHandler.getProgramInfo(program))
77                         eDebug("getting program info failed.");
78                 else
79                 {
80                         eDebugNoNewLine("have %d video stream(s)", program.videoStreams.size());
81                         if (!program.videoStreams.empty())
82                         {
83                                 eDebugNoNewLine(" (");
84                                 for (std::vector<eDVBServicePMTHandler::videoStream>::const_iterator
85                                         i(program.videoStreams.begin()); 
86                                         i != program.videoStreams.end(); ++i)
87                                 {
88                                         if (vpid == -1)
89                                                 vpid = i->pid;
90                                         if (i != program.videoStreams.begin())
91                                                 eDebugNoNewLine(", ");
92                                         eDebugNoNewLine("%04x", i->pid);
93                                 }
94                                 eDebugNoNewLine(")");
95                         }
96                         eDebugNoNewLine(", and %d audio stream(s)", program.audioStreams.size());
97                         if (!program.audioStreams.empty())
98                         {
99                                 eDebugNoNewLine(" (");
100                                 for (std::vector<eDVBServicePMTHandler::audioStream>::const_iterator
101                                         i(program.audioStreams.begin()); 
102                                         i != program.audioStreams.end(); ++i)
103                                 {
104                                         if (apid == -1)
105                                                 apid = i->pid;
106                                         if (i != program.audioStreams.begin())
107                                                 eDebugNoNewLine(", ");
108                                         eDebugNoNewLine("%04x", i->pid);
109                                 }
110                                 eDebugNoNewLine(")");
111                         }
112                         eDebug(", and the pcr pid is %04x", program.pcrPid);
113                         if (program.pcrPid != 0x1fff)
114                                 pcrpid = program.pcrPid;
115                 }
116                 
117                 if (!m_decoder)
118                 {
119                         ePtr<iDVBDemux> demux;
120                         m_serviceHandler.getDemux(demux);
121                         if (demux)
122                                 demux->getMPEGDecoder(m_decoder);
123                 }
124
125                 if (m_decoder)
126                 {
127                         m_decoder->setVideoPID(vpid);
128                         m_decoder->setAudioPID(apid, 0);
129                         m_decoder->setSyncPCR(pcrpid);
130                         m_decoder->start();
131                 }
132                                 
133                 break;
134         }
135         }
136 }
137
138 RESULT eDVBServicePlay::start()
139 {
140         eDebug("starting DVB service");
141         m_serviceHandler.tune((eServiceReferenceDVB&)m_reference);
142         return 0;
143 }
144
145 RESULT eDVBServicePlay::getIPausableService(ePtr<iPauseableService> &ptr)
146 {
147                 // not yet possible, maybe later...
148         ptr = 0;
149         return -1;
150 }
151
152 DEFINE_REF(eDVBServicePlay)
153
154 eAutoInitP0<eServiceFactoryDVB> init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB");