From f1455e94d68d629749f26de0010e1358c40ce72f Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Thu, 14 Oct 2010 13:34:28 +0100 Subject: bumped up the revision number --- configure.ac | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 7f25bb3..7a86e4d 100644 --- a/configure.ac +++ b/configure.ac @@ -1,10 +1,10 @@ -AC_INIT(indicator-sound, 0.4.8, conor.curran@canonical.com) +AC_INIT(indicator-sound, 0.4.9, conor.curran@canonical.com) AC_PREREQ(2.53) AM_CONFIG_HEADER(config.h) -AM_INIT_AUTOMAKE(indicator-sound, 0.4.8) +AM_INIT_AUTOMAKE(indicator-sound, 0.4.9) AM_MAINTAINER_MODE -- cgit v1.2.3 From db28882a5f0de835bc81d075f6ff35348736ec77 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Mon, 25 Oct 2010 15:44:47 -0400 Subject: reconnect bug hopefully fixed for good --- src/pulse-manager.c | 77 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 65 insertions(+), 12 deletions(-) diff --git a/src/pulse-manager.c b/src/pulse-manager.c index 8779525..353c297 100644 --- a/src/pulse-manager.c +++ b/src/pulse-manager.c @@ -20,7 +20,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ - #include #include #include @@ -28,14 +27,18 @@ with this program. If not, see . #include "pulse-manager.h" #include "dbus-menu-manager.h" +#define RECONNECT_DELAY 5 + static GHashTable *sink_hash = NULL; static SoundServiceDbus *dbus_service = NULL; static gint DEFAULT_SINK_INDEX = -1; static gboolean pa_server_available = FALSE; -// PA related +static gint reconnect_idle_id = 0; static pa_context *pulse_context = NULL; static pa_glib_mainloop *pa_main_loop = NULL; + static void context_state_callback(pa_context *c, void *userdata); +static gboolean reconnect_to_pulse(); static void pulse_sink_info_callback(pa_context *c, const pa_sink_info *sink_info, int eol, void *userdata); static void context_success_callback(pa_context *c, int success, void *userdata); static void pulse_sink_input_info_callback(pa_context *c, const pa_sink_input_info *info, int eol, void *userdata); @@ -61,15 +64,19 @@ void establish_pulse_activities(SoundServiceDbus *service) dbus_service = service; pa_main_loop = pa_glib_mainloop_new(g_main_context_default()); g_assert(pa_main_loop); - pulse_context = pa_context_new(pa_glib_mainloop_get_api(pa_main_loop), "ayatana.indicator.sound"); + pulse_context = pa_context_new(pa_glib_mainloop_get_api(pa_main_loop), + "ayatana.indicator.sound"); g_assert(pulse_context); - sink_hash = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, destroy_sink_info); + sink_hash = g_hash_table_new_full(g_direct_hash, + g_direct_equal, + NULL, + destroy_sink_info); // Establish event callback registration - pa_context_set_state_callback(pulse_context, context_state_callback, NULL); - dbus_menu_manager_update_pa_state(FALSE, FALSE, FALSE, 0); - pa_context_connect(pulse_context, NULL, PA_CONTEXT_NOFAIL, NULL); + pa_context_set_state_callback (pulse_context, context_state_callback, NULL); + dbus_menu_manager_update_pa_state (FALSE, FALSE, FALSE, 0); + pa_context_connect (pulse_context, NULL, PA_CONTEXT_NOFAIL, NULL); } /** @@ -81,6 +88,39 @@ pa_context* get_context() return pulse_context; } +static gboolean +reconnect_to_pulse() +{ + // reset + if (pulse_context != NULL) { + g_debug("freeing the pulse context"); + pa_context_unref(pulse_context); + pulse_context = NULL; + } + + if (sink_hash != NULL) { + g_hash_table_destroy(sink_hash); + sink_hash = NULL; + } + + // reconnect + pulse_context = pa_context_new(pa_glib_mainloop_get_api(pa_main_loop), + "ayatana.indicator.sound"); + g_assert(pulse_context); + sink_hash = g_hash_table_new_full(g_direct_hash, g_direct_equal, + NULL, + destroy_sink_info); + // Establish event callback registration + pa_context_set_state_callback (pulse_context, context_state_callback, NULL); + int result = pa_context_connect (pulse_context, NULL, PA_CONTEXT_NOFAIL, NULL); + if (result < 0) { + g_warning ("Failed to connect context: %s", + pa_strerror (pa_context_errno (pulse_context))); + } + reconnect_idle_id = 0; + return FALSE; +} + /** close_pulse_activites() Gracefully close our connection with the Pulse async library. @@ -294,9 +334,6 @@ static void pulse_sink_info_callback(pa_context *c, const pa_sink_info *sink, in static void pulse_default_sink_info_callback(pa_context *c, const pa_sink_info *info, int eol, void *userdata) { if (eol > 0) { - if (pa_context_errno(c) == PA_ERR_NOENTITY) - return; - g_warning("Default Sink info callback failure"); return; } else { DEFAULT_SINK_INDEX = info->index; @@ -416,7 +453,9 @@ static gboolean has_volume_changed(const pa_sink_info* new_sink, sink_info* cach } -static void pulse_server_info_callback(pa_context *c, const pa_server_info *info, void *userdata) +static void pulse_server_info_callback(pa_context *c, + const pa_server_info *info, + void *userdata) { /* g_debug("server info callback");*/ pa_operation *operation; @@ -428,7 +467,10 @@ static void pulse_server_info_callback(pa_context *c, const pa_server_info *info } pa_server_available = TRUE; if (info->default_sink_name != NULL) { - if (!(operation = pa_context_get_sink_info_by_name(c, info->default_sink_name, pulse_default_sink_info_callback, userdata))) { + if (!(operation = pa_context_get_sink_info_by_name(c, + info->default_sink_name, + pulse_default_sink_info_callback, + userdata))) { g_warning("pa_context_get_sink_info_by_name() failed"); } else { pa_operation_unref(operation); @@ -504,6 +546,17 @@ static void context_state_callback(pa_context *c, void *userdata) case PA_CONTEXT_FAILED: g_warning("FAILED to retrieve context - Is PulseAudio Daemon running ?"); pa_server_available = FALSE; + dbus_menu_manager_update_pa_state(TRUE, + pa_server_available, + default_sink_is_muted(), + get_default_sink_volume()); + + if (reconnect_idle_id == 0){ + reconnect_idle_id = g_timeout_add_seconds (RECONNECT_DELAY, + reconnect_to_pulse, + NULL); + + } break; case PA_CONTEXT_TERMINATED: /* g_debug("context terminated");*/ -- cgit v1.2.3 From a33f50636cea5d6c1972d1772a59cbb4a0c951b5 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 26 Oct 2010 17:03:20 -0400 Subject: initial transport state fixed --- src/mpris2-controller.vala | 6 +++--- src/player-controller.vala | 5 ++--- src/sound-service.c | 4 ++-- src/transport-menu-item.vala | 2 ++ src/transport-widget.c | 8 ++++++-- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/mpris2-controller.vala b/src/mpris2-controller.vala index f355d28..f440c13 100644 --- a/src/mpris2-controller.vala +++ b/src/mpris2-controller.vala @@ -84,7 +84,7 @@ public class Mpris2Controller : GLib.Object this.properties_interface = (FreeDesktopProperties) connection.get_object("org.freedesktop.Properties.PropertiesChanged", "/org/mpris/MediaPlayer2"); this.properties_interface.PropertiesChanged += property_changed_cb; - + } catch (DBus.Error e) { error("Problems connecting to the session bus - %s", e.message); } @@ -150,8 +150,8 @@ public class Mpris2Controller : GLib.Object } else{ update = determine_play_state(this.player.PlaybackStatus); - } - (this.owner.custom_items[PlayerController.widget_order.TRANSPORT] as TransportMenuitem).change_play_state(update); + } + (this.owner.custom_items[PlayerController.widget_order.TRANSPORT] as TransportMenuitem).change_play_state(update); GLib.HashTable cleaned_metadata = this.clean_metadata(); this.owner.custom_items[PlayerController.widget_order.METADATA].update(cleaned_metadata, MetadataMenuitem.attributes_format()); diff --git a/src/player-controller.vala b/src/player-controller.vala index ad8e989..f9cbe71 100644 --- a/src/player-controller.vala +++ b/src/player-controller.vala @@ -178,9 +178,8 @@ public class PlayerController : GLib.Object if(this.mpris_bridge.connected() == true){ this.update_state(state.CONNECTED); TitleMenuitem title = this.custom_items[widget_order.TITLE] as TitleMenuitem; - title.toggle_active_triangle(true); - TransportMenuitem transport = this.custom_items[widget_order.TRANSPORT] as TransportMenuitem; - transport.change_play_state(TransportMenuitem.state.PAUSED); + title.toggle_active_triangle(true); + this.mpris_bridge.initial_update(); } else{ this.update_state(state.DISCONNECTED); diff --git a/src/sound-service.c b/src/sound-service.c index f19379d..51f5f37 100644 --- a/src/sound-service.c +++ b/src/sound-service.c @@ -41,8 +41,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 7faadb5..839abf0 100644 --- a/src/transport-menu-item.vala +++ b/src/transport-menu-item.vala @@ -42,6 +42,8 @@ public class TransportMenuitem : PlayerItem public void change_play_state(state update) { + debug("UPDATING THE TRANSPORT DBUSMENUITEM PLAY STATE WITH VALUE %i", + (int)update); this.property_set_int(MENUITEM_PLAY_STATE, update); } diff --git a/src/transport-widget.c b/src/transport-widget.c index e7f0b4d..c16e791 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -1272,6 +1272,11 @@ transport_widget_set_twin_item(TransportWidget* self, priv->twin_item = twin_item; g_signal_connect(G_OBJECT(priv->twin_item), "property-changed", G_CALLBACK(transport_widget_property_update), self); + gint initial_state = dbusmenu_menuitem_property_get_int( twin_item, + DBUSMENU_TRANSPORT_MENUITEM_PLAY_STATE ); + g_debug("TRANSPORT WIDGET - INITIAL UPDATE = %i", initial_state); + transport_widget_toggle_play_pause( self, + (TransportWidgetState)initial_state); } /** @@ -1290,8 +1295,7 @@ transport_widget_property_update(DbusmenuMenuitem* item, gchar* property, { int update_value = g_value_get_int(value); //g_debug("transport_widget_update_state - with value %i", update_value); - transport_widget_toggle_play_pause(bar, - (TransportWidgetState)update_value); + transport_widget_toggle_play_pause(bar, (TransportWidgetState)update_value); } } -- cgit v1.2.3 From 2f96a598a036cc5742a44d1a497f02aef78f7acb Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Tue, 26 Oct 2010 17:49:39 -0400 Subject: metadata now fetched at start up --- src/metadata-widget.c | 33 +++++++++++++++++++++++++++++---- src/transport-menu-item.vala | 1 - 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/metadata-widget.c b/src/metadata-widget.c index cbbaeff..0e8aa3b 100644 --- a/src/metadata-widget.c +++ b/src/metadata-widget.c @@ -511,10 +511,35 @@ static void metadata_widget_set_twin_item(MetadataWidget* self, DbusmenuMenuitem* twin_item) { - MetadataWidgetPrivate* priv = METADATA_WIDGET_GET_PRIVATE(self); - priv->twin_item = twin_item; - g_signal_connect(G_OBJECT(priv->twin_item), "property-changed", - G_CALLBACK(metadata_widget_property_update), self); + MetadataWidgetPrivate* priv = METADATA_WIDGET_GET_PRIVATE(self); + priv->twin_item = twin_item; + g_signal_connect( G_OBJECT(priv->twin_item), "property-changed", + G_CALLBACK(metadata_widget_property_update), self); + gtk_label_set_text( GTK_LABEL(priv->container_label), + dbusmenu_menuitem_property_get( priv->twin_item, + DBUSMENU_METADATA_MENUITEM_ALBUM)); + metadata_widget_style_labels( self, GTK_LABEL(priv->container_label)); + + gtk_label_set_text( GTK_LABEL(priv->piece_label), + dbusmenu_menuitem_property_get( priv->twin_item, + DBUSMENU_METADATA_MENUITEM_TITLE)); + metadata_widget_style_labels( self, GTK_LABEL(priv->piece_label)); + gtk_label_set_text( GTK_LABEL(priv->artist_label), + dbusmenu_menuitem_property_get( priv->twin_item, + DBUSMENU_METADATA_MENUITEM_ARTIST)); + metadata_widget_style_labels( self, GTK_LABEL(priv->artist_label)); + + g_string_erase(priv->image_path, 0, -1); + g_string_overwrite( priv->image_path, + 0, + dbusmenu_menuitem_property_get( priv->twin_item, + DBUSMENU_METADATA_MENUITEM_ARTURL )); + + // if its a remote image queue a redraw incase the download took too long + if (g_str_has_prefix (dbusmenu_menuitem_property_get (priv->twin_item, DBUSMENU_METADATA_MENUITEM_ARTURL ), + g_get_user_cache_dir())){ + gtk_widget_queue_draw(GTK_WIDGET(self)); + } } diff --git a/src/transport-menu-item.vala b/src/transport-menu-item.vala index 839abf0..36429e8 100644 --- a/src/transport-menu-item.vala +++ b/src/transport-menu-item.vala @@ -62,5 +62,4 @@ public class TransportMenuitem : PlayerItem return attrs; } - } \ No newline at end of file -- cgit v1.2.3 From fbf5ac2d80a9bc536bb0ab10dc54121301c4b7c4 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Wed, 3 Nov 2010 16:27:56 +0000 Subject: tidy up --- src/pulse-manager.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/pulse-manager.c b/src/pulse-manager.c index 353c297..1ff1598 100644 --- a/src/pulse-manager.c +++ b/src/pulse-manager.c @@ -91,9 +91,9 @@ pa_context* get_context() static gboolean reconnect_to_pulse() { + g_debug("Attempt to reconnect to pulse"); // reset if (pulse_context != NULL) { - g_debug("freeing the pulse context"); pa_context_unref(pulse_context); pulse_context = NULL; } @@ -102,21 +102,23 @@ reconnect_to_pulse() g_hash_table_destroy(sink_hash); sink_hash = NULL; } - - // reconnect - pulse_context = pa_context_new(pa_glib_mainloop_get_api(pa_main_loop), - "ayatana.indicator.sound"); + pulse_context = pa_context_new( pa_glib_mainloop_get_api( pa_main_loop ), + "ayatana.indicator.sound" ); g_assert(pulse_context); - sink_hash = g_hash_table_new_full(g_direct_hash, g_direct_equal, - NULL, - destroy_sink_info); + sink_hash = g_hash_table_new_full( g_direct_hash, g_direct_equal, + NULL, + destroy_sink_info ); // Establish event callback registration pa_context_set_state_callback (pulse_context, context_state_callback, NULL); int result = pa_context_connect (pulse_context, NULL, PA_CONTEXT_NOFAIL, NULL); + if (result < 0) { g_warning ("Failed to connect context: %s", pa_strerror (pa_context_errno (pulse_context))); } + // we always want to cancel any continious callbacks with the existing timeout + // if the connection failed the new context created above will catch any updates + // to do with the state of pulse and thus take care of business. reconnect_idle_id = 0; return FALSE; } @@ -544,7 +546,7 @@ static void context_state_callback(pa_context *c, void *userdata) /* g_debug("context setting name");*/ break; case PA_CONTEXT_FAILED: - g_warning("FAILED to retrieve context - Is PulseAudio Daemon running ?"); + g_warning("PA_CONTEXT_FAILED - Is PulseAudio Daemon running ?"); pa_server_available = FALSE; dbus_menu_manager_update_pa_state(TRUE, pa_server_available, @@ -554,17 +556,16 @@ static void context_state_callback(pa_context *c, void *userdata) if (reconnect_idle_id == 0){ reconnect_idle_id = g_timeout_add_seconds (RECONNECT_DELAY, reconnect_to_pulse, - NULL); - + NULL); } break; case PA_CONTEXT_TERMINATED: /* g_debug("context terminated");*/ break; case PA_CONTEXT_READY: - g_debug("PA daemon is ready"); + g_debug("PA_CONTEXT_READY"); pa_operation *o; - + pa_context_set_subscribe_callback(c, subscribed_events_callback, userdata); if (!(o = pa_context_subscribe(c, (pa_subscription_mask_t) -- cgit v1.2.3 From 0d1c712d8984bce0432dba629e6d185794ed6f13 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Wed, 3 Nov 2010 19:19:35 +0000 Subject: fixed hover regression caused by a slight shift of behaviour from GTK --- src/transport-widget.c | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/src/transport-widget.c b/src/transport-widget.c index c16e791..7ada71a 100644 --- a/src/transport-widget.c +++ b/src/transport-widget.c @@ -114,7 +114,7 @@ static void transport_widget_property_update ( DbusmenuMenuitem* item, gpointer userdata ); static void transport_widget_menu_hidden ( GtkWidget *menu, TransportWidget *transport); -static void transport_widget_notify ( TransportWidget *item, +static void transport_widget_notify ( GObject *item, GParamSpec *pspec, gpointer user_data ); @@ -135,12 +135,12 @@ transport_widget_class_init (TransportWidgetClass *klass) g_type_class_add_private (klass, sizeof (TransportWidgetPrivate)); - widget_class->button_press_event = transport_widget_button_press_event; - widget_class->button_release_event = transport_widget_button_release_event; + widget_class->button_press_event = transport_widget_button_press_event; + widget_class->button_release_event = transport_widget_button_release_event; widget_class->expose_event = transport_widget_expose; gobject_class->dispose = transport_widget_dispose; - gobject_class->finalize = transport_widget_finalize; + gobject_class->finalize = transport_widget_finalize; } static void @@ -158,9 +158,9 @@ transport_widget_init (TransportWidget *self) previous_list = g_list_insert(previous_list, GINT_TO_POINTER(5), 1); previous_list = g_list_insert(previous_list, GINT_TO_POINTER(60), 2); previous_list = g_list_insert(previous_list, GINT_TO_POINTER(34), 3); - g_hash_table_insert(priv->command_coordinates, - GINT_TO_POINTER(TRANSPORT_PREVIOUS), - previous_list); + g_hash_table_insert(priv->command_coordinates, + GINT_TO_POINTER(TRANSPORT_PREVIOUS), + previous_list); GList* play_list = NULL; play_list = g_list_insert(play_list, GINT_TO_POINTER(58), 0); @@ -183,10 +183,10 @@ transport_widget_init (TransportWidget *self) next_list); gtk_widget_set_size_request(GTK_WIDGET(self), 200, 50); - g_signal_connect (G_OBJECT(self), - "notify::parent", - G_CALLBACK (transport_widget_notify), - NULL); + g_signal_connect (G_OBJECT(self), + "notify", + G_CALLBACK (transport_widget_notify), + NULL); } static void @@ -213,7 +213,7 @@ transport_widget_expose (GtkWidget *button, GdkEventExpose *event) event->area.width, event->area.height); cairo_clip(cr); - draw (button, cr); + draw (button, cr); cairo_destroy (cr); return FALSE; @@ -230,16 +230,16 @@ transport_widget_toggle_play_pause(TransportWidget* button, } static void -transport_widget_notify (TransportWidget *item, - GParamSpec *pspec, - gpointer user_data) +transport_widget_notify ( GObject *item, + GParamSpec *pspec, + gpointer user_data ) { if (g_strcmp0 (pspec->name, "parent")){ GtkWidget *parent = gtk_widget_get_parent (GTK_WIDGET (item)); if (parent){ g_signal_connect ( parent, "hide", G_CALLBACK (transport_widget_menu_hidden), - item); + item ); } } } @@ -248,7 +248,6 @@ static void transport_widget_menu_hidden ( GtkWidget *menu, TransportWidget *transport) { - //g_debug("Transport Widget's menu hidden method called"); g_return_if_fail(IS_TRANSPORT_WIDGET(transport)); transport_widget_react_to_button_release(transport, TRANSPORT_NADA); } @@ -1274,7 +1273,7 @@ transport_widget_set_twin_item(TransportWidget* self, G_CALLBACK(transport_widget_property_update), self); gint initial_state = dbusmenu_menuitem_property_get_int( twin_item, DBUSMENU_TRANSPORT_MENUITEM_PLAY_STATE ); - g_debug("TRANSPORT WIDGET - INITIAL UPDATE = %i", initial_state); + //g_debug("TRANSPORT WIDGET - INITIAL UPDATE = %i", initial_state); transport_widget_toggle_play_pause( self, (TransportWidgetState)initial_state); } -- cgit v1.2.3 From c51ba2b6d079467c28315b8365e1288b860a7024 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Thu, 4 Nov 2010 12:57:06 +0000 Subject: fixes bug to do with default player in menu after clen install --- src/familiar-players-db.vala | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/familiar-players-db.vala b/src/familiar-players-db.vala index 894447c..28ac286 100644 --- a/src/familiar-players-db.vala +++ b/src/familiar-players-db.vala @@ -29,6 +29,7 @@ public class FamiliarPlayersDB : GLib.Object { private const string GROUP_NAME = "Seen Database"; private const string KEY_NAME = "DesktopFiles"; + private const string DEFAULT_APP_DESKTOP = "/usr/share/applications/rhythmbox.desktop"; private HashMap players_DB; private string file_name; private string dir_name; @@ -38,13 +39,18 @@ public class FamiliarPlayersDB : GLib.Object public FamiliarPlayersDB() { this.write_id = 0; - this.players_DB = new HashMap(); + this.players_DB = new HashMap(); + if ( !create_key_file() ){ + this.players_DB.set(DEFAULT_APP_DESKTOP, true); + this.write_db(); + } + this.dir_name = build_filename(get_user_cache_dir(), "indicators", "sound"); this.file_name = build_filename(this.dir_name, "familiar-players-db.keyfile"); if(create_key_file() && check_for_keys() && load_data_from_key_file()){ debug("keyfiles in place and ready for action"); } - else{ + else{ this.key_file = null; warning("FamiliarPlayersDB:: problems loading key file - can't go any further"); } -- cgit v1.2.3 From f6c1abd8b39794057044f2ad9a567624ae4e9cf3 Mon Sep 17 00:00:00 2001 From: Conor Curran Date: Thu, 4 Nov 2010 14:00:01 +0000 Subject: prep of 0.5.0 --- configure.ac | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 7a86e4d..300662b 100644 --- a/configure.ac +++ b/configure.ac @@ -1,10 +1,10 @@ -AC_INIT(indicator-sound, 0.4.9, conor.curran@canonical.com) +AC_INIT(indicator-sound, 0.5.0, conor.curran@canonical.com) AC_PREREQ(2.53) AM_CONFIG_HEADER(config.h) -AM_INIT_AUTOMAKE(indicator-sound, 0.4.9) +AM_INIT_AUTOMAKE(indicator-sound, 0.5.0) AM_MAINTAINER_MODE -- cgit v1.2.3