5b9cf75cd95faf1acddf7989e16c5e5161534eb7
[enigma2.git] / lib / service / servicedvb.h
1 #ifndef __servicedvb_h
2 #define __servicedvb_h
3
4 #include <lib/service/iservice.h>
5 #include <lib/dvb/idvb.h>
6
7 #include <lib/dvb/pmt.h>
8 #include <lib/dvb/eit.h>
9 #include <lib/dvb/teletext.h>
10 #include <lib/base/filepush.h>
11
12 class eServiceFactoryDVB: public iServiceHandler
13 {
14 DECLARE_REF(eServiceFactoryDVB);
15 public:
16         eServiceFactoryDVB();
17         virtual ~eServiceFactoryDVB();
18         enum { id = 0x1 };
19
20                 // iServiceHandler
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);
26 private:
27         RESULT lookupService(ePtr<eDVBService> &ptr, const eServiceReference &ref);
28 };
29
30 class eBouquet;
31
32 class eDVBServiceList: public iListableService, public iMutableServiceList
33 {
34 DECLARE_REF(eDVBServiceList);
35 public:
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);
41         
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);
48 private:
49         RESULT startQuery();
50         eServiceReference m_parent;
51         friend class eServiceFactoryDVB;
52         eDVBServiceList(const eServiceReference &parent);
53         ePtr<iDVBChannelListQuery> m_query;
54         
55                 /* for editing purposes. WARNING: lifetime issue! */
56         eBouquet *m_bouquet;
57 };
58
59 class eDVBServiceBase: public iFrontendInformation
60 {
61 protected:
62         eDVBServicePMTHandler m_service_handler;
63 public:
64                 // iFrontendInformation
65         int getFrontendInfo(int w);
66         PyObject *getFrontendData(bool);
67 };
68
69 class eSubtitleWidget; 
70
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
77 {
78 DECLARE_REF(eDVBServicePlay);
79 public:
80         virtual ~eDVBServicePlay();
81
82                 // iPlayableService
83         RESULT connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection);
84         RESULT start();
85         RESULT stop();
86         RESULT setTarget(int target);
87         
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
99                 // iPauseableService
100         RESULT pause();
101         RESULT unpause();
102         RESULT setSlowMotion(int ratio);
103         RESULT setFastForward(int ratio);
104         
105                 // iSeekableService
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();
112
113                 // iServiceInformation
114         RESULT getName(std::string &name);
115         RESULT getEvent(ePtr<eServiceEvent> &evt, int nownext);
116         int getInfo(int w);
117         std::string getInfoString(int w);
118         PyObject *getInfoObject(int w);
119
120                 // iAudioTrackSelection 
121         int getNumberOfTracks();
122         RESULT selectTrack(unsigned int i);
123         RESULT getTrackInfo(struct iAudioTrackInfo &, unsigned int n);
124
125                 // iAudioChannelSelection       
126         int getCurrentChannel();
127         RESULT selectChannel(int i);
128
129                 // iSubserviceList
130         int getNumberOfSubservices();
131         RESULT getSubservice(eServiceReference &subservice, unsigned int n);
132
133                 // iTimeshiftService
134         RESULT startTimeshift();
135         RESULT stopTimeshift();
136         int isTimeshiftActive();
137         RESULT activateTimeshift();
138
139                 // iCueSheet
140         PyObject *getCutList();
141         void setCutList(PyObject *);
142         void setCutListEnable(int enable);
143         
144                 // iSubtitleOutput
145         RESULT enableSubtitles(eWidget *parent, PyObject *entry);
146         RESULT disableSubtitles(eWidget *parent);
147         PyObject *getSubtitleList();
148
149 private:
150         friend class eServiceFactoryDVB;
151         eServiceReference m_reference;
152         
153         ePtr<eDVBService> m_dvb_service;
154         
155         ePtr<iTSMPEGDecoder> m_decoder;
156         int m_is_primary;
157         
158                 /* in timeshift mode, we essentially have two channels, and thus pmt handlers. */
159         eDVBServicePMTHandler m_service_handler_timeshift;
160         eDVBServiceEITHandler m_event_handler;
161         
162         eDVBServicePlay(const eServiceReference &ref, eDVBService *service);
163         
164                 /* events */
165         void gotNewEvent();
166         
167         void serviceEvent(int event);
168         void serviceEventTimeshift(int event);
169         Signal2<void,iPlayableService*,int> m_event;
170         
171                 /* pvr */
172         int m_is_pvr, m_is_paused, m_timeshift_enabled, m_timeshift_active;
173         int m_first_program_info;
174         
175         std::string m_timeshift_file;
176         int m_timeshift_fd;
177         
178         ePtr<iDVBDemux> m_decode_demux;
179         
180         int m_current_audio_stream;
181         int selectAudioStream(int n);
182         
183                 /* timeshift */
184         ePtr<iDVBTSRecorder> m_record;
185         std::set<int> m_pids_active;
186
187         void updateTimeshiftPids();
188         void switchToLive();
189         void switchToTimeshift();
190         
191         void updateDecoder();
192         
193         int m_skipmode;
194         
195                 /* cuesheet */
196         
197         ePtr<eCueSheet> m_cue;
198         
199         struct cueEntry
200         {
201                 pts_t where;
202                 unsigned int what;
203                 
204                 bool operator < (const struct cueEntry &o) const
205                 {
206                         return where < o.where;
207                 }
208                 cueEntry(const pts_t &where, unsigned int what) :
209                         where(where), what(what)
210                 {
211                 }
212         };
213         
214         std::multiset<cueEntry> m_cue_entries;
215         int m_cuesheet_changed, m_cutlist_enabled;
216         
217         void loadCuesheet();
218         void saveCuesheet();
219         
220         void cutlistToCuesheet();
221         
222                 /* teletext subtitles */
223         void newSubtitlePage(const eDVBTeletextSubtitlePage &p);
224         ePtr<eConnection> m_new_subtitle_page_connection;
225         
226         ePtr<eDVBTeletextParser> m_teletext_parser;
227         eSubtitleWidget *m_subtitle_widget;
228         eTimer m_subtitle_sync_timer;
229         std::list<eDVBTeletextSubtitlePage> m_subtitle_pages;
230         
231         void checkSubtitleTiming();
232 };
233
234 #endif