Macro qtTrIdx() replaced by tr() and QT_TRANSLATE_NOOP()
[mafwsubrenderer] / mafw-gst-subtitles-renderer / libmafw-gst-renderer / mafw-gst-renderer-state-paused.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 "mafw-gst-renderer-state-paused.h"
26 #include "mafw-gst-renderer-utils.h"
27 #include <libmafw/mafw.h>
28
29 #undef  G_LOG_DOMAIN
30 #define G_LOG_DOMAIN "mafw-gst-renderer-state-paused"
31
32 /*----------------------------------------------------------------------------
33   Playback
34   ----------------------------------------------------------------------------*/
35
36 static void _do_play(MafwGstRendererState *self, GError **error);
37 static void _do_play_object(MafwGstRendererState *self, const gchar *object_id,
38                             GError **error);
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,
43                              GError **error);
44 static void _do_get_position(MafwGstRendererState *self,
45                              gint *seconds,
46                              GError **error);
47
48 /*----------------------------------------------------------------------------
49   Playlist
50   ----------------------------------------------------------------------------*/
51
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,
55                            GError **error);
56 /*----------------------------------------------------------------------------
57   Notification metatada
58   ----------------------------------------------------------------------------*/
59
60 static void _notify_metadata(MafwGstRendererState *self,
61                              const gchar *object_id,
62                              GHashTable *metadata,
63                              GError **error);
64
65 /*----------------------------------------------------------------------------
66   Notification worker
67   ----------------------------------------------------------------------------*/
68
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,
72                                   GError **error);
73
74 /*----------------------------------------------------------------------------
75   Playlist editing signals
76   ----------------------------------------------------------------------------*/
77
78 static void _playlist_contents_changed(MafwGstRendererState *self,
79                                        gboolean clip_changed,
80                                        GError **error);
81
82 /*----------------------------------------------------------------------------
83   Property methods
84   ----------------------------------------------------------------------------*/
85
86 static GValue* _get_property_value(MafwGstRendererState *self,
87                                    const gchar *name);
88
89 /*----------------------------------------------------------------------------
90   Memory card event handlers
91   ----------------------------------------------------------------------------*/
92
93 static void _handle_pre_unmount(MafwGstRendererState *self,
94                                 const gchar *mount_point);
95
96 /*----------------------------------------------------------------------------
97   GObject initialization
98   ----------------------------------------------------------------------------*/
99
100 G_DEFINE_TYPE(MafwGstRendererStatePaused, mafw_gst_renderer_state_paused,
101               MAFW_TYPE_GST_RENDERER_STATE);
102
103 static void mafw_gst_renderer_state_paused_init(MafwGstRendererStatePaused *self)
104 {
105 }
106
107 static void mafw_gst_renderer_state_paused_class_init(
108         MafwGstRendererStatePausedClass *klass)
109 {
110         MafwGstRendererStateClass *state_class;
111
112         state_class = MAFW_GST_RENDERER_STATE_CLASS(klass);
113         g_return_if_fail(state_class != NULL);
114
115         state_class->name = g_strdup("Paused");
116
117         /* Playback */
118
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;
125
126         /* Playlist */
127
128         state_class->next       = _do_next;
129         state_class->previous   = _do_previous;
130         state_class->goto_index = _do_goto_index;
131
132         /* Notification metadata */
133
134         state_class->notify_metadata = _notify_metadata;
135
136         /* Notification worker */
137
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;
142
143         /* Playlist editing signals */
144
145         state_class->playlist_contents_changed =
146                 _playlist_contents_changed;
147
148         /* Property methods */
149
150         state_class->get_property_value = _get_property_value;
151
152         /* Memory card event handlers */
153
154         state_class->handle_pre_unmount = _handle_pre_unmount;
155 }
156
157 GObject *mafw_gst_renderer_state_paused_new(MafwGstRenderer *renderer)
158 {
159         MafwGstRendererState *state;
160
161         state = MAFW_GST_RENDERER_STATE(
162                 g_object_new(MAFW_TYPE_GST_RENDERER_STATE_PAUSED, NULL));
163         state->renderer = renderer;
164
165         return G_OBJECT(state);
166 }
167
168 /*----------------------------------------------------------------------------
169   Playback
170   ----------------------------------------------------------------------------*/
171
172 static void _do_play(MafwGstRendererState *self, GError **error)
173 {
174         g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
175         mafw_gst_renderer_state_do_play(self, error);
176 }
177
178 static void _do_play_object(MafwGstRendererState *self, const gchar *object_id,
179                             GError **error)
180 {
181         MafwGstRendererPlaybackMode cur_mode, prev_mode;
182
183         g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
184
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);
189
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;
194         }
195 }
196
197 static void _do_stop(MafwGstRendererState *self, GError **error)
198 {
199         g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
200
201         self->renderer->worker->stay_paused = FALSE;
202         /* Stop playback */
203         mafw_gst_renderer_state_do_stop(self, error);
204 }
205
206 static void _do_resume(MafwGstRendererState *self, GError **error)
207 {
208         g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
209
210         MafwGstRenderer *renderer = MAFW_GST_RENDERER_STATE(self)->renderer;
211         self->renderer->worker->stay_paused = FALSE;
212         mafw_gst_renderer_worker_resume(renderer->worker);
213
214         /* Transition will be done after receiving notify_play */
215 }
216
217 static void _do_set_position(MafwGstRendererState *self,
218                              MafwRendererSeekMode mode, gint seconds,
219                              GError **error)
220 {
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);
224 }
225
226 static void _do_get_position(MafwGstRendererState *self,
227                              gint *seconds,
228                              GError **error)
229 {
230         g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
231         mafw_gst_renderer_state_do_get_position(self, seconds, error);
232 }
233
234 /*----------------------------------------------------------------------------
235   Playlist
236   ----------------------------------------------------------------------------*/
237
238 static void _do_next(MafwGstRendererState *self, GError **error)
239 {
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);
243 }
244
245 static void _do_previous(MafwGstRendererState *self, GError **error)
246 {
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);
250 }
251
252 static void _do_goto_index(MafwGstRendererState *self, guint index,
253                            GError **error)
254 {
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);
258 }
259
260
261 /*----------------------------------------------------------------------------
262   Notification metatada
263   ----------------------------------------------------------------------------*/
264
265 static void _notify_metadata(MafwGstRendererState *self,
266                              const gchar *object_id,
267                              GHashTable *metadata,
268                              GError **error)
269 {
270         g_debug("running _notify_metadata...");
271         /* Kindly Ignore this notification:
272            probably a delayed (now useless) metadata resolution */
273 }
274
275
276 /*----------------------------------------------------------------------------
277   Notification worker
278   ----------------------------------------------------------------------------*/
279
280 static void _notify_play(MafwGstRendererState *self, GError **error)
281 {
282         g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
283
284         MafwGstRenderer *renderer = MAFW_GST_RENDERER_STATE(self)->renderer;
285
286         /* Change status to play */
287         mafw_gst_renderer_set_state(renderer, Playing);
288 }
289
290 static void _notify_seek(MafwGstRendererState *self, GError **error)
291 {
292         mafw_gst_renderer_state_do_notify_seek(self, error);
293 }
294
295 static void _notify_buffer_status(MafwGstRendererState *self, gdouble percent,
296                                   GError **error)
297 {
298         mafw_gst_renderer_state_do_notify_buffer_status (self, percent, error);
299 }
300
301 /*----------------------------------------------------------------------------
302   Playlist editing signals
303   ----------------------------------------------------------------------------*/
304
305 static void _playlist_contents_changed(MafwGstRendererState *self,
306                                        gboolean clip_changed,
307                                        GError **error)
308 {
309         MafwGstRendererPlaybackMode mode;
310
311         g_return_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self));
312
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);
320         }
321 }
322
323 /*----------------------------------------------------------------------------
324   Property methods
325   ----------------------------------------------------------------------------*/
326
327 GValue* _get_property_value(MafwGstRendererState *self, const gchar *name)
328 {
329         GValue *value = NULL;
330
331         g_return_val_if_fail(MAFW_IS_GST_RENDERER_STATE_PAUSED(self), value);
332
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);
337
338                 value = g_new0(GValue, 1);
339                 g_value_init(value, G_TYPE_STRING);
340                 if (is_seekable) {
341                         g_value_set_string(value, "seek");
342                 } else {
343                         g_value_set_string(value, "");
344                 }
345         }
346
347         return value;
348 }
349
350 /*----------------------------------------------------------------------------
351   Memory card event handlers
352   ----------------------------------------------------------------------------*/
353
354 static void _handle_pre_unmount(MafwGstRendererState *self,
355                                 const gchar *mount_point)
356 {
357         gchar *mount_uri;
358
359         /* If not playing anything, bail out */
360         if (!self->renderer->media->uri) {
361                 return;
362         }
363
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);
367         } else {
368                 mount_uri = g_strdup(mount_point);
369         }
370
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),
375                                        NULL,
376                                        NULL);
377         }
378
379         g_free(mount_uri);
380 }