Source tree moved to mafw-gst-subtitles-renderer directory.
[mafwsubrenderer] / mafw-gst-subtitles-renderer / libmafw-gst-renderer / mafw-gst-renderer-state-paused.c
diff --git a/mafw-gst-subtitles-renderer/libmafw-gst-renderer/mafw-gst-renderer-state-paused.c b/mafw-gst-subtitles-renderer/libmafw-gst-renderer/mafw-gst-renderer-state-paused.c
new file mode 100644 (file)
index 0000000..8c4d1c9
--- /dev/null
@@ -0,0 +1,380 @@
+/*
+ * This file is a part of MAFW
+ *
+ * Copyright (C) 2007, 2008, 2009 Nokia Corporation, all rights reserved.
+ *
+ * Contact: Visa Smolander <visa.smolander@nokia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ *
+ */
+
+#include "mafw-gst-renderer-state-paused.h"
+#include "mafw-gst-renderer-utils.h"
+#include <libmafw/mafw.h>
+
+#undef  G_LOG_DOMAIN
+#define G_LOG_DOMAIN "mafw-gst-renderer-state-paused"
+
+/*----------------------------------------------------------------------------
+  Playback
+  ----------------------------------------------------------------------------*/
+
+static void _do_play(MafwGstRendererState *self, GError **error);
+static void _do_play_object(MafwGstRendererState *self, const gchar *object_id,
+                           GError **error);
+static void _do_stop(MafwGstRendererState *self, GError **error);
+static void _do_resume(MafwGstRendererState *self, GError **error);
+static void _do_set_position(MafwGstRendererState *self,
+                            MafwRendererSeekMode mode, gint seconds,
+                            GError **error);
+static void _do_get_position(MafwGstRendererState *self,
+                            gint *seconds,
+                            GError **error);
+
+/*----------------------------------------------------------------------------
+  Playlist
+  ----------------------------------------------------------------------------*/
+
+static void _do_next(MafwGstRendererState *self, GError **error);
+static void _do_previous(MafwGstRendererState *self, GError **error);
+static void _do_goto_index(MafwGstRendererState *self, guint index,
+                          GError **error);
+/*----------------------------------------------------------------------------
+  Notification metatada
+  ----------------------------------------------------------------------------*/
+
+static void _notify_metadata(MafwGstRendererState *self,
+                            const gchar *object_id,
+                            GHashTable *metadata,
+                            GError **error);
+
+/*----------------------------------------------------------------------------
+  Notification worker
+  ----------------------------------------------------------------------------*/
+
+static void _notify_play(MafwGstRendererState *self, GError **error);
+static void _notify_seek(MafwGstRendererState *self, GError **error);
+static void _notify_buffer_status(MafwGstRendererState *self, gdouble percent,
+                                 GError **error);
+
+/*----------------------------------------------------------------------------
+  Playlist editing signals
+  ----------------------------------------------------------------------------*/
+
+static void _playlist_contents_changed(MafwGstRendererState *self,
+                                      gboolean clip_changed,
+                                      GError **error);
+
+/*----------------------------------------------------------------------------
+  Property methods
+  ----------------------------------------------------------------------------*/
+
+static GValue* _get_property_value(MafwGstRendererState *self,
+                                  const gchar *name);
+
+/*----------------------------------------------------------------------------
+  Memory card event handlers
+  ----------------------------------------------------------------------------*/
+
+static void _handle_pre_unmount(MafwGstRendererState *self,
+                               const gchar *mount_point);
+
+/*----------------------------------------------------------------------------
+  GObject initialization
+  ----------------------------------------------------------------------------*/
+
+G_DEFINE_TYPE(MafwGstRendererStatePaused, mafw_gst_renderer_state_paused,
+             MAFW_TYPE_GST_RENDERER_STATE);
+
+static void mafw_gst_renderer_state_paused_init(MafwGstRendererStatePaused *self)
+{
+}
+
+static void mafw_gst_renderer_state_paused_class_init(
+       MafwGstRendererStatePausedClass *klass)
+{
+        MafwGstRendererStateClass *state_class;
+
+       state_class = MAFW_GST_RENDERER_STATE_CLASS(klass);
+        g_return_if_fail(state_class != NULL);
+
+       state_class->name = g_strdup("Paused");
+
+       /* Playback */
+
+       state_class->play         = _do_play;
+       state_class->play_object  = _do_play_object;
+       state_class->stop         = _do_stop;
+        state_class->resume       = _do_resume;
+       state_class->set_position = _do_set_position;
+       state_class->get_position = _do_get_position;
+
+       /* Playlist */
+
+       state_class->next       = _do_next;
+       state_class->previous   = _do_previous;
+       state_class->goto_index = _do_goto_index;
+
+        /* Notification metadata */
+
+        state_class->notify_metadata = _notify_metadata;
+
+        /* Notification worker */
+
+        state_class->notify_play = _notify_play;
+        /* state_class->notify_pause is not allowed */
+        state_class->notify_seek = _notify_seek;
+        state_class->notify_buffer_status = _notify_buffer_status;
+
+       /* Playlist editing signals */
+
+       state_class->playlist_contents_changed =
+               _playlist_contents_changed;
+
+       /* Property methods */
+
+       state_class->get_property_value = _get_property_value;
+
+        /* Memory card event handlers */
+
+       state_class->handle_pre_unmount = _handle_pre_unmount;
+}
+
+GObject *mafw_gst_renderer_state_paused_new(MafwGstRenderer *renderer)
+{
+       MafwGstRendererState *state;
+
+        state = MAFW_GST_RENDERER_STATE(
+               g_object_new(MAFW_TYPE_GST_RENDERER_STATE_PAUSED, NULL));
+       state->renderer = renderer;
+
+       return G_OBJECT(state);
+}
+
+/*----------------------------------------------------------------------------
+  Playback
+  ----------------------------------------------------------------------------*/
+
+static void _do_play(MafwGstRendererState *self, GError **error)
+{
+        g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
+       mafw_gst_renderer_state_do_play(self, error);
+}
+
+static void _do_play_object(MafwGstRendererState *self, const gchar *object_id,
+                           GError **error)
+{
+       MafwGstRendererPlaybackMode cur_mode, prev_mode;
+
+        g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
+
+       self->renderer->worker->stay_paused = FALSE;
+       prev_mode = mafw_gst_renderer_get_playback_mode(self->renderer);
+       mafw_gst_renderer_state_do_play_object(self, object_id, error);
+       cur_mode = mafw_gst_renderer_get_playback_mode(self->renderer);
+
+       /* If this happens it means that we interrupted playlist playback
+          so let's resume it when play_object is finished */
+       if (cur_mode != prev_mode) {
+               self->renderer->resume_playlist = TRUE;
+       }
+}
+
+static void _do_stop(MafwGstRendererState *self, GError **error)
+{
+        g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
+
+       self->renderer->worker->stay_paused = FALSE;
+       /* Stop playback */
+        mafw_gst_renderer_state_do_stop(self, error);
+}
+
+static void _do_resume(MafwGstRendererState *self, GError **error)
+{
+        g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
+
+        MafwGstRenderer *renderer = MAFW_GST_RENDERER_STATE(self)->renderer;
+       self->renderer->worker->stay_paused = FALSE;
+        mafw_gst_renderer_worker_resume(renderer->worker);
+
+        /* Transition will be done after receiving notify_play */
+}
+
+static void _do_set_position(MafwGstRendererState *self,
+                            MafwRendererSeekMode mode, gint seconds,
+                            GError **error)
+{
+        g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
+       self->renderer->worker->stay_paused = TRUE;
+       mafw_gst_renderer_state_do_set_position(self, mode, seconds, error);
+}
+
+static void _do_get_position(MafwGstRendererState *self,
+                            gint *seconds,
+                            GError **error)
+{
+        g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
+       mafw_gst_renderer_state_do_get_position(self, seconds, error);
+}
+
+/*----------------------------------------------------------------------------
+  Playlist
+  ----------------------------------------------------------------------------*/
+
+static void _do_next(MafwGstRendererState *self, GError **error)
+{
+        g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
+       self->renderer->worker->stay_paused = TRUE;
+       mafw_gst_renderer_state_do_next(self, error);
+}
+
+static void _do_previous(MafwGstRendererState *self, GError **error)
+{
+        g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
+       self->renderer->worker->stay_paused = TRUE;
+       mafw_gst_renderer_state_do_prev(self, error);
+}
+
+static void _do_goto_index(MafwGstRendererState *self, guint index,
+                          GError **error)
+{
+        g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
+       self->renderer->worker->stay_paused = TRUE;
+       mafw_gst_renderer_state_do_goto_index(self, index, error);
+}
+
+
+/*----------------------------------------------------------------------------
+  Notification metatada
+  ----------------------------------------------------------------------------*/
+
+static void _notify_metadata(MafwGstRendererState *self,
+                            const gchar *object_id,
+                            GHashTable *metadata,
+                            GError **error)
+{
+       g_debug("running _notify_metadata...");
+        /* Kindly Ignore this notification:
+          probably a delayed (now useless) metadata resolution */
+}
+
+
+/*----------------------------------------------------------------------------
+  Notification worker
+  ----------------------------------------------------------------------------*/
+
+static void _notify_play(MafwGstRendererState *self, GError **error)
+{
+        g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
+
+        MafwGstRenderer *renderer = MAFW_GST_RENDERER_STATE(self)->renderer;
+
+        /* Change status to play */
+        mafw_gst_renderer_set_state(renderer, Playing);
+}
+
+static void _notify_seek(MafwGstRendererState *self, GError **error)
+{
+        mafw_gst_renderer_state_do_notify_seek(self, error);
+}
+
+static void _notify_buffer_status(MafwGstRendererState *self, gdouble percent,
+                                 GError **error)
+{
+       mafw_gst_renderer_state_do_notify_buffer_status (self, percent, error);
+}
+
+/*----------------------------------------------------------------------------
+  Playlist editing signals
+  ----------------------------------------------------------------------------*/
+
+static void _playlist_contents_changed(MafwGstRendererState *self,
+                                      gboolean clip_changed,
+                                      GError **error)
+{
+       MafwGstRendererPlaybackMode mode;
+
+        g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
+
+       /* Play the new index only if we are not in standalone mode.
+          Otherwise, when play_object finishes the new item will be
+          played if that's been suggested with renderer->resume_playlist */
+       mode = mafw_gst_renderer_get_playback_mode(self->renderer);
+       if (clip_changed && mode == MAFW_GST_RENDERER_MODE_PLAYLIST) {
+               self->renderer->worker->stay_paused = TRUE;
+               mafw_gst_renderer_state_do_play(self, error);
+       }
+}
+
+/*----------------------------------------------------------------------------
+  Property methods
+  ----------------------------------------------------------------------------*/
+
+GValue* _get_property_value(MafwGstRendererState *self, const gchar *name)
+{
+       GValue *value = NULL;
+
+       g_return_val_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self), value);
+
+       if (!g_strcmp0(name, MAFW_PROPERTY_RENDERER_TRANSPORT_ACTIONS)) {
+               gboolean is_seekable =
+                       mafw_gst_renderer_worker_get_seekable(
+                               self->renderer->worker);
+
+               value = g_new0(GValue, 1);
+               g_value_init(value, G_TYPE_STRING);
+               if (is_seekable) {
+                       g_value_set_string(value, "seek");
+               } else {
+                       g_value_set_string(value, "");
+               }
+       }
+
+       return value;
+}
+
+/*----------------------------------------------------------------------------
+  Memory card event handlers
+  ----------------------------------------------------------------------------*/
+
+static void _handle_pre_unmount(MafwGstRendererState *self,
+                               const gchar *mount_point)
+{
+       gchar *mount_uri;
+
+       /* If not playing anything, bail out */
+       if (!self->renderer->media->uri) {
+               return;
+       }
+
+       /* Check if mount point is URI or path, we need URI */
+       if (!g_str_has_prefix(mount_point, "file://")) {
+               mount_uri = g_filename_to_uri(mount_point, NULL, NULL);
+       } else {
+               mount_uri = g_strdup(mount_point);
+       }
+
+       /* Stop if playing from unmounted location */
+       if (g_str_has_prefix(self->renderer->media->uri, mount_uri)) {
+                g_debug("PAUSED-STATE: stopping to mount card");
+               mafw_gst_renderer_stop(MAFW_RENDERER(self->renderer),
+                                      NULL,
+                                      NULL);
+       }
+
+       g_free(mount_uri);
+}