gnome-media r4087 - in trunk/gnome-volume-control: . src



Author: mccann
Date: Fri Dec 12 05:37:23 2008
New Revision: 4087
URL: http://svn.gnome.org/viewvc/gnome-media?rev=4087&view=rev

Log:
2008-12-12  William Jon McCann  <jmccann redhat com>

	* src/gvc-mixer-control.c (update_sink), (update_source):
	* src/gvc-mixer-stream.c (gvc_mixer_stream_get_decibel),
	(gvc_mixer_stream_set_decibel), (gvc_mixer_stream_get_can_decibel),
	(gvc_mixer_stream_set_can_decibel),
	(gvc_mixer_stream_set_property), (gvc_mixer_stream_get_property),
	(gvc_mixer_stream_class_init):
	* src/gvc-mixer-stream.h:
	* src/gvc-stream-status-icon.c (update_icon):
	Add decibel level support.



Modified:
   trunk/gnome-volume-control/ChangeLog
   trunk/gnome-volume-control/src/gvc-mixer-control.c
   trunk/gnome-volume-control/src/gvc-mixer-stream.c
   trunk/gnome-volume-control/src/gvc-mixer-stream.h
   trunk/gnome-volume-control/src/gvc-stream-status-icon.c

Modified: trunk/gnome-volume-control/src/gvc-mixer-control.c
==============================================================================
--- trunk/gnome-volume-control/src/gvc-mixer-control.c	(original)
+++ trunk/gnome-volume-control/src/gvc-mixer-control.c	Fri Dec 12 05:37:23 2008
@@ -525,6 +525,12 @@
         gvc_mixer_stream_set_icon_name (stream, "audio-card");
         gvc_mixer_stream_set_volume (stream, (guint)avg_volume);
         gvc_mixer_stream_set_is_muted (stream, info->mute);
+        gvc_mixer_stream_set_can_decibel (stream, !!(info->flags & PA_SINK_DECIBEL_VOLUME));
+        if (!!(info->flags & PA_SINK_DECIBEL_VOLUME)) {
+                gdouble db;
+                db = pa_sw_volume_to_dB (avg_volume);
+                gvc_mixer_stream_set_decibel (stream, db);
+        }
 
         if (is_new) {
                 g_hash_table_insert (control->priv->sinks,
@@ -547,6 +553,7 @@
         GvcMixerStream *stream;
         gboolean        is_new;
         pa_volume_t     avg_volume;
+
 #if 1
         g_debug ("Updating source: index=%u name='%s' description='%s'",
                  info->index,
@@ -577,6 +584,12 @@
         gvc_mixer_stream_set_icon_name (stream, "audio-input-microphone");
         gvc_mixer_stream_set_volume (stream, (guint)avg_volume);
         gvc_mixer_stream_set_is_muted (stream, info->mute);
+        gvc_mixer_stream_set_can_decibel (stream, !!(info->flags & PA_SOURCE_DECIBEL_VOLUME));
+        if (!!(info->flags & PA_SINK_DECIBEL_VOLUME)) {
+                gdouble db;
+                db = pa_sw_volume_to_dB (avg_volume);
+                gvc_mixer_stream_set_decibel (stream, db);
+        }
 
         if (is_new) {
                 g_hash_table_insert (control->priv->sources,

Modified: trunk/gnome-volume-control/src/gvc-mixer-stream.c
==============================================================================
--- trunk/gnome-volume-control/src/gvc-mixer-stream.c	(original)
+++ trunk/gnome-volume-control/src/gvc-mixer-stream.c	Fri Dec 12 05:37:23 2008
@@ -42,10 +42,12 @@
         guint          index;
         guint          num_channels;
         guint          volume;
+        gdouble        decibel;
         char          *name;
         char          *description;
         char          *icon_name;
         gboolean       is_muted;
+        gboolean       can_decibel;
 };
 
 enum
@@ -59,7 +61,9 @@
         PROP_DESCRIPTION,
         PROP_ICON_NAME,
         PROP_VOLUME,
+        PROP_DECIBEL,
         PROP_IS_MUTED,
+        PROP_CAN_DECIBEL
 };
 
 static void     gvc_mixer_stream_class_init (GvcMixerStreamClass *klass);
@@ -117,6 +121,13 @@
         return stream->priv->volume;
 }
 
+gdouble
+gvc_mixer_stream_get_decibel (GvcMixerStream *stream)
+{
+        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), 0);
+        return stream->priv->decibel;
+}
+
 gboolean
 gvc_mixer_stream_set_volume (GvcMixerStream *stream,
                              pa_volume_t     volume)
@@ -132,6 +143,20 @@
 }
 
 gboolean
+gvc_mixer_stream_set_decibel (GvcMixerStream *stream,
+                              gdouble         db)
+{
+        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
+
+        if (db != stream->priv->decibel) {
+                stream->priv->decibel = db;
+                g_object_notify (G_OBJECT (stream), "decibel");
+        }
+
+        return TRUE;
+}
+
+gboolean
 gvc_mixer_stream_get_is_muted  (GvcMixerStream *stream)
 {
         g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
@@ -139,6 +164,13 @@
 }
 
 gboolean
+gvc_mixer_stream_get_can_decibel (GvcMixerStream *stream)
+{
+        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
+        return stream->priv->can_decibel;
+}
+
+gboolean
 gvc_mixer_stream_set_is_muted  (GvcMixerStream *stream,
                                 gboolean        is_muted)
 {
@@ -152,6 +184,20 @@
         return TRUE;
 }
 
+gboolean
+gvc_mixer_stream_set_can_decibel  (GvcMixerStream *stream,
+                                   gboolean        can_decibel)
+{
+        g_return_val_if_fail (GVC_IS_MIXER_STREAM (stream), FALSE);
+
+        if (can_decibel != stream->priv->can_decibel) {
+                stream->priv->can_decibel = can_decibel;
+                g_object_notify (G_OBJECT (stream), "can-decibel");
+        }
+
+        return TRUE;
+}
+
 const char *
 gvc_mixer_stream_get_name (GvcMixerStream *stream)
 {
@@ -245,9 +291,15 @@
         case PROP_VOLUME:
                 gvc_mixer_stream_set_volume (self, g_value_get_ulong (value));
                 break;
+        case PROP_DECIBEL:
+                gvc_mixer_stream_set_decibel (self, g_value_get_double (value));
+                break;
         case PROP_IS_MUTED:
                 gvc_mixer_stream_set_is_muted (self, g_value_get_boolean (value));
                 break;
+        case PROP_CAN_DECIBEL:
+                gvc_mixer_stream_set_can_decibel (self, g_value_get_boolean (value));
+                break;
         default:
                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
                 break;
@@ -287,9 +339,15 @@
         case PROP_VOLUME:
                 g_value_set_ulong (value, self->priv->volume);
                 break;
+        case PROP_DECIBEL:
+                g_value_set_double (value, self->priv->decibel);
+                break;
         case PROP_IS_MUTED:
                 g_value_set_boolean (value, self->priv->is_muted);
                 break;
+        case PROP_CAN_DECIBEL:
+                g_value_set_boolean (value, self->priv->can_decibel);
+                break;
         default:
                 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
                 break;
@@ -394,6 +452,13 @@
                                                              "The volume for this stream",
                                                              0, G_MAXULONG, 0,
                                                              G_PARAM_READWRITE|G_PARAM_CONSTRUCT));
+        g_object_class_install_property (gobject_class,
+                                         PROP_DECIBEL,
+                                         g_param_spec_double ("decibel",
+                                                              "Decibel",
+                                                              "The decibel level for this stream",
+                                                              -G_MAXDOUBLE, G_MAXDOUBLE, 0,
+                                                              G_PARAM_READWRITE|G_PARAM_CONSTRUCT));
 
         g_object_class_install_property (gobject_class,
                                          PROP_NAME,
@@ -423,6 +488,13 @@
                                                                "Whether stream is muted",
                                                                FALSE,
                                                                G_PARAM_READWRITE|G_PARAM_CONSTRUCT));
+        g_object_class_install_property (gobject_class,
+                                         PROP_CAN_DECIBEL,
+                                         g_param_spec_boolean ("can-decibel",
+                                                               "can decibel",
+                                                               "Whether stream volume can be converted to decibel units",
+                                                               FALSE,
+                                                               G_PARAM_READWRITE|G_PARAM_CONSTRUCT));
 
         g_type_class_add_private (klass, sizeof (GvcMixerStreamPrivate));
 }

Modified: trunk/gnome-volume-control/src/gvc-mixer-stream.h
==============================================================================
--- trunk/gnome-volume-control/src/gvc-mixer-stream.h	(original)
+++ trunk/gnome-volume-control/src/gvc-mixer-stream.h	Fri Dec 12 05:37:23 2008
@@ -60,10 +60,12 @@
 guint               gvc_mixer_stream_get_num_channels (GvcMixerStream *stream);
 
 guint               gvc_mixer_stream_get_volume      (GvcMixerStream *stream);
+gdouble             gvc_mixer_stream_get_decibel     (GvcMixerStream *stream);
 gboolean            gvc_mixer_stream_change_volume   (GvcMixerStream *stream,
                                                       guint           volume);
 
 gboolean            gvc_mixer_stream_get_is_muted    (GvcMixerStream *stream);
+gboolean            gvc_mixer_stream_get_can_decibel (GvcMixerStream *stream);
 gboolean            gvc_mixer_stream_change_is_muted (GvcMixerStream *stream,
                                                       gboolean        is_muted);
 const char *        gvc_mixer_stream_get_name        (GvcMixerStream *stream);
@@ -73,8 +75,12 @@
 /* private */
 gboolean            gvc_mixer_stream_set_volume      (GvcMixerStream *stream,
                                                       guint           volume);
+gboolean            gvc_mixer_stream_set_decibel     (GvcMixerStream *stream,
+                                                      gdouble         db);
 gboolean            gvc_mixer_stream_set_is_muted    (GvcMixerStream *stream,
                                                       gboolean        is_muted);
+gboolean            gvc_mixer_stream_set_can_decibel (GvcMixerStream *stream,
+                                                      gboolean        can_decibel);
 gboolean            gvc_mixer_stream_set_name        (GvcMixerStream *stream,
                                                       const char     *name);
 gboolean            gvc_mixer_stream_set_description (GvcMixerStream *stream,

Modified: trunk/gnome-volume-control/src/gvc-stream-status-icon.c
==============================================================================
--- trunk/gnome-volume-control/src/gvc-stream-status-icon.c	(original)
+++ trunk/gnome-volume-control/src/gvc-stream-status-icon.c	Fri Dec 12 05:37:23 2008
@@ -361,6 +361,8 @@
         gboolean is_muted;
         guint    n;
         char    *markup;
+        gboolean can_decibel;
+        gdouble  db;
 
         if (icon->priv->mixer_stream == NULL) {
                 return;
@@ -368,6 +370,8 @@
 
         volume = gvc_mixer_stream_get_volume (icon->priv->mixer_stream);
         is_muted = gvc_mixer_stream_get_is_muted (icon->priv->mixer_stream);
+        db = gvc_mixer_stream_get_decibel (icon->priv->mixer_stream);
+        can_decibel = gvc_mixer_stream_get_can_decibel (icon->priv->mixer_stream);
 
         /* select image */
         if (volume <= 0 || is_muted) {
@@ -389,10 +393,28 @@
                 icon->priv->current_icon = n;
         }
 
-        markup = g_strdup_printf ("<b>%s: %.0f%%</b>\n<small>%s</small>",
-                                  icon->priv->display_name,
-                                  100 * (float)volume / PA_VOLUME_NORM,
-                                  gvc_mixer_stream_get_description (icon->priv->mixer_stream));
+        if (is_muted) {
+                markup = g_strdup_printf ("<b>%s: %s</b>\n<small>%s</small>",
+                                          icon->priv->display_name,
+                                          _("Muted"),
+                                          gvc_mixer_stream_get_description (icon->priv->mixer_stream));
+        } else if (can_decibel && (db > PA_DECIBEL_MININFTY)) {
+                markup = g_strdup_printf ("<b>%s: %.0f%%</b>\n<small>%0.2f dB\n%s</small>",
+                                          icon->priv->display_name,
+                                          100 * (float)volume / PA_VOLUME_NORM,
+                                          db,
+                                          gvc_mixer_stream_get_description (icon->priv->mixer_stream));
+        } else if (can_decibel) {
+                markup = g_strdup_printf ("<b>%s: %.0f%%</b>\n<small>-&#8734; dB\n%s</small>",
+                                          icon->priv->display_name,
+                                          100 * (float)volume / PA_VOLUME_NORM,
+                                          gvc_mixer_stream_get_description (icon->priv->mixer_stream));
+        } else {
+                markup = g_strdup_printf ("<b>%s: %.0f%%</b>\n<small>%s</small>",
+                                          icon->priv->display_name,
+                                          100 * (float)volume / PA_VOLUME_NORM,
+                                          gvc_mixer_stream_get_description (icon->priv->mixer_stream));
+        }
         gtk_status_icon_set_tooltip_markup (GTK_STATUS_ICON (icon),
                                             markup);
         g_free (markup);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]