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 typedef enum { atUnknown, atMPEG, atMP3, atAC3, atDTS, atAAC, atPCM, atOGG } audiotype_t;
47 typedef enum { stPlainText, stSSA, stSRT } subtype_t;
49 class eServiceMP3: public iPlayableService, public iPauseableService,
50 public iServiceInformation, public iSeekableService, public iAudioTrackSelection, public iAudioChannelSelection, public iSubtitleOutput, public Object
52 DECLARE_REF(eServiceMP3);
54 virtual ~eServiceMP3();
57 RESULT connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection);
60 RESULT setTarget(int target);
62 RESULT pause(ePtr<iPauseableService> &ptr);
63 RESULT setSlowMotion(int ratio);
64 RESULT setFastForward(int ratio);
66 RESULT seek(ePtr<iSeekableService> &ptr);
67 RESULT audioTracks(ePtr<iAudioTrackSelection> &ptr);
68 RESULT audioChannel(ePtr<iAudioChannelSelection> &ptr);
69 RESULT subtitle(ePtr<iSubtitleOutput> &ptr);
71 // not implemented (yet)
72 RESULT frontendInfo(ePtr<iFrontendInformation> &ptr) { ptr = 0; return -1; }
73 RESULT subServices(ePtr<iSubserviceList> &ptr) { ptr = 0; return -1; }
74 RESULT timeshift(ePtr<iTimeshiftService> &ptr) { ptr = 0; return -1; }
75 RESULT cueSheet(ePtr<iCueSheet> &ptr) { ptr = 0; return -1; }
76 RESULT audioDelay(ePtr<iAudioDelay> &ptr) { ptr = 0; return -1; }
77 RESULT rdsDecoder(ePtr<iRdsDecoder> &ptr) { ptr = 0; return -1; }
78 RESULT stream(ePtr<iStreamableService> &ptr) { ptr = 0; return -1; }
79 RESULT keys(ePtr<iServiceKeys> &ptr) { ptr = 0; return -1; }
85 RESULT info(ePtr<iServiceInformation>&);
88 RESULT getLength(pts_t &SWIG_OUTPUT);
89 RESULT seekTo(pts_t to);
90 RESULT seekRelative(int direction, pts_t to);
91 RESULT getPlayPosition(pts_t &SWIG_OUTPUT);
92 RESULT setTrickmode(int trick);
93 RESULT isCurrentlySeekable();
95 // iServiceInformation
96 RESULT getName(std::string &name);
98 std::string getInfoString(int w);
100 // iAudioTrackSelection
101 int getNumberOfTracks();
102 RESULT selectTrack(unsigned int i);
103 RESULT getTrackInfo(struct iAudioTrackInfo &, unsigned int n);
104 int getCurrentTrack();
106 // iAudioChannelSelection
107 int getCurrentChannel();
108 RESULT selectChannel(int i);
111 RESULT enableSubtitles(eWidget *parent, SWIG_PYOBJECT(ePyObject) entry);
112 RESULT disableSubtitles(eWidget *parent);
113 PyObject *getSubtitleList();
114 PyObject *getCachedSubtitle();
120 std::string language_code; /* iso-639, if available. */
122 :pad(0), type(atUnknown)
126 struct subtitleStream
130 std::string language_code; /* iso-639, if available. */
137 int m_currentAudioStream;
138 int m_currentSubtitleStream;
139 int selectAudioStream(int i);
140 std::vector<audioStream> m_audioStreams;
141 std::vector<subtitleStream> m_subtitleStreams;
142 eSubtitleWidget *m_subtitle_widget;
143 int m_currentTrickRatio;
144 eTimer m_seekTimeout;
145 void seekTimeoutCB();
146 friend class eServiceFactoryMP3;
147 std::string m_filename;
148 eServiceMP3(const char *filename);
149 Signal2<void,iPlayableService*,int> m_event;
152 stIdle, stRunning, stStopped,
155 GstElement *m_gst_pipeline;
156 GstTagList *m_stream_tags;
157 eFixedMessagePump<int> m_pump;
158 std::string m_error_message;
160 audiotype_t gstCheckAudioPad(GstStructure* structure);
161 void gstBusCall(GstBus *bus, GstMessage *msg);
162 static GstBusSyncReply gstBusSyncHandler(GstBus *bus, GstMessage *message, gpointer user_data);
163 static void gstCBpadAdded(GstElement *decodebin, GstPad *pad, gpointer data); /* for mpegdemux */
164 static void gstCBfilterPadAdded(GstElement *filter, GstPad *pad, gpointer user_data); /* for id3demux */
165 static void gstCBnewPad(GstElement *decodebin, GstPad *pad, gboolean last, gpointer data); /* for decodebin */
166 static void gstCBunknownType(GstElement *decodebin, GstPad *pad, GstCaps *l, gpointer data);
167 static void gstCBsubtitleAvail(GstElement *element, GstBuffer *buffer, GstPad *pad, gpointer user_data);
168 static void gstCBsubtitlePadEvent(GstPad *pad, GstEvent *event, gpointer user_data);
169 GstPad* gstCreateSubtitleSink(eServiceMP3* _this, subtype_t type);
170 void gstPoll(const int&);