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(bool);
81 class eSubtitleWidget;
83 class eDVBServicePlay: public eDVBServiceBase,
84 public iPlayableService, public iPauseableService,
85 public iSeekableService, public Object, public iServiceInformation,
86 public iAudioTrackSelection, public iAudioChannelSelection,
87 public iSubserviceList, public iTimeshiftService,
88 public iCueSheet, public iSubtitleOutput, public iAudioDelay,
91 DECLARE_REF(eDVBServicePlay);
93 virtual ~eDVBServicePlay();
96 RESULT connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection);
99 RESULT setTarget(int target);
101 RESULT seek(ePtr<iSeekableService> &ptr);
102 RESULT pause(ePtr<iPauseableService> &ptr);
103 RESULT info(ePtr<iServiceInformation> &ptr);
104 RESULT audioChannel(ePtr<iAudioChannelSelection> &ptr);
105 RESULT audioTracks(ePtr<iAudioTrackSelection> &ptr);
106 RESULT frontendInfo(ePtr<iFrontendInformation> &ptr);
107 RESULT subServices(ePtr<iSubserviceList> &ptr);
108 RESULT timeshift(ePtr<iTimeshiftService> &ptr);
109 RESULT cueSheet(ePtr<iCueSheet> &ptr);
110 RESULT subtitle(ePtr<iSubtitleOutput> &ptr);
111 RESULT audioDelay(ePtr<iAudioDelay> &ptr);
112 RESULT radioText(ePtr<iRadioText> &ptr);
117 RESULT setSlowMotion(int ratio);
118 RESULT setFastForward(int ratio);
121 RESULT getLength(pts_t &len);
122 RESULT seekTo(pts_t to);
123 RESULT seekRelative(int direction, pts_t to);
124 RESULT getPlayPosition(pts_t &pos);
125 RESULT setTrickmode(int trick=0);
126 RESULT isCurrentlySeekable();
128 // iServiceInformation
129 RESULT getName(std::string &name);
130 RESULT getEvent(ePtr<eServiceEvent> &evt, int nownext);
132 std::string getInfoString(int w);
133 PyObject *getInfoObject(int w);
135 // iAudioTrackSelection
136 int getNumberOfTracks();
137 RESULT selectTrack(unsigned int i);
138 RESULT getTrackInfo(struct iAudioTrackInfo &, unsigned int n);
140 // iAudioChannelSelection
141 int getCurrentChannel();
142 RESULT selectChannel(int i);
145 std::string getRadioText(int i=0);
148 int getNumberOfSubservices();
149 RESULT getSubservice(eServiceReference &subservice, unsigned int n);
152 RESULT startTimeshift();
153 RESULT stopTimeshift();
154 int isTimeshiftActive();
155 RESULT activateTimeshift();
158 PyObject *getCutList();
159 void setCutList(SWIG_PYOBJECT(ePyObject));
160 void setCutListEnable(int enable);
163 RESULT enableSubtitles(eWidget *parent, SWIG_PYOBJECT(ePyObject) entry);
164 RESULT disableSubtitles(eWidget *parent);
165 PyObject *getSubtitleList();
166 PyObject *getCachedSubtitle();
171 void setAC3Delay(int);
172 void setPCMDelay(int);
175 friend class eServiceFactoryDVB;
176 eServiceReference m_reference;
178 ePtr<eDVBService> m_dvb_service;
180 ePtr<iTSMPEGDecoder> m_decoder;
182 int m_have_video_pid;
184 /* in timeshift mode, we essentially have two channels, and thus pmt handlers. */
185 eDVBServicePMTHandler m_service_handler_timeshift;
186 eDVBServiceEITHandler m_event_handler;
188 eDVBServicePlay(const eServiceReference &ref, eDVBService *service);
193 void serviceEvent(int event);
194 void serviceEventTimeshift(int event);
195 Signal2<void,iPlayableService*,int> m_event;
198 int m_is_pvr, m_is_paused, m_timeshift_enabled, m_timeshift_active;
199 int m_first_program_info;
201 std::string m_timeshift_file;
204 ePtr<iDVBDemux> m_decode_demux;
206 int m_current_audio_stream;
207 int selectAudioStream(int n);
210 ePtr<iDVBTSRecorder> m_record;
211 std::set<int> m_pids_active;
213 void updateTimeshiftPids();
215 void switchToTimeshift();
217 void updateDecoder();
223 ePtr<eCueSheet> m_cue;
230 bool operator < (const struct cueEntry &o) const
232 return where < o.where;
234 cueEntry(const pts_t &where, unsigned int what) :
235 where(where), what(what)
240 std::multiset<cueEntry> m_cue_entries;
241 int m_cuesheet_changed, m_cutlist_enabled;
246 void cutlistToCuesheet();
248 eSubtitleWidget *m_subtitle_widget;
250 /* teletext subtitles */
251 ePtr<eDVBTeletextParser> m_teletext_parser;
252 void newSubtitlePage(const eDVBTeletextSubtitlePage &p);
253 ePtr<eConnection> m_new_subtitle_page_connection;
254 std::list<eDVBTeletextSubtitlePage> m_subtitle_pages;
257 ePtr<eDVBSubtitleParser> m_subtitle_parser;
258 void newDVBSubtitlePage(const eDVBSubtitlePage &p);
259 ePtr<eConnection> m_new_dvb_subtitle_page_connection;
260 std::list<eDVBSubtitlePage> m_dvb_subtitle_pages;
262 eTimer m_subtitle_sync_timer;
263 void checkSubtitleTiming();
266 ePtr<eDVBRadioTextParser> m_radiotext_parser;
267 ePtr<eConnection> m_radiotext_updated_connection;
268 void radioTextUpdated();
271 class eStaticServiceDVBBouquetInformation: public iStaticServiceInformation
273 DECLARE_REF(eStaticServiceDVBBouquetInformation);
274 eServiceReference m_playable_service;
276 eServiceReference &getPlayableService() { return m_playable_service; }
277 RESULT getName(const eServiceReference &ref, std::string &name);
278 int getLength(const eServiceReference &ref);
279 int isPlayable(const eServiceReference &ref, const eServiceReference &ignore);