Author: jannis
Date: 2008-06-22 01:00:20 +0000 (Sun, 22 Jun 2008)
New Revision: 27119
Modified:
xfce4-mixer/trunk/ChangeLog
xfce4-mixer/trunk/xfce4-mixer/xfce-mixer-option.c
xfce4-mixer/trunk/xfce4-mixer/xfce-mixer-option.h
xfce4-mixer/trunk/xfce4-mixer/xfce-mixer-switch.c
xfce4-mixer/trunk/xfce4-mixer/xfce-mixer-switch.h
xfce4-mixer/trunk/xfce4-mixer/xfce-mixer-track.c
xfce4-mixer/trunk/xfce4-mixer/xfce-mixer-track.h
xfce4-mixer/trunk/xfce4-mixer/xfce-mixer.c
Log:
* xfce4-mixer/xfce-mixer-track.{c,h},
xfce4-mixer/xfce-mixer-option.{c,h},
xfce4-mixer/xfce-mixer-switch.{c,h},
xfce4-mixer/xfce-mixer.c: Implement monitoring for mute,
record, volume, option and switch changes on all controls.
Works like a charm!
Modified: xfce4-mixer/trunk/ChangeLog
===================================================================
--- xfce4-mixer/trunk/ChangeLog 2008-06-21 22:27:50 UTC (rev 27118)
+++ xfce4-mixer/trunk/ChangeLog 2008-06-22 01:00:20 UTC (rev 27119)
@@ -1,3 +1,12 @@
+2008-06-22 Jannis Pohlmann <[EMAIL PROTECTED]>
+
+ * xfce4-mixer/xfce-mixer-track.{c,h},
+ xfce4-mixer/xfce-mixer-option.{c,h},
+ xfce4-mixer/xfce-mixer-switch.{c,h},
+ xfce4-mixer/xfce-mixer.c: Implement monitoring for mute,
+ record, volume, option and switch changes on all controls.
+ Works like a charm!
+
2008-06-21 Jannis Pohlmann <[EMAIL PROTECTED]>
* libxfce4mixer/xfce-mixer-card.c: Mark cards as ready when
Modified: xfce4-mixer/trunk/xfce4-mixer/xfce-mixer-option.c
===================================================================
--- xfce4-mixer/trunk/xfce4-mixer/xfce-mixer-option.c 2008-06-21 22:27:50 UTC
(rev 27118)
+++ xfce4-mixer/trunk/xfce4-mixer/xfce-mixer-option.c 2008-06-22 01:00:20 UTC
(rev 27119)
@@ -56,6 +56,10 @@
XfceMixerCard *card;
GstMixerTrack *track;
+
+ GtkWidget *combo;
+
+ gboolean ignore_signals;
};
@@ -111,6 +115,7 @@
static void
xfce_mixer_option_init (XfceMixerOption *option)
{
+ option->ignore_signals = FALSE;
}
@@ -161,7 +166,6 @@
xfce_mixer_option_create_contents (XfceMixerOption *option)
{
GstMixerOptions *options;
- GtkWidget *combo;
GtkWidget *label;
const GList *iter;
const gchar *active_option;
@@ -180,20 +184,20 @@
options = GST_MIXER_OPTIONS (option->track);
active_option = xfce_mixer_card_get_track_option (option->card,
option->track);
- combo = gtk_combo_box_new_text ();
+ option->combo = gtk_combo_box_new_text ();
for (iter = options->values, i = 0; iter != NULL; iter = g_list_next (iter),
++i)
{
- gtk_combo_box_append_text (GTK_COMBO_BOX (combo), iter->data);
+ gtk_combo_box_append_text (GTK_COMBO_BOX (option->combo), iter->data);
if (G_UNLIKELY (g_utf8_collate (active_option, iter->data) == 0))
- gtk_combo_box_set_active (GTK_COMBO_BOX (combo), i);
+ gtk_combo_box_set_active (GTK_COMBO_BOX (option->combo), i);
}
- gtk_box_pack_start (GTK_BOX (option), combo, FALSE, FALSE, 0);
- gtk_widget_show (combo);
+ gtk_box_pack_start (GTK_BOX (option), option->combo, FALSE, FALSE, 0);
+ gtk_widget_show (option->combo);
- g_signal_connect (combo, "changed", G_CALLBACK (xfce_mixer_option_changed),
option);
+ g_signal_connect (option->combo, "changed", G_CALLBACK
(xfce_mixer_option_changed), option);
g_free (title);
}
@@ -206,6 +210,9 @@
{
gchar *active_option;
+ if (G_UNLIKELY (option->ignore_signals))
+ return;
+
active_option = gtk_combo_box_get_active_text (combo);
if (G_LIKELY (active_option != NULL))
@@ -214,3 +221,45 @@
g_free (active_option);
}
}
+
+
+
+void
+xfce_mixer_option_update (XfceMixerOption *option)
+{
+ GstMixerOptions *options;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ const gchar *active_option;
+ gchar *str;
+ gint i;
+
+ g_return_if_fail (IS_XFCE_MIXER_OPTION (option));
+
+ options = GST_MIXER_OPTIONS (option->track);
+ active_option = xfce_mixer_card_get_track_option (option->card,
option->track);
+
+ model = gtk_combo_box_get_model (GTK_COMBO_BOX (option->combo));
+
+ if (gtk_tree_model_get_iter_first (model, &iter))
+ {
+ do
+ {
+ gtk_tree_model_get (model, &iter, 0, &str, -1);
+
+ if (G_UNLIKELY (g_utf8_collate (str, active_option) == 0))
+ {
+ option->ignore_signals = TRUE;
+ gtk_combo_box_set_active_iter (GTK_COMBO_BOX (option->combo),
&iter);
+ option->ignore_signals = FALSE;
+
+ g_free (str);
+
+ break;
+ }
+
+ g_free (str);
+ }
+ while (gtk_tree_model_iter_next (model, &iter));
+ }
+}
Modified: xfce4-mixer/trunk/xfce4-mixer/xfce-mixer-option.h
===================================================================
--- xfce4-mixer/trunk/xfce4-mixer/xfce-mixer-option.h 2008-06-21 22:27:50 UTC
(rev 27118)
+++ xfce4-mixer/trunk/xfce4-mixer/xfce-mixer-option.h 2008-06-22 01:00:20 UTC
(rev 27119)
@@ -41,8 +41,9 @@
GType xfce_mixer_option_get_type (void) G_GNUC_CONST;
-GtkWidget *xfce_mixer_option_new (XfceMixerCard *card,
- GstMixerTrack *track);
+GtkWidget *xfce_mixer_option_new (XfceMixerCard *card,
+ GstMixerTrack *track);
+void xfce_mixer_option_update (XfceMixerOption *option);
G_END_DECLS;
Modified: xfce4-mixer/trunk/xfce4-mixer/xfce-mixer-switch.c
===================================================================
--- xfce4-mixer/trunk/xfce4-mixer/xfce-mixer-switch.c 2008-06-21 22:27:50 UTC
(rev 27118)
+++ xfce4-mixer/trunk/xfce4-mixer/xfce-mixer-switch.c 2008-06-22 01:00:20 UTC
(rev 27119)
@@ -56,6 +56,10 @@
XfceMixerCard *card;
GstMixerTrack *track;
+
+ GtkWidget *check_button;
+
+ gboolean ignore_signals;
};
@@ -111,6 +115,7 @@
static void
xfce_mixer_switch_init (XfceMixerSwitch *mixer_switch)
{
+ mixer_switch->ignore_signals = FALSE;
}
@@ -159,23 +164,16 @@
static void
xfce_mixer_switch_create_contents (XfceMixerSwitch *mixer_switch)
{
- GtkWidget *check;
-
gtk_box_set_homogeneous (GTK_BOX (mixer_switch), FALSE);
gtk_box_set_spacing (GTK_BOX (mixer_switch), 12);
- check = gtk_check_button_new_with_mnemonic (mixer_switch->track->label);
- gtk_box_pack_start (GTK_BOX (mixer_switch), check, FALSE, FALSE, 0);
- gtk_widget_show (check);
+ mixer_switch->check_button = gtk_check_button_new_with_mnemonic
(mixer_switch->track->label);
+ gtk_box_pack_start (GTK_BOX (mixer_switch), mixer_switch->check_button,
FALSE, FALSE, 0);
+ gtk_widget_show (mixer_switch->check_button);
- if (G_LIKELY (GST_MIXER_TRACK_HAS_FLAG (mixer_switch->track,
GST_MIXER_TRACK_INPUT)))
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check),
- GST_MIXER_TRACK_HAS_FLAG
(mixer_switch->track, GST_MIXER_TRACK_RECORD));
- else
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check),
- !GST_MIXER_TRACK_HAS_FLAG
(mixer_switch->track, GST_MIXER_TRACK_MUTE));
+ xfce_mixer_switch_update (mixer_switch);
- g_signal_connect (check, "toggled", G_CALLBACK (xfce_mixer_switch_toggled),
mixer_switch);
+ g_signal_connect (mixer_switch->check_button, "toggled", G_CALLBACK
(xfce_mixer_switch_toggled), mixer_switch);
}
@@ -184,8 +182,30 @@
xfce_mixer_switch_toggled (GtkToggleButton *button,
XfceMixerSwitch *mixer_switch)
{
+ if (G_UNLIKELY (mixer_switch->ignore_signals))
+ return;
+
if (G_LIKELY (GST_MIXER_TRACK_HAS_FLAG (mixer_switch->track,
GST_MIXER_TRACK_INPUT)))
xfce_mixer_card_set_track_record (mixer_switch->card, mixer_switch->track,
gtk_toggle_button_get_active (button));
else
xfce_mixer_card_set_track_muted (mixer_switch->card, mixer_switch->track,
!gtk_toggle_button_get_active (button));
}
+
+
+
+void
+xfce_mixer_switch_update (XfceMixerSwitch *mixer_switch)
+{
+ g_return_if_fail (IS_XFCE_MIXER_SWITCH (mixer_switch));
+
+ mixer_switch->ignore_signals = TRUE;
+
+ if (G_LIKELY (GST_MIXER_TRACK_HAS_FLAG (mixer_switch->track,
GST_MIXER_TRACK_INPUT)))
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
(mixer_switch->check_button),
+ GST_MIXER_TRACK_HAS_FLAG
(mixer_switch->track, GST_MIXER_TRACK_RECORD));
+ else
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
(mixer_switch->check_button),
+ !GST_MIXER_TRACK_HAS_FLAG
(mixer_switch->track, GST_MIXER_TRACK_MUTE));
+
+ mixer_switch->ignore_signals = FALSE;
+}
Modified: xfce4-mixer/trunk/xfce4-mixer/xfce-mixer-switch.h
===================================================================
--- xfce4-mixer/trunk/xfce4-mixer/xfce-mixer-switch.h 2008-06-21 22:27:50 UTC
(rev 27118)
+++ xfce4-mixer/trunk/xfce4-mixer/xfce-mixer-switch.h 2008-06-22 01:00:20 UTC
(rev 27119)
@@ -41,8 +41,9 @@
GType xfce_mixer_switch_get_type (void) G_GNUC_CONST;
-GtkWidget *xfce_mixer_switch_new (XfceMixerCard *card,
- GstMixerTrack *track);
+GtkWidget *xfce_mixer_switch_new (XfceMixerCard *card,
+ GstMixerTrack *track);
+void xfce_mixer_switch_update (XfceMixerSwitch *mixer_switch);
G_END_DECLS;
Modified: xfce4-mixer/trunk/xfce4-mixer/xfce-mixer-track.c
===================================================================
--- xfce4-mixer/trunk/xfce4-mixer/xfce-mixer-track.c 2008-06-21 22:27:50 UTC
(rev 27118)
+++ xfce4-mixer/trunk/xfce4-mixer/xfce-mixer-track.c 2008-06-22 01:00:20 UTC
(rev 27119)
@@ -53,8 +53,6 @@
XfceMixerTrack *track);
static void xfce_mixer_track_record_toggled (GtkToggleButton *button,
XfceMixerTrack *track);
-static void xfce_mixer_track_update_mute (XfceMixerTrack *track);
-static void xfce_mixer_track_update_record (XfceMixerTrack *track);
@@ -76,6 +74,8 @@
XfceMixerCard *card;
GstMixerTrack *gst_track;
+
+ gboolean ignore_signals;
};
@@ -135,6 +135,8 @@
track->lock_button = NULL;
track->record_button = NULL;
+ track->ignore_signals = FALSE;
+
track->channel_faders = NULL;
}
@@ -281,6 +283,10 @@
* channels, but only one should deliver the change to GStreamer. */
static gboolean locked = FALSE;
+ /* Do nothing if signals are to be ignored */
+ if (G_UNLIKELY (track->ignore_signals))
+ return;
+
/* Do nothing if another fader already takes care about everything */
if (G_UNLIKELY (locked))
return;
@@ -424,22 +430,50 @@
-static void
+void
xfce_mixer_track_update_mute (XfceMixerTrack *track)
{
gboolean muted;
+ g_return_if_fail (IS_XFCE_MIXER_TRACK (track));
+
muted = GST_MIXER_TRACK_HAS_FLAG (track->gst_track, GST_MIXER_TRACK_MUTE);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (track->mute_button), muted);
}
-static void
+void
xfce_mixer_track_update_record (XfceMixerTrack *track)
{
gboolean record;
+ g_return_if_fail (IS_XFCE_MIXER_TRACK (track));
+
record = GST_MIXER_TRACK_HAS_FLAG (track->gst_track, GST_MIXER_TRACK_RECORD);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (track->record_button),
record);
}
+
+
+
+void
+xfce_mixer_track_update_volume (XfceMixerTrack *track)
+{
+ GList *iter;
+ gint *volumes;
+ gint channel;
+
+ g_return_if_fail (IS_XFCE_MIXER_TRACK (track));
+
+ volumes = g_new0 (gint, track->gst_track->num_channels);
+ xfce_mixer_card_get_track_volume (track->card, track->gst_track, volumes);
+
+ track->ignore_signals = TRUE;
+
+ for (iter = track->channel_faders, channel = 0; iter != NULL; iter =
g_list_next (iter), ++channel)
+ gtk_range_set_value (GTK_RANGE (iter->data), volumes[channel]);
+
+ track->ignore_signals = FALSE;
+
+ g_free (volumes);
+}
Modified: xfce4-mixer/trunk/xfce4-mixer/xfce-mixer-track.h
===================================================================
--- xfce4-mixer/trunk/xfce4-mixer/xfce-mixer-track.h 2008-06-21 22:27:50 UTC
(rev 27118)
+++ xfce4-mixer/trunk/xfce4-mixer/xfce-mixer-track.h 2008-06-22 01:00:20 UTC
(rev 27119)
@@ -39,10 +39,13 @@
#define IS_XFCE_MIXER_TRACK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),
TYPE_XFCE_MIXER_TRACK))
#define XFCE_MIXER_TRACK_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),
TYPE_XFCE_MIXER_TRACK, XfceMixerTrackClass))
-GType xfce_mixer_track_get_type (void) G_GNUC_CONST;
+GType xfce_mixer_track_get_type (void) G_GNUC_CONST;
-GtkWidget *xfce_mixer_track_new (XfceMixerCard *card,
- GstMixerTrack *gst_track);
+GtkWidget *xfce_mixer_track_new (XfceMixerCard *card,
+ GstMixerTrack *gst_track);
+void xfce_mixer_track_update_mute (XfceMixerTrack *track);
+void xfce_mixer_track_update_record (XfceMixerTrack *track);
+void xfce_mixer_track_update_volume (XfceMixerTrack *track);
G_END_DECLS;
Modified: xfce4-mixer/trunk/xfce4-mixer/xfce-mixer.c
===================================================================
--- xfce4-mixer/trunk/xfce4-mixer/xfce-mixer.c 2008-06-21 22:27:50 UTC (rev
27118)
+++ xfce4-mixer/trunk/xfce4-mixer/xfce-mixer.c 2008-06-22 01:00:20 UTC (rev
27119)
@@ -61,6 +61,8 @@
GtkNotebook __parent__;
XfceMixerCard *card;
+
+ GHashTable *widgets;
};
@@ -116,6 +118,7 @@
static void
xfce_mixer_init (XfceMixer *mixer)
{
+ mixer->widgets = g_hash_table_new_full (g_str_hash, g_str_equal, g_free,
NULL);
}
@@ -135,6 +138,8 @@
g_object_unref (G_OBJECT (mixer->card));
+ g_hash_table_unref (mixer->widgets);
+
(*G_OBJECT_CLASS (xfce_mixer_parent_class)->finalize) (object);
}
@@ -229,12 +234,16 @@
gtk_widget_show (track_widget);
num_children[0]++;
+
/* Append a separator. The last one will be destroyed later */
last_separator[0] = gtk_vseparator_new ();
gtk_table_attach (GTK_TABLE (views[0]), last_separator[0],
num_children[0], num_children[0] + 1, 0, 1,
GTK_SHRINK, GTK_FILL|GTK_EXPAND, 0, 0);
gtk_widget_show (last_separator[0]);
num_children[0]++;
+
+ /* Add the track to the hash table */
+ g_hash_table_insert (mixer->widgets, track->label, track_widget);
break;
case XFCE_MIXER_TRACK_TYPE_CAPTURE:
@@ -251,6 +260,9 @@
num_children[1], num_children[1] + 1, 0, 1,
GTK_SHRINK, GTK_FILL|GTK_EXPAND, 0, 0);
gtk_widget_show (last_separator[1]);
num_children[1]++;
+
+ /* Add the track to the hash table */
+ g_hash_table_insert (mixer->widgets, track->label, track_widget);
break;
case XFCE_MIXER_TRACK_TYPE_SWITCH:
@@ -258,6 +270,9 @@
gtk_box_pack_start (GTK_BOX (views[2]), track_widget, FALSE, FALSE,
0);
gtk_widget_show (track_widget);
num_children[2]++;
+
+ /* Add the track to the hash table */
+ g_hash_table_insert (mixer->widgets, track->label, track_widget);
break;
case XFCE_MIXER_TRACK_TYPE_OPTIONS:
@@ -265,6 +280,9 @@
gtk_box_pack_start (GTK_BOX (views[3]), track_widget, FALSE, FALSE,
0);
gtk_widget_show (track_widget);
num_children[3]++;
+
+ /* Add the track to the hash table */
+ g_hash_table_insert (mixer->widgets, track->label, track_widget);
break;
}
}
@@ -318,6 +336,7 @@
GstMixerMessageType type;
GstMixerOptions *options = NULL;
GstMixerTrack *track = NULL;
+ GtkWidget *widget;
gboolean muted;
gboolean record;
const gchar *option;
@@ -335,21 +354,45 @@
{
gst_mixer_message_parse_mute_toggled (message, &track, &muted);
g_debug ("Track '%s' was %s", track->label, muted ? "muted" : "unmuted");
+
+ widget = g_hash_table_lookup (mixer->widgets, track->label);
+
+ if (IS_XFCE_MIXER_TRACK (widget))
+ xfce_mixer_track_update_mute (XFCE_MIXER_TRACK (widget));
+ else if (IS_XFCE_MIXER_SWITCH (widget))
+ xfce_mixer_switch_update (XFCE_MIXER_SWITCH (widget));
}
else if (type == GST_MIXER_MESSAGE_RECORD_TOGGLED)
{
gst_mixer_message_parse_record_toggled (message, &track, &record);
g_debug ("Recording on track '%s' was %s", track->label, record ?
"turned on" : "turned off");
+
+ widget = g_hash_table_lookup (mixer->widgets, track->label);
+
+ if (IS_XFCE_MIXER_TRACK (widget))
+ xfce_mixer_track_update_record (XFCE_MIXER_TRACK (widget));
+ else if (IS_XFCE_MIXER_SWITCH (widget))
+ xfce_mixer_switch_update (XFCE_MIXER_SWITCH (widget));
}
else if (type == GST_MIXER_MESSAGE_VOLUME_CHANGED)
{
gst_mixer_message_parse_volume_changed (message, &track, &volumes,
&num_channels);
g_debug ("Volume on track '%s' changed to %i", track->label, volumes[0]);
+
+ widget = g_hash_table_lookup (mixer->widgets, track->label);
+
+ if (IS_XFCE_MIXER_TRACK (widget))
+ xfce_mixer_track_update_volume (XFCE_MIXER_TRACK (widget));
}
else if (type == GST_MIXER_MESSAGE_OPTION_CHANGED)
{
gst_mixer_message_parse_option_changed (message, &options, &option);
g_debug ("Option '%s' was set to '%s'", GST_MIXER_TRACK
(options)->label, option);
+
+ widget = g_hash_table_lookup (mixer->widgets, GST_MIXER_TRACK
(options)->label);
+
+ if (IS_XFCE_MIXER_OPTION (widget))
+ xfce_mixer_option_update (XFCE_MIXER_OPTION (widget));
}
return TRUE;
_______________________________________________
Xfce4-commits mailing list
[email protected]
http://foo-projects.org/mailman/listinfo/xfce4-commits