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 five 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);
29 RESULT setListName(const std::string &name);
32 /* these structures have by intention no operator int() defined.
33 the reason of these structures is to avoid mixing for example
34 a onid and a tsid (as there's no general order for them).
36 defining an operator int() would implicitely convert values
37 between them over the constructor with the int argument.
39 'explicit' doesn't here - eTransportStreamID(eOriginalNetworkID(n))
42 struct eTransportStreamID
47 int get() const { return v; }
48 eTransportStreamID(int i): v(i) { }
49 eTransportStreamID(): v(-1) { }
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; }
53 bool operator > (const eTransportStreamID &c) const { return v > c.v; }
61 int get() const { return v; }
62 eServiceID(int i): v(i) { }
63 eServiceID(): v(-1) { }
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; }
67 bool operator > (const eServiceID &c) const { return v > c.v; }
70 struct eOriginalNetworkID
75 int get() const { return v; }
76 eOriginalNetworkID(int i): v(i) { }
77 eOriginalNetworkID(): v(-1) { }
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; }
81 bool operator > (const eOriginalNetworkID &c) const { return v > c.v; }
89 int get() const { return v; }
90 eDVBNamespace(int i): v(i) { }
91 eDVBNamespace(): v(-1) { }
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; }
95 bool operator > (const eDVBNamespace &c) const { return v > c.v; }
100 eDVBNamespace dvbnamespace;
101 eTransportStreamID transport_stream_id;
102 eOriginalNetworkID original_network_id;
104 bool operator==(const eDVBChannelID &c) const
106 return dvbnamespace == c.dvbnamespace &&
107 transport_stream_id == c.transport_stream_id &&
108 original_network_id == c.original_network_id;
111 bool operator<(const eDVBChannelID &c) const
113 if (dvbnamespace < c.dvbnamespace)
115 else if (dvbnamespace == c.dvbnamespace)
117 if (original_network_id < c.original_network_id)
119 else if (original_network_id == c.original_network_id)
120 if (transport_stream_id < c.transport_stream_id)
125 eDVBChannelID(eDVBNamespace dvbnamespace, eTransportStreamID tsid, eOriginalNetworkID onid):
126 dvbnamespace(dvbnamespace), transport_stream_id(tsid), original_network_id(onid)
130 dvbnamespace(-1), transport_stream_id(-1), original_network_id(-1)
133 operator bool() const
135 return (dvbnamespace != -1) && (transport_stream_id != -1) && (original_network_id != -1);
139 struct eServiceReferenceDVB: public eServiceReference
141 int getServiceType() const { return data[0]; }
142 void setServiceType(int service_type) { data[0]=service_type; }
144 eServiceID getServiceID() const { return eServiceID(data[1]); }
145 void setServiceID(eServiceID service_id) { data[1]=service_id.get(); }
147 eTransportStreamID getTransportStreamID() const { return eTransportStreamID(data[2]); }
148 void setTransportStreamID(eTransportStreamID transport_stream_id) { data[2]=transport_stream_id.get(); }
150 eOriginalNetworkID getOriginalNetworkID() const { return eOriginalNetworkID(data[3]); }
151 void setOriginalNetworkID(eOriginalNetworkID original_network_id) { data[3]=original_network_id.get(); }
153 eDVBNamespace getDVBNamespace() const { return eDVBNamespace(data[4]); }
154 void setDVBNamespace(eDVBNamespace dvbnamespace) { data[4]=dvbnamespace.get(); }
156 eServiceID getParentServiceID() const { return eServiceID(data[5]); }
157 void setParentServiceID( eServiceID sid ) { data[5]=sid.get(); }
159 eTransportStreamID getParentTransportStreamID() const { return eTransportStreamID(data[6]); }
160 void setParentTransportStreamID( eTransportStreamID tsid ) { data[6]=tsid.get(); }
162 eServiceReferenceDVB(eDVBNamespace dvbnamespace, eTransportStreamID transport_stream_id, eOriginalNetworkID original_network_id, eServiceID service_id, int service_type)
163 :eServiceReference(eServiceReference::idDVB, 0)
165 setTransportStreamID(transport_stream_id);
166 setOriginalNetworkID(original_network_id);
167 setDVBNamespace(dvbnamespace);
168 setServiceID(service_id);
169 setServiceType(service_type);
172 void set(const eDVBChannelID &chid)
174 setDVBNamespace(chid.dvbnamespace);
175 setOriginalNetworkID(chid.original_network_id);
176 setTransportStreamID(chid.transport_stream_id);
179 void getChannelID(eDVBChannelID &chid) const
181 chid = eDVBChannelID(getDVBNamespace(), getTransportStreamID(), getOriginalNetworkID());
184 eServiceReferenceDVB()
185 :eServiceReference(eServiceReference::idDVB, 0)
189 eServiceReferenceDVB(const std::string &string)
190 :eServiceReference(string)
196 ////////////////// TODO: we need an interface here, but what exactly?
199 // btw, still implemented in db.cpp. FIX THIS, TOO.
201 class eDVBChannelQuery;
203 class eDVBService: public iStaticServiceInformation
205 DECLARE_REF(eDVBService);
209 cVPID, cAPID, cTPID, cPCRPID, cAC3PID, cacheMax
212 int getCachePID(cacheID);
213 void setCachePID(cacheID, int);
214 bool cacheEmpty() { return m_cache.empty(); }
217 /* m_service_name_sort is uppercase, with special chars removed, to increase sort performance. */
218 std::string m_service_name, m_service_name_sort;
219 std::string m_provider_name;
225 std::map<int,int> m_cache;
226 virtual ~eDVBService();
228 eDVBService &operator=(const eDVBService &);
230 // iStaticServiceInformation
231 RESULT getName(const eServiceReference &ref, std::string &name);
232 RESULT getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &ptr, time_t start_time);
233 bool isPlayable(const eServiceReference &ref, const eServiceReference &ignore);
236 int checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQuery &query);
243 class iDVBFrontendParameters;
245 class iDVBChannelListQuery: public iObject
248 virtual RESULT getNextResult(eServiceReferenceDVB &ref)=0;
249 virtual int compareLessEqual(const eServiceReferenceDVB &a, const eServiceReferenceDVB &b)=0;
252 class eDVBChannelQuery: public iObject
254 DECLARE_REF(eDVBChannelQuery);
271 std::string m_string;
273 eDVBChannelID m_channelid;
275 /* sort is only valid in root, and must be from the enum above. */
277 std::string m_bouquet_name;
279 static RESULT compile(ePtr<eDVBChannelQuery> &res, std::string query);
281 ePtr<eDVBChannelQuery> m_p1, m_p2;
284 class iDVBChannelList: public iObject
287 virtual RESULT addChannelToList(const eDVBChannelID &id, iDVBFrontendParameters *feparm)=0;
288 virtual RESULT removeChannel(const eDVBChannelID &id)=0;
290 virtual RESULT getChannelFrontendData(const eDVBChannelID &id, ePtr<iDVBFrontendParameters> &parm)=0;
292 virtual RESULT addService(const eServiceReferenceDVB &service, eDVBService *service)=0;
293 virtual RESULT getService(const eServiceReferenceDVB &reference, ePtr<eDVBService> &service)=0;
294 virtual RESULT flush()=0;
296 virtual RESULT getBouquet(const eServiceReference &ref, eBouquet* &bouquet)=0;
298 virtual RESULT startQuery(ePtr<iDVBChannelListQuery> &query, eDVBChannelQuery *query, const eServiceReference &source)=0;
301 class iDVBFrontendParameters: public iObject
304 virtual RESULT getSystem(int &type) const = 0;
305 virtual RESULT getDVBS(eDVBFrontendParametersSatellite &p) const = 0;
306 virtual RESULT getDVBC(eDVBFrontendParametersCable &p) const = 0;
307 virtual RESULT getDVBT(eDVBFrontendParametersTerrestrial &p) const = 0;
309 virtual RESULT calculateDifference(const iDVBFrontendParameters *parm, int &diff) const = 0;
310 virtual RESULT getHash(unsigned long &hash) const = 0;
313 #define MAX_DISEQC_LENGTH 16
315 class eDVBDiseqcCommand
319 __u8 data[MAX_DISEQC_LENGTH];
320 #if HAVE_DVB_API_VERSION < 3
326 class iDVBSatelliteEquipmentControl;
327 class eSecCommandList;
329 class iDVBFrontend: public iObject
333 feSatellite, feCable, feTerrestrial
335 virtual RESULT getFrontendType(int &type)=0;
336 virtual RESULT tune(const iDVBFrontendParameters &where)=0;
337 virtual RESULT connectStateChange(const Slot1<void,iDVBFrontend*> &stateChange, ePtr<eConnection> &connection)=0;
345 virtual RESULT getState(int &state)=0;
349 virtual RESULT setTone(int tone)=0;
351 voltageOff, voltage13, voltage18, voltage13_5, voltage18_5
353 virtual RESULT setVoltage(int voltage)=0;
354 virtual RESULT sendDiseqc(const eDVBDiseqcCommand &diseqc)=0;
355 virtual RESULT sendToneburst(int burst)=0;
356 virtual RESULT setSEC(iDVBSatelliteEquipmentControl *sec)=0;
357 virtual RESULT setSecSequence(const eSecCommandList &list)=0;
360 bitErrorRate, signalPower, signalQuality
362 virtual int readFrontendData(int type)=0;
364 virtual RESULT getData(int num, int &data)=0;
365 virtual RESULT setData(int num, int val)=0;
367 /* 0 means: not compatible. other values are a priority. */
368 virtual int isCompatibleWith(ePtr<iDVBFrontendParameters> &feparm)=0;
371 class iDVBSatelliteEquipmentControl: public iObject
374 virtual RESULT prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, eDVBFrontendParametersSatellite &sat, int frontend_id)=0;
375 virtual int canTune(const eDVBFrontendParametersSatellite &feparm, iDVBFrontend *fe, int frontend_id)=0;
376 virtual void setRotorMoving(bool)=0;
384 class iDVBChannel: public iObject
389 state_idle, /* not yet tuned */
390 state_tuning, /* currently tuning (first time) */
391 state_failed, /* tuning failed. */
392 state_unavailable, /* currently unavailable, will be back without further interaction */
394 state_release /* channel is being shut down. */
401 virtual RESULT connectStateChange(const Slot1<void,iDVBChannel*> &stateChange, ePtr<eConnection> &connection)=0;
402 virtual RESULT connectEvent(const Slot2<void,iDVBChannel*,int> &eventChange, ePtr<eConnection> &connection)=0;
403 virtual RESULT getState(int &state)=0;
405 /* demux capabilities */
411 virtual RESULT setCIRouting(const eDVBCIRouting &routing)=0;
412 virtual RESULT getDemux(ePtr<iDVBDemux> &demux, int cap=0)=0;
414 /* direct frontend access for raw channels and/or status inquiries. */
415 virtual RESULT getFrontend(ePtr<iDVBFrontend> &frontend)=0;
417 /* use count handling */
418 virtual void AddUse() = 0;
419 virtual void ReleaseUse() = 0;
422 /* signed, so we can express deltas. */
423 typedef long long pts_t;
425 class iDVBPVRChannel: public iDVBChannel
430 state_eof = state_release + 1 /* end-of-file reached. */
433 /* FIXME: there are some very ugly buffer-end and ... related problems */
434 /* so this is VERY UGLY. */
435 virtual RESULT playFile(const char *file) = 0;
437 virtual RESULT getLength(pts_t &pts) = 0;
439 /* we explicitely ask for the decoding demux here because a channel
440 can be shared between multiple decoders.
441 Of couse skipping doesn't make much sense
442 then, but getCurrentPosition does. */
443 virtual RESULT getCurrentPosition(iDVBDemux *decoding_demux, pts_t &pos, int mode) = 0;
444 virtual RESULT seekTo(iDVBDemux *decoding_demux, int relative, pts_t &pts) = 0;
445 virtual RESULT seekToPosition(iDVBDemux *decoding_demux, const off_t &pts) = 0;
448 class iDVBSectionReader;
449 class iDVBTSRecorder;
450 class iTSMPEGDecoder;
452 class iDVBDemux: public iObject
455 virtual RESULT createSectionReader(eMainloop *context, ePtr<iDVBSectionReader> &reader)=0;
456 virtual RESULT createTSRecorder(ePtr<iDVBTSRecorder> &recorder)=0;
457 virtual RESULT getMPEGDecoder(ePtr<iTSMPEGDecoder> &reader)=0;
458 virtual RESULT getSTC(pts_t &pts, int num=0)=0;
459 virtual RESULT getCADemuxID(uint8_t &id)=0;
460 virtual RESULT flush()=0;
463 class iTSMPEGDecoder: public iObject
466 enum { pidDisabled = -1 };
467 /** Set Displayed Video PID */
468 virtual RESULT setVideoPID(int vpid)=0;
470 enum { af_MPEG, af_AC3, af_DTS };
471 /** Set Displayed Audio PID and type */
472 virtual RESULT setAudioPID(int apid, int type)=0;
474 /** Set Displayed Videotext PID */
475 virtual RESULT setTextPID(int vpid)=0;
477 /** Set Sync mode to PCR */
478 virtual RESULT setSyncPCR(int pcrpid)=0;
479 enum { sm_Audio, sm_Video };
480 /** Set Sync mode to either audio or video master */
481 virtual RESULT setSyncMaster(int who)=0;
483 /** Apply settings */
484 virtual RESULT start()=0;
486 /** Freeze frame. Either continue decoding (without display) or halt. */
487 virtual RESULT freeze(int cont)=0;
488 /** Continue after freeze. */
489 virtual RESULT unfreeze()=0;
491 /** fast forward by skipping frames. 0 is disabled, 2 is twice-the-speed, ... */
492 virtual RESULT setFastForward(int skip=0)=0;
494 // stop on .. Picture
495 enum { spm_I, spm_Ref, spm_Any };
496 /** Stop on specific decoded picture. For I-Frame display. */
497 virtual RESULT setSinglePictureMode(int when)=0;
499 enum { pkm_B, pkm_PB };
500 /** Fast forward by skipping either B or P/B pictures */
501 virtual RESULT setPictureSkipMode(int what)=0;
503 /** Slow Motion by repeating pictures */
504 virtual RESULT setSlowMotion(int repeat)=0;
506 enum { zoom_Normal, zoom_PanScan, zoom_Letterbox, zoom_Fullscreen };
507 /** Set Zoom. mode *must* be fitting. */
508 virtual RESULT setZoom(int what)=0;
510 virtual RESULT setTrickmode(int what) = 0;