examples: Simplify C renderer example
[profile/ivi/rygel.git] / examples / renderer-plugins / C / example-player.c
1 /*
2  * Copyright (C) 2012 Intel Corporation
3  *
4  * This file is part of Rygel.
5  *
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.
10  *
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.
15  *
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.
19  */
20
21 #include "example-player.h"
22
23 enum  {
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
36 };
37
38 static void rygel_example_player_rygel_media_player_interface_init (RygelMediaPlayerIface  *iface);
39
40 static gboolean
41 rygel_example_player_real_seek (RygelMediaPlayer *base, gint64 time);
42
43 static gchar**
44 rygel_example_player_real_get_protocols (RygelMediaPlayer *base, int *result_length1);
45
46 static gchar**
47 rygel_example_player_real_get_mime_types (RygelMediaPlayer *base, int *result_length1);
48
49 static gchar*
50 rygel_example_player_real_get_playback_state (RygelMediaPlayer *base);
51
52 static void
53 rygel_example_player_real_set_playback_state (RygelMediaPlayer *base, const gchar *value);
54
55 static gchar*
56 rygel_example_player_real_get_uri (RygelMediaPlayer *base);
57
58 static void
59 rygel_example_player_real_set_uri (RygelMediaPlayer *base, const gchar *value);
60
61 static gchar*
62 rygel_example_player_real_get_mime_type (RygelMediaPlayer *base);
63
64 static void
65 rygel_example_player_real_set_mime_type (RygelMediaPlayer *base, const gchar *value);
66
67 static gchar*
68 rygel_example_player_real_get_metadata (RygelMediaPlayer *base);
69
70 static void
71 rygel_example_player_real_set_metadata (RygelMediaPlayer *base, const gchar *value);
72
73 static gchar*
74 rygel_example_player_real_get_content_features (RygelMediaPlayer *base);
75
76 static void
77 rygel_example_player_real_set_content_features (RygelMediaPlayer *base, const gchar *value);
78
79 static gdouble
80 rygel_example_player_real_get_volume (RygelMediaPlayer *base);
81
82 static void
83 rygel_example_player_real_set_volume (RygelMediaPlayer *base, gdouble value);
84
85 static gint64
86 rygel_example_player_real_get_duration (RygelMediaPlayer *base);
87
88 static gint64
89 rygel_example_player_real_get_position (RygelMediaPlayer *base);
90
91 static gboolean
92 rygel_example_player_real_get_can_seek (RygelMediaPlayer *base);
93
94 static gchar **
95 rygel_example_player_real_get_allowed_playback_speeds (RygelMediaPlayer *base, int *length);
96
97 static void
98 rygel_example_player_real_set_playback_speed (RygelMediaPlayer *base, const char *speed);
99
100 static gchar *
101 rygel_example_player_real_get_playback_speed (RygelMediaPlayer *base);
102
103 static void
104 _rygel_example_player_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec);
105
106 static void
107 _rygel_example_player_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec);
108
109 static void
110 rygel_example_player_finalize (GObject *obj);
111
112
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))
116
117 struct _RygelExamplePlayerPrivate {
118   gchar *_playback_state;
119   gchar *_uri;
120   gchar *_mime_type;
121   gchar *_metadata;
122   gchar *_content_features;
123   gdouble _volume;
124   gint64 _duration;
125   gint64 _position;
126   gchar *playback_speed;
127 };
128
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};
131
132 RygelExamplePlayer*
133 rygel_example_player_new (void) {
134     return g_object_new (RYGEL_EXAMPLE_TYPE_PLAYER, NULL);
135 }
136
137
138 static void
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;
161 }
162
163 static void
164 rygel_example_player_class_init (RygelExamplePlayerClass *klass) {
165   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
166
167   g_type_class_add_private (gobject_class, sizeof (RygelExamplePlayerPrivate));
168
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;
172
173   g_object_class_override_property (gobject_class,
174                                     RYGEL_EXAMPLE_PLAYER_PLAYBACK_STATE,
175                                     "playback-state");
176
177   g_object_class_override_property (gobject_class,
178                                     RYGEL_EXAMPLE_PLAYER_URI,
179                                     "uri");
180
181   g_object_class_override_property (gobject_class,
182                                     RYGEL_EXAMPLE_PLAYER_MIME_TYPE,
183                                     "mime-type");
184
185   g_object_class_override_property (gobject_class,
186                                     RYGEL_EXAMPLE_PLAYER_METADATA,
187                                     "metadata");
188
189   g_object_class_override_property (gobject_class,
190                                     RYGEL_EXAMPLE_PLAYER_CAN_SEEK,
191                                     "can-seek");
192
193   g_object_class_override_property (gobject_class,
194                                     RYGEL_EXAMPLE_PLAYER_CONTENT_FEATURES,
195                                     "content-features");
196
197   g_object_class_override_property (gobject_class,
198                                     RYGEL_EXAMPLE_PLAYER_VOLUME,
199                                     "volume");
200
201   g_object_class_override_property (gobject_class,
202                                     RYGEL_EXAMPLE_PLAYER_DURATION,
203                                     "duration");
204
205   g_object_class_override_property (gobject_class,
206                                     RYGEL_EXAMPLE_PLAYER_POSITION,
207                                     "position");
208
209   g_object_class_override_property (gobject_class,
210                                     RYGEL_EXAMPLE_PLAYER_PLAYBACK_SPEED,
211                                     "playback-speed");
212
213   g_object_class_override_property (gobject_class,
214                                     RYGEL_EXAMPLE_PLAYER_ALLOWED_PLAYBACK_SPEEDS,
215                                     "allowed-playback-speeds");
216 }
217
218 static void
219 rygel_example_player_init (RygelExamplePlayer *self) {
220   self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
221                                             RYGEL_EXAMPLE_TYPE_PLAYER,
222                                             RygelExamplePlayerPrivate);
223
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");
233 }
234
235
236 static gboolean
237 rygel_example_player_real_seek (RygelMediaPlayer *base, gint64 time) {
238   /* RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base); */
239   return FALSE;
240 }
241
242 static gchar**
243 rygel_example_player_real_get_protocols (RygelMediaPlayer *base, int *result_length) {
244   /* RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base); */
245
246   if (result_length) {
247     *result_length = g_strv_length (RYGEL_EXAMPLE_PLAYER_PROTOCOLS);
248   }
249
250   return g_strdupv (RYGEL_EXAMPLE_PLAYER_PROTOCOLS);
251 }
252
253
254 static gchar**
255 rygel_example_player_real_get_mime_types (RygelMediaPlayer *base, int *result_length) {
256   /* RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base); */
257
258   if (result_length) {
259     *result_length = g_strv_length (RYGEL_EXAMPLE_PLAYER_MIME_TYPES);
260   }
261
262   return g_strdupv (RYGEL_EXAMPLE_PLAYER_MIME_TYPES);
263 }
264
265
266 static gchar*
267 rygel_example_player_real_get_playback_state (RygelMediaPlayer *base) {
268   RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
269
270   return g_strdup (self->priv->_playback_state);
271 }
272
273
274 static void
275 rygel_example_player_real_set_playback_state (RygelMediaPlayer *base, const gchar *value) {
276   RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
277
278   g_free (self->priv->_playback_state);
279   self->priv->_playback_state = g_strdup (value);
280
281   g_object_notify (G_OBJECT (self), "playback-state");
282 }
283
284
285 static gchar*
286 rygel_example_player_real_get_uri (RygelMediaPlayer *base) {
287   RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
288
289   return g_strdup (self->priv->_uri);
290 }
291
292
293 static void
294 rygel_example_player_real_set_uri (RygelMediaPlayer *base, const gchar *value) {
295   RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
296
297   g_free (self->priv->_uri);
298   self->priv->_uri = g_strdup (value);
299
300   g_debug ("URI set to %s.", value);
301   g_object_notify (G_OBJECT (self), "uri");
302 }
303
304
305 static gchar*
306 rygel_example_player_real_get_mime_type (RygelMediaPlayer *base) {
307   RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
308
309   return g_strdup (self->priv->_mime_type);
310 }
311
312
313 static void
314 rygel_example_player_real_set_mime_type (RygelMediaPlayer *base, const gchar *value) {
315   RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
316
317   g_free (self->priv->_mime_type);
318   self->priv->_mime_type = g_strdup (value);
319
320   g_object_notify (G_OBJECT (self), "mime-type");
321 }
322
323
324 static gchar*
325 rygel_example_player_real_get_metadata (RygelMediaPlayer *base) {
326   RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
327
328   return g_strdup (self->priv->_metadata);
329 }
330
331
332 static void
333 rygel_example_player_real_set_metadata (RygelMediaPlayer *base, const gchar *value) {
334   RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
335
336   g_free (self->priv->_mime_type);
337   self->priv->_mime_type = g_strdup (value);
338
339   g_object_notify (G_OBJECT (self), "metadata");
340 }
341
342
343 static gchar*
344 rygel_example_player_real_get_content_features (RygelMediaPlayer *base) {
345   RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
346
347   return g_strdup (self->priv->_content_features);
348 }
349
350
351 static void
352 rygel_example_player_real_set_content_features (RygelMediaPlayer *base, const gchar *value) {
353   RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
354
355   g_free (self->priv->_content_features);
356   self->priv->_content_features = g_strdup (value);
357
358   g_object_notify (G_OBJECT (self), "content-features");
359 }
360
361
362 static gdouble
363 rygel_example_player_real_get_volume (RygelMediaPlayer *base) {
364   RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
365
366   return self->priv->_volume;
367 }
368
369
370 static void
371 rygel_example_player_real_set_volume (RygelMediaPlayer *base, gdouble value) {
372   RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
373
374   self->priv->_volume = value;
375
376   g_debug ("volume set to %f.", value);
377   g_object_notify (G_OBJECT (self), "volume");
378 }
379
380
381 static gint64
382 rygel_example_player_real_get_duration (RygelMediaPlayer *base) {
383   RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
384
385   return self->priv->_duration;
386 }
387
388
389 static gint64
390 rygel_example_player_real_get_position (RygelMediaPlayer *base) {
391   RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
392
393   return self->priv->_position;
394 }
395
396 static gboolean
397 rygel_example_player_real_get_can_seek (RygelMediaPlayer *base) {
398     return FALSE;
399 }
400
401 static gchar **
402 rygel_example_player_real_get_allowed_playback_speeds (RygelMediaPlayer *base, int *length)
403 {
404     if (length != NULL) {
405         *length = 6;
406     }
407
408     return g_strsplit ("-1,-1/2,1/2,1,2,4", ",", -1);
409 }
410
411 static void
412 rygel_example_player_real_set_playback_speed (RygelMediaPlayer *base,
413                                               const char *speed)
414 {
415   RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
416
417   if (self->priv->playback_speed != NULL) {
418     g_free (self->priv->playback_speed);
419   }
420
421   self->priv->playback_speed = g_strdup (speed);
422
423   g_object_notify (G_OBJECT (self), "playback-speed");
424 }
425
426 static gchar *
427 rygel_example_player_real_get_playback_speed (RygelMediaPlayer *base)
428 {
429   RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (base);
430
431   return g_strdup (self->priv->playback_speed);
432 }
433
434 static void
435 _rygel_example_player_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) {
436   RygelMediaPlayer *base = RYGEL_MEDIA_PLAYER (object);
437
438   switch (property_id) {
439     case RYGEL_EXAMPLE_PLAYER_PLAYBACK_STATE:
440       g_value_take_string (value, rygel_media_player_get_playback_state (base));
441       break;
442     case RYGEL_EXAMPLE_PLAYER_URI:
443       g_value_take_string (value, rygel_media_player_get_uri (base));
444       break;
445     case RYGEL_EXAMPLE_PLAYER_MIME_TYPE:
446       g_value_take_string (value, rygel_media_player_get_mime_type (base));
447       break;
448     case RYGEL_EXAMPLE_PLAYER_METADATA:
449       g_value_take_string (value, rygel_media_player_get_metadata (base));
450       break;
451     case RYGEL_EXAMPLE_PLAYER_CONTENT_FEATURES:
452       g_value_take_string (value, rygel_media_player_get_content_features (base));
453       break;
454     case RYGEL_EXAMPLE_PLAYER_VOLUME:
455       g_value_set_double (value, rygel_media_player_get_volume (base));
456       break;
457     case RYGEL_EXAMPLE_PLAYER_DURATION:
458       g_value_set_int64 (value, rygel_media_player_get_duration (base));
459       break;
460     case RYGEL_EXAMPLE_PLAYER_POSITION:
461       g_value_set_int64 (value, rygel_media_player_get_position (base));
462       break;
463     case RYGEL_EXAMPLE_PLAYER_CAN_SEEK:
464       g_value_set_boolean (value, rygel_media_player_get_can_seek (base));
465       break;
466     case RYGEL_EXAMPLE_PLAYER_PLAYBACK_SPEED:
467       g_value_take_string (value, rygel_media_player_get_playback_speed (base));
468       break;
469     case RYGEL_EXAMPLE_PLAYER_ALLOWED_PLAYBACK_SPEEDS:
470       {
471         int length;
472
473         g_value_take_boxed (value, rygel_media_player_get_allowed_playback_speeds (base, &length));
474       }
475       break;
476     default:
477       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
478       break;
479   }
480 }
481
482
483 static void
484 _rygel_example_player_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) {
485   RygelMediaPlayer *base = RYGEL_MEDIA_PLAYER (object);
486
487   switch (property_id) {
488     case RYGEL_EXAMPLE_PLAYER_PLAYBACK_STATE:
489       rygel_media_player_set_playback_state (base, g_value_get_string (value));
490       break;
491     case RYGEL_EXAMPLE_PLAYER_URI:
492       rygel_media_player_set_uri (base, g_value_get_string (value));
493       break;
494     case RYGEL_EXAMPLE_PLAYER_MIME_TYPE:
495       rygel_media_player_set_mime_type (base, g_value_get_string (value));
496       break;
497     case RYGEL_EXAMPLE_PLAYER_METADATA:
498       rygel_media_player_set_metadata (base, g_value_get_string (value));
499       break;
500     case RYGEL_EXAMPLE_PLAYER_CONTENT_FEATURES:
501       rygel_media_player_set_content_features (base, g_value_get_string (value));
502       break;
503     case RYGEL_EXAMPLE_PLAYER_VOLUME:
504       rygel_media_player_set_volume (base, g_value_get_double (value));
505       break;
506     case RYGEL_EXAMPLE_PLAYER_PLAYBACK_SPEED:
507       rygel_media_player_set_playback_speed (base, g_value_get_string (value));
508       break;
509     default:
510       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
511       break;
512   }
513 }
514
515 static void
516 rygel_example_player_finalize (GObject *obj) {
517   RygelExamplePlayer *self = RYGEL_EXAMPLE_PLAYER (obj);
518
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);
524
525   G_OBJECT_CLASS (rygel_example_player_parent_class)->finalize (obj);
526 }
527
528