2
* * Copyright (C) 2009 Ali <aliov@xfce.org>
4
* Licensed under the GNU General Public License Version 2
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation; either version 2 of the License, or
9
* (at your option) any later version.
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
* GNU General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29
#include <gdk/gdkkeysyms.h>
31
#include <parole/parole.h>
33
#include <libxfce4util/libxfce4util.h>
34
#include <libxfcegui4/libxfcegui4.h>
36
#include "parole-plugin-player.h"
38
#include "gst/parole-gst.h"
39
#include "dbus/parole-dbus.h"
40
#include "common/parole-screensaver.h"
42
#define RESOURCE_FILE "xfce4/parole/browser-plugin.rc"
47
static void parole_plugin_player_dbus_class_init (ParolePluginPlayerClass *klass);
48
static void parole_plugin_player_dbus_init (ParolePluginPlayer *player);
50
static void parole_plugin_player_finalize (GObject *object);
52
static void parole_plugin_player_set_property (GObject *object,
56
static void parole_plugin_player_get_property (GObject *object,
61
#define PAROLE_PLUGIN_PLAYER_GET_PRIVATE(o) \
62
(G_TYPE_INSTANCE_GET_PRIVATE ((o), PAROLE_TYPE_PLUGIN_PLAYER, ParolePluginPlayerPrivate))
64
static GTimer *idle_timer = NULL;
65
static GThread *idle_thread = NULL;
67
struct ParolePluginPlayerPrivate
77
GtkWidget *full_screen;
83
ParoleScreenSaver *saver;
85
ParoleMediaState state;
90
gboolean internal_range_change;
91
gboolean user_seeking;
112
static guint signals [LAST_SIGNAL] = { 0 };
114
G_DEFINE_TYPE (ParolePluginPlayer, parole_plugin_player, G_TYPE_OBJECT)
117
parole_plugin_player_play (ParolePluginPlayer *player)
119
if ( player->priv->terminate )
122
player->priv->finished = FALSE;
123
parole_gst_play_uri (player->priv->gst, player->priv->url, NULL);
127
parole_plugin_player_set_fullscreen_button (ParolePluginPlayer *player)
131
g_object_get (G_OBJECT (player->priv->full_screen ),
135
if ( player->priv->fullscreen )
137
gtk_image_set_from_stock (GTK_IMAGE (img), GTK_STOCK_LEAVE_FULLSCREEN, GTK_ICON_SIZE_BUTTON);
138
gtk_widget_set_tooltip_text (img, _("Leave fullscreen"));
142
gtk_image_set_from_stock (GTK_IMAGE (img), GTK_STOCK_FULLSCREEN, GTK_ICON_SIZE_BUTTON);
143
gtk_widget_set_tooltip_text (img, _("Fullscreen"));
146
g_object_unref (G_OBJECT (img));
150
parole_plugin_player_fullscreen (ParolePluginPlayer *player, gboolean fullscreen)
152
if ( player->priv->fullscreen == fullscreen )
155
player->priv->fullscreen = fullscreen;
157
parole_plugin_player_set_fullscreen_button (player);
161
gtk_widget_show (player->priv->window);
162
gtk_widget_reparent (player->priv->vbox, player->priv->window);
163
gtk_widget_show_all (player->priv->window);
164
gtk_window_fullscreen (GTK_WINDOW (player->priv->window));
168
gtk_widget_hide (player->priv->window);
169
gtk_widget_reparent (player->priv->vbox, player->priv->plug);
170
gtk_window_unfullscreen (GTK_WINDOW (player->priv->window));
175
read_entry_int (const gchar *entry, gint fallback)
177
gint ret_val = fallback;
181
file = xfce_resource_save_location (XFCE_RESOURCE_CONFIG, RESOURCE_FILE, TRUE);
182
rc = xfce_rc_simple_open (file, TRUE);
187
ret_val = xfce_rc_read_int_entry (rc, entry, fallback);
195
write_entry_int (const gchar *entry, gint value)
200
file = xfce_resource_save_location (XFCE_RESOURCE_CONFIG, RESOURCE_FILE, TRUE);
201
rc = xfce_rc_simple_open (file, FALSE);
204
xfce_rc_write_int_entry (rc, entry, value);
209
parole_plugin_player_set_play_button_image (ParolePluginPlayer *player)
213
g_object_get (G_OBJECT (player->priv->play),
217
if ( player->priv->state == PAROLE_MEDIA_STATE_PLAYING )
219
g_object_set (G_OBJECT (img),
220
"stock", GTK_STOCK_MEDIA_PAUSE,
225
g_object_set (G_OBJECT (img),
226
"stock", GTK_STOCK_MEDIA_PLAY,
230
g_object_unref (img);
234
parole_plugin_player_play_clicked_cb (ParolePluginPlayer *player)
236
if ( player->priv->state == PAROLE_MEDIA_STATE_PLAYING )
237
parole_gst_pause (player->priv->gst);
238
else if ( player->priv->state == PAROLE_MEDIA_STATE_PAUSED )
239
parole_gst_resume (player->priv->gst);
240
else if ( player->priv->finished )
241
parole_gst_stop (PAROLE_GST (player->priv->gst));
245
parole_plugin_player_change_range_value (ParolePluginPlayer *player, gdouble value)
247
if ( !player->priv->user_seeking )
249
player->priv->internal_range_change = TRUE;
251
gtk_range_set_value (GTK_RANGE (player->priv->range), value);
253
player->priv->internal_range_change = FALSE;
258
parole_plugin_player_media_state_cb (ParoleGst *gst, const ParoleStream *stream,
259
ParoleMediaState state, ParolePluginPlayer *player)
264
g_object_get (G_OBJECT (stream),
265
"has-video", &has_video,
268
g_object_set (G_OBJECT (player->priv->full_screen),
269
"visible", has_video,
272
player->priv->state = state;
273
parole_plugin_player_set_play_button_image (player);
275
if ( has_video && state == PAROLE_MEDIA_STATE_PLAYING )
276
parole_screen_saver_inhibit (player->priv->saver);
278
parole_screen_saver_uninhibit (player->priv->saver);
280
if ( state == PAROLE_MEDIA_STATE_PLAYING )
286
g_object_get (G_OBJECT (stream),
287
"seekable", &seekable,
288
"duration", &duration,
292
gtk_widget_set_sensitive (player->priv->range, seekable);
293
player->priv->internal_range_change = TRUE;
294
if ( live || duration == 0 )
295
parole_plugin_player_change_range_value (player, 0);
297
gtk_range_set_range (GTK_RANGE (player->priv->range), 0, duration);
298
player->priv->internal_range_change = FALSE;
300
gtk_widget_set_tooltip_text (GTK_WIDGET (player->priv->range), seekable ? NULL : _("Media stream is not seekable"));
302
else if ( state == PAROLE_MEDIA_STATE_PAUSED )
304
parole_plugin_player_change_range_value (player, 0);
306
else if ( state == PAROLE_MEDIA_STATE_STOPPED )
308
parole_plugin_player_change_range_value (player, 0);
310
if ( player->priv->terminate )
314
else if ( player->priv->reload )
316
player->priv->reload = FALSE;
317
parole_plugin_player_play (player);
320
else if ( player->priv->list != NULL && player->priv->url )
322
parole_plugin_player_play (player);
324
else if ( player->priv->finished )
326
player->priv->finished = FALSE;
329
else if ( state == PAROLE_MEDIA_STATE_FINISHED )
331
parole_plugin_player_change_range_value (player, 0);
332
player->priv->finished = TRUE;
334
if ( player->priv->url )
336
g_free (player->priv->url);
337
player->priv->url = NULL;
340
if ( player->priv->list )
342
player->priv->list = player->priv->list->next;
343
if ( player->priv->list->data )
345
ParoleFile *file = NULL;
346
file = PAROLE_FILE (player->priv->list->data);
348
player->priv->url = g_strdup (parole_file_get_uri (file));
351
parole_gst_stop (PAROLE_GST (player->priv->gst));
356
parole_plugin_player_terminate (GtkWidget *widget, GdkEvent *ev, ParolePluginPlayer *player)
358
//g_debug ("Delete event");
359
parole_gst_terminate (player->priv->gst);
360
g_signal_handler_disconnect (player->priv->plug, player->priv->sig);
361
player->priv->terminate = TRUE;
366
parole_plugin_player_range_value_changed (GtkRange *range, ParolePluginPlayer *player)
370
if ( !player->priv->internal_range_change )
372
value = gtk_range_get_value (GTK_RANGE (range));
373
player->priv->user_seeking = TRUE;
374
parole_gst_seek (player->priv->gst, value);
375
player->priv->user_seeking = FALSE;
380
parole_plugin_player_range_button_release (GtkWidget *widget, GdkEventButton *ev, ParolePluginPlayer *player)
384
player->priv->user_seeking = FALSE;
390
parole_plugin_player_range_button_press (GtkWidget *widget, GdkEventButton *ev, ParolePluginPlayer *player)
394
player->priv->user_seeking = TRUE;
400
parole_plugin_player_volume_changed_cb (GtkWidget *volume, gdouble value, ParolePluginPlayer *player)
402
parole_gst_set_volume (player->priv->gst, value);
403
write_entry_int ("volume", (gint) (value * 100));
407
parole_plugin_player_media_progressed_cb (ParoleGst *gst, const ParoleStream *stream,
408
gint64 value, ParolePluginPlayer *player)
411
if ( !player->priv->user_seeking && player->priv->state == PAROLE_MEDIA_STATE_PLAYING )
413
parole_plugin_player_change_range_value (player, value);
418
parole_plugin_player_reload (ParolePluginPlayer *player)
420
player->priv->reload = TRUE;
421
parole_gst_stop (player->priv->gst);
425
parole_plugin_player_copy_url (ParolePluginPlayer *player)
427
GtkClipboard *clipboard;
429
clipboard = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
430
gtk_clipboard_set_text (clipboard, player->priv->url, -1);
431
clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
432
gtk_clipboard_set_text (clipboard, player->priv->url, -1);
436
parole_plugin_player_show_menu (ParolePluginPlayer *player, guint button, guint activate_time)
438
GtkWidget *menu, *mi, *img;
440
menu = gtk_menu_new ();
445
mi = gtk_image_menu_item_new_from_stock (GTK_STOCK_REFRESH, NULL);
446
gtk_widget_show (mi);
447
g_signal_connect_swapped (mi, "activate",
448
G_CALLBACK (parole_plugin_player_reload), player);
449
gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
455
mi = gtk_image_menu_item_new_with_label (_("Copy url"));
456
img = gtk_image_new_from_stock (GTK_STOCK_COPY, GTK_ICON_SIZE_MENU);
457
gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mi),img);
458
gtk_widget_show (mi);
459
g_signal_connect_swapped (mi, "activate",
460
G_CALLBACK (parole_plugin_player_copy_url), player);
461
gtk_menu_shell_append (GTK_MENU_SHELL (menu), mi);
464
g_signal_connect_swapped (menu, "selection-done",
465
G_CALLBACK (gtk_widget_destroy), menu);
467
gtk_menu_popup (GTK_MENU (menu),
470
button, activate_time);
474
parole_plugin_player_gst_widget_button_release (GtkWidget *widget,
476
ParolePluginPlayer *player)
478
gboolean ret_val = FALSE;
480
if ( ev->button == 3 )
482
parole_plugin_player_show_menu (player, ev->button, ev->time);
490
parole_plugin_player_fullscreen_clicked_cb (ParolePluginPlayer *player)
492
parole_plugin_player_fullscreen (player, !player->priv->fullscreen);
496
parole_plugin_player_window_key_press_cb (GtkWidget *widget, GdkEventKey *ev, ParolePluginPlayer *player)
498
gboolean ret_val = FALSE;
505
parole_plugin_player_fullscreen_clicked_cb (player);
509
parole_plugin_player_fullscreen (player, FALSE);
519
parole_plugin_player_gst_widget_button_press (GtkWidget *widget, GdkEventButton *ev, ParolePluginPlayer *player)
521
gboolean ret_val = FALSE;
524
* if full_screen widget is visible then we are playing
525
* video file so there is a point to go fullscreen.
527
if ( ev->type == GDK_2BUTTON_PRESS && GTK_WIDGET_VISIBLE (player->priv->full_screen) )
529
parole_plugin_player_fullscreen_clicked_cb (player);
537
parole_plugin_player_window_delete_event_cb (ParolePluginPlayer *player)
539
parole_plugin_player_fullscreen (player, FALSE);
543
static gpointer *check_idle_thread (gpointer data)
545
ParolePluginPlayer *player;
547
player = PAROLE_PLUGIN_PLAYER (data);
552
if ( g_timer_elapsed (idle_timer, NULL ) > 60.f )
557
} while ( player->priv->terminate == FALSE );
563
parole_plugin_player_dispose (GObject *object)
565
ParolePluginPlayer *player;
567
player = PAROLE_PLUGIN_PLAYER (object);
569
G_OBJECT_CLASS (parole_plugin_player_parent_class)->dispose (object);
573
parole_plugin_player_error_cb (ParoleGst *gst, const gchar *error, ParolePluginPlayer *player)
575
player->priv->finished = TRUE;
576
parole_screen_saver_uninhibit (player->priv->saver);
577
g_warning ("player_error_cb : %s", error);
582
parole_plugin_player_buffering_cb (ParoleGst *gst, const ParoleStream *stream,
583
gint percentage, ParolePluginPlayer *player)
585
if ( percentage == 100 )
587
gtk_widget_hide (player->priv->buffering);
593
text = g_strdup_printf ("%s %d%%...", _("Buffering"), percentage);
594
gtk_label_set_text (GTK_LABEL (player->priv->buffering), text);
596
gtk_widget_show (player->priv->buffering);
601
parole_plugin_player_construct (GObject *object)
603
ParolePluginPlayer *player;
611
player = PAROLE_PLUGIN_PLAYER (object);
613
vbox = gtk_vbox_new (FALSE, 0);
618
gstbox = gtk_hbox_new (TRUE, 0);
620
gtk_box_pack_start (GTK_BOX (gstbox), GTK_WIDGET (player->priv->gst), TRUE, TRUE, 0);
621
gtk_box_pack_start (GTK_BOX (vbox), gstbox, TRUE, TRUE, 0);
623
g_signal_connect (G_OBJECT (player->priv->gst), "media-state",
624
G_CALLBACK (parole_plugin_player_media_state_cb), player);
626
g_signal_connect (G_OBJECT (player->priv->gst), "error",
627
G_CALLBACK (parole_plugin_player_error_cb), player);
629
g_signal_connect (G_OBJECT (player->priv->gst), "buffering",
630
G_CALLBACK (parole_plugin_player_buffering_cb), player);
632
g_signal_connect (G_OBJECT (player->priv->gst), "media-progressed",
633
G_CALLBACK (parole_plugin_player_media_progressed_cb), player);
635
g_signal_connect_after (G_OBJECT (player->priv->gst), "button-release-event",
636
G_CALLBACK (parole_plugin_player_gst_widget_button_release), player);
638
g_signal_connect_after (G_OBJECT (player->priv->gst), "button-press-event",
639
G_CALLBACK (parole_plugin_player_gst_widget_button_press), player);
641
g_signal_connect (G_OBJECT (player->priv->gst), "error",
642
G_CALLBACK (parole_plugin_player_error_cb), player);
644
hbox = gtk_hbox_new (FALSE, 0);
648
player->priv->play = gtk_button_new ();
650
g_signal_connect_swapped (player->priv->play, "clicked",
651
G_CALLBACK (parole_plugin_player_play_clicked_cb), player);
653
img = gtk_image_new_from_stock (GTK_STOCK_MEDIA_PLAY, GTK_ICON_SIZE_MENU);
655
g_object_set (G_OBJECT (player->priv->play),
656
"receives-default", FALSE,
658
"relief", GTK_RELIEF_NONE,
662
gtk_box_pack_start (GTK_BOX (hbox), player->priv->play,
665
sep = gtk_vseparator_new ();
666
gtk_box_pack_start (GTK_BOX (hbox), sep ,
671
player->priv->range = gtk_hscale_new (NULL);
672
g_object_set (G_OBJECT (player->priv->range),
674
"show-fill-level", TRUE,
677
gtk_box_pack_start (GTK_BOX (hbox), player->priv->range,
680
g_signal_connect (player->priv->range, "button-press-event",
681
G_CALLBACK (parole_plugin_player_range_button_press), player);
683
g_signal_connect (player->priv->range, "button-release-event",
684
G_CALLBACK (parole_plugin_player_range_button_release), player);
686
g_signal_connect (player->priv->range, "value-changed",
687
G_CALLBACK (parole_plugin_player_range_value_changed), player);
689
sep = gtk_vseparator_new ();
690
gtk_box_pack_start (GTK_BOX (hbox), sep,
696
player->priv->full_screen = gtk_button_new ();
698
img = gtk_image_new ();
700
g_object_set (G_OBJECT (player->priv->full_screen),
701
"receives-default", FALSE,
703
"relief", GTK_RELIEF_NONE,
706
parole_plugin_player_set_fullscreen_button (player);
707
gtk_box_pack_start (GTK_BOX (hbox), player->priv->full_screen,
709
sep = gtk_vseparator_new ();
710
gtk_box_pack_start (GTK_BOX (hbox), sep,
713
g_signal_connect_swapped (player->priv->full_screen, "clicked",
714
G_CALLBACK (parole_plugin_player_fullscreen_clicked_cb), player);
719
adj = gtk_adjustment_new (0.,
721
player->priv->volume = g_object_new (GTK_TYPE_VOLUME_BUTTON,
723
"size", GTK_ICON_SIZE_MENU,
725
gtk_adjustment_set_value (GTK_ADJUSTMENT (adj), (gdouble) (read_entry_int ("volume", 100)/100.) );
726
gtk_box_pack_start (GTK_BOX (hbox), player->priv->volume,
729
g_signal_connect (player->priv->volume, "value-changed",
730
G_CALLBACK (parole_plugin_player_volume_changed_cb), player);
736
player->priv->buffering = gtk_label_new (NULL);
737
gtk_widget_set_no_show_all (player->priv->buffering, TRUE);
738
gtk_widget_hide (player->priv->buffering);
739
gtk_box_pack_start (GTK_BOX (vbox), player->priv->buffering,
742
gtk_box_pack_start (GTK_BOX (vbox), hbox,
744
gtk_container_add (GTK_CONTAINER (player->priv->plug), vbox);
746
player->priv->sig = g_signal_connect (player->priv->plug, "delete-event",
747
G_CALLBACK (parole_plugin_player_terminate), player);
749
parole_plugin_player_change_range_value (player, 0);
750
gtk_widget_set_sensitive (player->priv->range, FALSE);
752
player->priv->vbox = vbox;
754
g_signal_emit (player, signals [SIG_READY], 0);
756
if ( player->priv->url )
757
parole_plugin_player_play (player);
761
parole_plugin_player_class_init (ParolePluginPlayerClass *klass)
763
GObjectClass *object_class = G_OBJECT_CLASS (klass);
765
object_class->finalize = parole_plugin_player_finalize;
766
object_class->dispose = parole_plugin_player_dispose;
768
object_class->get_property = parole_plugin_player_get_property;
769
object_class->set_property = parole_plugin_player_set_property;
771
object_class->constructed = parole_plugin_player_construct;
773
signals[SIG_EXITING] =
774
g_signal_new ("exiting",
775
PAROLE_TYPE_PLUGIN_PLAYER,
777
G_STRUCT_OFFSET (ParolePluginPlayerClass, exiting),
779
g_cclosure_marshal_VOID__VOID,
780
G_TYPE_NONE, 0, G_TYPE_NONE);
783
g_signal_new ("ready",
784
PAROLE_TYPE_PLUGIN_PLAYER,
786
G_STRUCT_OFFSET (ParolePluginPlayerClass, ready),
788
g_cclosure_marshal_VOID__VOID,
789
G_TYPE_NONE, 0, G_TYPE_NONE);
792
g_object_class_install_property (object_class,
794
g_param_spec_object ("plug",
797
G_PARAM_CONSTRUCT_ONLY |
800
g_object_class_install_property (object_class,
802
g_param_spec_string ("url",
805
G_PARAM_CONSTRUCT_ONLY |
808
g_type_class_add_private (klass, sizeof (ParolePluginPlayerPrivate));
810
parole_plugin_player_dbus_class_init (klass);
814
parole_plugin_player_init (ParolePluginPlayer *player)
816
GError *error = NULL;
818
player->priv = PAROLE_PLUGIN_PLAYER_GET_PRIVATE (player);
820
player->priv->bus = parole_g_session_bus_get ();
822
player->priv->gst = NULL;
823
player->priv->saver = parole_screen_saver_new ();
824
player->priv->plug = NULL;
825
player->priv->fullscreen = FALSE;
826
player->priv->terminate = FALSE;
827
player->priv->reload = FALSE;
828
player->priv->user_seeking = FALSE;
829
player->priv->internal_range_change = FALSE;
830
player->priv->list = NULL;
831
player->priv->state = PAROLE_MEDIA_STATE_STOPPED;
833
player->priv->gst = PAROLE_GST (parole_gst_new (TRUE, NULL));
835
player->priv->window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
836
gtk_window_set_keep_above (GTK_WINDOW (player->priv->window), TRUE);
837
gtk_window_set_decorated (GTK_WINDOW (player->priv->window), FALSE);
839
g_signal_connect_swapped (player->priv->window, "delete-event",
840
G_CALLBACK (parole_plugin_player_window_delete_event_cb), player);
842
g_signal_connect (player->priv->window, "key-press-event",
843
G_CALLBACK (parole_plugin_player_window_key_press_cb), player);
846
idle_timer = g_timer_new ();
847
idle_thread = g_thread_create ((GThreadFunc)check_idle_thread, player, FALSE, &error);
851
g_warning ("%s", error->message);
852
g_error_free (error);
856
parole_plugin_player_dbus_init (player);
860
static void parole_plugin_player_set_property (GObject *object,
865
ParolePluginPlayer *player;
866
player = PAROLE_PLUGIN_PLAYER (object);
871
player->priv->plug = GTK_WIDGET (g_value_get_object (value));
874
player->priv->url = g_value_dup_string (value);
877
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
882
static void parole_plugin_player_get_property (GObject *object,
887
ParolePluginPlayer *player;
888
player = PAROLE_PLUGIN_PLAYER (object);
893
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
899
parole_plugin_player_finalize (GObject *object)
901
ParolePluginPlayer *player;
903
player = PAROLE_PLUGIN_PLAYER (object);
905
//g_debug ("Finalize...");
907
dbus_g_connection_unref (player->priv->bus);
909
g_object_unref (player->priv->saver);
911
if ( player->priv->url )
912
g_free (player->priv->url);
914
if ( player->priv->list )
916
g_slist_foreach (player->priv->list, (GFunc) g_object_unref, NULL);
917
g_slist_free (player->priv->list);
920
G_OBJECT_CLASS (parole_plugin_player_parent_class)->finalize (object);
923
static gboolean parole_plugin_player_play_idle (gpointer data)
925
ParolePluginPlayer *player;
927
player = PAROLE_PLUGIN_PLAYER (data);
929
parole_plugin_player_play (player);
935
parole_plugin_player_quit_idle (gpointer data)
937
ParolePluginPlayer *player;
939
player = PAROLE_PLUGIN_PLAYER (data);
941
parole_gst_terminate (player->priv->gst);
947
parole_plugin_player_stop_idle (gpointer data)
949
ParolePluginPlayer *player;
951
player = PAROLE_PLUGIN_PLAYER (data);
953
if (player->priv->gst)
954
parole_gst_terminate (player->priv->gst);
960
parole_plugin_player_new (GtkWidget *plug, gchar *url)
962
ParolePluginPlayer *player = NULL;
964
player = g_object_new (PAROLE_TYPE_PLUGIN_PLAYER,
972
void parole_plugin_player_exit (ParolePluginPlayer *player)
974
player->priv->terminate = TRUE;
975
parole_gst_terminate (player->priv->gst);
978
static gboolean parole_plugin_player_dbus_quit (ParolePluginPlayer *player,
982
static gboolean parole_plugin_player_dbus_stop (ParolePluginPlayer *player,
985
static gboolean parole_plugin_player_dbus_ping (ParolePluginPlayer *player,
988
static gboolean parole_plugin_player_dbus_play_url (ParolePluginPlayer *player,
992
static gboolean parole_plugin_player_dbus_play_list (ParolePluginPlayer *player,
996
#include "org.parole.media.plugin.h"
999
* DBus server implementation
1002
parole_plugin_player_dbus_class_init (ParolePluginPlayerClass *klass)
1005
dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (klass),
1006
&dbus_glib_parole_gst_object_info);
1011
parole_plugin_player_dbus_init (ParolePluginPlayer *player)
1013
dbus_g_connection_register_g_object (player->priv->bus,
1014
"/org/Parole/Media/Plugin",
1019
parole_plugin_player_dbus_quit (ParolePluginPlayer *player,
1022
//g_debug ("Quit message received");
1023
player->priv->terminate = TRUE;
1024
g_idle_add ((GSourceFunc) parole_plugin_player_quit_idle, player);
1029
parole_plugin_player_dbus_stop (ParolePluginPlayer *player, GError **error)
1031
//g_debug ("Stop message received");
1032
player->priv->terminate = TRUE;
1033
g_idle_add ((GSourceFunc)parole_plugin_player_stop_idle, player);
1038
static gboolean parole_plugin_player_dbus_ping (ParolePluginPlayer *player,
1044
g_timer_reset (idle_timer);
1049
static gboolean parole_plugin_player_dbus_play_url (ParolePluginPlayer *player,
1053
player->priv->url = g_strdup (in_URL);
1054
//g_debug ("Playing url=%s", in_URL);
1055
g_idle_add ((GSourceFunc) parole_plugin_player_play_idle, player);
1059
static gboolean parole_plugin_player_dbus_play_list (ParolePluginPlayer *player,
1063
player->priv->list = parole_pl_parser_parse_from_file_by_extension (list);
1065
if ( player->priv->list != NULL && g_slist_length (player->priv->list) != 0 )
1068
file = g_slist_nth_data (player->priv->list, 0);
1070
player->priv->url = g_strdup (parole_file_get_uri (file));
1071
//g_debug ("Playing url=%s", player->priv->url);
1072
g_idle_add ((GSourceFunc) parole_plugin_player_play_idle, player);