From 71d315d3abec5b62e43b821232d70262bec92bd1 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Wed, 16 Jun 2010 18:19:35 +0100 Subject: metadata being updated dynamically --- src/Makefile.am | 4 ++- src/metadata-menu-item.vala | 15 ++++++----- src/metadata-widget.c | 21 +++++++++++---- src/metadata-widget.h | 2 +- src/mpris-controller-v2.vala | 28 ++++++++++++++++++++ src/mpris-controller.vala | 61 ++++++++++++++++++++++++++++++++++++++++++++ src/music-player-bridge.vala | 21 ++++++++++++++- src/player-controller.vala | 37 ++++++++++++++++++++++++++- src/sound-service.c | 4 +-- src/transport-menu-item.vala | 20 +++++++++++++++ 10 files changed, 195 insertions(+), 18 deletions(-) create mode 100644 src/mpris-controller-v2.vala create mode 100644 src/mpris-controller.vala diff --git a/src/Makefile.am b/src/Makefile.am index 2a19c3d..ac7beb9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -54,7 +54,9 @@ music_bridge_VALASOURCES = \ music-player-bridge.vala \ transport-menu-item.vala \ metadata-menu-item.vala \ - player-controller.vala + player-controller.vala \ + mpris-controller-v2.vala \ + mpris-controller.vala music_bridge_VALAFLAGS = \ --ccode \ diff --git a/src/metadata-menu-item.vala b/src/metadata-menu-item.vala index ef72143..894ad3c 100644 --- a/src/metadata-menu-item.vala +++ b/src/metadata-menu-item.vala @@ -13,15 +13,16 @@ public class MetadataMenuitem : Dbusmenu.Menuitem public MetadataMenuitem() { this.property_set(MENUITEM_PROP_TYPE, DBUSMENU_METADATA_MENUITEM_TYPE); - this.property_set(DBUSMENU_METADATA_MENUITEM_TEXT_ARTIST, "Sonnamble"); - this.property_set(DBUSMENU_METADATA_MENUITEM_TEXT_PIECE, "Nocturne"); - this.property_set(DBUSMENU_METADATA_MENUITEM_TEXT_CONTAINER, "Seven Months in E minor"); - this.property_set(DBUSMENU_METADATA_MENUITEM_IMAGE_PATH, "/home/ronoc/Desktop/Sonnamble/Sonnamble_CD.jpg"); - - debug("image_path property set %s:", this.property_get(DBUSMENU_METADATA_MENUITEM_IMAGE_PATH)); - } + public void update(HashMap data) + { + this.property_set(DBUSMENU_METADATA_MENUITEM_TEXT_ARTIST, data.get("artist")); + this.property_set(DBUSMENU_METADATA_MENUITEM_TEXT_PIECE, data.get("title")); + this.property_set(DBUSMENU_METADATA_MENUITEM_TEXT_CONTAINER, data.get("album")); + this.property_set(DBUSMENU_METADATA_MENUITEM_IMAGE_PATH, data.get("arturl")); + } + public override void handle_event(string name, GLib.Value input_value, uint timestamp) { debug("MetadataItem -> handle event caught!"); diff --git a/src/metadata-widget.c b/src/metadata-widget.c index a451ad7..e69a9dd 100644 --- a/src/metadata-widget.c +++ b/src/metadata-widget.c @@ -53,9 +53,9 @@ static gboolean metadata_widget_button_press_event (GtkWidget *menuitem, static gboolean metadata_widget_button_release_event (GtkWidget *menuitem, GdkEventButton *event); // Dbusmenuitem properties update callback -static void metadata_widget_update_state(gchar * property, - GValue * value, - gpointer userdata); +static void metadata_widget_update_state(DbusmenuMenuitem* item, gchar* property, + GValue* value, gpointer userdata); + //static void update_content( @@ -159,9 +159,20 @@ metadata_widget_button_release_event (GtkWidget *menuitem, return TRUE; } -static void metadata_widget_update_state(gchar *property, GValue *value, gpointer userdata) +static void +metadata_widget_update_state(DbusmenuMenuitem* item, gchar* property, + GValue* value, gpointer userdata) { - g_debug("metadata_widget_update_state - with property %s", property); + //g_debug("metadata_widget_update_state - with property %s", property); + MetadataWidget* mitem = METADATA_WIDGET(userdata); + MetadataWidgetPrivate * priv = METADATA_WIDGET_GET_PRIVATE(mitem); + + if(g_ascii_strcasecmp(DBUSMENU_METADATA_MENUITEM_TEXT_ARTIST, property) == 0){ + gtk_label_set_text(GTK_LABEL(priv->artist_label), g_value_get_string(value)); + } + else if(g_ascii_strcasecmp(DBUSMENU_METADATA_MENUITEM_TEXT_PIECE, property) == 0){ + gtk_label_set_text(GTK_LABEL(priv->piece_label), g_value_get_string(value)); + } } /** diff --git a/src/metadata-widget.h b/src/metadata-widget.h index ce7df5f..6f1d4d3 100644 --- a/src/metadata-widget.h +++ b/src/metadata-widget.h @@ -25,7 +25,7 @@ with this program. If not, see . G_BEGIN_DECLS #define METADATA_WIDGET_TYPE (metadata_widget_get_type ()) -#define METADATA_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), METADATA_WIDGET_TYPE, TransportBar)) +#define METADATA_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), METADATA_WIDGET_TYPE, MetadataWidget)) #define METADATA_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), METADATA_WIDGET_TYPE, MetadataWidgetClass)) #define IS_METADATA_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), METADATA_WIDGET_TYPE)) #define IS_METADATA_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), METADATA_WIDGET_TYPE)) diff --git a/src/mpris-controller-v2.vala b/src/mpris-controller-v2.vala new file mode 100644 index 0000000..0392cfc --- /dev/null +++ b/src/mpris-controller-v2.vala @@ -0,0 +1,28 @@ +/* +This service primarily controls PulseAudio and is driven by the sound indicator menu on the panel. +Copyright 2010 Canonical Ltd. + +Authors: + Conor Curran + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see . +*/ +using Gee; + +public class MprisControllerV2 : MprisController +{ + public MprisControllerV2(string name, PlayerController controller){ + base(name, controller, "org.mpris.MediaPlayer.Player"); + } + +} diff --git a/src/mpris-controller.vala b/src/mpris-controller.vala new file mode 100644 index 0000000..f606b32 --- /dev/null +++ b/src/mpris-controller.vala @@ -0,0 +1,61 @@ +/* +This service primarily controls PulseAudio and is driven by the sound indicator menu on the panel. +Copyright 2010 Canonical Ltd. + +Authors: + Conor Curran + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see . +*/ +using Gee; + +public class MprisController : GLib.Object +{ + private DBus.Connection connection; + private dynamic DBus.Object mpris_player; + private PlayerController controller; + + public MprisController(string name, PlayerController controller, string mpris_interface="org.freedesktop.MediaPlayer"){ + try { + this.connection = DBus.Bus.get (DBus.BusType.SESSION); + } catch (Error e) { + error("Problems connecting to the session bus - %s", e.message); + } + this.controller = controller; + this.mpris_player = this.connection.get_object ("org.mpris.".concat(name.down()) , "/Player", mpris_interface); + this.mpris_player.TrackChange += onTrackChange; + this.controller.update_playing_info(get_track_data()); + } + + public HashMap get_track_data() + { + return format_metadata(this.mpris_player.GetMetadata()); + } + + private void onTrackChange(dynamic DBus.Object mpris_client, HashTable ht) + { + this.controller.update_playing_info(format_metadata(ht)); + } + + private static HashMap format_metadata(HashTable data) + { + HashMap results = new HashMap(); + debug("format_metadata - title = %s", (string)data.lookup("title")); + results.set("title", (string)data.lookup("title")); + results.set("artist", (string)data.lookup("artist")); + results.set("album", (string)data.lookup("album")); + results.set("arturl", (string)data.lookup("arturl")); + return results; + } + +} diff --git a/src/music-player-bridge.vala b/src/music-player-bridge.vala index 89f633b..b03ecbd 100644 --- a/src/music-player-bridge.vala +++ b/src/music-player-bridge.vala @@ -1,3 +1,23 @@ +/* +This service primarily controls PulseAudio and is driven by the sound indicator menu on the panel. +Copyright 2010 Canonical Ltd. + +Authors: + Conor Curran + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see . +*/ + using Indicate; using Dbusmenu; using Gee; @@ -23,7 +43,6 @@ public class MusicPlayerBridge : GLib.Object public void set_root_menu_item(Dbusmenu.Menuitem menu) { - debug("MusicPlayerBridge -> set_root_menu_item"); root_menu = menu; } diff --git a/src/player-controller.vala b/src/player-controller.vala index dcb428b..4c09c12 100644 --- a/src/player-controller.vala +++ b/src/player-controller.vala @@ -1,12 +1,35 @@ +/* +This service primarily controls PulseAudio and is driven by the sound indicator menu on the panel. +Copyright 2010 Canonical Ltd. + +Authors: + Conor Curran + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see . +*/ + + using Dbusmenu; using Gee; public class PlayerController : GLib.Object { + private const int METADATA = 2; private Dbusmenu.Menuitem root_menu; private string name; private bool is_active; private ArrayList custom_items; + private MprisController mpris_adaptor; // TODO: pass in the appropriate position for the menu (to handle multiple players) public PlayerController(Dbusmenu.Menuitem root, string client_name, bool active) @@ -16,6 +39,12 @@ public class PlayerController : GLib.Object this.is_active = active; this.custom_items = new ArrayList(); self_construct(); + // Temporary scenario to handle both v1 and v2 of MPRIS. + if(this.name == "Vlc"){ + this.mpris_adaptor = new MprisControllerV2(this.name, this); + }else{ + this.mpris_adaptor = new MprisController(this.name, this); + } } public void vanish() @@ -52,7 +81,13 @@ public class PlayerController : GLib.Object } return true; } - + + public void update_playing_info(HashMap data) + { + debug("PlayerController - update_playing_info"); + MetadataMenuitem item = (MetadataMenuitem)this.custom_items[METADATA]; + item.update(data); + } private static string format_client_name(string client_name) { diff --git a/src/sound-service.c b/src/sound-service.c index 38e5fba..3ec7a60 100644 --- a/src/sound-service.c +++ b/src/sound-service.c @@ -45,8 +45,8 @@ service_shutdown (IndicatorService *service, gpointer user_data) if (mainloop != NULL) { g_debug("Service shutdown !"); // TODO: uncomment for release !! - close_pulse_activites(); - g_main_loop_quit(mainloop); + //close_pulse_activites(); + //g_main_loop_quit(mainloop); } return; } diff --git a/src/transport-menu-item.vala b/src/transport-menu-item.vala index 7687a92..2259e43 100644 --- a/src/transport-menu-item.vala +++ b/src/transport-menu-item.vala @@ -1,3 +1,23 @@ +/* +This service primarily controls PulseAudio and is driven by the sound indicator menu on the panel. +Copyright 2010 Canonical Ltd. + +Authors: + Conor Curran + +This program is free software: you can redistribute it and/or modify it +under the terms of the GNU General Public License version 3, as published +by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranties of +MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR +PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program. If not, see . +*/ + using Dbusmenu; using Gee; -- cgit v1.2.3