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/teletext.h>
10 #include <lib/base/filepush.h>
12 class eServiceFactoryDVB: public iServiceHandler
14 DECLARE_REF(eServiceFactoryDVB);
17 virtual ~eServiceFactoryDVB();
21 RESULT play(const eServiceReference &, ePtr<iPlayableService> &ptr);
22 RESULT record(const eServiceReference &, ePtr<iRecordableService> &ptr);
23 RESULT list(const eServiceReference &, ePtr<iListableService> &ptr);
24 RESULT info(const eServiceReference &, ePtr<iStaticServiceInformation> &ptr);
25 RESULT offlineOperations(const eServiceReference &, ePtr<iServiceOfflineOperations> &ptr);
27 RESULT lookupService(ePtr<eDVBService> &ptr, const eServiceReference &ref);
32 class eDVBServiceList: public iListableService, public iMutableServiceList
34 DECLARE_REF(eDVBServiceList);
36 virtual ~eDVBServiceList();
37 PyObject *getContent(const char* formatstr, bool sorted=false);
38 RESULT getContent(std::list<eServiceReference> &list, bool sorted=false);
39 RESULT getNext(eServiceReference &ptr);
40 int compareLessEqual(const eServiceReference &a, const eServiceReference &b);
42 RESULT startEdit(ePtr<iMutableServiceList> &);
43 RESULT flushChanges();
44 RESULT addService(eServiceReference &ref, eServiceReference before);
45 RESULT removeService(eServiceReference &ref);
46 RESULT moveService(eServiceReference &ref, int pos);
47 RESULT setListName(const std::string &name);
50 eServiceReference m_parent;
51 friend class eServiceFactoryDVB;
52 eDVBServiceList(const eServiceReference &parent);
53 ePtr<iDVBChannelListQuery> m_query;
55 /* for editing purposes. WARNING: lifetime issue! */
59 class eDVBServiceBase: public iFrontendInformation
62 eDVBServicePMTHandler m_service_handler;
64 // iFrontendInformation
65 int getFrontendInfo(int w);
66 PyObject *getFrontendData(bool);
69 class eSubtitleWidget;
71 class eDVBServicePlay: public eDVBServiceBase,
72 public iPlayableService, public iPauseableService,
73 public iSeekableService, public Object, public iServiceInformation,
74 public iAudioTrackSelection, public iAudioChannelSelection,
75 public iSubserviceList, public iTimeshiftService,
76 public iCueSheet, public iSubtitleOutput, public iAudioDelay
78 DECLARE_REF(eDVBServicePlay);
80 virtual ~eDVBServicePlay();
83 RESULT connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection);
86 RESULT setTarget(int target);
88 RESULT seek(ePtr<iSeekableService> &ptr);
89 RESULT pause(ePtr<iPauseableService> &ptr);
90 RESULT info(ePtr<iServiceInformation> &ptr);
91 RESULT audioChannel(ePtr<iAudioChannelSelection> &ptr);
92 RESULT audioTracks(ePtr<iAudioTrackSelection> &ptr);
93 RESULT frontendInfo(ePtr<iFrontendInformation> &ptr);
94 RESULT subServices(ePtr<iSubserviceList> &ptr);
95 RESULT timeshift(ePtr<iTimeshiftService> &ptr);
96 RESULT cueSheet(ePtr<iCueSheet> &ptr);
97 RESULT subtitle(ePtr<iSubtitleOutput> &ptr);
98 RESULT audioDelay(ePtr<iAudioDelay> &ptr);
103 RESULT setSlowMotion(int ratio);
104 RESULT setFastForward(int ratio);
107 RESULT getLength(pts_t &len);
108 RESULT seekTo(pts_t to);
109 RESULT seekRelative(int direction, pts_t to);
110 RESULT getPlayPosition(pts_t &pos);
111 RESULT setTrickmode(int trick=0);
112 RESULT isCurrentlySeekable();
114 // iServiceInformation
115 RESULT getName(std::string &name);
116 RESULT getEvent(ePtr<eServiceEvent> &evt, int nownext);
118 std::string getInfoString(int w);
119 PyObject *getInfoObject(int w);
121 // iAudioTrackSelection
122 int getNumberOfTracks();
123 RESULT selectTrack(unsigned int i);
124 RESULT getTrackInfo(struct iAudioTrackInfo &, unsigned int n);
126 // iAudioChannelSelection
127 int getCurrentChannel();
128 RESULT selectChannel(int i);
131 int getNumberOfSubservices();
132 RESULT getSubservice(eServiceReference &subservice, unsigned int n);
135 RESULT startTimeshift();
136 RESULT stopTimeshift();
137 int isTimeshiftActive();
138 RESULT activateTimeshift();
141 PyObject *getCutList();
142 void setCutList(PyObject *);
143 void setCutListEnable(int enable);
146 RESULT enableSubtitles(eWidget *parent, PyObject *entry);
147 RESULT disableSubtitles(eWidget *parent);
148 PyObject *getSubtitleList();
153 void setAC3Delay(int);
154 void setPCMDelay(int);
157 friend class eServiceFactoryDVB;
158 eServiceReference m_reference;
160 ePtr<eDVBService> m_dvb_service;
162 ePtr<iTSMPEGDecoder> m_decoder;
164 int m_have_video_pid;
166 /* in timeshift mode, we essentially have two channels, and thus pmt handlers. */
167 eDVBServicePMTHandler m_service_handler_timeshift;
168 eDVBServiceEITHandler m_event_handler;
170 eDVBServicePlay(const eServiceReference &ref, eDVBService *service);
175 void serviceEvent(int event);
176 void serviceEventTimeshift(int event);
177 Signal2<void,iPlayableService*,int> m_event;
180 int m_is_pvr, m_is_paused, m_timeshift_enabled, m_timeshift_active;
181 int m_first_program_info;
183 std::string m_timeshift_file;
186 ePtr<iDVBDemux> m_decode_demux;
188 int m_current_audio_stream;
189 int selectAudioStream(int n);
192 ePtr<iDVBTSRecorder> m_record;
193 std::set<int> m_pids_active;
195 void updateTimeshiftPids();
197 void switchToTimeshift();
199 void updateDecoder();
205 ePtr<eCueSheet> m_cue;
212 bool operator < (const struct cueEntry &o) const
214 return where < o.where;
216 cueEntry(const pts_t &where, unsigned int what) :
217 where(where), what(what)
222 std::multiset<cueEntry> m_cue_entries;
223 int m_cuesheet_changed, m_cutlist_enabled;
228 void cutlistToCuesheet();
230 /* teletext subtitles */
231 void newSubtitlePage(const eDVBTeletextSubtitlePage &p);
232 ePtr<eConnection> m_new_subtitle_page_connection;
234 ePtr<eDVBTeletextParser> m_teletext_parser;
235 eSubtitleWidget *m_subtitle_widget;
236 eTimer m_subtitle_sync_timer;
237 std::list<eDVBTeletextSubtitlePage> m_subtitle_pages;
239 void checkSubtitleTiming();