4 #include <lib/service/iservice.h>
5 #include <lib/dvb/idvb.h>
7 #include <lib/dvb/pmt.h>
8 #include <lib/dvb/eit.h>
9 #include <lib/dvb/subtitle.h>
10 #include <lib/dvb/teletext.h>
11 #include <lib/dvb/radiotext.h>
12 #include <lib/base/filepush.h>
14 class eStaticServiceDVBInformation;
15 class eStaticServiceDVBBouquetInformation;
17 class eServiceFactoryDVB: public iServiceHandler
19 DECLARE_REF(eServiceFactoryDVB);
20 ePtr<eStaticServiceDVBInformation> m_StaticServiceDVBInfo;
21 ePtr<eStaticServiceDVBBouquetInformation> m_StaticServiceDVBBouquetInfo;
24 virtual ~eServiceFactoryDVB();
28 RESULT play(const eServiceReference &, ePtr<iPlayableService> &ptr);
29 RESULT record(const eServiceReference &, ePtr<iRecordableService> &ptr);
30 RESULT list(const eServiceReference &, ePtr<iListableService> &ptr);
31 RESULT info(const eServiceReference &, ePtr<iStaticServiceInformation> &ptr);
32 RESULT offlineOperations(const eServiceReference &, ePtr<iServiceOfflineOperations> &ptr);
34 RESULT lookupService(ePtr<eDVBService> &ptr, const eServiceReference &ref);
39 class eDVBServiceList: public iListableService, public iMutableServiceList
41 DECLARE_REF(eDVBServiceList);
43 virtual ~eDVBServiceList();
44 PyObject *getContent(const char* formatstr, bool sorted=false);
45 RESULT getContent(std::list<eServiceReference> &list, bool sorted=false);
46 RESULT getNext(eServiceReference &ptr);
47 inline int compareLessEqual(const eServiceReference &a, const eServiceReference &b);
49 RESULT startEdit(ePtr<iMutableServiceList> &);
50 RESULT flushChanges();
51 RESULT addService(eServiceReference &ref, eServiceReference before);
52 RESULT removeService(eServiceReference &ref);
53 RESULT moveService(eServiceReference &ref, int pos);
54 RESULT setListName(const std::string &name);
57 eServiceReference m_parent;
58 friend class eServiceFactoryDVB;
59 eDVBServiceList(const eServiceReference &parent);
60 ePtr<iDVBChannelListQuery> m_query;
62 /* for editing purposes. WARNING: lifetime issue! */
66 inline int eDVBServiceList::compareLessEqual(const eServiceReference &a, const eServiceReference &b)
68 return m_query->compareLessEqual((const eServiceReferenceDVB&)a, (const eServiceReferenceDVB&)b);
71 class eDVBServiceBase: public iFrontendInformation
74 eDVBServicePMTHandler m_service_handler;
76 // iFrontendInformation
77 int getFrontendInfo(int w);
78 PyObject *getFrontendData();
79 PyObject *getFrontendStatus();
80 PyObject *getTransponderData(bool);
81 PyObject *getAll(bool original); // a sum of getFrontendData/Status/TransponderData
84 class eSubtitleWidget;
86 class eDVBServicePlay: public eDVBServiceBase,
87 public iPlayableService, public iPauseableService,
88 public iSeekableService, public Object, public iServiceInformation,
89 public iAudioTrackSelection, public iAudioChannelSelection,
90 public iSubserviceList, public iTimeshiftService,
91 public iCueSheet, public iSubtitleOutput, public iAudioDelay,
92 public iRdsDecoder, public iStreamableService
94 DECLARE_REF(eDVBServicePlay);
96 virtual ~eDVBServicePlay();
99 RESULT connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection);
102 RESULT setTarget(int target);
104 RESULT seek(ePtr<iSeekableService> &ptr);
105 RESULT pause(ePtr<iPauseableService> &ptr);
106 RESULT info(ePtr<iServiceInformation> &ptr);
107 RESULT audioChannel(ePtr<iAudioChannelSelection> &ptr);
108 RESULT audioTracks(ePtr<iAudioTrackSelection> &ptr);
109 RESULT frontendInfo(ePtr<iFrontendInformation> &ptr);
110 RESULT subServices(ePtr<iSubserviceList> &ptr);
111 RESULT timeshift(ePtr<iTimeshiftService> &ptr);
112 RESULT cueSheet(ePtr<iCueSheet> &ptr);
113 RESULT subtitle(ePtr<iSubtitleOutput> &ptr);
114 RESULT audioDelay(ePtr<iAudioDelay> &ptr);
115 RESULT rdsDecoder(ePtr<iRdsDecoder> &ptr);
116 RESULT keys(ePtr<iServiceKeys> &ptr) { ptr = 0; return -1; }
121 RESULT setSlowMotion(int ratio);
122 RESULT setFastForward(int ratio);
125 RESULT getLength(pts_t &len);
126 RESULT seekTo(pts_t to);
127 RESULT seekRelative(int direction, pts_t to);
128 RESULT getPlayPosition(pts_t &pos);
129 RESULT setTrickmode(int trick=0);
130 RESULT isCurrentlySeekable();
132 // iServiceInformation
133 RESULT getName(std::string &name);
134 RESULT getEvent(ePtr<eServiceEvent> &evt, int nownext);
136 std::string getInfoString(int w);
137 PyObject *getInfoObject(int w);
139 // iAudioTrackSelection
140 int getNumberOfTracks();
141 RESULT selectTrack(unsigned int i);
142 RESULT getTrackInfo(struct iAudioTrackInfo &, unsigned int n);
143 int getCurrentTrack();
145 // iAudioChannelSelection
146 int getCurrentChannel();
147 RESULT selectChannel(int i);
150 std::string getText(int i=0);
151 void showRassSlidePicture();
152 void showRassInteractivePic(int page, int subpage);
153 ePyObject getRassInteractiveMask();
156 int getNumberOfSubservices();
157 RESULT getSubservice(eServiceReference &subservice, unsigned int n);
160 RESULT startTimeshift();
161 RESULT stopTimeshift();
162 int isTimeshiftActive();
163 RESULT activateTimeshift();
166 PyObject *getCutList();
167 void setCutList(SWIG_PYOBJECT(ePyObject));
168 void setCutListEnable(int enable);
171 RESULT enableSubtitles(eWidget *parent, SWIG_PYOBJECT(ePyObject) entry);
172 RESULT disableSubtitles(eWidget *parent);
173 PyObject *getSubtitleList();
174 PyObject *getCachedSubtitle();
179 void setAC3Delay(int);
180 void setPCMDelay(int);
182 // iStreamableService
183 RESULT stream(ePtr<iStreamableService> &ptr);
184 PyObject *getStreamingData();
186 friend class eServiceFactoryDVB;
187 eServiceReference m_reference;
189 ePtr<eDVBService> m_dvb_service;
191 ePtr<iTSMPEGDecoder> m_decoder;
193 int m_have_video_pid;
196 /* in timeshift mode, we essentially have two channels, and thus pmt handlers. */
197 eDVBServicePMTHandler m_service_handler_timeshift;
198 eDVBServiceEITHandler m_event_handler;
199 int m_current_audio_pid;
201 eDVBServicePlay(const eServiceReference &ref, eDVBService *service);
206 void serviceEvent(int event);
207 void serviceEventTimeshift(int event);
208 Signal2<void,iPlayableService*,int> m_event;
211 int m_is_pvr, m_is_paused, m_timeshift_enabled, m_timeshift_active;
212 int m_first_program_info;
214 std::string m_timeshift_file;
217 ePtr<iDVBDemux> m_decode_demux;
219 int m_current_audio_stream;
220 int selectAudioStream(int n = -1);
223 ePtr<iDVBTSRecorder> m_record;
224 std::set<int> m_pids_active;
226 void updateTimeshiftPids();
228 void switchToTimeshift();
230 void updateDecoder();
236 ePtr<eCueSheet> m_cue;
243 bool operator < (const struct cueEntry &o) const
245 return where < o.where;
247 cueEntry(const pts_t &where, unsigned int what) :
248 where(where), what(what)
253 std::multiset<cueEntry> m_cue_entries;
254 int m_cuesheet_changed, m_cutlist_enabled;
259 void cutlistToCuesheet();
261 eSubtitleWidget *m_subtitle_widget;
263 /* teletext subtitles */
264 ePtr<eDVBTeletextParser> m_teletext_parser;
265 void newSubtitlePage(const eDVBTeletextSubtitlePage &p);
266 ePtr<eConnection> m_new_subtitle_page_connection;
267 std::list<eDVBTeletextSubtitlePage> m_subtitle_pages;
270 ePtr<eDVBSubtitleParser> m_subtitle_parser;
271 void newDVBSubtitlePage(const eDVBSubtitlePage &p);
272 ePtr<eConnection> m_new_dvb_subtitle_page_connection;
273 std::list<eDVBSubtitlePage> m_dvb_subtitle_pages;
275 ePtr<eTimer> m_subtitle_sync_timer;
276 void checkSubtitleTiming();
279 ePtr<eDVBRdsDecoder> m_rds_decoder;
280 ePtr<eConnection> m_rds_decoder_event_connection;
281 void rdsDecoderEvent(int);
283 ePtr<eConnection> m_video_event_connection;
284 void video_event(struct iTSMPEGDecoder::videoEvent);
287 class eStaticServiceDVBBouquetInformation: public iStaticServiceInformation
289 DECLARE_REF(eStaticServiceDVBBouquetInformation);
290 eServiceReference m_playable_service;
292 eServiceReference &getPlayableService() { return m_playable_service; }
293 RESULT getName(const eServiceReference &ref, std::string &name);
294 int getLength(const eServiceReference &ref);
295 int isPlayable(const eServiceReference &ref, const eServiceReference &ignore, bool simulate=false);
296 RESULT getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &ptr, time_t start_time);