don't shut down enigma 2 when deleting a timer which has an after event "shutdown...
[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 eDVBServicePlay: public iPlayableService, public iPauseableService, 
60                 public iSeekableService, public Object, public iServiceInformation, 
61                 public iAudioTrackSelection, public iFrontendStatusInformation,
62                 public iSubserviceList, public iTimeshiftService,
63                 public iCueSheet
64 {
65 DECLARE_REF(eDVBServicePlay);
66 public:
67         virtual ~eDVBServicePlay();
68
69                 // iPlayableService
70         RESULT connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection);
71         RESULT start();
72         RESULT stop();
73         RESULT setTarget(int target);
74         
75         RESULT seek(ePtr<iSeekableService> &ptr);
76         RESULT pause(ePtr<iPauseableService> &ptr);
77         RESULT info(ePtr<iServiceInformation> &ptr);
78         RESULT audioTracks(ePtr<iAudioTrackSelection> &ptr);
79         RESULT frontendStatusInfo(ePtr<iFrontendStatusInformation> &ptr);
80         RESULT subServices(ePtr<iSubserviceList> &ptr);
81         RESULT timeshift(ePtr<iTimeshiftService> &ptr);
82         RESULT cueSheet(ePtr<iCueSheet> &ptr);
83
84                 // iPauseableService
85         RESULT pause();
86         RESULT unpause();
87         RESULT setSlowMotion(int ratio);
88         RESULT setFastForward(int ratio);
89         
90                 // iSeekableService
91         RESULT getLength(pts_t &len);
92         RESULT seekTo(pts_t to);
93         RESULT seekRelative(int direction, pts_t to);
94         RESULT getPlayPosition(pts_t &pos);
95         RESULT setTrickmode(int trick=0);
96         RESULT isCurrentlySeekable();
97
98                 // iServiceInformation
99         RESULT getName(std::string &name);
100         RESULT getEvent(ePtr<eServiceEvent> &evt, int nownext);
101         int getInfo(int w);
102         std::string getInfoString(int w);
103         PyObject *getInfoObject(int w);
104
105                 // iAudioTrackSelection 
106         int getNumberOfTracks();
107         RESULT selectTrack(unsigned int i);
108         RESULT getTrackInfo(struct iAudioTrackInfo &, unsigned int n);
109
110                 // iFrontendStatusInformation
111         int getFrontendInfo(int w);
112         PyObject *getFrontendData(bool);
113
114                 // iSubserviceList
115         int getNumberOfSubservices();
116         RESULT getSubservice(eServiceReference &subservice, unsigned int n);
117
118                 // iTimeshiftService
119         RESULT startTimeshift();
120         RESULT stopTimeshift();
121         int isTimeshiftActive();
122         RESULT activateTimeshift();
123
124                 // iCueSheet
125         PyObject *getCutList();
126         void setCutList(PyObject *);
127         void setCutListEnable(int enable);
128         
129 private:
130         friend class eServiceFactoryDVB;
131         eServiceReference m_reference;
132         
133         ePtr<eDVBService> m_dvb_service;
134         
135         ePtr<iTSMPEGDecoder> m_decoder;
136         int m_is_primary;
137         
138                 /* in timeshift mode, we essentially have two channels, and thus pmt handlers. */
139         eDVBServicePMTHandler m_service_handler, m_service_handler_timeshift;
140         eDVBServiceEITHandler m_event_handler;
141         
142         eDVBServicePlay(const eServiceReference &ref, eDVBService *service);
143         
144                 /* events */
145         void gotNewEvent();
146         
147         void serviceEvent(int event);
148         void serviceEventTimeshift(int event);
149         Signal2<void,iPlayableService*,int> m_event;
150         
151                 /* pvr */
152         int m_is_pvr, m_is_paused, m_timeshift_enabled, m_timeshift_active;
153         int m_first_program_info;
154         
155         std::string m_timeshift_file;
156         int m_timeshift_fd;
157         
158         ePtr<iDVBDemux> m_decode_demux;
159         
160         int m_current_audio_stream;
161         int selectAudioStream(int n);
162         
163                 /* timeshift */
164         ePtr<iDVBTSRecorder> m_record;
165         std::set<int> m_pids_active;
166
167         void updateTimeshiftPids();
168         void switchToLive();
169         void switchToTimeshift();
170         
171         void updateDecoder();
172         
173         int m_skipmode;
174         
175                 /* cuesheet */
176         
177         ePtr<eCueSheet> m_cue;
178         
179         struct cueEntry
180         {
181                 pts_t where;
182                 unsigned int what;
183                 
184                 bool operator < (const struct cueEntry &o) const
185                 {
186                         return where < o.where;
187                 }
188                 cueEntry(const pts_t &where, unsigned int what) :
189                         where(where), what(what)
190                 {
191                 }
192         };
193         
194         std::multiset<cueEntry> m_cue_entries;
195         int m_cuesheet_changed, m_cutlist_enabled;
196         
197         void loadCuesheet();
198         void saveCuesheet();
199         
200         void cutlistToCuesheet();
201         
202                 /* teletext subtitles */
203         ePtr<eDVBTeletextParser> m_teletext_parser;
204 };
205
206 #endif