2 * This file is a part of MAFW
4 * Copyright (C) 2007, 2008, 2009 Nokia Corporation, all rights reserved.
6 * Contact: Visa Smolander <visa.smolander@nokia.com>
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.
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.
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
25 #include <libmafw/mafw-errors.h>
26 #include "mafw-gst-renderer-state-stopped.h"
29 #define G_LOG_DOMAIN "mafw-gst-renderer-state-stopped"
31 /*----------------------------------------------------------------------------
33 ----------------------------------------------------------------------------*/
35 static void _do_play(MafwGstRendererState *self, GError **error);
36 static void _do_play_object(MafwGstRendererState *self, const gchar *object_id,
38 static void _do_stop(MafwGstRendererState *self, GError **error);
40 /*----------------------------------------------------------------------------
42 ----------------------------------------------------------------------------*/
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,
49 /*----------------------------------------------------------------------------
51 ----------------------------------------------------------------------------*/
53 static void _notify_metadata(MafwGstRendererState *self,
54 const gchar *object_id,
58 /*----------------------------------------------------------------------------
59 Playlist editing signals
60 ----------------------------------------------------------------------------*/
62 static void _playlist_contents_changed(MafwGstRendererState *self,
63 gboolean clip_changed,
66 /*----------------------------------------------------------------------------
68 ----------------------------------------------------------------------------*/
70 static GValue* _get_property_value(MafwGstRendererState *self,
73 /*----------------------------------------------------------------------------
74 GObject initialization
75 ----------------------------------------------------------------------------*/
77 G_DEFINE_TYPE(MafwGstRendererStateStopped, mafw_gst_renderer_state_stopped,
78 MAFW_TYPE_GST_RENDERER_STATE);
80 static void mafw_gst_renderer_state_stopped_init(MafwGstRendererStateStopped *self)
84 static void mafw_gst_renderer_state_stopped_class_init(
85 MafwGstRendererStateStoppedClass *klass)
87 MafwGstRendererStateClass *state_klass;
89 state_klass = MAFW_GST_RENDERER_STATE_CLASS(klass);
90 g_return_if_fail(state_klass != NULL);
92 state_klass->name = g_strdup("Stopped");
96 state_klass->play = _do_play;
97 state_klass->play_object = _do_play_object;
98 state_klass->stop = _do_stop;
102 state_klass->next = _do_next;
103 state_klass->previous = _do_previous;
104 state_klass->goto_index = _do_goto_index;
108 state_klass->notify_metadata = _notify_metadata;
110 /* Playlist editing signals */
112 state_klass->playlist_contents_changed =
113 _playlist_contents_changed;
115 /* Property methods */
117 state_klass->get_property_value = _get_property_value;
120 GObject *mafw_gst_renderer_state_stopped_new(MafwGstRenderer *renderer)
122 MafwGstRendererState *state;
124 state = MAFW_GST_RENDERER_STATE(
125 g_object_new(MAFW_TYPE_GST_RENDERER_STATE_STOPPED, NULL));
126 state->renderer = renderer;
128 return G_OBJECT(state);
131 /*----------------------------------------------------------------------------
133 ----------------------------------------------------------------------------*/
135 static void _do_play(MafwGstRendererState *self, GError **error)
137 g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_STOPPED(self));
138 mafw_gst_renderer_state_do_play(self, error);
141 static void _do_play_object(MafwGstRendererState *self, const gchar *object_id,
144 MafwGstRendererPlaybackMode cur_mode, prev_mode;
146 g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_STOPPED(self));
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);
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;
160 static void _do_stop(MafwGstRendererState *self, GError **error)
162 g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_STOPPED(self));
163 /* We are already in Stopped state, so do nothing */
166 /*----------------------------------------------------------------------------
168 ----------------------------------------------------------------------------*/
170 static void _do_next(MafwGstRendererState *self, GError **error)
172 MafwGstRenderer *renderer = NULL;
173 MafwGstRendererMovementResult value = MAFW_GST_RENDERER_MOVE_RESULT_OK;
175 g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_STOPPED(self));
177 renderer = MAFW_GST_RENDERER_STATE(self)->renderer;
179 value = mafw_gst_renderer_move(renderer,
180 MAFW_GST_RENDERER_MOVE_TYPE_NEXT,
184 case MAFW_GST_RENDERER_MOVE_RESULT_ERROR:
185 case MAFW_GST_RENDERER_MOVE_RESULT_OK:
187 case MAFW_GST_RENDERER_MOVE_RESULT_NO_PLAYLIST:
190 MAFW_RENDERER_ERROR_NO_MEDIA,
191 "There is no playlist or media to play");
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);
198 g_critical("Movement not controlled");
202 static void _do_previous(MafwGstRendererState *self, GError **error)
204 MafwGstRenderer *renderer = NULL;
205 MafwGstRendererMovementResult value = MAFW_GST_RENDERER_MOVE_RESULT_OK;
208 g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_STOPPED(self));
210 renderer = MAFW_GST_RENDERER_STATE(self)->renderer;
212 value = mafw_gst_renderer_move(renderer,
213 MAFW_GST_RENDERER_MOVE_TYPE_PREV,
217 case MAFW_GST_RENDERER_MOVE_RESULT_ERROR:
218 case MAFW_GST_RENDERER_MOVE_RESULT_OK:
220 case MAFW_GST_RENDERER_MOVE_RESULT_NO_PLAYLIST:
223 MAFW_RENDERER_ERROR_NO_MEDIA,
224 "There is no playlist or media to play");
226 case MAFW_GST_RENDERER_MOVE_RESULT_PLAYLIST_LIMIT:
228 mafw_playlist_iterator_move_to_last(renderer->iterator, NULL);
229 mafw_gst_renderer_set_media_playlist(renderer);
232 g_critical("Movement not controlled");
236 static void _do_goto_index(MafwGstRendererState *self, guint index,
239 MafwGstRenderer *renderer = NULL;
240 MafwGstRendererMovementResult value = MAFW_GST_RENDERER_MOVE_RESULT_OK;
242 g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_STOPPED(self));
244 renderer = MAFW_GST_RENDERER_STATE(self)->renderer;
246 value = mafw_gst_renderer_move(renderer,
247 MAFW_GST_RENDERER_MOVE_TYPE_INDEX,
251 case MAFW_GST_RENDERER_MOVE_RESULT_ERROR:
252 case MAFW_GST_RENDERER_MOVE_RESULT_OK:
254 case MAFW_GST_RENDERER_MOVE_RESULT_NO_PLAYLIST:
257 MAFW_RENDERER_ERROR_NO_MEDIA,
258 "There is no playlist or media to play");
260 case MAFW_GST_RENDERER_MOVE_RESULT_PLAYLIST_LIMIT:
263 MAFW_RENDERER_ERROR_INDEX_OUT_OF_BOUNDS,
264 "Index is out of bounds");
267 g_critical("Movement not controlled");
271 /*----------------------------------------------------------------------------
272 Notification metatada
273 ----------------------------------------------------------------------------*/
275 static void _notify_metadata(MafwGstRendererState *self,
276 const gchar *object_id,
277 GHashTable *metadata,
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. */
289 /*----------------------------------------------------------------------------
290 Playlist editing signals
291 ----------------------------------------------------------------------------*/
293 static void _playlist_contents_changed(MafwGstRendererState *self,
294 gboolean clip_changed,
297 g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_STOPPED(self));
299 /* Do nothing, we just stay in Stopped state in any case */
302 /*----------------------------------------------------------------------------
304 ----------------------------------------------------------------------------*/
306 GValue* _get_property_value(MafwGstRendererState *self, const gchar *name)
308 GValue *value = NULL;
310 g_return_val_if_fail(MAFW_IS_GST_RENDERER_STATE_STOPPED(self), value);
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, "");