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();
131 RESULT seekChapter(int chapter);
133 // iServiceInformation
134 RESULT getName(std::string &name);
135 RESULT getEvent(ePtr<eServiceEvent> &evt, int nownext);
137 std::string getInfoString(int w);
138 PyObject *getInfoObject(int w);
140 // iAudioTrackSelection
141 int getNumberOfTracks();
142 RESULT selectTrack(unsigned int i);
143 RESULT getTrackInfo(struct iAudioTrackInfo &, unsigned int n);
144 int getCurrentTrack();
146 // iAudioChannelSelection
147 int getCurrentChannel();
148 RESULT selectChannel(int i);
151 std::string getText(int i=0);
152 void showRassSlidePicture();
153 void showRassInteractivePic(int page, int subpage);
154 ePyObject getRassInteractiveMask();
157 int getNumberOfSubservices();
158 RESULT getSubservice(eServiceReference &subservice, unsigned int n);
161 RESULT startTimeshift();
162 RESULT stopTimeshift();
163 int isTimeshiftActive();
164 RESULT activateTimeshift();
167 PyObject *getCutList();
168 void setCutList(SWIG_PYOBJECT(ePyObject));
169 void setCutListEnable(int enable);
172 RESULT enableSubtitles(eWidget *parent, SWIG_PYOBJECT(ePyObject) entry);
173 RESULT disableSubtitles(eWidget *parent);
174 PyObject *getSubtitleList();
175 PyObject *getCachedSubtitle();
180 void setAC3Delay(int);
181 void setPCMDelay(int);
183 // iStreamableService
184 RESULT stream(ePtr<iStreamableService> &ptr);
185 PyObject *getStreamingData();
187 friend class eServiceFactoryDVB;
188 eServiceReference m_reference;
190 ePtr<eDVBService> m_dvb_service;
192 ePtr<iTSMPEGDecoder> m_decoder;
194 int m_have_video_pid;
197 /* in timeshift mode, we essentially have two channels, and thus pmt handlers. */
198 eDVBServicePMTHandler m_service_handler_timeshift;
199 eDVBServiceEITHandler m_event_handler;
200 int m_current_audio_pid;
202 eDVBServicePlay(const eServiceReference &ref, eDVBService *service);
207 void serviceEvent(int event);
208 void serviceEventTimeshift(int event);
209 Signal2<void,iPlayableService*,int> m_event;
212 int m_is_pvr, m_is_paused, m_timeshift_enabled, m_timeshift_active;
213 int m_first_program_info;
215 std::string m_timeshift_file;
218 ePtr<iDVBDemux> m_decode_demux;
220 int m_current_audio_stream;
221 int selectAudioStream(int n = -1);
224 ePtr<iDVBTSRecorder> m_record;
225 std::set<int> m_pids_active;
227 void updateTimeshiftPids();
229 void switchToTimeshift();
231 void updateDecoder();
237 ePtr<eCueSheet> m_cue;
244 bool operator < (const struct cueEntry &o) const
246 return where < o.where;
248 cueEntry(const pts_t &where, unsigned int what) :
249 where(where), what(what)
254 std::multiset<cueEntry> m_cue_entries;
255 int m_cuesheet_changed, m_cutlist_enabled;
260 void cutlistToCuesheet();
262 eSubtitleWidget *m_subtitle_widget;
264 /* teletext subtitles */
265 ePtr<eDVBTeletextParser> m_teletext_parser;
266 void newSubtitlePage(const eDVBTeletextSubtitlePage &p);
267 ePtr<eConnection> m_new_subtitle_page_connection;
268 std::list<eDVBTeletextSubtitlePage> m_subtitle_pages;
271 ePtr<eDVBSubtitleParser> m_subtitle_parser;
272 void newDVBSubtitlePage(const eDVBSubtitlePage &p);
273 ePtr<eConnection> m_new_dvb_subtitle_page_connection;
274 std::list<eDVBSubtitlePage> m_dvb_subtitle_pages;
276 eTimer m_subtitle_sync_timer;
277 void checkSubtitleTiming();
280 ePtr<eDVBRdsDecoder> m_rds_decoder;
281 ePtr<eConnection> m_rds_decoder_event_connection;
282 void rdsDecoderEvent(int);
284 ePtr<eConnection> m_video_event_connection;
285 void video_event(struct iTSMPEGDecoder::videoEvent);
286 struct iTSMPEGDecoder::videoEvent m_videoEventData;
289 class eStaticServiceDVBBouquetInformation: public iStaticServiceInformation
291 DECLARE_REF(eStaticServiceDVBBouquetInformation);
292 eServiceReference m_playable_service;
294 eServiceReference &getPlayableService() { return m_playable_service; }
295 RESULT getName(const eServiceReference &ref, std::string &name);
296 int getLength(const eServiceReference &ref);
297 int isPlayable(const eServiceReference &ref, const eServiceReference &ignore);
298 RESULT getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &ptr, time_t start_time);