5 #include <lib/base/message.h>
6 #include <lib/service/iservice.h>
7 #include <lib/dvb/pmt.h>
8 #include <lib/dvb/subtitle.h>
9 #include <lib/dvb/teletext.h>
12 class eStaticServiceMP3Info;
14 class eSubtitleWidget;
16 class eServiceFactoryMP3: public iServiceHandler
18 DECLARE_REF(eServiceFactoryMP3);
21 virtual ~eServiceFactoryMP3();
25 RESULT play(const eServiceReference &, ePtr<iPlayableService> &ptr);
26 RESULT record(const eServiceReference &, ePtr<iRecordableService> &ptr);
27 RESULT list(const eServiceReference &, ePtr<iListableService> &ptr);
28 RESULT info(const eServiceReference &, ePtr<iStaticServiceInformation> &ptr);
29 RESULT offlineOperations(const eServiceReference &, ePtr<iServiceOfflineOperations> &ptr);
31 ePtr<eStaticServiceMP3Info> m_service_info;
34 class eStaticServiceMP3Info: public iStaticServiceInformation
36 DECLARE_REF(eStaticServiceMP3Info);
37 friend class eServiceFactoryMP3;
38 eStaticServiceMP3Info();
40 RESULT getName(const eServiceReference &ref, std::string &name);
41 int getLength(const eServiceReference &ref);
44 typedef struct _GstElement GstElement;
46 class eServiceMP3: public iPlayableService, public iPauseableService,
47 public iServiceInformation, public iSeekableService, public iAudioTrackSelection, public iAudioChannelSelection, public iSubtitleOutput, public Object
49 DECLARE_REF(eServiceMP3);
51 virtual ~eServiceMP3();
54 RESULT connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection);
57 RESULT setTarget(int target);
59 RESULT pause(ePtr<iPauseableService> &ptr);
60 RESULT setSlowMotion(int ratio);
61 RESULT setFastForward(int ratio);
63 RESULT seek(ePtr<iSeekableService> &ptr);
64 RESULT audioTracks(ePtr<iAudioTrackSelection> &ptr);
65 RESULT audioChannel(ePtr<iAudioChannelSelection> &ptr);
66 RESULT subtitle(ePtr<iSubtitleOutput> &ptr);
68 // not implemented (yet)
69 RESULT frontendInfo(ePtr<iFrontendInformation> &ptr) { ptr = 0; return -1; }
70 RESULT subServices(ePtr<iSubserviceList> &ptr) { ptr = 0; return -1; }
71 RESULT timeshift(ePtr<iTimeshiftService> &ptr) { ptr = 0; return -1; }
72 RESULT cueSheet(ePtr<iCueSheet> &ptr) { ptr = 0; return -1; }
73 RESULT audioDelay(ePtr<iAudioDelay> &ptr) { ptr = 0; return -1; }
74 RESULT rdsDecoder(ePtr<iRdsDecoder> &ptr) { ptr = 0; return -1; }
75 RESULT stream(ePtr<iStreamableService> &ptr) { ptr = 0; return -1; }
76 RESULT keys(ePtr<iServiceKeys> &ptr) { ptr = 0; return -1; }
82 RESULT info(ePtr<iServiceInformation>&);
85 RESULT getLength(pts_t &SWIG_OUTPUT);
86 RESULT seekTo(pts_t to);
87 RESULT seekRelative(int direction, pts_t to);
88 RESULT getPlayPosition(pts_t &SWIG_OUTPUT);
89 RESULT setTrickmode(int trick);
90 RESULT isCurrentlySeekable();
92 // iServiceInformation
93 RESULT getName(std::string &name);
95 std::string getInfoString(int w);
97 // iAudioTrackSelection
98 int getNumberOfTracks();
99 RESULT selectTrack(unsigned int i);
100 RESULT getTrackInfo(struct iAudioTrackInfo &, unsigned int n);
101 int getCurrentTrack();
103 // iAudioChannelSelection
104 int getCurrentChannel();
105 RESULT selectChannel(int i);
108 RESULT enableSubtitles(eWidget *parent, SWIG_PYOBJECT(ePyObject) entry);
109 RESULT disableSubtitles(eWidget *parent);
110 PyObject *getSubtitleList();
111 PyObject *getCachedSubtitle();
116 enum { atMP2, atMP3, atAC3, atDTS, atAAC, atPCM, atOGG };
117 int type; // mpeg2, ac3, dts, ...
118 std::string language_code; /* iso-639, if available. */
120 struct subtitleStream
123 std::string language_code; /* iso-639, if available. */
126 int m_currentAudioStream;
127 int m_currentSubtitleStream;
128 int selectAudioStream(int i);
129 std::vector<audioStream> m_audioStreams;
130 std::vector<subtitleStream> m_subtitleStreams;
131 eSubtitleWidget *m_subtitle_widget;
132 int m_currentTrickRatio;
133 eTimer m_seekTimeout;
134 void eServiceMP3::seekTimeoutCB();
135 friend class eServiceFactoryMP3;
136 std::string m_filename;
137 eServiceMP3(const char *filename);
138 Signal2<void,iPlayableService*,int> m_event;
141 stIdle, stRunning, stStopped,
144 GstElement *m_gst_pipeline;
145 GstTagList *m_stream_tags;
146 eFixedMessagePump<int> m_pump;
148 void gstBusCall(GstBus *bus, GstMessage *msg);
149 static GstBusSyncReply gstBusSyncHandler(GstBus *bus, GstMessage *message, gpointer user_data);
150 static void gstCBpadAdded(GstElement *decodebin, GstPad *pad, gpointer data); /* for mpegdemux */
151 static void gstCBfilterPadAdded(GstElement *filter, GstPad *pad, gpointer user_data); /* for id3demux */
152 static void gstCBnewPad(GstElement *decodebin, GstPad *pad, gboolean last, gpointer data); /* for decodebin */
153 static void gstCBunknownType(GstElement *decodebin, GstPad *pad, GstCaps *l, gpointer data);
154 static void gstCBsubtitleAvail(GstElement *element, GstBuffer *buffer, GstPad *pad, gpointer user_data);
155 void gstPoll(const int&);