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; }
117 RESULT streamed(ePtr<iStreamedService> &ptr) { ptr = 0; return -1; }
122 RESULT setSlowMotion(int ratio);
123 RESULT setFastForward(int ratio);
126 RESULT getLength(pts_t &len);
127 RESULT seekTo(pts_t to);
128 RESULT seekRelative(int direction, pts_t to);
129 RESULT getPlayPosition(pts_t &pos);
130 RESULT setTrickmode(int trick=0);
131 RESULT isCurrentlySeekable();
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(bool swToLive=true);
163 int isTimeshiftActive();
164 RESULT activateTimeshift();
165 RESULT setNextPlaybackFile(const char *fn);
168 PyObject *getCutList();
169 void setCutList(SWIG_PYOBJECT(ePyObject));
170 void setCutListEnable(int enable);
173 RESULT enableSubtitles(eWidget *parent, SWIG_PYOBJECT(ePyObject) entry);
174 RESULT disableSubtitles(eWidget *parent);
175 PyObject *getSubtitleList();
176 PyObject *getCachedSubtitle();
181 void setAC3Delay(int);
182 void setPCMDelay(int);
184 // iStreamableService
185 RESULT stream(ePtr<iStreamableService> &ptr);
186 PyObject *getStreamingData();
187 void setQpipMode(bool value, bool audio);
190 friend class eServiceFactoryDVB;
191 eServiceReference m_reference;
193 ePtr<eDVBService> m_dvb_service;
195 ePtr<iTSMPEGDecoder> m_decoder;
198 int m_have_video_pid;
201 /* in timeshift mode, we essentially have two channels, and thus pmt handlers. */
202 eDVBServicePMTHandler m_service_handler_timeshift;
203 eDVBServiceEITHandler m_event_handler;
204 int m_current_audio_pid;
205 int m_current_video_pid_type;
210 eDVBServicePlay(const eServiceReference &ref, eDVBService *service, bool connect_event=true);
215 void serviceEvent(int event);
216 void serviceEventTimeshift(int event);
217 Signal2<void,iPlayableService*,int> m_event;
222 int m_is_pvr, m_is_paused, m_timeshift_enabled, m_timeshift_active, m_timeshift_changed;
223 int m_first_program_info;
225 std::string m_timeshift_file, m_timeshift_file_next;
227 ePtr<iDVBDemux> m_decode_demux;
229 int m_current_audio_stream;
230 int selectAudioStream(int n = -1);
231 RESULT setFastForward_internal(int ratio, bool final_seek=false);
234 ePtr<iDVBTSRecorder> m_record;
235 std::set<int> m_pids_active;
237 void updateTimeshiftPids();
238 virtual void switchToLive();
240 void resetTimeshift(int start);
241 void switchToTimeshift();
243 void updateDecoder(bool sendSeekableStateChanged=false);
251 ePtr<eCueSheet> m_cue;
258 bool operator < (const struct cueEntry &o) const
260 return where < o.where;
262 cueEntry(const pts_t &where, unsigned int what) :
263 where(where), what(what)
268 std::multiset<cueEntry> m_cue_entries;
269 int m_cuesheet_changed, m_cutlist_enabled;
274 void cutlistToCuesheet();
276 eSubtitleWidget *m_subtitle_widget;
278 /* teletext subtitles */
279 ePtr<eDVBTeletextParser> m_teletext_parser;
280 void newSubtitlePage(const eDVBTeletextSubtitlePage &p);
281 ePtr<eConnection> m_new_subtitle_page_connection;
282 std::list<eDVBTeletextSubtitlePage> m_subtitle_pages;
285 ePtr<eDVBSubtitleParser> m_subtitle_parser;
286 void newDVBSubtitlePage(const eDVBSubtitlePage &p);
287 ePtr<eConnection> m_new_dvb_subtitle_page_connection;
288 std::list<eDVBSubtitlePage> m_dvb_subtitle_pages;
290 ePtr<eTimer> m_subtitle_sync_timer;
291 void checkSubtitleTiming();
294 ePtr<eDVBRdsDecoder> m_rds_decoder;
295 ePtr<eConnection> m_rds_decoder_event_connection;
296 void rdsDecoderEvent(int);
298 ePtr<eConnection> m_video_event_connection;
299 void video_event(struct iTSMPEGDecoder::videoEvent);
301 virtual ePtr<iTsSource> createTsSource(eServiceReferenceDVB &ref);
304 class eStaticServiceDVBBouquetInformation: public iStaticServiceInformation
306 DECLARE_REF(eStaticServiceDVBBouquetInformation);
307 eServiceReference m_playable_service;
309 eServiceReference &getPlayableService() { return m_playable_service; }
310 RESULT getName(const eServiceReference &ref, std::string &name);
311 int getLength(const eServiceReference &ref);
312 int isPlayable(const eServiceReference &ref, const eServiceReference &ignore, bool simulate=false);
313 RESULT getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &ptr, time_t start_time);