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
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);
102 RESULT setSlowMotion(int ratio);
103 RESULT setFastForward(int ratio);
106 RESULT getLength(pts_t &len);
107 RESULT seekTo(pts_t to);
108 RESULT seekRelative(int direction, pts_t to);
109 RESULT getPlayPosition(pts_t &pos);
110 RESULT setTrickmode(int trick=0);
111 RESULT isCurrentlySeekable();
113 // iServiceInformation
114 RESULT getName(std::string &name);
115 RESULT getEvent(ePtr<eServiceEvent> &evt, int nownext);
117 std::string getInfoString(int w);
118 PyObject *getInfoObject(int w);
120 // iAudioTrackSelection
121 int getNumberOfTracks();
122 RESULT selectTrack(unsigned int i);
123 RESULT getTrackInfo(struct iAudioTrackInfo &, unsigned int n);
125 // iAudioChannelSelection
126 int getCurrentChannel();
127 RESULT selectChannel(int i);
130 int getNumberOfSubservices();
131 RESULT getSubservice(eServiceReference &subservice, unsigned int n);
134 RESULT startTimeshift();
135 RESULT stopTimeshift();
136 int isTimeshiftActive();
137 RESULT activateTimeshift();
140 PyObject *getCutList();
141 void setCutList(PyObject *);
142 void setCutListEnable(int enable);
145 RESULT enableSubtitles(eWidget *parent, PyObject *entry);
146 RESULT disableSubtitles(eWidget *parent);
147 PyObject *getSubtitleList();
150 friend class eServiceFactoryDVB;
151 eServiceReference m_reference;
153 ePtr<eDVBService> m_dvb_service;
155 ePtr<iTSMPEGDecoder> m_decoder;
158 /* in timeshift mode, we essentially have two channels, and thus pmt handlers. */
159 eDVBServicePMTHandler m_service_handler_timeshift;
160 eDVBServiceEITHandler m_event_handler;
162 eDVBServicePlay(const eServiceReference &ref, eDVBService *service);
167 void serviceEvent(int event);
168 void serviceEventTimeshift(int event);
169 Signal2<void,iPlayableService*,int> m_event;
172 int m_is_pvr, m_is_paused, m_timeshift_enabled, m_timeshift_active;
173 int m_first_program_info;
175 std::string m_timeshift_file;
178 ePtr<iDVBDemux> m_decode_demux;
180 int m_current_audio_stream;
181 int selectAudioStream(int n);
184 ePtr<iDVBTSRecorder> m_record;
185 std::set<int> m_pids_active;
187 void updateTimeshiftPids();
189 void switchToTimeshift();
191 void updateDecoder();
197 ePtr<eCueSheet> m_cue;
204 bool operator < (const struct cueEntry &o) const
206 return where < o.where;
208 cueEntry(const pts_t &where, unsigned int what) :
209 where(where), what(what)
214 std::multiset<cueEntry> m_cue_entries;
215 int m_cuesheet_changed, m_cutlist_enabled;
220 void cutlistToCuesheet();
222 /* teletext subtitles */
223 void newSubtitlePage(const eDVBTeletextSubtitlePage &p);
224 ePtr<eConnection> m_new_subtitle_page_connection;
226 ePtr<eDVBTeletextParser> m_teletext_parser;
227 eSubtitleWidget *m_subtitle_widget;
228 eTimer m_subtitle_sync_timer;
229 std::list<eDVBTeletextSubtitlePage> m_subtitle_pages;
231 void checkSubtitleTiming();