voltage was not set, when not diseqc send was needed .. fix this
[enigma2.git] / lib / dvb / decoder.cpp
1 #include <config.h>
2 #include <lib/base/eerror.h>
3 #include <lib/dvb/decoder.h>
4 #if HAVE_DVB_API_VERSION < 3 
5 #define audioStatus audio_status
6 #define videoStatus video_status
7 #define pesType pes_type
8 #define playState play_state
9 #define audioStreamSource_t audio_stream_source_t
10 #define videoStreamSource_t video_stream_source_t
11 #define streamSource stream_source
12 #define dmxPesFilterParams dmx_pes_filter_params
13 #define DMX_PES_VIDEO DMX_PES_VIDEO0
14 #define DMX_PES_AUDIO DMX_PES_AUDIO0
15 #include <ost/dmx.h>
16 #include <ost/video.h>
17 #include <ost/audio.h>
18 #else
19 #include <linux/dvb/audio.h>
20 #include <linux/dvb/video.h>
21 #include <linux/dvb/dmx.h>
22 #endif
23
24 #include <unistd.h>
25 #include <fcntl.h>
26 #include <sys/ioctl.h>
27 #include <errno.h>
28
29 DEFINE_REF(eDVBAudio);
30
31 eDVBAudio::eDVBAudio(eDVBDemux *demux, int dev): m_demux(demux)
32 {
33         char filename[128];
34 #if HAVE_DVB_API_VERSION < 3
35         sprintf(filename, "/dev/dvb/card%d/audio%d", demux->adapter, dev);      
36 #else
37         sprintf(filename, "/dev/dvb/adapter%d/audio%d", demux->adapter, dev);
38 #endif
39         m_fd = ::open(filename, O_RDWR);
40         if (m_fd < 0)
41                 eWarning("%s: %m", filename);
42 #if HAVE_DVB_API_VERSION < 3
43         sprintf(filename, "/dev/dvb/card%d/demux%d", demux->adapter, demux->demux);
44 #else
45         sprintf(filename, "/dev/dvb/adapter%d/demux%d", demux->adapter, demux->demux);
46 #endif  
47         m_fd_demux = ::open(filename, O_RDWR);
48         if (m_fd_demux < 0)
49                 eWarning("%s: %m", filename);
50 }
51         
52 int eDVBAudio::startPid(int pid)
53 {       
54         eDebug("setting audio pid to %x", pid);
55         if ((m_fd < 0) || (m_fd_demux < 0))
56                 return -1;
57         dmx_pes_filter_params pes;
58         pes.pid      = pid;
59         pes.input    = DMX_IN_FRONTEND;
60         pes.output   = DMX_OUT_DECODER;
61         pes.pes_type = DMX_PES_AUDIO;  // DMX_PES_AUDIO0
62         pes.flags    = 0;
63         if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
64         {
65                 eWarning("audio: DMX_SET_PES_FILTER: %m");
66                 return -errno;
67         }
68         if (::ioctl(m_fd_demux, DMX_START, &pes) < 0)
69         {
70                 eWarning("audio: DMX_START: %m");
71                 return -errno;
72         }
73         
74         if (::ioctl(m_fd, AUDIO_PLAY) < 0)
75                 eWarning("audio: AUDIO_PLAY: %m");
76         return 0;
77 }
78         
79 void eDVBAudio::stop()
80 {
81         if (::ioctl(m_fd, AUDIO_STOP) < 0)
82                 eWarning("audio: AUDIO_STOP: %m");
83         if (::ioctl(m_fd_demux, DMX_STOP) < 0)
84                 eWarning("audio: DMX_STOP: %m");
85 }
86         
87 eDVBAudio::~eDVBAudio()
88 {
89         if (m_fd >= 0)
90                 ::close(m_fd);
91         if (m_fd_demux >= 0)
92                 ::close(m_fd_demux);
93 }
94
95 DEFINE_REF(eDVBVideo);
96
97 eDVBVideo::eDVBVideo(eDVBDemux *demux, int dev): m_demux(demux)
98 {
99         char filename[128];
100 #if HAVE_DVB_API_VERSION < 3
101         sprintf(filename, "/dev/dvb/card%d/video%d", demux->adapter, dev);
102 #else
103         sprintf(filename, "/dev/dvb/adapter%d/video%d", demux->adapter, dev);
104 #endif
105         m_fd = ::open(filename, O_RDWR);
106         if (m_fd < 0)
107                 eWarning("%s: %m", filename);
108 #if HAVE_DVB_API_VERSION < 3
109         sprintf(filename, "/dev/dvb/card%d/demux%d", demux->adapter, demux->demux);
110 #else
111         sprintf(filename, "/dev/dvb/adapter%d/demux%d", demux->adapter, demux->demux);
112 #endif
113         m_fd_demux = ::open(filename, O_RDWR);
114         if (m_fd_demux < 0)
115                 eWarning("%s: %m", filename);
116 }
117         
118 int eDVBVideo::startPid(int pid)
119 {       
120         if ((m_fd < 0) || (m_fd_demux < 0))
121                 return -1;
122         dmx_pes_filter_params pes;
123         
124         pes.pid      = pid;
125         pes.input    = DMX_IN_FRONTEND;
126         pes.output   = DMX_OUT_DECODER;
127         pes.pes_type = DMX_PES_VIDEO;
128         pes.flags    = 0;
129         if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
130         {
131                 eWarning("video: DMX_SET_PES_FILTER: %m");
132                 return -errno;
133         }
134         if (::ioctl(m_fd_demux, DMX_START, &pes) < 0)
135         {
136                 eWarning("video: DMX_START: %m");
137                 return -errno;
138         }
139         
140         if (::ioctl(m_fd, VIDEO_PLAY) < 0)
141                 eWarning("video: VIDEO_PLAY: %m");
142         else
143                 eDebug("video ok");
144         return 0;
145 }
146         
147 void eDVBVideo::stop()
148 {
149         if (::ioctl(m_fd, VIDEO_STOP) < 0)
150                 eWarning("video: VIDEO_STOP: %m");
151         if (::ioctl(m_fd_demux, DMX_STOP) < 0)
152                 eWarning("video: DMX_STOP: %m");
153 }
154         
155 eDVBVideo::~eDVBVideo()
156 {
157         if (m_fd >= 0)
158                 ::close(m_fd);
159         if (m_fd_demux >= 0)
160                 ::close(m_fd_demux);
161 }
162
163 DEFINE_REF(eDVBPCR);
164
165 eDVBPCR::eDVBPCR(eDVBDemux *demux): m_demux(demux)
166 {
167         char filename[128];
168 #if HAVE_DVB_API_VERSION < 3
169         sprintf(filename, "/dev/dvb/card%d/demux%d", demux->adapter, demux->demux);
170 #else
171         sprintf(filename, "/dev/dvb/adapter%d/demux%d", demux->adapter, demux->demux);
172 #endif
173         m_fd_demux = ::open(filename, O_RDWR);
174         if (m_fd_demux < 0)
175                 eWarning("%s: %m", filename);
176 }
177
178 int eDVBPCR::startPid(int pid)
179 {
180         if (m_fd_demux < 0)
181                 return -1;
182         dmx_pes_filter_params pes;
183
184         pes.pid      = pid;
185         pes.input    = DMX_IN_FRONTEND;
186         pes.output   = DMX_OUT_DECODER;
187         pes.pes_type = DMX_PES_PCR;
188         pes.flags    = 0;
189         if (::ioctl(m_fd_demux, DMX_SET_PES_FILTER, &pes) < 0)
190         {
191                 eWarning("video: DMX_SET_PES_FILTER: %m");
192                 return -errno;
193         }
194         if (::ioctl(m_fd_demux, DMX_START, &pes) < 0)
195         {
196                 eWarning("video: DMX_START: %m");
197                 return -errno;
198         }
199         return 0;
200 }
201
202 void eDVBPCR::stop()
203 {
204         if (::ioctl(m_fd_demux, DMX_STOP) < 0)
205                 eWarning("video: DMX_STOP: %m");
206 }
207
208 eDVBPCR::~eDVBPCR()
209 {
210         if (m_fd_demux >= 0)
211                 ::close(m_fd_demux);
212 }
213
214 DEFINE_REF(eTSMPEGDecoder);
215
216 int eTSMPEGDecoder::setState()
217 {
218         int res = 0;
219         eDebug("changed %x", m_changed);
220
221         if (m_changed & changePCR)
222         {
223                 if (m_pcr)
224                         m_pcr->stop();
225                 m_pcr = 0;
226                 m_pcr = new eDVBPCR(m_demux);
227                 if (m_pcr->startPid(m_pcrpid))
228                 {
229                         eWarning("video: startpid failed!");
230                         res = -1;
231                 }
232                 m_changed &= ~changePCR;
233         }
234         if (m_changed & changeVideo)
235         {
236                 if (m_video)
237                         m_video->stop();
238                 m_video = 0;
239                 m_video = new eDVBVideo(m_demux, 0);
240                 if (m_video->startPid(m_vpid))
241                 {
242                         eWarning("video: startpid failed!");
243                         res = -1;
244                 }
245                 m_changed &= ~changeVideo;
246         }
247         if (m_changed & changeAudio)
248         {
249                 if (m_audio)
250                         m_audio->stop();
251                 m_audio = 0;
252                 m_audio = new eDVBAudio(m_demux, 0);
253                 if (m_audio->startPid(m_apid))
254                 {
255                         eWarning("audio: startpid failed!");
256                         res = -1;
257                 }
258                 m_changed &= ~changeAudio;
259         }
260         return res;
261 }
262
263 eTSMPEGDecoder::eTSMPEGDecoder(eDVBDemux *demux, int decoder): m_demux(demux)
264 {
265 }
266
267 eTSMPEGDecoder::~eTSMPEGDecoder()
268 {
269         m_vpid = m_apid = m_pcrpid = pidNone;
270         m_changed = -1;
271         setState();
272 }
273
274 RESULT eTSMPEGDecoder::setVideoPID(int vpid)
275 {
276         if (m_vpid != vpid)
277         {
278                 m_changed |= changeVideo;
279                 m_vpid = vpid;
280         }
281         return 0;
282 }
283
284 RESULT eTSMPEGDecoder::setAudioPID(int apid, int type)
285 {
286         if ((m_apid != apid) || (m_atype != type))
287         {
288                 m_changed |= changeAudio;
289                 m_atype = type;
290                 m_apid = apid;
291         }
292         return 0;
293 }
294
295 RESULT eTSMPEGDecoder::setSyncPCR(int pcrpid)
296 {
297         if (m_pcrpid != pcrpid)
298         {
299                 m_changed |= changePCR;
300                 m_pcrpid = pcrpid;
301         }
302         return -1;
303 }
304
305 RESULT eTSMPEGDecoder::setSyncMaster(int who)
306 {
307         return -1;
308 }
309
310 RESULT eTSMPEGDecoder::start()
311 {
312         return setState();
313 }
314
315 RESULT eTSMPEGDecoder::freeze(int cont)
316 {
317         return -1;
318 }
319
320 RESULT eTSMPEGDecoder::unfreeze()
321 {
322         return -1;
323 }
324
325 RESULT eTSMPEGDecoder::setSinglePictureMode(int when)
326 {
327         return -1;
328 }
329
330 RESULT eTSMPEGDecoder::setPictureSkipMode(int what)
331 {
332         return -1;
333 }
334
335 RESULT eTSMPEGDecoder::setSlowMotion(int repeat)
336 {
337         return -1;
338 }
339
340 RESULT eTSMPEGDecoder::setZoom(int what)
341 {
342         return -1;
343 }