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 eDVBServicePlay: public eDVBServiceBase,
70 public iPlayableService, public iPauseableService,
71 public iSeekableService, public Object, public iServiceInformation,
72 public iAudioTrackSelection, public iAudioChannelSelection,
73 public iSubserviceList, public iTimeshiftService,
76 DECLARE_REF(eDVBServicePlay);
78 virtual ~eDVBServicePlay();
81 RESULT connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection);
84 RESULT setTarget(int target);
86 RESULT seek(ePtr<iSeekableService> &ptr);
87 RESULT pause(ePtr<iPauseableService> &ptr);
88 RESULT info(ePtr<iServiceInformation> &ptr);
89 RESULT audioChannel(ePtr<iAudioChannelSelection> &ptr);
90 RESULT audioTracks(ePtr<iAudioTrackSelection> &ptr);
91 RESULT frontendInfo(ePtr<iFrontendInformation> &ptr);
92 RESULT subServices(ePtr<iSubserviceList> &ptr);
93 RESULT timeshift(ePtr<iTimeshiftService> &ptr);
94 RESULT cueSheet(ePtr<iCueSheet> &ptr);
99 RESULT setSlowMotion(int ratio);
100 RESULT setFastForward(int ratio);
103 RESULT getLength(pts_t &len);
104 RESULT seekTo(pts_t to);
105 RESULT seekRelative(int direction, pts_t to);
106 RESULT getPlayPosition(pts_t &pos);
107 RESULT setTrickmode(int trick=0);
108 RESULT isCurrentlySeekable();
110 // iServiceInformation
111 RESULT getName(std::string &name);
112 RESULT getEvent(ePtr<eServiceEvent> &evt, int nownext);
114 std::string getInfoString(int w);
115 PyObject *getInfoObject(int w);
117 // iAudioTrackSelection
118 int getNumberOfTracks();
119 RESULT selectTrack(unsigned int i);
120 RESULT getTrackInfo(struct iAudioTrackInfo &, unsigned int n);
122 // iAudioChannelSelection
123 int getCurrentChannel();
124 RESULT selectChannel(int i);
127 int getNumberOfSubservices();
128 RESULT getSubservice(eServiceReference &subservice, unsigned int n);
131 RESULT startTimeshift();
132 RESULT stopTimeshift();
133 int isTimeshiftActive();
134 RESULT activateTimeshift();
137 PyObject *getCutList();
138 void setCutList(PyObject *);
139 void setCutListEnable(int enable);
142 friend class eServiceFactoryDVB;
143 eServiceReference m_reference;
145 ePtr<eDVBService> m_dvb_service;
147 ePtr<iTSMPEGDecoder> m_decoder;
150 /* in timeshift mode, we essentially have two channels, and thus pmt handlers. */
151 eDVBServicePMTHandler m_service_handler_timeshift;
152 eDVBServiceEITHandler m_event_handler;
154 eDVBServicePlay(const eServiceReference &ref, eDVBService *service);
159 void serviceEvent(int event);
160 void serviceEventTimeshift(int event);
161 Signal2<void,iPlayableService*,int> m_event;
164 int m_is_pvr, m_is_paused, m_timeshift_enabled, m_timeshift_active;
165 int m_first_program_info;
167 std::string m_timeshift_file;
170 ePtr<iDVBDemux> m_decode_demux;
172 int m_current_audio_stream;
173 int selectAudioStream(int n);
176 ePtr<iDVBTSRecorder> m_record;
177 std::set<int> m_pids_active;
179 void updateTimeshiftPids();
181 void switchToTimeshift();
183 void updateDecoder();
189 ePtr<eCueSheet> m_cue;
196 bool operator < (const struct cueEntry &o) const
198 return where < o.where;
200 cueEntry(const pts_t &where, unsigned int what) :
201 where(where), what(what)
206 std::multiset<cueEntry> m_cue_entries;
207 int m_cuesheet_changed, m_cutlist_enabled;
212 void cutlistToCuesheet();
214 /* teletext subtitles */
215 ePtr<eDVBTeletextParser> m_teletext_parser;