Updating branch refs/heads/master to 484886fbb7fc18ad77cda0f82a84c463f2011c51 (commit) from 5369a8e17dcab5d6431a290552a50fc966d45fa4 (commit)
commit 484886fbb7fc18ad77cda0f82a84c463f2011c51 Author: Guido Berhoerster <guido+x...@berhoerster.name> Date: Thu Sep 27 16:31:09 2012 +0200 Refactor the plugin Refactor and simplify the plugin code. Added some more debugging output to the plugin. panel-plugin/xfce-mixer-plugin.c | 523 ++++++++++++++++++++++---------------- 1 files changed, 300 insertions(+), 223 deletions(-) diff --git a/panel-plugin/xfce-mixer-plugin.c b/panel-plugin/xfce-mixer-plugin.c index 2cb25c8..ef2720d 100644 --- a/panel-plugin/xfce-mixer-plugin.c +++ b/panel-plugin/xfce-mixer-plugin.c @@ -71,43 +71,51 @@ enum -static void xfce_mixer_plugin_construct (XfcePanelPlugin *plugin); -static void xfce_mixer_plugin_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec); -static void xfce_mixer_plugin_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec); -static void xfce_mixer_plugin_free_data (XfcePanelPlugin *plugin); -static void xfce_mixer_plugin_configure_plugin (XfcePanelPlugin *plugin); -static gboolean xfce_mixer_plugin_size_changed (XfcePanelPlugin *plugin, - gint size); -static void xfce_mixer_plugin_screen_position_changed (XfcePanelPlugin *plugin, - XfceScreenPosition screen_position); -static void xfce_mixer_plugin_button_toggled (XfceMixerPlugin *mixer_plugin, - GtkToggleButton *togglebutton); -static void xfce_mixer_plugin_volume_changed (XfceMixerPlugin *mixer_plugin, - gdouble volume); -static void xfce_mixer_plugin_mute_changed (XfceMixerPlugin *mixer_plugin, - gboolean muted); -static void xfce_mixer_plugin_mute_item_toggled (XfceMixerPlugin *mixer_plugin, - GtkCheckMenuItem *mute_menu_item); -static void xfce_mixer_plugin_command_item_activated (XfceMixerPlugin *mixer_plugin, - GtkMenuItem *menuitem); -static void xfce_mixer_plugin_is_muted_property_changed (XfceMixerPlugin *mixer_plugin, - GParamSpec *pspec, - GObject *object); -static void xfce_mixer_plugin_update_track (XfceMixerPlugin *mixer_plugin); -static void xfce_mixer_plugin_bus_message (GstBus *bus, - GstMessage *message, - XfceMixerPlugin *mixer_plugin); +static void xfce_mixer_plugin_construct (XfcePanelPlugin *plugin); +static void xfce_mixer_plugin_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); +static void xfce_mixer_plugin_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); +static void xfce_mixer_plugin_free_data (XfcePanelPlugin *plugin); +static void xfce_mixer_plugin_configure_plugin (XfcePanelPlugin *plugin); +static gboolean xfce_mixer_plugin_size_changed (XfcePanelPlugin *plugin, + gint size); +static void xfce_mixer_plugin_screen_position_changed (XfcePanelPlugin *plugin, + XfceScreenPosition screen_position); +static void xfce_mixer_plugin_button_toggled (XfceMixerPlugin *mixer_plugin, + GtkToggleButton *togglebutton); +static gint xfce_mixer_plugin_get_volume (XfceMixerPlugin *mixer_plugin); +static void xfce_mixer_plugin_set_volume (XfceMixerPlugin *mixer_plugin, + gint volume); +static gboolean xfce_mixer_plugin_get_muted (XfceMixerPlugin *mixer_plugin); +static void xfce_mixer_plugin_set_muted (XfceMixerPlugin *mixer_plugin, + gboolean muted); +static void xfce_mixer_plugin_update_volume (XfceMixerPlugin *mixer_plugin, + gint volume); +static void xfce_mixer_plugin_update_muted (XfceMixerPlugin *mixer_plugin, + gboolean muted); +static void xfce_mixer_plugin_update_track (XfceMixerPlugin *mixer_plugin); +static void xfce_mixer_plugin_button_volume_changed (XfceMixerPlugin *mixer_plugin, + gdouble button_volume); +static void xfce_mixer_plugin_button_is_muted (XfceMixerPlugin *mixer_plugin, + GParamSpec *pspec, + GObject *object); +static void xfce_mixer_plugin_mute_item_toggled (XfceMixerPlugin *mixer_plugin, + GtkCheckMenuItem *mute_menu_item); +static void xfce_mixer_plugin_command_item_activated (XfceMixerPlugin *mixer_plugin, + GtkMenuItem *menuitem); +static void xfce_mixer_plugin_bus_message (GstBus *bus, + GstMessage *message, + XfceMixerPlugin *mixer_plugin); #ifdef HAVE_KEYBINDER -static void xfce_mixer_plugin_volume_key_pressed (const char *keystring, - void *user_data); -static void xfce_mixer_plugin_mute_pressed (const char *keystring, - void *user_data); +static void xfce_mixer_plugin_volume_key_pressed (const char *keystring, + void *user_data); +static void xfce_mixer_plugin_mute_pressed (const char *keystring, + void *user_data); #endif @@ -273,8 +281,8 @@ xfce_mixer_plugin_init (XfceMixerPlugin *mixer_plugin) /* Create volume button for the plugin */ mixer_plugin->button = xfce_volume_button_new (); - g_signal_connect_swapped (G_OBJECT (mixer_plugin->button), "volume-changed", G_CALLBACK (xfce_mixer_plugin_volume_changed), mixer_plugin); - g_signal_connect_swapped (G_OBJECT (mixer_plugin->button), "notify::is-muted", G_CALLBACK (xfce_mixer_plugin_is_muted_property_changed), mixer_plugin); + g_signal_connect_swapped (G_OBJECT (mixer_plugin->button), "volume-changed", G_CALLBACK (xfce_mixer_plugin_button_volume_changed), mixer_plugin); + g_signal_connect_swapped (G_OBJECT (mixer_plugin->button), "notify::is-muted", G_CALLBACK (xfce_mixer_plugin_button_is_muted), mixer_plugin); g_signal_connect_swapped (G_OBJECT (mixer_plugin->button), "toggled", G_CALLBACK (xfce_mixer_plugin_button_toggled), mixer_plugin); gtk_container_add (GTK_CONTAINER (mixer_plugin->hvbox), mixer_plugin->button); gtk_widget_show (mixer_plugin->button); @@ -372,6 +380,7 @@ xfce_mixer_plugin_set_property (GObject *object, /* If the given card name is invalid resort to the default */ if (!GST_IS_MIXER (card)) { + xfce_mixer_debug ("could not set sound-card to '%s', trying the default card instead", card_name); card = xfce_mixer_get_default_card (); if GST_IS_MIXER (card) card_name = xfce_mixer_get_card_internal_name (card); @@ -386,11 +395,13 @@ xfce_mixer_plugin_set_property (GObject *object, xfce_mixer_select_card (mixer_plugin->card); mixer_plugin->message_handler_id = xfce_mixer_bus_connect (G_CALLBACK (xfce_mixer_plugin_bus_message), mixer_plugin); track_label = xfconf_channel_get_string (mixer_plugin->plugin_channel, "/track", NULL); + xfce_mixer_debug ("set sound-card to '%s'", card_name); } else { track_label = NULL; xfce_mixer_bus_disconnect (mixer_plugin->message_handler_id); + xfce_mixer_debug ("could not determine a valid card"); } g_object_set (object, "track", track_label, NULL); @@ -421,6 +432,7 @@ xfce_mixer_plugin_set_property (GObject *object, track_type != XFCE_MIXER_TRACK_TYPE_CAPTURE) || GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_READONLY)) { + xfce_mixer_debug ("could not set track to '%s', trying the default track instead", track_label); g_free (track_label); track = xfce_mixer_get_default_track (mixer_plugin->card); if (GST_IS_MIXER_TRACK (track)) @@ -433,7 +445,10 @@ xfce_mixer_plugin_set_property (GObject *object, { mixer_plugin->track = track; mixer_plugin->track_label = g_strdup (track_label); + xfce_mixer_debug ("set track to '%s'", track_label); } + else + xfce_mixer_debug ("could not determine a valid track"); g_free (track_label); } @@ -446,6 +461,7 @@ xfce_mixer_plugin_set_property (GObject *object, mixer_plugin->command = g_value_dup_string (value); if (mixer_plugin->command == NULL) mixer_plugin->command = g_strdup (XFCE_MIXER_PLUGIN_DEFAULT_COMMAND); + xfce_mixer_debug ("set command to '%s'", mixer_plugin->command); break; #ifdef HAVE_KEYBINDER case PROP_ENABLE_KEYBOARD_SHORTCUTS: @@ -468,6 +484,8 @@ xfce_mixer_plugin_set_property (GObject *object, keybinder_unbind(XFCE_MIXER_PLUGIN_MUTE_KEY, xfce_mixer_plugin_mute_pressed); } mixer_plugin->enable_keyboard_shortcuts = enable_keyboard_shortcuts; + + xfce_mixer_debug ("set enable-keyboard-shortcuts to %s", enable_keyboard_shortcuts ? "true" : "false"); } break; #endif @@ -632,147 +650,161 @@ xfce_mixer_plugin_button_toggled (XfceMixerPlugin *mixer_plugin, -static void -xfce_mixer_plugin_volume_changed (XfceMixerPlugin *mixer_plugin, - gdouble volume) +static gint +xfce_mixer_plugin_get_volume (XfceMixerPlugin *mixer_plugin) { - gint *volumes; - gint volume_range; - gint new_volume; - gint i; - - g_return_if_fail (mixer_plugin != NULL); - g_return_if_fail (GST_IS_MIXER (mixer_plugin->card)); - g_return_if_fail (GST_IS_MIXER_TRACK (mixer_plugin->track)); + gint *volumes; + gint volume; - mixer_plugin->ignore_bus_messages = TRUE; + g_return_val_if_fail (IS_XFCE_MIXER_PLUGIN (mixer_plugin), 0); + g_return_val_if_fail (GST_IS_MIXER (mixer_plugin->card), 0); + g_return_val_if_fail (GST_IS_MIXER_TRACK (mixer_plugin->track), 0); - /* Allocate array for track volumes */ volumes = g_new (gint, mixer_plugin->track->num_channels); - /* Determine difference between max and min volume */ - volume_range = mixer_plugin->track->max_volume - mixer_plugin->track->min_volume; - - /* Determine new volume */ - new_volume = (gint) round (mixer_plugin->track->min_volume + (volume * volume_range)); - - /* Set all channel volumes to the new volume */ - for (i = 0; i < mixer_plugin->track->num_channels; ++i) - volumes[i] = new_volume; - - /* Apply volume change to the sound card */ - gst_mixer_set_volume (GST_MIXER (mixer_plugin->card), mixer_plugin->track, volumes); + gst_mixer_get_volume (GST_MIXER (mixer_plugin->card), mixer_plugin->track, volumes); + volume = xfce_mixer_get_max_volume (volumes, mixer_plugin->track->num_channels); - /* Free volume array */ g_free (volumes); - mixer_plugin->ignore_bus_messages = FALSE; + return volume; } static void -xfce_mixer_plugin_mute_changed (XfceMixerPlugin *mixer_plugin, - gboolean muted) +xfce_mixer_plugin_set_volume (XfceMixerPlugin *mixer_plugin, + gint volume) { - XfceMixerTrackType track_type; + gint *volumes; + gint i; + g_return_if_fail (IS_XFCE_MIXER_PLUGIN (mixer_plugin)); g_return_if_fail (GST_IS_MIXER (mixer_plugin->card)); g_return_if_fail (GST_IS_MIXER_TRACK (mixer_plugin->track)); - track_type = xfce_mixer_track_type_new (mixer_plugin->track); + volumes = g_new (gint, mixer_plugin->track->num_channels); - if ((track_type == XFCE_MIXER_TRACK_TYPE_PLAYBACK && - GST_MIXER_TRACK_HAS_FLAG (mixer_plugin->track, GST_MIXER_TRACK_NO_MUTE)) || - (track_type == XFCE_MIXER_TRACK_TYPE_CAPTURE && - GST_MIXER_TRACK_HAS_FLAG (mixer_plugin->track, GST_MIXER_TRACK_NO_RECORD))) - return; + /* Only change the volume if the new volume differs from the old */ + if (volume != xfce_mixer_plugin_get_volume (mixer_plugin)) + { + mixer_plugin->ignore_bus_messages = TRUE; - mixer_plugin->ignore_bus_messages = TRUE; + for (i = 0; i < mixer_plugin->track->num_channels; ++i) + volumes[i] = volume; + gst_mixer_set_volume (GST_MIXER (mixer_plugin->card), mixer_plugin->track, volumes); - if (G_LIKELY (track_type == XFCE_MIXER_TRACK_TYPE_PLAYBACK)) - { - /* Apply mute change to the sound card */ - gst_mixer_set_mute (GST_MIXER (mixer_plugin->card), mixer_plugin->track, muted); - } - else - { - /* Toggle capture */ - gst_mixer_set_record (GST_MIXER (mixer_plugin->card), mixer_plugin->track, !muted); - } + xfce_mixer_debug ("set volume to %d", volume); - /* Update mute menu item */ - if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (mixer_plugin->mute_menu_item)) != muted) - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mixer_plugin->mute_menu_item), muted); + mixer_plugin->ignore_bus_messages = FALSE; + } - mixer_plugin->ignore_bus_messages = FALSE; + g_free (volumes); } -static void -xfce_mixer_plugin_mute_item_toggled (XfceMixerPlugin *mixer_plugin, - GtkCheckMenuItem *mute_menu_item) +static gboolean +xfce_mixer_plugin_get_muted (XfceMixerPlugin *mixer_plugin) { - gboolean muted = gtk_check_menu_item_get_active (mute_menu_item); + XfceMixerTrackType track_type; + gboolean muted = FALSE; - /* Update the volume button */ - xfce_volume_button_set_muted (XFCE_VOLUME_BUTTON (mixer_plugin->button), muted); + g_return_val_if_fail (IS_XFCE_MIXER_PLUGIN (mixer_plugin), FALSE); + g_return_val_if_fail (GST_IS_MIXER (mixer_plugin->card), FALSE); + g_return_val_if_fail (GST_IS_MIXER_TRACK (mixer_plugin->track), FALSE); - xfce_mixer_plugin_mute_changed (mixer_plugin, muted); + track_type = xfce_mixer_track_type_new (mixer_plugin->track); + + if (G_LIKELY (track_type == XFCE_MIXER_TRACK_TYPE_PLAYBACK)) + muted = GST_MIXER_TRACK_HAS_FLAG (mixer_plugin->track, GST_MIXER_TRACK_MUTE); + else if (track_type == XFCE_MIXER_TRACK_TYPE_CAPTURE) + muted = !GST_MIXER_TRACK_HAS_FLAG (mixer_plugin->track, GST_MIXER_TRACK_RECORD); + + return muted; } static void -xfce_mixer_plugin_command_item_activated (XfceMixerPlugin *mixer_plugin, - GtkMenuItem *menuitem) +xfce_mixer_plugin_set_muted (XfceMixerPlugin *mixer_plugin, + gboolean muted) { - gchar *message; + XfceMixerTrackType track_type; - g_return_if_fail (mixer_plugin != NULL); + g_return_if_fail (IS_XFCE_MIXER_PLUGIN (mixer_plugin)); + g_return_if_fail (GST_IS_MIXER (mixer_plugin->card)); + g_return_if_fail (GST_IS_MIXER_TRACK (mixer_plugin->track)); - if (G_UNLIKELY (mixer_plugin->command == NULL || strlen (mixer_plugin->command) == 0)) - { - xfce_dialog_show_error (NULL, NULL, _("No command defined")); - return; - } + track_type = xfce_mixer_track_type_new (mixer_plugin->track); - /* Try to start the mixer command */ - if (G_UNLIKELY (!g_spawn_command_line_async (mixer_plugin->command, NULL))) + /* Return if track is neither capable of mute not record */ + if ((track_type == XFCE_MIXER_TRACK_TYPE_PLAYBACK && + GST_MIXER_TRACK_HAS_FLAG (mixer_plugin->track, GST_MIXER_TRACK_NO_MUTE)) || + (track_type == XFCE_MIXER_TRACK_TYPE_CAPTURE && + GST_MIXER_TRACK_HAS_FLAG (mixer_plugin->track, GST_MIXER_TRACK_NO_RECORD))) + return; + + /* Only change the current mute state differs from the old */ + if (muted != xfce_mixer_plugin_get_muted (mixer_plugin)) { - /* Generate error message and insert the current command */ - message = g_strdup_printf (_("Could not execute the command \"%s\". " - "Ensure that either the location of the command " - "is included in the PATH environment variable or " - "that you are providing the full path to the " - "command."), - mixer_plugin->command); + mixer_plugin->ignore_bus_messages = TRUE; - /* Display error */ - xfce_dialog_show_error (NULL, NULL, "%s", message); + if (G_LIKELY (track_type == XFCE_MIXER_TRACK_TYPE_PLAYBACK)) + { + /* Apply mute change to the sound card */ + gst_mixer_set_mute (GST_MIXER (mixer_plugin->card), mixer_plugin->track, muted); + } + else + { + /* Toggle capture */ + gst_mixer_set_record (GST_MIXER (mixer_plugin->card), mixer_plugin->track, !muted); + } - /* Free error message */ - g_free (message); + xfce_mixer_debug ("%s track", muted ? "muted" : "unmuted"); + + mixer_plugin->ignore_bus_messages = FALSE; } } static void -xfce_mixer_plugin_is_muted_property_changed (XfceMixerPlugin *mixer_plugin, - GParamSpec *pspec, - GObject *object) +xfce_mixer_plugin_update_volume (XfceMixerPlugin *mixer_plugin, + gint volume) { - gboolean muted; + gdouble button_volume; - g_return_if_fail (mixer_plugin != NULL); + g_return_if_fail (IS_XFCE_MIXER_PLUGIN (mixer_plugin)); g_return_if_fail (GST_IS_MIXER (mixer_plugin->card)); g_return_if_fail (GST_IS_MIXER_TRACK (mixer_plugin->track)); - g_object_get (object, "is-muted", &muted, NULL); + /* Determine maximum value as double between 0.0 and 1.0 */ + button_volume = ((gdouble) xfce_mixer_plugin_get_volume (mixer_plugin) - mixer_plugin->track->min_volume) / (mixer_plugin->track->max_volume - mixer_plugin->track->min_volume); + + /* Update the button */ + g_signal_handlers_block_by_func (G_OBJECT (mixer_plugin->button), xfce_mixer_plugin_button_volume_changed, mixer_plugin); + xfce_volume_button_set_volume (XFCE_VOLUME_BUTTON (mixer_plugin->button), button_volume); + g_signal_handlers_unblock_by_func (G_OBJECT (mixer_plugin->button), xfce_mixer_plugin_button_volume_changed, mixer_plugin); +} + + + +static void +xfce_mixer_plugin_update_muted (XfceMixerPlugin *mixer_plugin, + gboolean muted) +{ + g_return_if_fail (IS_XFCE_MIXER_PLUGIN (mixer_plugin)); - xfce_mixer_plugin_mute_changed (mixer_plugin, muted); + /* Update the button */ + g_signal_handlers_block_by_func (G_OBJECT (mixer_plugin->button), xfce_mixer_plugin_button_is_muted, mixer_plugin); + xfce_volume_button_set_muted (XFCE_VOLUME_BUTTON (mixer_plugin->button), muted); + g_signal_handlers_unblock_by_func (G_OBJECT (mixer_plugin->button), xfce_mixer_plugin_button_is_muted, mixer_plugin); + + /* Update mute menu item */ + g_signal_handlers_block_by_func (G_OBJECT (mixer_plugin->mute_menu_item), xfce_mixer_plugin_mute_item_toggled, mixer_plugin); + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mixer_plugin->mute_menu_item), muted); + g_signal_handlers_unblock_by_func (G_OBJECT (mixer_plugin->mute_menu_item), xfce_mixer_plugin_mute_item_toggled, mixer_plugin); } @@ -781,10 +813,7 @@ static void xfce_mixer_plugin_update_track (XfceMixerPlugin *mixer_plugin) { XfceMixerTrackType track_type; - gboolean muted = FALSE; - gint volume_range; - gdouble volume; - gint *volumes; + gboolean muted; g_return_if_fail (IS_XFCE_MIXER_PLUGIN (mixer_plugin)); @@ -796,53 +825,130 @@ xfce_mixer_plugin_update_track (XfceMixerPlugin *mixer_plugin) return; } - /* Get volumes of the mixer track */ - volumes = g_new (gint, mixer_plugin->track->num_channels); - gst_mixer_get_volume (GST_MIXER (mixer_plugin->card), mixer_plugin->track, volumes); - - /* Determine difference between max and min volume */ - volume_range = mixer_plugin->track->max_volume - mixer_plugin->track->min_volume; - - /* Determine maximum value as double between 0.0 and 1.0 */ - volume = ((gdouble) xfce_mixer_get_max_volume (volumes, mixer_plugin->track->num_channels) - mixer_plugin->track->min_volume) / volume_range; - - /* Determine track type */ - track_type = xfce_mixer_track_type_new (mixer_plugin->track); - - if (G_LIKELY (track_type == XFCE_MIXER_TRACK_TYPE_PLAYBACK)) - muted = GST_MIXER_TRACK_HAS_FLAG (mixer_plugin->track, GST_MIXER_TRACK_MUTE); - else if (track_type == XFCE_MIXER_TRACK_TYPE_CAPTURE) - muted = !GST_MIXER_TRACK_HAS_FLAG (mixer_plugin->track, GST_MIXER_TRACK_RECORD); - /* Update the volume button and menu */ xfce_volume_button_set_is_configured (XFCE_VOLUME_BUTTON (mixer_plugin->button), TRUE); xfce_volume_button_set_track_label (XFCE_VOLUME_BUTTON (mixer_plugin->button), xfce_mixer_get_track_label (mixer_plugin->track)); - xfce_volume_button_set_volume (XFCE_VOLUME_BUTTON (mixer_plugin->button), volume); + xfce_mixer_plugin_update_volume (mixer_plugin, xfce_mixer_plugin_get_volume (mixer_plugin)); /* * If the track does not support mute/record, disable the corresponding menu * item and button functionality */ + track_type = xfce_mixer_track_type_new (mixer_plugin->track); if ((track_type == XFCE_MIXER_TRACK_TYPE_PLAYBACK && GST_MIXER_TRACK_HAS_FLAG (mixer_plugin->track, GST_MIXER_TRACK_NO_MUTE)) || (track_type == XFCE_MIXER_TRACK_TYPE_CAPTURE && GST_MIXER_TRACK_HAS_FLAG (mixer_plugin->track, GST_MIXER_TRACK_NO_RECORD))) { xfce_volume_button_set_no_mute (XFCE_VOLUME_BUTTON (mixer_plugin->button), TRUE); - xfce_volume_button_set_muted (XFCE_VOLUME_BUTTON (mixer_plugin->button), FALSE); gtk_widget_set_sensitive (mixer_plugin->mute_menu_item, FALSE); - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mixer_plugin->mute_menu_item), FALSE); + muted = FALSE; } else { xfce_volume_button_set_no_mute (XFCE_VOLUME_BUTTON (mixer_plugin->button), FALSE); - xfce_volume_button_set_muted (XFCE_VOLUME_BUTTON (mixer_plugin->button), muted); gtk_widget_set_sensitive (mixer_plugin->mute_menu_item, TRUE); - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mixer_plugin->mute_menu_item), muted); + muted = xfce_mixer_plugin_get_muted (mixer_plugin); } - /* Free volume array */ - g_free (volumes); + xfce_mixer_plugin_update_muted (mixer_plugin, muted); +} + + + +static void +xfce_mixer_plugin_button_volume_changed (XfceMixerPlugin *mixer_plugin, + gdouble button_volume) +{ + gint volume; + + g_return_if_fail (mixer_plugin != NULL); + g_return_if_fail (GST_IS_MIXER (mixer_plugin->card)); + g_return_if_fail (GST_IS_MIXER_TRACK (mixer_plugin->track)); + + /* Convert relative to absolute volume */ + volume = (gint) round (mixer_plugin->track->min_volume + (button_volume * (mixer_plugin->track->max_volume - mixer_plugin->track->min_volume))); + + xfce_mixer_debug ("button emitted 'volume-changed', new volume is %d (%d%%)", volume, (gint) round (button_volume * 100)); + + xfce_mixer_plugin_set_volume (mixer_plugin, volume); +} + + + +static void +xfce_mixer_plugin_button_is_muted (XfceMixerPlugin *mixer_plugin, + GParamSpec *pspec, + GObject *object) +{ + gboolean muted; + + g_return_if_fail (mixer_plugin != NULL); + g_return_if_fail (GST_IS_MIXER (mixer_plugin->card)); + g_return_if_fail (GST_IS_MIXER_TRACK (mixer_plugin->track)); + + g_object_get (object, "is-muted", &muted, NULL); + + xfce_mixer_debug ("button 'is-muted' property changed to %s", muted ? "true" : "false"); + + xfce_mixer_plugin_set_muted (mixer_plugin, muted); + xfce_mixer_plugin_update_muted (mixer_plugin, muted); +} + + + +static void +xfce_mixer_plugin_mute_item_toggled (XfceMixerPlugin *mixer_plugin, + GtkCheckMenuItem *mute_menu_item) +{ + gboolean muted; + + g_return_if_fail (GST_IS_MIXER (mixer_plugin->card)); + g_return_if_fail (GST_IS_MIXER_TRACK (mixer_plugin->track)); + + muted = gtk_check_menu_item_get_active (mute_menu_item); + + xfce_mixer_debug ("mute check menu item was toggled to %s", muted ? "true" : "false"); + + xfce_mixer_plugin_set_muted (mixer_plugin, muted); + xfce_mixer_plugin_update_muted (mixer_plugin, muted); +} + + + +static void +xfce_mixer_plugin_command_item_activated (XfceMixerPlugin *mixer_plugin, + GtkMenuItem *menuitem) +{ + gchar *message; + + g_return_if_fail (mixer_plugin != NULL); + + xfce_mixer_debug ("command menu item was activated"); + + if (G_UNLIKELY (mixer_plugin->command == NULL || strlen (mixer_plugin->command) == 0)) + { + xfce_dialog_show_error (NULL, NULL, _("No command defined")); + return; + } + + /* Try to start the mixer command */ + if (G_UNLIKELY (!g_spawn_command_line_async (mixer_plugin->command, NULL))) + { + /* Generate error message and insert the current command */ + message = g_strdup_printf (_("Could not execute the command \"%s\". " + "Ensure that either the location of the command " + "is included in the PATH environment variable or " + "that you are providing the full path to the " + "command."), + mixer_plugin->command); + + /* Display error */ + xfce_dialog_show_error (NULL, NULL, "%s", message); + + /* Free error message */ + g_free (message); + } } @@ -852,10 +958,9 @@ xfce_mixer_plugin_bus_message (GstBus *bus, GstMessage *message, XfceMixerPlugin *mixer_plugin) { - GstMixerTrack *track = NULL; - gboolean mute; - gboolean record; - const gchar *label; + GstMixerTrack *track = NULL; + gboolean muted; + const gchar *label; /* Don't do anything if GstBus messages are to be ignored */ if (G_UNLIKELY (mixer_plugin->ignore_bus_messages)) @@ -876,32 +981,35 @@ xfce_mixer_plugin_bus_message (GstBus *bus, /* Update the volume button if the message belongs to the current mixer track */ if (G_UNLIKELY (g_utf8_collate (label, mixer_plugin->track_label) == 0)) - xfce_mixer_plugin_update_track (mixer_plugin); + { + xfce_mixer_debug ("received 'volume-changed' message from gstreamer"); + xfce_mixer_plugin_update_volume (mixer_plugin, xfce_mixer_plugin_get_volume (mixer_plugin)); + } break; case GST_MIXER_MESSAGE_MUTE_TOGGLED: /* Parse the mute message */ - gst_mixer_message_parse_mute_toggled (message, &track, &mute); + gst_mixer_message_parse_mute_toggled (message, &track, &muted); label = xfce_mixer_get_track_label (track); /* Update the volume button and mute menu item if the message belongs to the current mixer track */ if (G_UNLIKELY (g_utf8_collate (label, mixer_plugin->track_label) == 0)) { - xfce_volume_button_set_muted (XFCE_VOLUME_BUTTON (mixer_plugin->button), mute); - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mixer_plugin->mute_menu_item), mute); + xfce_mixer_debug ("received 'mute-toggled' message from gstreamer"); + xfce_mixer_plugin_update_muted (mixer_plugin, xfce_mixer_plugin_get_muted (mixer_plugin)); } break; case GST_MIXER_MESSAGE_RECORD_TOGGLED: /* Parse the record message */ - gst_mixer_message_parse_record_toggled (message, &track, &record); + gst_mixer_message_parse_record_toggled (message, &track, NULL); label = xfce_mixer_get_track_label (track); /* Update the volume button and mute menu item if the message belongs to the current mixer track */ if (G_UNLIKELY (g_utf8_collate (label, mixer_plugin->track_label) == 0)) { - xfce_volume_button_set_muted (XFCE_VOLUME_BUTTON (mixer_plugin->button), !record); - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mixer_plugin->mute_menu_item), !record); + xfce_mixer_debug ("received 'record-toggled' message from gstreamer"); + xfce_mixer_plugin_update_muted (mixer_plugin, xfce_mixer_plugin_get_muted (mixer_plugin)); } break; @@ -912,6 +1020,7 @@ xfce_mixer_plugin_bus_message (GstBus *bus, * track with such name any more, the property setter will handle the * situation in a sane way */ + xfce_mixer_debug ("received 'mixer-changed' message from gstreamer"); g_object_set (mixer_plugin, "track", mixer_plugin->track_label, NULL); break; default: @@ -927,41 +1036,31 @@ xfce_mixer_plugin_volume_key_pressed (const char *keystring, void *user_data) { XfceMixerPlugin *mixer_plugin = XFCE_MIXER_PLUGIN (user_data); - gint volume_range; gint interval; - gint i; - gint *old_volumes; - gint *new_volumes; gint old_volume; gint new_volume; - gdouble button_volume; if (G_UNLIKELY (!GST_IS_MIXER (mixer_plugin->card) || !GST_IS_MIXER_TRACK (mixer_plugin->track) || mixer_plugin->track_label == NULL)) return; - /* Get volumes of the mixer track */ - old_volumes = g_new (gint, mixer_plugin->track->num_channels); - gst_mixer_get_volume (GST_MIXER (mixer_plugin->card), mixer_plugin->track, old_volumes); - old_volume = xfce_mixer_get_max_volume (old_volumes, mixer_plugin->track->num_channels); - g_free (old_volumes); - - volume_range = mixer_plugin->track->max_volume - mixer_plugin->track->min_volume; - /* Increase/Decrease in intervals of 5% of the volume range but at least 1 */ - interval = (gint) round (volume_range * 0.05); + interval = (gint) round ((mixer_plugin->track->max_volume - mixer_plugin->track->min_volume) * 0.05); if (interval == 0) interval = 1; + /* Determine new volume */ if (strcmp (keystring, XFCE_MIXER_PLUGIN_RAISE_VOLUME_KEY) == 0) { - /* Determine new volume */ + xfce_mixer_debug ("'%s' pressed", XFCE_MIXER_PLUGIN_RAISE_VOLUME_KEY); + old_volume = xfce_mixer_plugin_get_volume (mixer_plugin); new_volume = old_volume + interval; if (new_volume > mixer_plugin->track->max_volume) new_volume = mixer_plugin->track->max_volume; } else if (strcmp (keystring, XFCE_MIXER_PLUGIN_LOWER_VOLUME_KEY) == 0) { - /* Determine new volume */ + xfce_mixer_debug ("'%s' pressed", XFCE_MIXER_PLUGIN_LOWER_VOLUME_KEY); + old_volume = xfce_mixer_plugin_get_volume (mixer_plugin); new_volume = old_volume - interval; if (new_volume < mixer_plugin->track->min_volume) new_volume = mixer_plugin->track->min_volume; @@ -969,34 +1068,20 @@ xfce_mixer_plugin_volume_key_pressed (const char *keystring, else return; - if (new_volume != old_volume) - { - mixer_plugin->ignore_bus_messages = TRUE; - - /* Calculate volume as double between 0.0 and 1.0 for the button */ - button_volume = ((gdouble) new_volume - mixer_plugin->track->min_volume) / volume_range; - xfce_volume_button_set_volume (XFCE_VOLUME_BUTTON (mixer_plugin->button), button_volume); - - /* Apply volume change to the sound card */ - new_volumes = g_new (gint, mixer_plugin->track->num_channels); - for (i = 0; i < mixer_plugin->track->num_channels; ++i) - new_volumes[i] = new_volume; - gst_mixer_set_volume (GST_MIXER (mixer_plugin->card), mixer_plugin->track, new_volumes); - g_free (new_volumes); - - /* Mute when volume reaches 0%, unmute if volume is raised from 0% */ - if (old_volume > 0 && new_volume == 0) - { - xfce_mixer_plugin_mute_changed (mixer_plugin, TRUE); - xfce_volume_button_set_muted (XFCE_VOLUME_BUTTON (mixer_plugin->button), TRUE); - } - else if (old_volume == 0 && new_volume > 0) - { - xfce_mixer_plugin_mute_changed (mixer_plugin, FALSE); - xfce_volume_button_set_muted (XFCE_VOLUME_BUTTON (mixer_plugin->button), FALSE); - } + /* Set the volume */ + xfce_mixer_plugin_set_volume (mixer_plugin, new_volume); + xfce_mixer_plugin_update_volume (mixer_plugin, new_volume); - mixer_plugin->ignore_bus_messages = FALSE; + /* Mute when volume reaches 0%, unmute if volume is raised from 0% */ + if (old_volume > 0 && new_volume == 0) + { + xfce_mixer_plugin_set_muted (mixer_plugin, TRUE); + xfce_mixer_plugin_update_muted (mixer_plugin, TRUE); + } + else if (old_volume == 0 && new_volume > 0) + { + xfce_mixer_plugin_set_muted (mixer_plugin, FALSE); + xfce_mixer_plugin_update_muted (mixer_plugin, FALSE); } } @@ -1006,26 +1091,18 @@ static void xfce_mixer_plugin_mute_pressed (const char *keystring, void *user_data) { - XfceMixerPlugin *mixer_plugin = XFCE_MIXER_PLUGIN (user_data); - XfceMixerTrackType track_type; - gboolean muted = TRUE; + XfceMixerPlugin *mixer_plugin = XFCE_MIXER_PLUGIN (user_data); + gboolean muted = TRUE; if (G_UNLIKELY (!GST_IS_MIXER (mixer_plugin->card) || !GST_IS_MIXER_TRACK (mixer_plugin->track) || mixer_plugin->track_label == NULL)) return; - /* Determine track type */ - track_type = xfce_mixer_track_type_new (mixer_plugin->track); - - /* Determine current mute state */ - if (G_LIKELY (track_type == XFCE_MIXER_TRACK_TYPE_PLAYBACK)) - muted = GST_MIXER_TRACK_HAS_FLAG (mixer_plugin->track, GST_MIXER_TRACK_MUTE); - else if (track_type == XFCE_MIXER_TRACK_TYPE_CAPTURE) - muted = !GST_MIXER_TRACK_HAS_FLAG (mixer_plugin->track, GST_MIXER_TRACK_RECORD); + xfce_mixer_debug ("'%s' pressed", XFCE_MIXER_PLUGIN_MUTE_KEY); - /* Set the new mute state */ - xfce_mixer_plugin_mute_changed (mixer_plugin, !muted); + muted = xfce_mixer_plugin_get_muted (mixer_plugin); - /* Update the volume button */ - xfce_volume_button_set_muted (XFCE_VOLUME_BUTTON (mixer_plugin->button), !muted); + /* Toggle the mute state */ + xfce_mixer_plugin_set_muted (mixer_plugin, !muted); + xfce_mixer_plugin_update_muted (mixer_plugin, !muted); } #endif _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits