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

Reply via email to