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);
120 RESULT setSlowMotion(int ratio);
121 RESULT setFastForward(int ratio);
124 RESULT getLength(pts_t &len);
125 RESULT seekTo(pts_t to);
126 RESULT seekRelative(int direction, pts_t to);
127 RESULT getPlayPosition(pts_t &pos);
128 RESULT setTrickmode(int trick=0);
129 RESULT isCurrentlySeekable();
131 // iServiceInformation
132 RESULT getName(std::string &name);
133 RESULT getEvent(ePtr<eServiceEvent> &evt, int nownext);
135 std::string getInfoString(int w);
136 PyObject *getInfoObject(int w);
138 // iAudioTrackSelection
139 int getNumberOfTracks();
140 RESULT selectTrack(unsigned int i);
141 RESULT getTrackInfo(struct iAudioTrackInfo &, unsigned int n);
143 // iAudioChannelSelection
144 int getCurrentChannel();
145 RESULT selectChannel(int i);
148 std::string getText(int i=0);
149 void showRassSlidePicture();
150 void showRassInteractivePic(int page, int subpage);
151 ePyObject getRassInteractiveMask();
154 int getNumberOfSubservices();
155 RESULT getSubservice(eServiceReference &subservice, unsigned int n);
158 RESULT startTimeshift();
159 RESULT stopTimeshift();
160 int isTimeshiftActive();
161 RESULT activateTimeshift();
164 PyObject *getCutList();
165 void setCutList(SWIG_PYOBJECT(ePyObject));
166 void setCutListEnable(int enable);
169 RESULT enableSubtitles(eWidget *parent, SWIG_PYOBJECT(ePyObject) entry);
170 RESULT disableSubtitles(eWidget *parent);
171 PyObject *getSubtitleList();
172 PyObject *getCachedSubtitle();
177 void setAC3Delay(int);
178 void setPCMDelay(int);
180 // iStreamableService
181 RESULT stream(ePtr<iStreamableService> &ptr);
182 PyObject *getStreamingData();
184 friend class eServiceFactoryDVB;
185 eServiceReference m_reference;
187 ePtr<eDVBService> m_dvb_service;
189 ePtr<iTSMPEGDecoder> m_decoder;
191 int m_have_video_pid;
194 /* in timeshift mode, we essentially have two channels, and thus pmt handlers. */
195 eDVBServicePMTHandler m_service_handler_timeshift;
196 eDVBServiceEITHandler m_event_handler;
198 eDVBServicePlay(const eServiceReference &ref, eDVBService *service);
203 void serviceEvent(int event);
204 void serviceEventTimeshift(int event);
205 Signal2<void,iPlayableService*,int> m_event;
208 int m_is_pvr, m_is_paused, m_timeshift_enabled, m_timeshift_active;
209 int m_first_program_info;
211 std::string m_timeshift_file;
214 ePtr<iDVBDemux> m_decode_demux;
216 int m_current_audio_stream;
217 int selectAudioStream(int n);
220 ePtr<iDVBTSRecorder> m_record;
221 std::set<int> m_pids_active;
223 void updateTimeshiftPids();
225 void switchToTimeshift();
227 void updateDecoder();
233 ePtr<eCueSheet> m_cue;
240 bool operator < (const struct cueEntry &o) const
242 return where < o.where;
244 cueEntry(const pts_t &where, unsigned int what) :
245 where(where), what(what)
250 std::multiset<cueEntry> m_cue_entries;
251 int m_cuesheet_changed, m_cutlist_enabled;
256 void cutlistToCuesheet();
258 eSubtitleWidget *m_subtitle_widget;
260 /* teletext subtitles */
261 ePtr<eDVBTeletextParser> m_teletext_parser;
262 void newSubtitlePage(const eDVBTeletextSubtitlePage &p);
263 ePtr<eConnection> m_new_subtitle_page_connection;
264 std::list<eDVBTeletextSubtitlePage> m_subtitle_pages;
267 ePtr<eDVBSubtitleParser> m_subtitle_parser;
268 void newDVBSubtitlePage(const eDVBSubtitlePage &p);
269 ePtr<eConnection> m_new_dvb_subtitle_page_connection;
270 std::list<eDVBSubtitlePage> m_dvb_subtitle_pages;
272 eTimer m_subtitle_sync_timer;
273 void checkSubtitleTiming();
276 ePtr<eDVBRdsDecoder> m_rds_decoder;
277 ePtr<eConnection> m_rds_decoder_event_connection;
278 void rdsDecoderEvent(int);
280 ePtr<eConnection> m_video_event_connection;
281 void video_event(struct iTSMPEGDecoder::videoEvent);
282 struct iTSMPEGDecoder::videoEvent m_videoEventData;
285 class eStaticServiceDVBBouquetInformation: public iStaticServiceInformation
287 DECLARE_REF(eStaticServiceDVBBouquetInformation);
288 eServiceReference m_playable_service;
290 eServiceReference &getPlayableService() { return m_playable_service; }
291 RESULT getName(const eServiceReference &ref, std::string &name);
292 int getLength(const eServiceReference &ref);
293 int isPlayable(const eServiceReference &ref, const eServiceReference &ignore);
294 RESULT getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &ptr, time_t start_time);