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_channel;
181 int m_current_audio_stream;
182 int selectAudioStream(int n);
185 ePtr<iDVBTSRecorder> m_record;
186 std::set<int> m_pids_active;
188 void updateTimeshiftPids();
190 void switchToTimeshift();
192 void updateDecoder();
198 ePtr<eCueSheet> m_cue;
205 bool operator < (const struct cueEntry &o) const
207 return where < o.where;
209 cueEntry(const pts_t &where, unsigned int what) :
210 where(where), what(what)
215 std::multiset<cueEntry> m_cue_entries;
216 int m_cuesheet_changed, m_cutlist_enabled;
221 void cutlistToCuesheet();
223 /* teletext subtitles */
224 void newSubtitlePage(const eDVBTeletextSubtitlePage &p);
225 ePtr<eConnection> m_new_subtitle_page_connection;
227 ePtr<eDVBTeletextParser> m_teletext_parser;
228 eSubtitleWidget *m_subtitle_widget;
229 eTimer m_subtitle_sync_timer;
230 std::list<eDVBTeletextSubtitlePage> m_subtitle_pages;
232 void checkSubtitleTiming();