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 { atUnknown, atMP2, atMP3, atAC3, atDTS, atAAC, atPCM, atOGG } type;
117 std::string language_code; /* iso-639, if available. */
119 :pad(0), type(atUnknown)
123 struct subtitleStream
126 std::string language_code; /* iso-639, if available. */
129 int m_currentAudioStream;
130 int m_currentSubtitleStream;
131 int selectAudioStream(int i);
132 std::vector<audioStream> m_audioStreams;
133 std::vector<subtitleStream> m_subtitleStreams;
134 eSubtitleWidget *m_subtitle_widget;
135 int m_currentTrickRatio;
136 eTimer m_seekTimeout;
137 void eServiceMP3::seekTimeoutCB();
138 friend class eServiceFactoryMP3;
139 std::string m_filename;
140 eServiceMP3(const char *filename);
141 Signal2<void,iPlayableService*,int> m_event;
144 stIdle, stRunning, stStopped,
147 GstElement *m_gst_pipeline;
148 GstTagList *m_stream_tags;
149 eFixedMessagePump<int> m_pump;
151 void gstBusCall(GstBus *bus, GstMessage *msg);
152 static GstBusSyncReply gstBusSyncHandler(GstBus *bus, GstMessage *message, gpointer user_data);
153 static void gstCBpadAdded(GstElement *decodebin, GstPad *pad, gpointer data); /* for mpegdemux */
154 static void gstCBfilterPadAdded(GstElement *filter, GstPad *pad, gpointer user_data); /* for id3demux */
155 static void gstCBnewPad(GstElement *decodebin, GstPad *pad, gboolean last, gpointer data); /* for decodebin */
156 static void gstCBunknownType(GstElement *decodebin, GstPad *pad, GstCaps *l, gpointer data);
157 static void gstCBsubtitleAvail(GstElement *element, GstBuffer *buffer, GstPad *pad, gpointer user_data);
158 void gstPoll(const int&);