Imported mafw-gst-renderer_0.1.2009.47-1+0m5
[mafwsubrenderer] / libmafw-gst-renderer / mafw-gst-renderer-state-stopped.c
1 /*
2  * This file is a part of MAFW
3  *
4  * Copyright (C) 2007, 2008, 2009 Nokia Corporation, all rights reserved.
5  *
6  * Contact: Visa Smolander <visa.smolander@nokia.com>
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public License
10  * as published by the Free Software Foundation; version 2.1 of
11  * the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful, but
14  * WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
21  * 02110-1301 USA
22  *
23  */
24
25 #include <libmafw/mafw-errors.h>
26 #include "mafw-gst-renderer-state-stopped.h"
27
28 #undef  G_LOG_DOMAIN
29 #define G_LOG_DOMAIN "mafw-gst-renderer-state-stopped"
30
31 /*----------------------------------------------------------------------------
32   Playback
33   ----------------------------------------------------------------------------*/
34
35 static void _do_play(MafwGstRendererState *self, GError **error);
36 static void _do_play_object(MafwGstRendererState *self, const gchar *object_id,
37                             GError **error);
38 static void _do_stop(MafwGstRendererState *self, GError **error);
39
40 /*----------------------------------------------------------------------------
41   Playlist
42   ----------------------------------------------------------------------------*/
43
44 static void _do_next(MafwGstRendererState *self, GError **error);
45 static void _do_previous(MafwGstRendererState *self, GError **error);
46 static void _do_goto_index(MafwGstRendererState *self, guint index,
47                            GError **error);
48
49 /*----------------------------------------------------------------------------
50   Notification metatada
51   ----------------------------------------------------------------------------*/
52
53 static void _notify_metadata(MafwGstRendererState *self,
54                              const gchar *object_id,
55                              GHashTable *metadata,
56                              GError **error);
57
58 /*----------------------------------------------------------------------------
59   Playlist editing signals
60   ----------------------------------------------------------------------------*/
61
62 static void _playlist_contents_changed(MafwGstRendererState *self,
63                                        gboolean clip_changed,
64                                        GError **error);
65
66 /*----------------------------------------------------------------------------
67   Property methods
68   ----------------------------------------------------------------------------*/
69
70 static GValue* _get_property_value(MafwGstRendererState *self,
71                                    const gchar *name);
72
73 /*----------------------------------------------------------------------------
74   GObject initialization
75   ----------------------------------------------------------------------------*/
76
77 G_DEFINE_TYPE(MafwGstRendererStateStopped, mafw_gst_renderer_state_stopped,
78               MAFW_TYPE_GST_RENDERER_STATE);
79
80 static void mafw_gst_renderer_state_stopped_init(MafwGstRendererStateStopped *self)
81 {
82 }
83
84 static void mafw_gst_renderer_state_stopped_class_init(
85         MafwGstRendererStateStoppedClass *klass)
86 {
87         MafwGstRendererStateClass *state_klass;
88
89         state_klass = MAFW_GST_RENDERER_STATE_CLASS(klass);
90         g_return_if_fail(state_klass != NULL);
91
92         state_klass->name = g_strdup("Stopped");
93
94         /* Playback */
95
96         state_klass->play        = _do_play;
97         state_klass->play_object = _do_play_object;
98         state_klass->stop        = _do_stop;
99
100         /* Playlist */
101
102         state_klass->next       = _do_next;
103         state_klass->previous   = _do_previous;
104         state_klass->goto_index = _do_goto_index;
105
106         /* Metadata */
107
108         state_klass->notify_metadata = _notify_metadata;
109
110         /* Playlist editing signals */
111
112         state_klass->playlist_contents_changed =
113                 _playlist_contents_changed;
114
115         /* Property methods */
116
117         state_klass->get_property_value = _get_property_value;
118 }
119
120 GObject *mafw_gst_renderer_state_stopped_new(MafwGstRenderer *renderer)
121 {
122         MafwGstRendererState *state;
123
124         state = MAFW_GST_RENDERER_STATE(
125                 g_object_new(MAFW_TYPE_GST_RENDERER_STATE_STOPPED, NULL));
126         state->renderer = renderer;
127
128         return G_OBJECT(state);
129 }
130
131 /*----------------------------------------------------------------------------
132   Playback
133   ----------------------------------------------------------------------------*/
134
135 static void _do_play(MafwGstRendererState *self, GError **error)
136 {
137         g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_STOPPED(self));
138         mafw_gst_renderer_state_do_play(self, error);
139 }
140
141 static void _do_play_object(MafwGstRendererState *self, const gchar *object_id,
142                             GError **error)
143 {
144         MafwGstRendererPlaybackMode cur_mode, prev_mode;
145
146         g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_STOPPED(self));
147
148         prev_mode = mafw_gst_renderer_get_playback_mode(self->renderer);
149         mafw_gst_renderer_state_do_play_object(self, object_id, error);
150         cur_mode = mafw_gst_renderer_get_playback_mode(self->renderer);
151
152         /* If this happens it means that we interrupted playlist mode
153            but we did so in Stopped state, so when play_object finishes
154            we want to stay Stopped */
155         if (cur_mode != prev_mode) {
156                 self->renderer->resume_playlist = FALSE;
157         }
158 }
159
160 static void _do_stop(MafwGstRendererState *self, GError **error)
161 {
162         g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_STOPPED(self));
163         /* We are already in Stopped state, so do nothing */
164 }
165
166 /*----------------------------------------------------------------------------
167   Playlist
168   ----------------------------------------------------------------------------*/
169
170 static void _do_next(MafwGstRendererState *self, GError **error)
171 {
172         MafwGstRenderer *renderer = NULL;
173         MafwGstRendererMovementResult value = MAFW_GST_RENDERER_MOVE_RESULT_OK;
174
175         g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_STOPPED(self));
176
177         renderer = MAFW_GST_RENDERER_STATE(self)->renderer;
178
179         value = mafw_gst_renderer_move(renderer,
180                                       MAFW_GST_RENDERER_MOVE_TYPE_NEXT,
181                                       0, error);
182
183         switch (value) {
184         case MAFW_GST_RENDERER_MOVE_RESULT_ERROR:
185         case MAFW_GST_RENDERER_MOVE_RESULT_OK:
186                 break;
187         case MAFW_GST_RENDERER_MOVE_RESULT_NO_PLAYLIST:
188                 g_set_error (error,
189                              MAFW_RENDERER_ERROR,
190                              MAFW_RENDERER_ERROR_NO_MEDIA,
191                              "There is no playlist or media to play");
192                 break;
193         case MAFW_GST_RENDERER_MOVE_RESULT_PLAYLIST_LIMIT:
194                 mafw_playlist_iterator_reset(renderer->iterator, NULL);
195                 mafw_gst_renderer_set_media_playlist(renderer);
196                 break;
197         default:
198                 g_critical("Movement not controlled");
199         }
200 }
201
202 static void _do_previous(MafwGstRendererState *self, GError **error)
203 {
204         MafwGstRenderer *renderer = NULL;
205         MafwGstRendererMovementResult value = MAFW_GST_RENDERER_MOVE_RESULT_OK;
206
207
208         g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_STOPPED(self));
209
210         renderer = MAFW_GST_RENDERER_STATE(self)->renderer;
211
212         value = mafw_gst_renderer_move(renderer,
213                                       MAFW_GST_RENDERER_MOVE_TYPE_PREV,
214                                       0, error);
215
216         switch (value) {
217         case MAFW_GST_RENDERER_MOVE_RESULT_ERROR:
218         case MAFW_GST_RENDERER_MOVE_RESULT_OK:
219                 break;
220         case MAFW_GST_RENDERER_MOVE_RESULT_NO_PLAYLIST:
221                 g_set_error(error,
222                             MAFW_RENDERER_ERROR,
223                             MAFW_RENDERER_ERROR_NO_MEDIA,
224                             "There is no playlist or media to play");
225                 break;
226         case MAFW_GST_RENDERER_MOVE_RESULT_PLAYLIST_LIMIT:
227
228                 mafw_playlist_iterator_move_to_last(renderer->iterator, NULL);
229                 mafw_gst_renderer_set_media_playlist(renderer);
230                 break;
231         default:
232                 g_critical("Movement not controlled");
233         }
234 }
235
236 static void _do_goto_index(MafwGstRendererState *self, guint index,
237                            GError **error)
238 {
239         MafwGstRenderer *renderer = NULL;
240         MafwGstRendererMovementResult value = MAFW_GST_RENDERER_MOVE_RESULT_OK;
241
242         g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_STOPPED(self));
243
244         renderer = MAFW_GST_RENDERER_STATE(self)->renderer;
245
246         value = mafw_gst_renderer_move(renderer,
247                                       MAFW_GST_RENDERER_MOVE_TYPE_INDEX,
248                                       index, error);
249
250         switch (value) {
251         case MAFW_GST_RENDERER_MOVE_RESULT_ERROR:
252         case MAFW_GST_RENDERER_MOVE_RESULT_OK:
253                 break;
254         case MAFW_GST_RENDERER_MOVE_RESULT_NO_PLAYLIST:
255                 g_set_error(error,
256                             MAFW_RENDERER_ERROR,
257                             MAFW_RENDERER_ERROR_NO_MEDIA,
258                             "There is no playlist or media to play");
259                 break;
260         case MAFW_GST_RENDERER_MOVE_RESULT_PLAYLIST_LIMIT:
261                 g_set_error(error,
262                             MAFW_RENDERER_ERROR,
263                             MAFW_RENDERER_ERROR_INDEX_OUT_OF_BOUNDS,
264                             "Index is out of bounds");
265                 break;
266         default:
267                 g_critical("Movement not controlled");
268         }
269 }
270
271 /*----------------------------------------------------------------------------
272   Notification metatada
273   ----------------------------------------------------------------------------*/
274
275 static void _notify_metadata(MafwGstRendererState *self,
276                              const gchar *object_id,
277                              GHashTable *metadata,
278                              GError **error)
279 {
280         g_debug("running _notify_metadata...");
281         /* This happens because we issued a play() command, this moved us to
282            Transitioning state, waiting for the URL of the objectid to play,
283            but before we got the URL and moved to Playing state, a stop()
284            command was issued. Now we got the results of the stopped play()
285            command, so we just ignore the result and stay in Stopped state. */
286
287 }
288
289 /*----------------------------------------------------------------------------
290   Playlist editing signals
291   ----------------------------------------------------------------------------*/
292
293 static void _playlist_contents_changed(MafwGstRendererState *self,
294                                        gboolean clip_changed,
295                                        GError **error)
296 {
297         g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_STOPPED(self));
298
299         /* Do nothing, we just stay in Stopped state in any case */
300 }
301
302 /*----------------------------------------------------------------------------
303   Property methods
304   ----------------------------------------------------------------------------*/
305
306 GValue* _get_property_value(MafwGstRendererState *self, const gchar *name)
307 {
308         GValue *value = NULL;
309
310         g_return_val_if_fail(MAFW_IS_GST_RENDERER_STATE_STOPPED(self), value);
311
312         if (!g_strcmp0(name, MAFW_PROPERTY_RENDERER_TRANSPORT_ACTIONS)) {
313                 value = g_new0(GValue, 1);
314                 g_value_init(value, G_TYPE_STRING);
315                 g_value_set_string(value, "");
316         }
317
318         return value;
319 }