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 "mafw-gst-renderer-state-paused.h"
26 #include "mafw-gst-renderer-utils.h"
27 #include <libmafw/mafw.h>
30 #define G_LOG_DOMAIN "mafw-gst-renderer-state-paused"
32 /*----------------------------------------------------------------------------
34 ----------------------------------------------------------------------------*/
36 static void _do_play(MafwGstRendererState *self, GError **error);
37 static void _do_play_object(MafwGstRendererState *self, const gchar *object_id,
39 static void _do_stop(MafwGstRendererState *self, GError **error);
40 static void _do_resume(MafwGstRendererState *self, GError **error);
41 static void _do_set_position(MafwGstRendererState *self,
42 MafwRendererSeekMode mode, gint seconds,
44 static void _do_get_position(MafwGstRendererState *self,
48 /*----------------------------------------------------------------------------
50 ----------------------------------------------------------------------------*/
52 static void _do_next(MafwGstRendererState *self, GError **error);
53 static void _do_previous(MafwGstRendererState *self, GError **error);
54 static void _do_goto_index(MafwGstRendererState *self, guint index,
56 /*----------------------------------------------------------------------------
58 ----------------------------------------------------------------------------*/
60 static void _notify_metadata(MafwGstRendererState *self,
61 const gchar *object_id,
65 /*----------------------------------------------------------------------------
67 ----------------------------------------------------------------------------*/
69 static void _notify_play(MafwGstRendererState *self, GError **error);
70 static void _notify_seek(MafwGstRendererState *self, GError **error);
71 static void _notify_buffer_status(MafwGstRendererState *self, gdouble percent,
74 /*----------------------------------------------------------------------------
75 Playlist editing signals
76 ----------------------------------------------------------------------------*/
78 static void _playlist_contents_changed(MafwGstRendererState *self,
79 gboolean clip_changed,
82 /*----------------------------------------------------------------------------
84 ----------------------------------------------------------------------------*/
86 static GValue* _get_property_value(MafwGstRendererState *self,
89 /*----------------------------------------------------------------------------
90 Memory card event handlers
91 ----------------------------------------------------------------------------*/
93 static void _handle_pre_unmount(MafwGstRendererState *self,
94 const gchar *mount_point);
96 /*----------------------------------------------------------------------------
97 GObject initialization
98 ----------------------------------------------------------------------------*/
100 G_DEFINE_TYPE(MafwGstRendererStatePaused, mafw_gst_renderer_state_paused,
101 MAFW_TYPE_GST_RENDERER_STATE);
103 static void mafw_gst_renderer_state_paused_init(MafwGstRendererStatePaused *self)
107 static void mafw_gst_renderer_state_paused_class_init(
108 MafwGstRendererStatePausedClass *klass)
110 MafwGstRendererStateClass *state_class;
112 state_class = MAFW_GST_RENDERER_STATE_CLASS(klass);
113 g_return_if_fail(state_class != NULL);
115 state_class->name = g_strdup("Paused");
119 state_class->play = _do_play;
120 state_class->play_object = _do_play_object;
121 state_class->stop = _do_stop;
122 state_class->resume = _do_resume;
123 state_class->set_position = _do_set_position;
124 state_class->get_position = _do_get_position;
128 state_class->next = _do_next;
129 state_class->previous = _do_previous;
130 state_class->goto_index = _do_goto_index;
132 /* Notification metadata */
134 state_class->notify_metadata = _notify_metadata;
136 /* Notification worker */
138 state_class->notify_play = _notify_play;
139 /* state_class->notify_pause is not allowed */
140 state_class->notify_seek = _notify_seek;
141 state_class->notify_buffer_status = _notify_buffer_status;
143 /* Playlist editing signals */
145 state_class->playlist_contents_changed =
146 _playlist_contents_changed;
148 /* Property methods */
150 state_class->get_property_value = _get_property_value;
152 /* Memory card event handlers */
154 state_class->handle_pre_unmount = _handle_pre_unmount;
157 GObject *mafw_gst_renderer_state_paused_new(MafwGstRenderer *renderer)
159 MafwGstRendererState *state;
161 state = MAFW_GST_RENDERER_STATE(
162 g_object_new(MAFW_TYPE_GST_RENDERER_STATE_PAUSED, NULL));
163 state->renderer = renderer;
165 return G_OBJECT(state);
168 /*----------------------------------------------------------------------------
170 ----------------------------------------------------------------------------*/
172 static void _do_play(MafwGstRendererState *self, GError **error)
174 g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
175 mafw_gst_renderer_state_do_play(self, error);
178 static void _do_play_object(MafwGstRendererState *self, const gchar *object_id,
181 MafwGstRendererPlaybackMode cur_mode, prev_mode;
183 g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
185 self->renderer->worker->stay_paused = FALSE;
186 prev_mode = mafw_gst_renderer_get_playback_mode(self->renderer);
187 mafw_gst_renderer_state_do_play_object(self, object_id, error);
188 cur_mode = mafw_gst_renderer_get_playback_mode(self->renderer);
190 /* If this happens it means that we interrupted playlist playback
191 so let's resume it when play_object is finished */
192 if (cur_mode != prev_mode) {
193 self->renderer->resume_playlist = TRUE;
197 static void _do_stop(MafwGstRendererState *self, GError **error)
199 g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
201 self->renderer->worker->stay_paused = FALSE;
203 mafw_gst_renderer_state_do_stop(self, error);
206 static void _do_resume(MafwGstRendererState *self, GError **error)
208 g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
210 MafwGstRenderer *renderer = MAFW_GST_RENDERER_STATE(self)->renderer;
211 self->renderer->worker->stay_paused = FALSE;
212 mafw_gst_renderer_worker_resume(renderer->worker);
214 /* Transition will be done after receiving notify_play */
217 static void _do_set_position(MafwGstRendererState *self,
218 MafwRendererSeekMode mode, gint seconds,
221 g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
222 self->renderer->worker->stay_paused = TRUE;
223 mafw_gst_renderer_state_do_set_position(self, mode, seconds, error);
226 static void _do_get_position(MafwGstRendererState *self,
230 g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
231 mafw_gst_renderer_state_do_get_position(self, seconds, error);
234 /*----------------------------------------------------------------------------
236 ----------------------------------------------------------------------------*/
238 static void _do_next(MafwGstRendererState *self, GError **error)
240 g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
241 self->renderer->worker->stay_paused = TRUE;
242 mafw_gst_renderer_state_do_next(self, error);
245 static void _do_previous(MafwGstRendererState *self, GError **error)
247 g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
248 self->renderer->worker->stay_paused = TRUE;
249 mafw_gst_renderer_state_do_prev(self, error);
252 static void _do_goto_index(MafwGstRendererState *self, guint index,
255 g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
256 self->renderer->worker->stay_paused = TRUE;
257 mafw_gst_renderer_state_do_goto_index(self, index, error);
261 /*----------------------------------------------------------------------------
262 Notification metatada
263 ----------------------------------------------------------------------------*/
265 static void _notify_metadata(MafwGstRendererState *self,
266 const gchar *object_id,
267 GHashTable *metadata,
270 g_debug("running _notify_metadata...");
271 /* Kindly Ignore this notification:
272 probably a delayed (now useless) metadata resolution */
276 /*----------------------------------------------------------------------------
278 ----------------------------------------------------------------------------*/
280 static void _notify_play(MafwGstRendererState *self, GError **error)
282 g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
284 MafwGstRenderer *renderer = MAFW_GST_RENDERER_STATE(self)->renderer;
286 /* Change status to play */
287 mafw_gst_renderer_set_state(renderer, Playing);
290 static void _notify_seek(MafwGstRendererState *self, GError **error)
292 mafw_gst_renderer_state_do_notify_seek(self, error);
295 static void _notify_buffer_status(MafwGstRendererState *self, gdouble percent,
298 mafw_gst_renderer_state_do_notify_buffer_status (self, percent, error);
301 /*----------------------------------------------------------------------------
302 Playlist editing signals
303 ----------------------------------------------------------------------------*/
305 static void _playlist_contents_changed(MafwGstRendererState *self,
306 gboolean clip_changed,
309 MafwGstRendererPlaybackMode mode;
311 g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
313 /* Play the new index only if we are not in standalone mode.
314 Otherwise, when play_object finishes the new item will be
315 played if that's been suggested with renderer->resume_playlist */
316 mode = mafw_gst_renderer_get_playback_mode(self->renderer);
317 if (clip_changed && mode == MAFW_GST_RENDERER_MODE_PLAYLIST) {
318 self->renderer->worker->stay_paused = TRUE;
319 mafw_gst_renderer_state_do_play(self, error);
323 /*----------------------------------------------------------------------------
325 ----------------------------------------------------------------------------*/
327 GValue* _get_property_value(MafwGstRendererState *self, const gchar *name)
329 GValue *value = NULL;
331 g_return_val_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self), value);
333 if (!g_strcmp0(name, MAFW_PROPERTY_RENDERER_TRANSPORT_ACTIONS)) {
334 gboolean is_seekable =
335 mafw_gst_renderer_worker_get_seekable(
336 self->renderer->worker);
338 value = g_new0(GValue, 1);
339 g_value_init(value, G_TYPE_STRING);
341 g_value_set_string(value, "seek");
343 g_value_set_string(value, "");
350 /*----------------------------------------------------------------------------
351 Memory card event handlers
352 ----------------------------------------------------------------------------*/
354 static void _handle_pre_unmount(MafwGstRendererState *self,
355 const gchar *mount_point)
359 /* If not playing anything, bail out */
360 if (!self->renderer->media->uri) {
364 /* Check if mount point is URI or path, we need URI */
365 if (!g_str_has_prefix(mount_point, "file://")) {
366 mount_uri = g_filename_to_uri(mount_point, NULL, NULL);
368 mount_uri = g_strdup(mount_point);
371 /* Stop if playing from unmounted location */
372 if (g_str_has_prefix(self->renderer->media->uri, mount_uri)) {
373 g_debug("PAUSED-STATE: stopping to mount card");
374 mafw_gst_renderer_stop(MAFW_RENDERER(self->renderer),