Updating branch refs/heads/master to f543917aea0dd551490cf25806c4260d9740b288 (commit) from e749d2a409a4228ac1f0a59c081f4d14b01b8297 (commit)
commit f543917aea0dd551490cf25806c4260d9740b288 Author: Guido Berhoerster <guido+x...@berhoerster.name> Date: Thu Sep 27 16:31:08 2012 +0200 Mute a track when the volume is set to 0% and unmute when set to a higher value Mute a track automatically when the volume button reaches 0% and unmute it again when above 0% (bug #8291). Improve the volume calculations by using round() rather than truncating. NEWS | 2 + configure.ac.in | 6 ++++ panel-plugin/xfce-mixer-plugin.c | 6 +++- panel-plugin/xfce-volume-button.c | 43 ++++++++++++++++++++--------- xfce4-mixer/xfce-mixer-track.c | 54 ++++++++++++++++++++++++++++++++---- 5 files changed, 91 insertions(+), 20 deletions(-) diff --git a/NEWS b/NEWS index c4ccfac..80a8b8a 100644 --- a/NEWS +++ b/NEWS @@ -17,6 +17,8 @@ - Avoid the deprecated GtkTooltips API and let XfceVolumeButton handle tooltips. - Indicate in the plugin tooltip whether the track is muted. +- Mute a track when the volume is set to 0% and unmute when set to a higher + value (bug #8291). 4.8.0 diff --git a/configure.ac.in b/configure.ac.in index 6a42c74..f391d31 100644 --- a/configure.ac.in +++ b/configure.ac.in @@ -84,6 +84,12 @@ dnl *** Check for i18n support *** dnl ****************************** XDT_I18N([@LINGUAS@]) +dnl ********************** +dnl *** Check for libm *** +dnl ********************** +AC_CHECK_HEADERS([math.h]) +AC_CHECK_LIB([m],[round]) + dnl *********************************** dnl *** Check for required packages *** dnl *********************************** diff --git a/panel-plugin/xfce-mixer-plugin.c b/panel-plugin/xfce-mixer-plugin.c index 73fbef0..1dc6d97 100644 --- a/panel-plugin/xfce-mixer-plugin.c +++ b/panel-plugin/xfce-mixer-plugin.c @@ -23,6 +23,10 @@ #include <config.h> #endif +#ifdef HAVE_MATH_H +#include <math.h> +#endif + #include <gtk/gtk.h> #include <gst/gst.h> @@ -537,7 +541,7 @@ xfce_mixer_plugin_volume_changed (XfceMixerPlugin *mixer_plugin, volume_range = mixer_plugin->track->max_volume - mixer_plugin->track->min_volume; /* Determine new volume */ - new_volume = mixer_plugin->track->min_volume + (volume * volume_range); + 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) diff --git a/panel-plugin/xfce-volume-button.c b/panel-plugin/xfce-volume-button.c index e80c792..826d4be 100644 --- a/panel-plugin/xfce-volume-button.c +++ b/panel-plugin/xfce-volume-button.c @@ -23,6 +23,10 @@ #include <config.h> #endif +#ifdef HAVE_MATH_H +#include <math.h> +#endif + #include <gdk/gdk.h> #include <gtk/gtk.h> @@ -216,7 +220,7 @@ xfce_volume_button_class_init (XfceVolumeButtonClass *klass) g_param_spec_boolean ("is-muted", "is-muted", "is-muted", - FALSE, + TRUE, G_PARAM_READABLE | G_PARAM_WRITABLE)); button_signals[VOLUME_CHANGED] = g_signal_new ("volume-changed", @@ -240,15 +244,15 @@ xfce_volume_button_init (XfceVolumeButton *button) button->is_configured = FALSE; - /* By default we expect the button not to be muted */ - button->is_muted = FALSE; - /* Allocate array for preloaded icons */ button->pixbufs = g_new0 (GdkPixbuf*, G_N_ELEMENTS (icons)-1); /* Create adjustment for the button (from 0.0 to 1.0 in 5% steps) */ button->adjustment = gtk_adjustment_new (0.0, 0.0, 1.0, 0.05, 0.05, 0.0); + /* Set to muted by default since the initial adjustment value is 0 */ + button->is_muted = TRUE; + /* Create a new scaled image for the button icon */ button->image = xfce_panel_image_new (); gtk_container_add (GTK_CONTAINER (button), button->image); @@ -478,7 +482,8 @@ xfce_volume_button_scrolled (GtkWidget *widget, GdkEventScroll *event, XfceVolumeButton *button) { - gdouble value; + gdouble old_value; + gdouble new_value; gdouble step_increment; g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE); @@ -489,7 +494,7 @@ xfce_volume_button_scrolled (GtkWidget *widget, return TRUE; /* Get current adjustment value and the step increment size */ - g_object_get (G_OBJECT (button->adjustment), "value", &value, "step-increment", &step_increment, NULL); + g_object_get (G_OBJECT (button->adjustment), "value", &old_value, "step-increment", &step_increment, NULL); /* Distinguish between scroll directions */ switch (event->direction) @@ -497,20 +502,32 @@ xfce_volume_button_scrolled (GtkWidget *widget, case GDK_SCROLL_UP: case GDK_SCROLL_RIGHT: /* Increase one step when scrolling up/right */ - gtk_adjustment_set_value (GTK_ADJUSTMENT (button->adjustment), value + step_increment); + gtk_adjustment_set_value (GTK_ADJUSTMENT (button->adjustment), old_value + step_increment); break; case GDK_SCROLL_DOWN: case GDK_SCROLL_LEFT: /* Decrease one step when scrolling down/left */ - gtk_adjustment_set_value (GTK_ADJUSTMENT (button->adjustment), value - step_increment); + gtk_adjustment_set_value (GTK_ADJUSTMENT (button->adjustment), old_value - step_increment); break; } - /* Update the state of the button */ - xfce_volume_button_update (button); + new_value = gtk_adjustment_get_value (GTK_ADJUSTMENT (button->adjustment)); + if (fabs (new_value - old_value) < VOLUME_EPSILON) + { + /* Mute when volume reaches 0%, unmute if volume is raised from 0% */ + if (new_value < VOLUME_EPSILON && !button->is_muted) + xfce_volume_button_set_muted (button, TRUE); + else if (old_value < VOLUME_EPSILON && button->is_muted) + xfce_volume_button_set_muted (button, FALSE); + else + { + /* Update the state of the button */ + xfce_volume_button_update (button); + } - /* Notify listeners of the new volume */ - g_signal_emit_by_name (button, "volume-changed", gtk_adjustment_get_value (GTK_ADJUSTMENT (button->adjustment))); + /* Notify listeners of the new volume */ + g_signal_emit_by_name (button, "volume-changed", new_value); + } /* The scroll event has been handled, stop other handlers from being invoked */ return TRUE; @@ -566,7 +583,7 @@ xfce_volume_button_update (XfceVolumeButton *button) if (button->is_muted) tip_text = g_strdup_printf (_("%s: muted"), button->track_label); else - tip_text = g_strdup_printf (_("%s: %i%%"), button->track_label, (gint) (value * 100)); + tip_text = g_strdup_printf (_("%s: %i%%"), button->track_label, (gint) round (value * 100)); gtk_widget_set_tooltip_text (GTK_WIDGET (button), tip_text); g_free (tip_text); } diff --git a/xfce4-mixer/xfce-mixer-track.c b/xfce4-mixer/xfce-mixer-track.c index c984cb3..579f562 100644 --- a/xfce4-mixer/xfce-mixer-track.c +++ b/xfce4-mixer/xfce-mixer-track.c @@ -277,8 +277,11 @@ xfce_mixer_track_fader_changed (GtkRange *range, XfceMixerTrack *track) { GList *iter; - gint *volumes; + gint *old_volumes; + gint *new_volumes; gint channel; + gint old_max_volume; + gint new_max_volume; /* Locking mechanism: If locked, the volume change should be applied to all * channels, but only one should deliver the change to GStreamer. */ @@ -295,8 +298,15 @@ xfce_mixer_track_fader_changed (GtkRange *range, /* Otherwise, block the other faders */ locked = TRUE; + /* Get current volumes of the track */ + old_volumes = g_new (gint, track->gst_track->num_channels); + gst_mixer_get_volume (GST_MIXER (track->card), track->gst_track, old_volumes); + + /* Determine maximum value of all channels */ + old_max_volume = xfce_mixer_get_max_volume (old_volumes, track->gst_track->num_channels); + /* Allocate array for the volumes to be sent to GStreamer */ - volumes = g_new (gint, track->gst_track->num_channels); + new_volumes = g_new (gint, track->gst_track->num_channels); /* Collect volumes of all channels */ for (iter = track->channel_faders, channel = 0; iter != NULL; iter = g_list_next (iter), ++channel) @@ -305,14 +315,46 @@ xfce_mixer_track_fader_changed (GtkRange *range, if (G_LIKELY (track->gst_track->num_channels >= 2 && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (track->lock_button)))) gtk_range_set_value (GTK_RANGE (iter->data), gtk_range_get_value (range)); - volumes[channel] = (gint) gtk_range_get_value (GTK_RANGE (iter->data)); + new_volumes[channel] = (gint) gtk_range_get_value (GTK_RANGE (iter->data)); } /* Deliver the volume update to GStreamer */ - gst_mixer_set_volume (GST_MIXER (track->card), track->gst_track, volumes); + gst_mixer_set_volume (GST_MIXER (track->card), track->gst_track, new_volumes); - /* Free volume array */ - g_free (volumes); + /* Determine new maximum value of all channels */ + new_max_volume = xfce_mixer_get_max_volume (new_volumes, track->gst_track->num_channels); + + /* Mute when volume reaches the minimum, unmute if volume is raised from the minimum */ + if (old_max_volume > track->gst_track->min_volume && new_max_volume == track->gst_track->min_volume) + { + if (xfce_mixer_track_type_new (track->gst_track) != XFCE_MIXER_TRACK_TYPE_CAPTURE) + { + gst_mixer_set_mute (GST_MIXER (track->card), track->gst_track, TRUE); + xfce_mixer_track_update_mute (track); + } + else + { + gst_mixer_set_record (GST_MIXER (track->card), track->gst_track, TRUE); + xfce_mixer_track_update_record (track); + } + } + else if (old_max_volume == track->gst_track->min_volume && new_max_volume > track->gst_track->min_volume) + { + if (xfce_mixer_track_type_new (track->gst_track) != XFCE_MIXER_TRACK_TYPE_CAPTURE) + { + gst_mixer_set_mute (GST_MIXER (track->card), track->gst_track, FALSE); + xfce_mixer_track_update_mute (track); + } + else + { + gst_mixer_set_record (GST_MIXER (track->card), track->gst_track, FALSE); + xfce_mixer_track_update_record (track); + } + } + + /* Free volume arrays */ + g_free (old_volumes); + g_free (new_volumes); /* We're done, unlock this function */ locked = FALSE; _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits