5 #if HAVE_DVB_API_VERSION < 3
6 #include <ost/frontend.h>
7 #define FRONTENDPARAMETERS FrontendParameters
9 #include <linux/dvb/frontend.h>
10 #define FRONTENDPARAMETERS struct dvb_frontend_parameters
12 #include <lib/dvb/frontendparms.h>
13 #include <lib/base/object.h>
14 #include <lib/base/ebase.h>
15 #include <lib/service/service.h>
16 #include <libsig_comp.h>
17 #include <connection.h>
21 std::string m_bouquet_name;
22 std::string m_filename; // without path.. just name
23 typedef std::list<eServiceReference> list;
25 // the following four methods are implemented in db.cpp
26 RESULT flushChanges();
27 RESULT addService(const eServiceReference &);
28 RESULT removeService(const eServiceReference &);
29 RESULT moveService(const eServiceReference &, unsigned int);
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)
191 ////////////////// TODO: we need an interface here, but what exactly?
194 // btw, still implemented in db.cpp. FIX THIS, TOO.
196 class eDVBChannelQuery;
198 class eDVBService: public iStaticServiceInformation
200 DECLARE_REF(eDVBService);
204 cVPID, cAPID, cTPID, cPCRPID, cAC3PID, cacheMax
207 int getCachePID(cacheID);
208 void setCachePID(cacheID, int);
209 bool cacheEmpty() { return m_cache.empty(); }
212 /* m_service_name_sort is uppercase, with special chars removed, to increase sort performance. */
213 std::string m_service_name, m_service_name_sort;
214 std::string m_provider_name;
220 std::map<int,int> m_cache;
221 virtual ~eDVBService();
223 eDVBService &operator=(const eDVBService &);
225 // iStaticServiceInformation
226 RESULT getName(const eServiceReference &ref, std::string &name);
227 RESULT getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &ptr, time_t start_time);
228 bool isPlayable(const eServiceReference &ref, const eServiceReference &ignore);
231 int checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQuery &query);
238 class iDVBFrontendParameters;
240 class iDVBChannelListQuery: public iObject
243 virtual RESULT getNextResult(eServiceReferenceDVB &ref)=0;
244 virtual int compareLessEqual(const eServiceReferenceDVB &a, const eServiceReferenceDVB &b)=0;
247 class eDVBChannelQuery: public iObject
249 DECLARE_REF(eDVBChannelQuery);
266 std::string m_string;
268 eDVBChannelID m_channelid;
270 /* sort is only valid in root, and must be from the enum above. */
272 std::string m_bouquet_name;
274 static RESULT compile(ePtr<eDVBChannelQuery> &res, std::string query);
276 ePtr<eDVBChannelQuery> m_p1, m_p2;
279 class iDVBChannelList: public iObject
282 virtual RESULT addChannelToList(const eDVBChannelID &id, iDVBFrontendParameters *feparm)=0;
283 virtual RESULT removeChannel(const eDVBChannelID &id)=0;
285 virtual RESULT getChannelFrontendData(const eDVBChannelID &id, ePtr<iDVBFrontendParameters> &parm)=0;
287 virtual RESULT addService(const eServiceReferenceDVB &service, eDVBService *service)=0;
288 virtual RESULT getService(const eServiceReferenceDVB &reference, ePtr<eDVBService> &service)=0;
289 virtual RESULT flush()=0;
291 virtual RESULT getBouquet(const eServiceReference &ref, eBouquet* &bouquet)=0;
293 virtual RESULT startQuery(ePtr<iDVBChannelListQuery> &query, eDVBChannelQuery *query, const eServiceReference &source)=0;
296 class iDVBFrontendParameters: public iObject
299 virtual RESULT getSystem(int &type) const = 0;
300 virtual RESULT getDVBS(eDVBFrontendParametersSatellite &p) const = 0;
301 virtual RESULT getDVBC(eDVBFrontendParametersCable &p) const = 0;
302 virtual RESULT getDVBT(eDVBFrontendParametersTerrestrial &p) const = 0;
304 virtual RESULT calculateDifference(const iDVBFrontendParameters *parm, int &diff) const = 0;
305 virtual RESULT getHash(unsigned long &hash) const = 0;
308 #define MAX_DISEQC_LENGTH 16
310 class eDVBDiseqcCommand
314 __u8 data[MAX_DISEQC_LENGTH];
315 #if HAVE_DVB_API_VERSION < 3
321 class iDVBSatelliteEquipmentControl;
322 class eSecCommandList;
324 class iDVBFrontend: public iObject
328 feSatellite, feCable, feTerrestrial
330 virtual RESULT getFrontendType(int &type)=0;
331 virtual RESULT tune(const iDVBFrontendParameters &where)=0;
332 virtual RESULT connectStateChange(const Slot1<void,iDVBFrontend*> &stateChange, ePtr<eConnection> &connection)=0;
340 virtual RESULT getState(int &state)=0;
344 virtual RESULT setTone(int tone)=0;
346 voltageOff, voltage13, voltage18, voltage13_5, voltage18_5
348 virtual RESULT setVoltage(int voltage)=0;
349 virtual RESULT sendDiseqc(const eDVBDiseqcCommand &diseqc)=0;
350 virtual RESULT sendToneburst(int burst)=0;
351 virtual RESULT setSEC(iDVBSatelliteEquipmentControl *sec)=0;
352 virtual RESULT setSecSequence(const eSecCommandList &list)=0;
355 bitErrorRate, signalPower, signalQuality
357 virtual int readFrontendData(int type)=0;
359 virtual RESULT getData(int num, int &data)=0;
360 virtual RESULT setData(int num, int val)=0;
362 /* 0 means: not compatible. other values are a priority. */
363 virtual int isCompatibleWith(ePtr<iDVBFrontendParameters> &feparm)=0;
366 class iDVBSatelliteEquipmentControl: public iObject
369 virtual RESULT prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, eDVBFrontendParametersSatellite &sat, int frontend_id)=0;
370 virtual int canTune(const eDVBFrontendParametersSatellite &feparm, iDVBFrontend *fe, int frontend_id)=0;
371 virtual void setRotorMoving(bool)=0;
379 class iDVBChannel: public iObject
384 state_idle, /* not yet tuned */
385 state_tuning, /* currently tuning (first time) */
386 state_failed, /* tuning failed. */
387 state_unavailable, /* currently unavailable, will be back without further interaction */
389 state_release /* channel is being shut down. */
396 virtual RESULT connectStateChange(const Slot1<void,iDVBChannel*> &stateChange, ePtr<eConnection> &connection)=0;
397 virtual RESULT connectEvent(const Slot2<void,iDVBChannel*,int> &eventChange, ePtr<eConnection> &connection)=0;
398 virtual RESULT getState(int &state)=0;
400 /* demux capabilities */
406 virtual RESULT setCIRouting(const eDVBCIRouting &routing)=0;
407 virtual RESULT getDemux(ePtr<iDVBDemux> &demux, int cap=0)=0;
409 /* direct frontend access for raw channels and/or status inquiries. */
410 virtual RESULT getFrontend(ePtr<iDVBFrontend> &frontend)=0;
412 /* use count handling */
413 virtual void AddUse() = 0;
414 virtual void ReleaseUse() = 0;
417 /* signed, so we can express deltas. */
418 typedef long long pts_t;
420 class iDVBPVRChannel: public iDVBChannel
425 state_eof = state_release + 1 /* end-of-file reached. */
428 /* FIXME: there are some very ugly buffer-end and ... related problems */
429 /* so this is VERY UGLY. */
430 virtual RESULT playFile(const char *file) = 0;
432 virtual RESULT getLength(pts_t &pts) = 0;
434 /* we explicitely ask for the decoding demux here because a channel
435 can be shared between multiple decoders.
436 Of couse skipping doesn't make much sense
437 then, but getCurrentPosition does. */
438 virtual RESULT getCurrentPosition(iDVBDemux *decoding_demux, pts_t &pos, int mode) = 0;
439 virtual RESULT seekTo(iDVBDemux *decoding_demux, int relative, pts_t &pts) = 0;
440 virtual RESULT seekToPosition(iDVBDemux *decoding_demux, const off_t &pts) = 0;
443 class iDVBSectionReader;
444 class iDVBTSRecorder;
445 class iTSMPEGDecoder;
447 class iDVBDemux: public iObject
450 virtual RESULT createSectionReader(eMainloop *context, ePtr<iDVBSectionReader> &reader)=0;
451 virtual RESULT createTSRecorder(ePtr<iDVBTSRecorder> &recorder)=0;
452 virtual RESULT getMPEGDecoder(ePtr<iTSMPEGDecoder> &reader)=0;
453 virtual RESULT getSTC(pts_t &pts, int num=0)=0;
454 virtual RESULT getCADemuxID(uint8_t &id)=0;
455 virtual RESULT flush()=0;
458 class iTSMPEGDecoder: public iObject
461 enum { pidDisabled = -1 };
462 /** Set Displayed Video PID */
463 virtual RESULT setVideoPID(int vpid)=0;
465 enum { af_MPEG, af_AC3, af_DTS };
466 /** Set Displayed Audio PID and type */
467 virtual RESULT setAudioPID(int apid, int type)=0;
469 /** Set Displayed Videotext PID */
470 virtual RESULT setTextPID(int vpid)=0;
472 /** Set Sync mode to PCR */
473 virtual RESULT setSyncPCR(int pcrpid)=0;
474 enum { sm_Audio, sm_Video };
475 /** Set Sync mode to either audio or video master */
476 virtual RESULT setSyncMaster(int who)=0;
478 /** Apply settings */
479 virtual RESULT start()=0;
481 /** Freeze frame. Either continue decoding (without display) or halt. */
482 virtual RESULT freeze(int cont)=0;
483 /** Continue after freeze. */
484 virtual RESULT unfreeze()=0;
486 /** fast forward by skipping frames. 0 is disabled, 2 is twice-the-speed, ... */
487 virtual RESULT setFastForward(int skip=0)=0;
489 // stop on .. Picture
490 enum { spm_I, spm_Ref, spm_Any };
491 /** Stop on specific decoded picture. For I-Frame display. */
492 virtual RESULT setSinglePictureMode(int when)=0;
494 enum { pkm_B, pkm_PB };
495 /** Fast forward by skipping either B or P/B pictures */
496 virtual RESULT setPictureSkipMode(int what)=0;
498 /** Slow Motion by repeating pictures */
499 virtual RESULT setSlowMotion(int repeat)=0;
501 enum { zoom_Normal, zoom_PanScan, zoom_Letterbox, zoom_Fullscreen };
502 /** Set Zoom. mode *must* be fitting. */
503 virtual RESULT setZoom(int what)=0;
505 virtual RESULT setTrickmode(int what) = 0;