m (→How to develop a backend) |
m (→How to develop a backend) |
||
| Line 108: | Line 108: | ||
}; | }; | ||
</pre> | </pre> | ||
| - | Here is a sample player backend: [http://wiki.meego.com/images/Sample-player-backend-0.0.1.tar.gz] | + | Here is a sample player backend based on GStreamer using playbin2: [http://wiki.meego.com/images/Sample-player-backend-0.0.1.tar.gz] |
Contents |
This page describes the architecture of umms-0.1. You can get the code from: git://gitorious.org:meego-middleware/umms.git
The UMMS general description can found on the main page
Class to implement com.UMMS.AudioManager interface which provide client with audio output control service.
Class to implement com.UMMS.VideoOutput interface which provide client with video output control service.
Class to implement com.UMMS.PlayingContentMetadataViewer interface which allow the client to query the current playing content on server side.
Class to manage MediaPlayer objects, including create/destory, register/unregister MediaPlayer objects.
Class to implement the com.UMMS.MediaPlayer interface which provide media playback service for client.
A base class which defined internal interface for media playback. UmmsMediaPlayer uses this class to handle the service request. Backend developer need to subclass it.
A base class which defined internal interface for controlling audio output. UmmsAudioManager uses this class to handle the service request. Backend developer need to subclass it.
A base class which defined internal interface for controlling video output. UmmsVideoOutput uses this class to handle the service request. Backend developer need to subclass it.
A class which defined the plugin mechanism. All backend should be implemented as a UmmsPlugin.
An implementation of UmmsPlayerBackend.
An implementation of UmmsAudioBackend.
An implementation of UmmsVideoOutput.
Note that, Player,AudioManger,VideoOutput are plugins and will not provide by umms-1.0.
Suppose you are going to develop a player backend.
The UmmsPlayerBackend is an internal interface to abstract all the media playback control. The backend developer should subclass this class and implement its vmethods. Of course, you can just implement a subset of the virtual methods defined in UmmsPlayerBackendClass struct, for example. For the dvb player backend, it is optional to implement the "pause" method. If you want to add the time-shifting feature for DVB playback, implementing "pause" method is a choice.
The definition of struct UmmsPlugin:
typedef struct _UmmsPlugin {
gint major_version;//the major version number of umms core that plugin was compiled for
gint minor_version;//the minor version number of core that plugin was compiled for
UmmsPluginType type;
const gchar *filename;//set by "plugin loader" when this plugin loaded.
const gchar *name;
const gchar *description;
/*
* Used for plugins of UMMS_PLUGIN_TYPE_PLAYER_BACKEND type.
* If supported_uri_protocols is empty, unsupported_uri_protocols is respected
* as a "black list" of uri. If supported_uri_protocols is not empty, ignore
* unsupported_uri_protocols.
* For example, the implementor can create a black list for its plugin like this:
* supported_uri_protocols = {NULL};
* unsupported_uri_protocols = {"dvb"};
* that means the plugin can handle all uri protocols unless "dvb".
*/
const gchar **supported_uri_protocols;
const gchar **unsupported_uri_protocols;
/*vmethod to create the instance of backend.*/
gpointer (*backend_new_func) (void);
}UmmsPlugin;
The most important fields are supported_uri_protocols, unsupported_uri_protocols, and backend_new_func. The following is a code snapshot to fill the struct:
static gchar *supported_prots[] = {
NULL
};
static gchar *unsupported_prots[] = {
"dvb", NULL
};
MyPlayerBackend *my_player_backend_new (void)
{
return g_object_new (MY_TYPE_PLAYER_BACKEND, NULL);
}
/*Plugin description*/
G_MODULE_EXPORT
UmmsPlugin umms_plugin = {
UMMS_VERSION_MAJOR;
UMMS_VERSION_MINOR;
UMMS_PLUGIN_TYPE_PLAYER_BACKEND,
NULL,//should set by loader
"Player",
"Player to handle non-dvb URI",
(const gchar **)&supported_prots,
(const gchar **)&unsupported_prots,
(gpointer (*) (void)) my_player_backend_new
};
Here is a sample player backend based on GStreamer using playbin2: [1]