2 * Copyright (C) 2012 Intel Corporation
4 * This file is part of Rygel.
6 * Rygel is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU Lesser General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * Rygel is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public License
17 * along with this program; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21 #include "example-player.h"
24 RYGEL_EXAMPLE_PLAYER_DUMMY_PROPERTY,
25 RYGEL_EXAMPLE_PLAYER_PLAYBACK_STATE,
26 RYGEL_EXAMPLE_PLAYER_URI,
27 RYGEL_EXAMPLE_PLAYER_MIME_TYPE,
28 RYGEL_EXAMPLE_PLAYER_CAN_SEEK,
29 RYGEL_EXAMPLE_PLAYER_METADATA,
30 RYGEL_EXAMPLE_PLAYER_CONTENT_FEATURES,
31 RYGEL_EXAMPLE_PLAYER_VOLUME,
32 RYGEL_EXAMPLE_PLAYER_DURATION,
33 RYGEL_EXAMPLE_PLAYER_POSITION,
34 RYGEL_EXAMPLE_PLAYER_PLAYBACK_SPEED,
35 RYGEL_EXAMPLE_PLAYER_ALLOWED_PLAYBACK_SPEEDS
38 static void rygel_example_player_rygel_media_player_interface_init (RygelMediaPlayerIface *iface);
41 rygel_example_player_real_seek (RygelMediaPlayer *base, gint64 time);
44 rygel_example_player_real_get_protocols (RygelMediaPlayer *base, int *result_length1);
47 rygel_example_player_real_get_mime_types (RygelMediaPlayer *base, int *result_length1);
50 rygel_example_player_real_get_playback_state (RygelMediaPlayer *base);
53 rygel_example_player_real_set_playback_state (RygelMediaPlayer *base, const gchar *value);
56 rygel_example_player_real_get_uri (RygelMediaPlayer *base);
59 rygel_example_player_real_set_uri (RygelMediaPlayer *base, const gchar *value);
62 rygel_example_player_real_get_mime_type (RygelMediaPlayer *base);
65 rygel_example_player_real_set_mime_type (RygelMediaPlayer *base, const gchar *value);
68 rygel_example_player_real_get_metadata (RygelMediaPlayer *base);
71 rygel_example_player_real_set_metadata (RygelMediaPlayer *base, const gchar *value);
74 rygel_example_player_real_get_content_features (RygelMediaPlayer *base);
77 rygel_example_player_real_set_content_features (RygelMediaPlayer *base, const gchar *value);
80 rygel_example_player_real_get_volume (RygelMediaPlayer *base);
83 rygel_example_player_real_set_volume (RygelMediaPlayer *base, gdouble value);
86 rygel_example_player_real_get_duration (RygelMediaPlayer *base);
89 rygel_example_player_real_get_position (RygelMediaPlayer *base);
92 rygel_example_player_real_get_can_seek (RygelMediaPlayer *base);
95 rygel_example_player_real_get_allowed_playback_speeds (RygelMediaPlayer *base, int *length);
98 rygel_example_player_real_set_playback_speed (RygelMediaPlayer *base, const char *speed);
101 rygel_example_player_real_get_playback_speed (RygelMediaPlayer *base);
104 _rygel_example_player_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec);
107 _rygel_example_player_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec);
110 rygel_example_player_finalize (GObject *obj);
113 G_DEFINE_TYPE_WITH_CODE (RygelExamplePlayer, rygel_example_player, G_TYPE_OBJECT,
114 G_IMPLEMENT_INTERFACE (RYGEL_TYPE_MEDIA_PLAYER,
115 rygel_example_player_rygel_media_player_interface_init))
117 struct _RygelExamplePlayerPrivate {
118 gchar *_playback_state;
122 gchar *_content_features;
126 gchar *playback_speed;
129 static const gchar* RYGEL_EXAMPLE_PLAYER_PROTOCOLS[] = {"http-get", NULL};
130 static const gchar* RYGEL_EXAMPLE_PLAYER_MIME_TYPES[] = {"image/jpeg", "image/png", NULL};
133 rygel_example_player_new (void) {
134 return g_object_new (RYGEL_EXAMPLE_TYPE_PLAYER, NULL);
139 rygel_example_player_rygel_media_player_interface_init (RygelMediaPlayerIface *iface) {
140 iface->seek = (gboolean (*)(RygelMediaPlayer*, gint64)) rygel_example_player_real_seek;
141 iface->get_protocols = (gchar **(*)(RygelMediaPlayer*, int*)) rygel_example_player_real_get_protocols;
142 iface->get_mime_types = (gchar **(*)(RygelMediaPlayer*, int*)) rygel_example_player_real_get_mime_types;
143 iface->get_playback_state = rygel_example_player_real_get_playback_state;
144 iface->set_playback_state = rygel_example_player_real_set_playback_state;
145 iface->get_uri = rygel_example_player_real_get_uri;
146 iface->set_uri = rygel_example_player_real_set_uri;
147 iface->get_mime_type = rygel_example_player_real_get_mime_type;
148 iface->set_mime_type = rygel_example_player_real_set_mime_type;
149 iface->get_metadata = rygel_example_player_real_get_metadata;
150 iface->set_metadata = rygel_example_player_real_set_metadata;
151 iface->get_content_features = rygel_example_player_real_get_content_features;
152 iface->set_content_features = rygel_example_player_real_set_content_features;
153 iface->get_volume = rygel_example_player_real_get_volume;
154 iface->set_volume = rygel_example_player_real_set_volume;
155 iface->get_duration = rygel_example_player_real_get_duration;
156 iface->get_position = rygel_example_player_real_get_position;
157 iface->get_can_seek = rygel_example_player_real_get_can_seek;
158 iface->get_allowed_playback_speeds = rygel_example_player_real_get_allowed_playback_speeds;
159 iface->get_playback_speed = rygel_example_player_real_get_playback_speed;
160 iface->set_playback_speed = rygel_example_player_real_set_playback_speed;
164 rygel_example_player_class_init (RygelExamplePlayerClass *klass) {
165 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
167 g_type_class_add_private (gobject_class, sizeof (RygelExamplePlayerPrivate));
169 gobject_class->get_property = _rygel_example_player_get_property;
170 gobject_class->set_property = _rygel_example_player_set_property;
171 gobject_class->finalize = rygel_example_player_finalize;
173 g_object_class_override_property (gobject_class,
174 RYGEL_EXAMPLE_PLAYER_PLAYBACK_STATE,
177 g_object_class_override_property (gobject_class,
178 RYGEL_EXAMPLE_PLAYER_URI,
181 g_object_class_override_property (gobject_class,
182 RYGEL_EXAMPLE_PLAYER_MIME_TYPE,
185 g_object_class_override_property (gobject_class,
186 RYGEL_EXAMPLE_PLAYER_METADATA,
189 g_object_class_override_property (gobject_class,
190 RYGEL_EXAMPLE_PLAYER_CAN_SEEK,
193 g_object_class_override_property (gobject_class,
194 RYGEL_EXAMPLE_PLAYER_CONTENT_FEATURES,
197 g_object_class_override_property (gobject_class,
198 RYGEL_EXAMPLE_PLAYER_VOLUME,
201 g_object_class_override_property (gobject_class,
202 RYGEL_EXAMPLE_PLAYER_DURATION,
205 g_object_class_override_property (gobject_class,
206 RYGEL_EXAMPLE_PLAYER_POSITION,
209 g_object_class_override_property (gobject_class,
210 RYGEL_EXAMPLE_PLAYER_PLAYBACK_SPEED,
213 g_object_class_override_property (gobject_class,
214 RYGEL_EXAMPLE_PLAYER_ALLOWED_PLAYBACK_SPEEDS,
215 "allowed-playback-speeds");
219 rygel_example_player_init (RygelExamplePlayer *self) {
220 self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
221 RYGEL_EXAMPLE_TYPE_PLAYER,
222 RygelExamplePlayerPrivate);
224 self->priv->_playback_state = g_strdup ("NO_MEDIA_PRESENT");
225 self->priv->_uri = NULL;
226 self->priv->_mime_type = NULL;
227 self->priv->_metadata = NULL;
228 self->priv->_content_features = NULL;
229 self->priv->_volume = 0;
230 self->priv->_duration = 0;
231 self->priv->_position = 0;
232 self->priv->playback_speed = g_strdup ("1");
237 rygel_example_player_real_seek (RygelMediaPlayer *base, gint64 time) {
238 /* RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base); */
243 rygel_example_player_real_get_protocols (RygelMediaPlayer *base, int *result_length) {
244 /* RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base); */
247 *result_length = g_strv_length (RYGEL_EXAMPLE_PLAYER_PROTOCOLS);
250 return g_strdupv (RYGEL_EXAMPLE_PLAYER_PROTOCOLS);
255 rygel_example_player_real_get_mime_types (RygelMediaPlayer *base, int *result_length) {
256 /* RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base); */
259 *result_length = g_strv_length (RYGEL_EXAMPLE_PLAYER_MIME_TYPES);
262 return g_strdupv (RYGEL_EXAMPLE_PLAYER_MIME_TYPES);
267 rygel_example_player_real_get_playback_state (RygelMediaPlayer *base) {
268 RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
270 return g_strdup (self->priv->_playback_state);
275 rygel_example_player_real_set_playback_state (RygelMediaPlayer *base, const gchar *value) {
276 RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
278 g_free (self->priv->_playback_state);
279 self->priv->_playback_state = g_strdup (value);
281 g_object_notify (G_OBJECT (self), "playback-state");
286 rygel_example_player_real_get_uri (RygelMediaPlayer *base) {
287 RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
289 return g_strdup (self->priv->_uri);
294 rygel_example_player_real_set_uri (RygelMediaPlayer *base, const gchar *value) {
295 RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
297 g_free (self->priv->_uri);
298 self->priv->_uri = g_strdup (value);
300 g_debug ("URI set to %s.", value);
301 g_object_notify (G_OBJECT (self), "uri");
306 rygel_example_player_real_get_mime_type (RygelMediaPlayer *base) {
307 RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
309 return g_strdup (self->priv->_mime_type);
314 rygel_example_player_real_set_mime_type (RygelMediaPlayer *base, const gchar *value) {
315 RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
317 g_free (self->priv->_mime_type);
318 self->priv->_mime_type = g_strdup (value);
320 g_object_notify (G_OBJECT (self), "mime-type");
325 rygel_example_player_real_get_metadata (RygelMediaPlayer *base) {
326 RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
328 return g_strdup (self->priv->_metadata);
333 rygel_example_player_real_set_metadata (RygelMediaPlayer *base, const gchar *value) {
334 RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
336 g_free (self->priv->_mime_type);
337 self->priv->_mime_type = g_strdup (value);
339 g_object_notify (G_OBJECT (self), "metadata");
344 rygel_example_player_real_get_content_features (RygelMediaPlayer *base) {
345 RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
347 return g_strdup (self->priv->_content_features);
352 rygel_example_player_real_set_content_features (RygelMediaPlayer *base, const gchar *value) {
353 RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
355 g_free (self->priv->_content_features);
356 self->priv->_content_features = g_strdup (value);
358 g_object_notify (G_OBJECT (self), "content-features");
363 rygel_example_player_real_get_volume (RygelMediaPlayer *base) {
364 RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
366 return self->priv->_volume;
371 rygel_example_player_real_set_volume (RygelMediaPlayer *base, gdouble value) {
372 RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
374 self->priv->_volume = value;
376 g_debug ("volume set to %f.", value);
377 g_object_notify (G_OBJECT (self), "volume");
382 rygel_example_player_real_get_duration (RygelMediaPlayer *base) {
383 RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
385 return self->priv->_duration;
390 rygel_example_player_real_get_position (RygelMediaPlayer *base) {
391 RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
393 return self->priv->_position;
397 rygel_example_player_real_get_can_seek (RygelMediaPlayer *base) {
402 rygel_example_player_real_get_allowed_playback_speeds (RygelMediaPlayer *base, int *length)
404 if (length != NULL) {
408 return g_strsplit ("-1,-1/2,1/2,1,2,4", ",", -1);
412 rygel_example_player_real_set_playback_speed (RygelMediaPlayer *base,
415 RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
417 if (self->priv->playback_speed != NULL) {
418 g_free (self->priv->playback_speed);
421 self->priv->playback_speed = g_strdup (speed);
423 g_object_notify (G_OBJECT (self), "playback-speed");
427 rygel_example_player_real_get_playback_speed (RygelMediaPlayer *base)
429 RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
431 return g_strdup (self->priv->playback_speed);
435 _rygel_example_player_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) {
436 RygelMediaPlayer *base = RYGEL_MEDIA_PLAYER (object);
438 switch (property_id) {
439 case RYGEL_EXAMPLE_PLAYER_PLAYBACK_STATE:
440 g_value_take_string (value, rygel_media_player_get_playback_state (base));
442 case RYGEL_EXAMPLE_PLAYER_URI:
443 g_value_take_string (value, rygel_media_player_get_uri (base));
445 case RYGEL_EXAMPLE_PLAYER_MIME_TYPE:
446 g_value_take_string (value, rygel_media_player_get_mime_type (base));
448 case RYGEL_EXAMPLE_PLAYER_METADATA:
449 g_value_take_string (value, rygel_media_player_get_metadata (base));
451 case RYGEL_EXAMPLE_PLAYER_CONTENT_FEATURES:
452 g_value_take_string (value, rygel_media_player_get_content_features (base));
454 case RYGEL_EXAMPLE_PLAYER_VOLUME:
455 g_value_set_double (value, rygel_media_player_get_volume (base));
457 case RYGEL_EXAMPLE_PLAYER_DURATION:
458 g_value_set_int64 (value, rygel_media_player_get_duration (base));
460 case RYGEL_EXAMPLE_PLAYER_POSITION:
461 g_value_set_int64 (value, rygel_media_player_get_position (base));
463 case RYGEL_EXAMPLE_PLAYER_CAN_SEEK:
464 g_value_set_boolean (value, rygel_media_player_get_can_seek (base));
466 case RYGEL_EXAMPLE_PLAYER_PLAYBACK_SPEED:
467 g_value_take_string (value, rygel_media_player_get_playback_speed (base));
469 case RYGEL_EXAMPLE_PLAYER_ALLOWED_PLAYBACK_SPEEDS:
473 g_value_take_boxed (value, rygel_media_player_get_allowed_playback_speeds (base, &length));
477 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
484 _rygel_example_player_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) {
485 RygelMediaPlayer *base = RYGEL_MEDIA_PLAYER (object);
487 switch (property_id) {
488 case RYGEL_EXAMPLE_PLAYER_PLAYBACK_STATE:
489 rygel_media_player_set_playback_state (base, g_value_get_string (value));
491 case RYGEL_EXAMPLE_PLAYER_URI:
492 rygel_media_player_set_uri (base, g_value_get_string (value));
494 case RYGEL_EXAMPLE_PLAYER_MIME_TYPE:
495 rygel_media_player_set_mime_type (base, g_value_get_string (value));
497 case RYGEL_EXAMPLE_PLAYER_METADATA:
498 rygel_media_player_set_metadata (base, g_value_get_string (value));
500 case RYGEL_EXAMPLE_PLAYER_CONTENT_FEATURES:
501 rygel_media_player_set_content_features (base, g_value_get_string (value));
503 case RYGEL_EXAMPLE_PLAYER_VOLUME:
504 rygel_media_player_set_volume (base, g_value_get_double (value));
506 case RYGEL_EXAMPLE_PLAYER_PLAYBACK_SPEED:
507 rygel_media_player_set_playback_speed (base, g_value_get_string (value));
510 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
516 rygel_example_player_finalize (GObject *obj) {
517 RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (obj);
519 g_free (self->priv->_playback_state);
520 g_free (self->priv->_uri);
521 g_free (self->priv->_mime_type);
522 g_free (self->priv->_metadata);
523 g_free (self->priv->_content_features);
525 G_OBJECT_CLASS (rygel_example_player_parent_class)->finalize (obj);