|
|
60f948a |
diff -up gnome-applets-2.21.1/mixer/applet.h.mixer-sync gnome-applets-2.21.1/mixer/applet.h
|
|
|
60f948a |
--- gnome-applets-2.21.1/mixer/applet.h.mixer-sync 2007-07-27 22:02:35.000000000 -0400
|
|
|
60f948a |
+++ gnome-applets-2.21.1/mixer/applet.h 2007-11-13 09:39:37.000000000 -0500
|
|
|
60f948a |
@@ -71,6 +71,7 @@ typedef struct _GnomeVolumeApplet {
|
|
|
60f948a |
|
|
|
60f948a |
/* element */
|
|
|
60f948a |
GstMixer *mixer;
|
|
|
60f948a |
+ GstBus *bus;
|
|
|
60f948a |
gboolean lock;
|
|
|
60f948a |
gint state;
|
|
|
60f948a |
GList *tracks;
|
|
|
60f948a |
diff -up gnome-applets-2.21.1/mixer/applet.c.mixer-sync gnome-applets-2.21.1/mixer/applet.c
|
|
|
60f948a |
--- gnome-applets-2.21.1/mixer/applet.c.mixer-sync 2007-11-03 20:12:18.000000000 -0400
|
|
|
60f948a |
+++ gnome-applets-2.21.1/mixer/applet.c 2007-11-13 09:47:09.000000000 -0500
|
|
|
60f948a |
@@ -79,7 +79,12 @@ static void gnome_volume_applet_orientat
|
|
|
60f948a |
PanelAppletOrient orient);
|
|
|
60f948a |
|
|
|
60f948a |
static gboolean gnome_volume_applet_refresh (GnomeVolumeApplet *applet,
|
|
|
60f948a |
- gboolean force_refresh);
|
|
|
60f948a |
+ gboolean force_refresh,
|
|
|
60f948a |
+ gdouble volume,
|
|
|
60f948a |
+ gint mute);
|
|
|
60f948a |
+
|
|
|
60f948a |
+static void cb_notify_message (GstBus *bus, GstMessage *message, gpointer data);
|
|
|
60f948a |
+
|
|
|
60f948a |
static gboolean cb_check (gpointer data);
|
|
|
60f948a |
|
|
|
60f948a |
static void cb_volume (GtkAdjustment *adj,
|
|
|
60f948a |
@@ -218,6 +223,12 @@ gnome_volume_applet_init (GnomeVolumeApp
|
|
|
60f948a |
/* i18n */
|
|
|
60f948a |
ao = gtk_widget_get_accessible (GTK_WIDGET (applet));
|
|
|
60f948a |
atk_object_set_name (ao, _("Volume Control"));
|
|
|
60f948a |
+
|
|
|
60f948a |
+ /* Bus for notifications */
|
|
|
60f948a |
+ applet->bus = gst_bus_new ();
|
|
|
60f948a |
+ gst_bus_add_signal_watch (applet->bus);
|
|
|
60f948a |
+ g_signal_connect (G_OBJECT (applet->bus), "message::element",
|
|
|
60f948a |
+ (GCallback) cb_notify_message, applet);
|
|
|
60f948a |
}
|
|
|
60f948a |
|
|
|
60f948a |
/* Parse the list of tracks that are stored in GConf */
|
|
|
60f948a |
@@ -344,12 +355,33 @@ select_element_and_track (GnomeVolumeApp
|
|
|
60f948a |
return FALSE;
|
|
|
60f948a |
|
|
|
60f948a |
applet->mixer = g_object_ref (active_element);
|
|
|
60f948a |
+ gst_element_set_bus (GST_ELEMENT (applet->mixer), applet->bus);
|
|
|
60f948a |
applet->tracks = active_tracks;
|
|
|
60f948a |
g_list_foreach (applet->tracks, (GFunc) g_object_ref, NULL);
|
|
|
60f948a |
|
|
|
60f948a |
return TRUE;
|
|
|
60f948a |
}
|
|
|
60f948a |
|
|
|
60f948a |
+static void
|
|
|
60f948a |
+gnome_volume_applet_setup_timeout (GnomeVolumeApplet *applet)
|
|
|
60f948a |
+{
|
|
|
60f948a |
+ gboolean need_timeout = TRUE;
|
|
|
60f948a |
+ need_timeout = ((gst_mixer_get_mixer_flags (GST_MIXER (applet->mixer)) &
|
|
|
60f948a |
+ GST_MIXER_FLAG_AUTO_NOTIFICATIONS) == 0);
|
|
|
60f948a |
+
|
|
|
60f948a |
+ if (need_timeout) {
|
|
|
60f948a |
+ if (applet->timeout == 0) {
|
|
|
60f948a |
+ applet->timeout = g_timeout_add (100, cb_check, applet);
|
|
|
60f948a |
+ }
|
|
|
60f948a |
+ }
|
|
|
60f948a |
+ else {
|
|
|
60f948a |
+ if (applet->timeout != 0) {
|
|
|
60f948a |
+ g_source_remove (applet->timeout);
|
|
|
60f948a |
+ applet->timeout = 0;
|
|
|
60f948a |
+ }
|
|
|
60f948a |
+ }
|
|
|
60f948a |
+}
|
|
|
60f948a |
+
|
|
|
60f948a |
gboolean
|
|
|
60f948a |
gnome_volume_applet_setup (GnomeVolumeApplet *applet,
|
|
|
60f948a |
GList *elements)
|
|
|
60f948a |
@@ -411,10 +443,9 @@ gnome_volume_applet_setup (GnomeVolumeAp
|
|
|
60f948a |
component = panel_applet_get_popup_component (PANEL_APPLET (applet));
|
|
|
60f948a |
g_signal_connect (component, "ui-event", G_CALLBACK (cb_ui_event), applet);
|
|
|
60f948a |
|
|
|
60f948a |
- gnome_volume_applet_refresh (applet, TRUE);
|
|
|
60f948a |
- if (res) {
|
|
|
60f948a |
- applet->timeout = g_timeout_add (100, cb_check, applet);
|
|
|
60f948a |
- }
|
|
|
60f948a |
+ gnome_volume_applet_refresh (applet, TRUE, -1, -1);
|
|
|
60f948a |
+ if (res)
|
|
|
60f948a |
+ gnome_volume_applet_setup_timeout (applet);
|
|
|
60f948a |
|
|
|
60f948a |
if (res) {
|
|
|
60f948a |
/* gconf */
|
|
|
60f948a |
@@ -455,6 +486,11 @@ gnome_volume_applet_dispose (GObject *ob
|
|
|
60f948a |
g_list_free (applet->elements);
|
|
|
60f948a |
applet->elements = NULL;
|
|
|
60f948a |
}
|
|
|
60f948a |
+ gst_bus_remove_signal_watch (applet->bus);
|
|
|
60f948a |
+ if (applet->bus) {
|
|
|
60f948a |
+ gst_object_unref (applet->bus);
|
|
|
60f948a |
+ applet->bus = NULL;
|
|
|
60f948a |
+ }
|
|
|
60f948a |
|
|
|
60f948a |
if (applet->tracks) {
|
|
|
60f948a |
g_list_foreach (applet->tracks, (GFunc) g_object_unref, NULL);
|
|
|
60f948a |
@@ -649,11 +685,11 @@ gnome_volume_applet_toggle_mute (GnomeVo
|
|
|
60f948a |
component = panel_applet_get_popup_component (PANEL_APPLET (applet));
|
|
|
60f948a |
bonobo_ui_component_set_prop (component,
|
|
|
60f948a |
"/commands/Mute",
|
|
|
60f948a |
- "state", mute ? "1" : "0", NULL);
|
|
|
60f948a |
+ "state", !mute ? "1" : "0", NULL);
|
|
|
60f948a |
|
|
|
60f948a |
/* update graphic - this should happen automagically after the next
|
|
|
60f948a |
* idle call, but apparently doesn't for some people... */
|
|
|
60f948a |
- gnome_volume_applet_refresh (applet, TRUE);
|
|
|
60f948a |
+ gnome_volume_applet_refresh (applet, TRUE, -1, !mute);
|
|
|
60f948a |
}
|
|
|
60f948a |
|
|
|
60f948a |
/*
|
|
|
60f948a |
@@ -916,7 +952,7 @@ void gnome_volume_applet_size_allocate (
|
|
|
60f948a |
}
|
|
|
60f948a |
|
|
|
60f948a |
init_pixbufs (applet);
|
|
|
60f948a |
- gnome_volume_applet_refresh (applet, TRUE);
|
|
|
60f948a |
+ gnome_volume_applet_refresh (applet, TRUE, -1, -1);
|
|
|
60f948a |
}
|
|
|
60f948a |
|
|
|
60f948a |
static void
|
|
|
60f948a |
@@ -966,15 +1002,23 @@ gnome_volume_applet_adjust_volume (GstMi
|
|
|
60f948a |
{
|
|
|
60f948a |
int range = track->max_volume - track->min_volume;
|
|
|
60f948a |
gdouble scale = ((gdouble) range) / 100;
|
|
|
60f948a |
- int *volumes, n;
|
|
|
60f948a |
+ int *volumes, n, volint;
|
|
|
60f948a |
|
|
|
60f948a |
- volume *= scale;
|
|
|
60f948a |
- volume += track->min_volume;
|
|
|
60f948a |
+ if (volume == 1.0) {
|
|
|
60f948a |
+ volint = track->max_volume;
|
|
|
60f948a |
+ } else if (volume == 0.0) {
|
|
|
60f948a |
+ volint = track->min_volume;
|
|
|
60f948a |
+ } else {
|
|
|
60f948a |
+ volume *= scale;
|
|
|
60f948a |
+ volume += track->min_volume;
|
|
|
60f948a |
+ volint = lrint (volume);
|
|
|
60f948a |
+ }
|
|
|
60f948a |
|
|
|
60f948a |
volumes = g_new (gint, track->num_channels);
|
|
|
60f948a |
for (n = 0; n < track->num_channels; n++)
|
|
|
60f948a |
- volumes[n] = lrint (volume);
|
|
|
60f948a |
+ volumes[n] = volint;
|
|
|
60f948a |
gst_mixer_set_volume (mixer, track, volumes);
|
|
|
60f948a |
+
|
|
|
60f948a |
g_free (volumes);
|
|
|
60f948a |
}
|
|
|
60f948a |
|
|
|
60f948a |
@@ -1025,6 +1069,8 @@ cb_volume (GtkAdjustment *adj,
|
|
|
60f948a |
|
|
|
60f948a |
applet->lock = FALSE;
|
|
|
60f948a |
applet->force_next_update = TRUE;
|
|
|
60f948a |
+
|
|
|
60f948a |
+ gnome_volume_applet_refresh (GNOME_VOLUME_APPLET (data), FALSE, v, -1);
|
|
|
60f948a |
}
|
|
|
60f948a |
|
|
|
60f948a |
/*
|
|
|
60f948a |
@@ -1035,31 +1081,39 @@ cb_volume (GtkAdjustment *adj,
|
|
|
60f948a |
|
|
|
60f948a |
static gboolean
|
|
|
60f948a |
gnome_volume_applet_refresh (GnomeVolumeApplet *applet,
|
|
|
60f948a |
- gboolean force_refresh)
|
|
|
60f948a |
+ gboolean force_refresh,
|
|
|
60f948a |
+ gdouble volume,
|
|
|
60f948a |
+ gint mute)
|
|
|
60f948a |
{
|
|
|
60f948a |
BonoboUIComponent *component;
|
|
|
60f948a |
GdkPixbuf *pixbuf;
|
|
|
60f948a |
gint n;
|
|
|
60f948a |
- gdouble volume;
|
|
|
60f948a |
- gboolean mute, did_change;
|
|
|
60f948a |
+ gboolean show_mute, did_change;
|
|
|
60f948a |
gchar *tooltip_str;
|
|
|
60f948a |
GstMixerTrack *first_track;
|
|
|
60f948a |
GString *track_names;
|
|
|
60f948a |
GList *iter;
|
|
|
60f948a |
|
|
|
60f948a |
+ show_mute = 0;
|
|
|
60f948a |
+
|
|
|
60f948a |
if (!applet->mixer) {
|
|
|
60f948a |
n = 0;
|
|
|
60f948a |
- mute = FALSE;
|
|
|
60f948a |
+ show_mute = 1;
|
|
|
60f948a |
+ mute = 0;
|
|
|
60f948a |
} else if (!applet->tracks) {
|
|
|
60f948a |
return FALSE;
|
|
|
60f948a |
} else {
|
|
|
60f948a |
- /* only first track */
|
|
|
60f948a |
first_track = g_list_first (applet->tracks)->data;
|
|
|
60f948a |
- volume = gnome_volume_applet_get_volume (applet->mixer, first_track);
|
|
|
60f948a |
- mute = GST_MIXER_TRACK_HAS_FLAG (first_track,
|
|
|
60f948a |
- GST_MIXER_TRACK_MUTE);
|
|
|
60f948a |
- if (volume <= 0) {
|
|
|
60f948a |
- mute = TRUE;
|
|
|
60f948a |
+ if (volume == -1) {
|
|
|
60f948a |
+ /* only first track */
|
|
|
60f948a |
+ volume = gnome_volume_applet_get_volume (applet->mixer, first_track);
|
|
|
60f948a |
+ }
|
|
|
60f948a |
+ if (mute == -1) {
|
|
|
60f948a |
+ mute = GST_MIXER_TRACK_HAS_FLAG (first_track,
|
|
|
60f948a |
+ GST_MIXER_TRACK_MUTE) ? 1 : 0;
|
|
|
60f948a |
+ }
|
|
|
60f948a |
+ if (volume <= 0 || mute) {
|
|
|
60f948a |
+ show_mute = 1;
|
|
|
60f948a |
n = 0;
|
|
|
60f948a |
}
|
|
|
60f948a |
else {
|
|
|
60f948a |
@@ -1077,7 +1131,7 @@ gnome_volume_applet_refresh (GnomeVolume
|
|
|
60f948a |
applet->force_next_update = FALSE;
|
|
|
60f948a |
|
|
|
60f948a |
if (did_change) {
|
|
|
60f948a |
- if (mute) {
|
|
|
60f948a |
+ if (show_mute) {
|
|
|
60f948a |
pixbuf = applet->pix[0];
|
|
|
60f948a |
} else {
|
|
|
60f948a |
pixbuf = applet->pix[n];
|
|
|
60f948a |
@@ -1101,7 +1155,7 @@ gnome_volume_applet_refresh (GnomeVolume
|
|
|
60f948a |
track_names = g_string_append (track_names, track->label);
|
|
|
60f948a |
}
|
|
|
60f948a |
|
|
|
60f948a |
- if (mute) {
|
|
|
60f948a |
+ if (show_mute) {
|
|
|
60f948a |
tooltip_str = g_strdup_printf (_("%s: muted"), track_names->str);
|
|
|
60f948a |
} else {
|
|
|
60f948a |
/* Translator comment: I'm not all too sure if this makes sense
|
|
|
60f948a |
@@ -1129,6 +1183,52 @@ gnome_volume_applet_refresh (GnomeVolume
|
|
|
60f948a |
return did_change;
|
|
|
60f948a |
}
|
|
|
60f948a |
|
|
|
60f948a |
+static void
|
|
|
60f948a |
+cb_notify_message (GstBus *bus, GstMessage *message, gpointer data)
|
|
|
60f948a |
+{
|
|
|
60f948a |
+ GnomeVolumeApplet *applet = GNOME_VOLUME_APPLET (data);
|
|
|
60f948a |
+ GstMixerMessageType type;
|
|
|
60f948a |
+ GstMixerTrack *first_track;
|
|
|
60f948a |
+ GstMixerTrack *track = NULL;
|
|
|
60f948a |
+ gint mute;
|
|
|
60f948a |
+ gdouble volume;
|
|
|
60f948a |
+
|
|
|
60f948a |
+ if (applet->tracks == NULL ||
|
|
|
60f948a |
+ GST_MESSAGE_SRC (message) != GST_OBJECT (applet->mixer)) {
|
|
|
60f948a |
+ /* No tracks, or not from our mixer - can't update anything anyway */
|
|
|
60f948a |
+ return;
|
|
|
60f948a |
+ }
|
|
|
60f948a |
+
|
|
|
60f948a |
+ volume = mute = -1;
|
|
|
60f948a |
+
|
|
|
60f948a |
+ first_track = g_list_first (applet->tracks)->data;
|
|
|
60f948a |
+
|
|
|
60f948a |
+ /* This code only calls refresh if the first_track changes, because the
|
|
|
60f948a |
+ * refresh code only retrieves the current value from that track anyway */
|
|
|
60f948a |
+ type = gst_mixer_message_get_type (message);
|
|
|
60f948a |
+ if (type == GST_MIXER_MESSAGE_MUTE_TOGGLED) {
|
|
|
60f948a |
+ gboolean muted;
|
|
|
60f948a |
+ gst_mixer_message_parse_mute_toggled (message, &track, &muted);
|
|
|
60f948a |
+ mute = muted ? 1 : 0;
|
|
|
60f948a |
+ }
|
|
|
60f948a |
+ else if (type == GST_MIXER_MESSAGE_VOLUME_CHANGED) {
|
|
|
60f948a |
+ gint n, num_channels, *vols;
|
|
|
60f948a |
+ volume = 0.0;
|
|
|
60f948a |
+
|
|
|
60f948a |
+ gst_mixer_message_parse_volume_changed (message, &track, &vols, &num_channels);
|
|
|
60f948a |
+ for (n = 0; n < num_channels; n++)
|
|
|
60f948a |
+ volume += vols[n];
|
|
|
60f948a |
+ volume /= track->num_channels;
|
|
|
60f948a |
+ volume = 100 * volume / (track->max_volume - track->min_volume);
|
|
|
60f948a |
+ } else
|
|
|
60f948a |
+ {
|
|
|
60f948a |
+ return;
|
|
|
60f948a |
+ }
|
|
|
60f948a |
+
|
|
|
60f948a |
+ if (first_track == track)
|
|
|
60f948a |
+ gnome_volume_applet_refresh (GNOME_VOLUME_APPLET (data), FALSE, volume, mute);
|
|
|
60f948a |
+}
|
|
|
60f948a |
+
|
|
|
60f948a |
static gboolean
|
|
|
60f948a |
cb_check (gpointer data)
|
|
|
60f948a |
{
|
|
|
60f948a |
@@ -1146,7 +1246,7 @@ cb_check (gpointer data)
|
|
|
60f948a |
*/
|
|
|
60f948a |
if (time_counter % timeout == 0 || recent_change) {
|
|
|
60f948a |
did_change = gnome_volume_applet_refresh (GNOME_VOLUME_APPLET (data),
|
|
|
60f948a |
- FALSE);
|
|
|
60f948a |
+ FALSE, -1, -1);
|
|
|
60f948a |
|
|
|
60f948a |
/*
|
|
|
60f948a |
* If a change was done, set recent_change so that the update is
|
|
|
60f948a |
@@ -1227,6 +1327,8 @@ cb_gconf (GConfClient *client,
|
|
|
60f948a |
/* save */
|
|
|
60f948a |
gst_object_replace ((GstObject **) &applet->mixer, item->data);
|
|
|
60f948a |
gst_element_set_state (old_element, GST_STATE_NULL);
|
|
|
60f948a |
+
|
|
|
60f948a |
+ gnome_volume_applet_setup_timeout (applet);
|
|
|
60f948a |
newdevice = TRUE;
|
|
|
60f948a |
}
|
|
|
60f948a |
break;
|
|
|
60f948a |
@@ -1387,7 +1489,7 @@ cb_theme_change (GtkIconTheme *icon_them
|
|
|
60f948a |
GnomeVolumeApplet *applet = GNOME_VOLUME_APPLET (data);
|
|
|
60f948a |
|
|
|
60f948a |
init_pixbufs (applet);
|
|
|
60f948a |
- gnome_volume_applet_refresh (applet, TRUE);
|
|
|
60f948a |
+ gnome_volume_applet_refresh (applet, TRUE, -1, -1);
|
|
|
60f948a |
}
|
|
|
60f948a |
|
|
|
60f948a |
/*
|