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 Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits