1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
#ifndef __servicemp3_h
#define __servicemp3_h
#ifdef HAVE_GSTREAMER
#include <lib/base/message.h>
#include <lib/service/iservice.h>
#include <gst/gst.h>
class eStaticServiceMP3Info;
class eServiceFactoryMP3: public iServiceHandler
{
DECLARE_REF(eServiceFactoryMP3);
public:
eServiceFactoryMP3();
virtual ~eServiceFactoryMP3();
enum { id = 0x1001 };
// iServiceHandler
RESULT play(const eServiceReference &, ePtr<iPlayableService> &ptr);
RESULT record(const eServiceReference &, ePtr<iRecordableService> &ptr);
RESULT list(const eServiceReference &, ePtr<iListableService> &ptr);
RESULT info(const eServiceReference &, ePtr<iStaticServiceInformation> &ptr);
RESULT offlineOperations(const eServiceReference &, ePtr<iServiceOfflineOperations> &ptr);
private:
ePtr<eStaticServiceMP3Info> m_service_info;
};
class eStaticServiceMP3Info: public iStaticServiceInformation
{
DECLARE_REF(eStaticServiceMP3Info);
friend class eServiceFactoryMP3;
eStaticServiceMP3Info();
public:
RESULT getName(const eServiceReference &ref, std::string &name);
int getLength(const eServiceReference &ref);
};
typedef struct _GstElement GstElement;
class eServiceMP3: public iPlayableService, public iPauseableService,
public iServiceInformation, public iSeekableService, public Object
{
DECLARE_REF(eServiceMP3);
public:
virtual ~eServiceMP3();
// iPlayableService
RESULT connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection);
RESULT start();
RESULT stop();
RESULT setTarget(int target);
RESULT pause(ePtr<iPauseableService> &ptr);
RESULT setSlowMotion(int ratio);
RESULT setFastForward(int ratio);
RESULT seek(ePtr<iSeekableService> &ptr);
// not implemented (yet)
RESULT audioChannel(ePtr<iAudioChannelSelection> &ptr) { ptr = 0; return -1; }
RESULT audioTracks(ePtr<iAudioTrackSelection> &ptr) { ptr = 0; return -1; }
RESULT frontendStatusInfo(ePtr<iFrontendStatusInformation> &ptr) { ptr = 0; return -1; }
RESULT subServices(ePtr<iSubserviceList> &ptr) { ptr = 0; return -1; }
RESULT timeshift(ePtr<iTimeshiftService> &ptr) { ptr = 0; return -1; }
RESULT cueSheet(ePtr<iCueSheet>& ptr) { ptr = 0; return -1; }
// iPausableService
RESULT pause();
RESULT unpause();
RESULT info(ePtr<iServiceInformation>&);
// iSeekableService
RESULT getLength(pts_t &SWIG_OUTPUT);
RESULT seekTo(pts_t to);
RESULT seekRelative(int direction, pts_t to);
RESULT getPlayPosition(pts_t &SWIG_OUTPUT);
RESULT setTrickmode(int trick);
RESULT isCurrentlySeekable();
// iServiceInformation
RESULT getName(std::string &name);
int getInfo(int w);
std::string getInfoString(int w);
private:
friend class eServiceFactoryMP3;
std::string m_filename;
eServiceMP3(const char *filename);
Signal2<void,iPlayableService*,int> m_event;
enum
{
stIdle, stRunning, stStopped,
};
int m_state;
GstElement *m_gst_pipeline, *m_gst_audio;
GstTagList *m_stream_tags;
eFixedMessagePump<int> m_pump;
void gstBusCall(GstBus *bus, GstMessage *msg);
static GstBusSyncReply gstBusSyncHandler(GstBus *bus, GstMessage *message, gpointer user_data);
static void gstCBnewPad(GstElement *decodebin, GstPad *pad, gboolean last, gpointer data);
void gstPoll(const int&);
};
#endif
#endif
|