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);
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;
165 /* in timeshift mode, we essentially have two channels, and thus pmt handlers. */
166 eDVBServicePMTHandler m_service_handler_timeshift;
167 eDVBServiceEITHandler m_event_handler;
169 eDVBServicePlay(const eServiceReference &ref, eDVBService *service);
174 void serviceEvent(int event);
175 void serviceEventTimeshift(int event);
176 Signal2<void,iPlayableService*,int> m_event;
179 int m_is_pvr, m_is_paused, m_timeshift_enabled, m_timeshift_active;
180 int m_first_program_info;
182 std::string m_timeshift_file;
185 ePtr<iDVBDemux> m_decode_demux;
187 int m_current_audio_stream;
188 int selectAudioStream(int n);
191 ePtr<iDVBTSRecorder> m_record;
192 std::set<int> m_pids_active;
194 void updateTimeshiftPids();
196 void switchToTimeshift();
198 void updateDecoder();
204 ePtr<eCueSheet> m_cue;
211 bool operator < (const struct cueEntry &o) const
213 return where < o.where;
215 cueEntry(const pts_t &where, unsigned int what) :
216 where(where), what(what)
221 std::multiset<cueEntry> m_cue_entries;
222 int m_cuesheet_changed, m_cutlist_enabled;
227 void cutlistToCuesheet();
229 /* teletext subtitles */
230 void newSubtitlePage(const eDVBTeletextSubtitlePage &p);
231 ePtr<eConnection> m_new_subtitle_page_connection;
233 ePtr<eDVBTeletextParser> m_teletext_parser;
234 eSubtitleWidget *m_subtitle_widget;
235 eTimer m_subtitle_sync_timer;
236 std::list<eDVBTeletextSubtitlePage> m_subtitle_pages;
238 void checkSubtitleTiming();