4 #if HAVE_DVB_API_VERSION < 3
5 #include <ost/frontend.h>
6 #define FRONTENDPARAMETERS FrontendParameters
8 #include <linux/dvb/frontend.h>
9 #define FRONTENDPARAMETERS struct dvb_frontend_parameters
11 #include <lib/dvb/frontendparms.h>
12 #include <lib/base/object.h>
13 #include <lib/base/ebase.h>
14 #include <lib/service/service.h>
15 #include <libsig_comp.h>
16 #include <connection.h>
20 std::string m_bouquet_name;
21 std::string m_filename; // without path.. just name
22 typedef std::list<eServiceReference> list;
24 // the following four methods are implemented in db.cpp
25 RESULT flushChanges();
26 RESULT addService(const eServiceReference &);
27 RESULT removeService(const eServiceReference &);
28 RESULT moveService(const eServiceReference &, unsigned int);
31 /* these structures have by intention no operator int() defined.
32 the reason of these structures is to avoid mixing for example
33 a onid and a tsid (as there's no general order for them).
35 defining an operator int() would implicitely convert values
36 between them over the constructor with the int argument.
38 'explicit' doesn't here - eTransportStreamID(eOriginalNetworkID(n))
41 struct eTransportStreamID
46 int get() const { return v; }
47 eTransportStreamID(int i): v(i) { }
48 eTransportStreamID(): v(-1) { }
49 bool operator == (const eTransportStreamID &c) const { return v == c.v; }
50 bool operator != (const eTransportStreamID &c) const { return v != c.v; }
51 bool operator < (const eTransportStreamID &c) const { return v < c.v; }
52 bool operator > (const eTransportStreamID &c) const { return v > c.v; }
60 int get() const { return v; }
61 eServiceID(int i): v(i) { }
62 eServiceID(): v(-1) { }
63 bool operator == (const eServiceID &c) const { return v == c.v; }
64 bool operator != (const eServiceID &c) const { return v != c.v; }
65 bool operator < (const eServiceID &c) const { return v < c.v; }
66 bool operator > (const eServiceID &c) const { return v > c.v; }
69 struct eOriginalNetworkID
74 int get() const { return v; }
75 eOriginalNetworkID(int i): v(i) { }
76 eOriginalNetworkID(): v(-1) { }
77 bool operator == (const eOriginalNetworkID &c) const { return v == c.v; }
78 bool operator != (const eOriginalNetworkID &c) const { return v != c.v; }
79 bool operator < (const eOriginalNetworkID &c) const { return v < c.v; }
80 bool operator > (const eOriginalNetworkID &c) const { return v > c.v; }
88 int get() const { return v; }
89 eDVBNamespace(int i): v(i) { }
90 eDVBNamespace(): v(-1) { }
91 bool operator == (const eDVBNamespace &c) const { return v == c.v; }
92 bool operator != (const eDVBNamespace &c) const { return v != c.v; }
93 bool operator < (const eDVBNamespace &c) const { return v < c.v; }
94 bool operator > (const eDVBNamespace &c) const { return v > c.v; }
99 eDVBNamespace dvbnamespace;
100 eTransportStreamID transport_stream_id;
101 eOriginalNetworkID original_network_id;
103 bool operator==(const eDVBChannelID &c) const
105 return dvbnamespace == c.dvbnamespace &&
106 transport_stream_id == c.transport_stream_id &&
107 original_network_id == c.original_network_id;
110 bool operator<(const eDVBChannelID &c) const
112 if (dvbnamespace < c.dvbnamespace)
114 else if (dvbnamespace == c.dvbnamespace)
116 if (original_network_id < c.original_network_id)
118 else if (original_network_id == c.original_network_id)
119 if (transport_stream_id < c.transport_stream_id)
124 eDVBChannelID(eDVBNamespace dvbnamespace, eTransportStreamID tsid, eOriginalNetworkID onid):
125 dvbnamespace(dvbnamespace), transport_stream_id(tsid), original_network_id(onid)
129 dvbnamespace(-1), transport_stream_id(-1), original_network_id(-1)
132 operator bool() const
134 return (dvbnamespace != -1) && (transport_stream_id != -1) && (original_network_id != -1);
138 struct eServiceReferenceDVB: public eServiceReference
140 int getServiceType() const { return data[0]; }
141 void setServiceType(int service_type) { data[0]=service_type; }
143 eServiceID getServiceID() const { return eServiceID(data[1]); }
144 void setServiceID(eServiceID service_id) { data[1]=service_id.get(); }
146 eTransportStreamID getTransportStreamID() const { return eTransportStreamID(data[2]); }
147 void setTransportStreamID(eTransportStreamID transport_stream_id) { data[2]=transport_stream_id.get(); }
149 eOriginalNetworkID getOriginalNetworkID() const { return eOriginalNetworkID(data[3]); }
150 void setOriginalNetworkID(eOriginalNetworkID original_network_id) { data[3]=original_network_id.get(); }
152 eDVBNamespace getDVBNamespace() const { return eDVBNamespace(data[4]); }
153 void setDVBNamespace(eDVBNamespace dvbnamespace) { data[4]=dvbnamespace.get(); }
155 eServiceID getParentServiceID() const { return eServiceID(data[5]); }
156 void setParentServiceID( eServiceID sid ) { data[5]=sid.get(); }
158 eTransportStreamID getParentTransportStreamID() const { return eTransportStreamID(data[6]); }
159 void setParentTransportStreamID( eTransportStreamID tsid ) { data[6]=tsid.get(); }
161 eServiceReferenceDVB(eDVBNamespace dvbnamespace, eTransportStreamID transport_stream_id, eOriginalNetworkID original_network_id, eServiceID service_id, int service_type)
162 :eServiceReference(eServiceReference::idDVB, 0)
164 setTransportStreamID(transport_stream_id);
165 setOriginalNetworkID(original_network_id);
166 setDVBNamespace(dvbnamespace);
167 setServiceID(service_id);
168 setServiceType(service_type);
171 void set(const eDVBChannelID &chid)
173 setDVBNamespace(chid.dvbnamespace);
174 setOriginalNetworkID(chid.original_network_id);
175 setTransportStreamID(chid.transport_stream_id);
178 void getChannelID(eDVBChannelID &chid) const
180 chid = eDVBChannelID(getDVBNamespace(), getTransportStreamID(), getOriginalNetworkID());
183 eServiceReferenceDVB()
184 :eServiceReference(eServiceReference::idDVB, 0)
188 eServiceReferenceDVB(const std::string &string)
189 :eServiceReference(string)
195 ////////////////// TODO: we need an interface here, but what exactly?
198 // btw, still implemented in db.cpp. FIX THIS, TOO.
200 class eDVBChannelQuery;
202 class eDVBService: public iStaticServiceInformation
204 DECLARE_REF(eDVBService);
208 cVPID, cAPID, cTPID, cPCRPID, cAC3PID, cacheMax
211 int getCachePID(cacheID);
212 void setCachePID(cacheID, int);
213 bool cacheEmpty() { return m_cache.empty(); }
216 /* m_service_name_sort is uppercase, with special chars removed, to increase sort performance. */
217 std::string m_service_name, m_service_name_sort;
218 std::string m_provider_name;
224 std::map<int,int> m_cache;
225 virtual ~eDVBService();
227 eDVBService &operator=(const eDVBService &);
229 // iStaticServiceInformation
230 RESULT getName(const eServiceReference &ref, std::string &name);
231 RESULT getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &ptr, time_t start_time);
232 bool isPlayable(const eServiceReference &ref, const eServiceReference &ignore);
235 int checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQuery &query);
242 class iDVBFrontendParameters;
244 class iDVBChannelListQuery: public iObject
247 virtual RESULT getNextResult(eServiceReferenceDVB &ref)=0;
248 virtual int compareLessEqual(const eServiceReferenceDVB &a, const eServiceReferenceDVB &b)=0;
251 class eDVBChannelQuery: public iObject
253 DECLARE_REF(eDVBChannelQuery);
270 std::string m_string;
272 eDVBChannelID m_channelid;
274 /* sort is only valid in root, and must be from the enum above. */
276 std::string m_bouquet_name;
278 static RESULT compile(ePtr<eDVBChannelQuery> &res, std::string query);
280 ePtr<eDVBChannelQuery> m_p1, m_p2;
283 class iDVBChannelList: public iObject
286 virtual RESULT addChannelToList(const eDVBChannelID &id, iDVBFrontendParameters *feparm)=0;
287 virtual RESULT removeChannel(const eDVBChannelID &id)=0;
289 virtual RESULT getChannelFrontendData(const eDVBChannelID &id, ePtr<iDVBFrontendParameters> &parm)=0;
291 virtual RESULT addService(const eServiceReferenceDVB &service, eDVBService *service)=0;
292 virtual RESULT getService(const eServiceReferenceDVB &reference, ePtr<eDVBService> &service)=0;
293 virtual RESULT flush()=0;
295 virtual RESULT getBouquet(const eServiceReference &ref, eBouquet* &bouquet)=0;
297 virtual RESULT startQuery(ePtr<iDVBChannelListQuery> &query, eDVBChannelQuery *query, const eServiceReference &source)=0;
300 class iDVBFrontendParameters: public iObject
303 virtual RESULT getSystem(int &type) const = 0;
304 virtual RESULT getDVBS(eDVBFrontendParametersSatellite &p) const = 0;
305 virtual RESULT getDVBC(eDVBFrontendParametersCable &p) const = 0;
306 virtual RESULT getDVBT(eDVBFrontendParametersTerrestrial &p) const = 0;
308 virtual RESULT calculateDifference(const iDVBFrontendParameters *parm, int &diff) const = 0;
309 virtual RESULT getHash(unsigned long &hash) const = 0;
312 #define MAX_DISEQC_LENGTH 16
314 class eDVBDiseqcCommand
318 __u8 data[MAX_DISEQC_LENGTH];
319 #if HAVE_DVB_API_VERSION < 3
325 class iDVBSatelliteEquipmentControl;
326 class eSecCommandList;
328 class iDVBFrontend: public iObject
332 feSatellite, feCable, feTerrestrial
334 virtual RESULT getFrontendType(int &type)=0;
335 virtual RESULT tune(const iDVBFrontendParameters &where)=0;
336 virtual RESULT connectStateChange(const Slot1<void,iDVBFrontend*> &stateChange, ePtr<eConnection> &connection)=0;
344 virtual RESULT getState(int &state)=0;
348 virtual RESULT setTone(int tone)=0;
350 voltageOff, voltage13, voltage18, voltage13_5, voltage18_5
352 virtual RESULT setVoltage(int voltage)=0;
353 virtual RESULT sendDiseqc(const eDVBDiseqcCommand &diseqc)=0;
354 virtual RESULT sendToneburst(int burst)=0;
355 virtual RESULT setSEC(iDVBSatelliteEquipmentControl *sec)=0;
356 virtual RESULT setSecSequence(const eSecCommandList &list)=0;
359 bitErrorRate, signalPower, signalQuality
361 virtual int readFrontendData(int type)=0;
363 virtual RESULT getData(int num, int &data)=0;
364 virtual RESULT setData(int num, int val)=0;
366 /* 0 means: not compatible. other values are a priority. */
367 virtual int isCompatibleWith(ePtr<iDVBFrontendParameters> &feparm)=0;
370 class iDVBSatelliteEquipmentControl: public iObject
373 virtual RESULT prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, eDVBFrontendParametersSatellite &sat, int frontend_id)=0;
374 virtual int canTune(const eDVBFrontendParametersSatellite &feparm, iDVBFrontend *fe, int frontend_id)=0;
375 virtual void setRotorMoving(bool)=0;
383 class iDVBChannel: public iObject
388 state_idle, /* not yet tuned */
389 state_tuning, /* currently tuning (first time) */
390 state_failed, /* tuning failed. */
391 state_unavailable, /* currently unavailable, will be back without further interaction */
393 state_release /* channel is being shut down. */
400 virtual RESULT connectStateChange(const Slot1<void,iDVBChannel*> &stateChange, ePtr<eConnection> &connection)=0;
401 virtual RESULT connectEvent(const Slot2<void,iDVBChannel*,int> &eventChange, ePtr<eConnection> &connection)=0;
402 virtual RESULT getState(int &state)=0;
404 /* demux capabilities */
410 virtual RESULT setCIRouting(const eDVBCIRouting &routing)=0;
411 virtual RESULT getDemux(ePtr<iDVBDemux> &demux, int cap=0)=0;
413 /* direct frontend access for raw channels and/or status inquiries. */
414 virtual RESULT getFrontend(ePtr<iDVBFrontend> &frontend)=0;
416 /* use count handling */
417 virtual void AddUse() = 0;
418 virtual void ReleaseUse() = 0;
421 /* signed, so we can express deltas. */
422 typedef long long pts_t;
424 class iDVBPVRChannel: public iDVBChannel
429 state_eof = state_release + 1 /* end-of-file reached. */
432 /* FIXME: there are some very ugly buffer-end and ... related problems */
433 /* so this is VERY UGLY. */
434 virtual RESULT playFile(const char *file) = 0;
436 virtual RESULT getLength(pts_t &pts) = 0;
438 /* we explicitely ask for the decoding demux here because a channel
439 can be shared between multiple decoders.
440 Of couse skipping doesn't make much sense
441 then, but getCurrentPosition does. */
442 virtual RESULT getCurrentPosition(iDVBDemux *decoding_demux, pts_t &pos, int mode) = 0;
443 virtual RESULT seekTo(iDVBDemux *decoding_demux, int relative, pts_t &pts) = 0;
444 virtual RESULT seekToPosition(iDVBDemux *decoding_demux, const off_t &pts) = 0;
447 class iDVBSectionReader;
448 class iDVBTSRecorder;
449 class iTSMPEGDecoder;
451 class iDVBDemux: public iObject
454 virtual RESULT createSectionReader(eMainloop *context, ePtr<iDVBSectionReader> &reader)=0;
455 virtual RESULT createTSRecorder(ePtr<iDVBTSRecorder> &recorder)=0;
456 virtual RESULT getMPEGDecoder(ePtr<iTSMPEGDecoder> &reader)=0;
457 virtual RESULT getSTC(pts_t &pts, int num=0)=0;
458 virtual RESULT getCADemuxID(uint8_t &id)=0;
459 virtual RESULT flush()=0;
462 class iTSMPEGDecoder: public iObject
465 enum { pidDisabled = -1 };
466 /** Set Displayed Video PID */
467 virtual RESULT setVideoPID(int vpid)=0;
469 enum { af_MPEG, af_AC3, af_DTS };
470 /** Set Displayed Audio PID and type */
471 virtual RESULT setAudioPID(int apid, int type)=0;
473 /** Set Displayed Videotext PID */
474 virtual RESULT setTextPID(int vpid)=0;
476 /** Set Sync mode to PCR */
477 virtual RESULT setSyncPCR(int pcrpid)=0;
478 enum { sm_Audio, sm_Video };
479 /** Set Sync mode to either audio or video master */
480 virtual RESULT setSyncMaster(int who)=0;
482 /** Apply settings */
483 virtual RESULT start()=0;
485 /** Freeze frame. Either continue decoding (without display) or halt. */
486 virtual RESULT freeze(int cont)=0;
487 /** Continue after freeze. */
488 virtual RESULT unfreeze()=0;
490 /** fast forward by skipping frames. 0 is disabled, 2 is twice-the-speed, ... */
491 virtual RESULT setFastForward(int skip=0)=0;
493 // stop on .. Picture
494 enum { spm_I, spm_Ref, spm_Any };
495 /** Stop on specific decoded picture. For I-Frame display. */
496 virtual RESULT setSinglePictureMode(int when)=0;
498 enum { pkm_B, pkm_PB };
499 /** Fast forward by skipping either B or P/B pictures */
500 virtual RESULT setPictureSkipMode(int what)=0;
502 /** Slow Motion by repeating pictures */
503 virtual RESULT setSlowMotion(int repeat)=0;
505 enum { zoom_Normal, zoom_PanScan, zoom_Letterbox, zoom_Fullscreen };
506 /** Set Zoom. mode *must* be fitting. */
507 virtual RESULT setZoom(int what)=0;
509 virtual RESULT setTrickmode(int what) = 0;