From d4eda71c49bb458eda7cf9d22d47002b8528552c Mon Sep 17 00:00:00 2001 From: Carlos Silva Date: Sun, 10 Jan 2016 02:38:59 +0000 Subject: [PATCH] gvc-mixer-source-output: Update volume and mute status This commit implements notifying about volume and mute status changes for source outputs (applications that monitor the microphone, in short). https://bugzilla.gnome.org/show_bug.cgi?id=760387 --- gvc-mixer-control.c | 5 ++++ gvc-mixer-source-output.c | 52 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/gvc-mixer-control.c b/gvc-mixer-control.c index e62edf4..2177956 100644 --- a/gvc-mixer-control.c +++ b/gvc-mixer-control.c @@ -1776,6 +1776,7 @@ update_source_output (GvcMixerControl *control, { GvcMixerStream *stream; gboolean is_new; + pa_volume_t max_volume; const char *name; #if 1 @@ -1802,10 +1803,14 @@ update_source_output (GvcMixerControl *control, name = (const char *)g_hash_table_lookup (control->priv->clients, GUINT_TO_POINTER (info->client)); + max_volume = pa_cvolume_max (&info->volume); + gvc_mixer_stream_set_name (stream, name); gvc_mixer_stream_set_description (stream, info->name); set_application_id_from_proplist (stream, info->proplist); set_is_event_stream_from_proplist (stream, info->proplist); + gvc_mixer_stream_set_volume (stream, (guint)max_volume); + gvc_mixer_stream_set_is_muted (stream, info->mute); set_icon_name_from_proplist (stream, info->proplist, "audio-input-microphone"); if (is_new) { diff --git a/gvc-mixer-source-output.c b/gvc-mixer-source-output.c index dc856d0..664bb94 100644 --- a/gvc-mixer-source-output.c +++ b/gvc-mixer-source-output.c @@ -30,6 +30,8 @@ #include #include "gvc-mixer-source-output.h" +#include "gvc-mixer-stream-private.h" +#include "gvc-channel-map-private.h" #define GVC_MIXER_SOURCE_OUTPUT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GVC_TYPE_MIXER_SOURCE_OUTPUT, GvcMixerSourceOutputPrivate)) @@ -45,8 +47,33 @@ G_DEFINE_TYPE (GvcMixerSourceOutput, gvc_mixer_source_output, GVC_TYPE_MIXER_STR static gboolean gvc_mixer_source_output_push_volume (GvcMixerStream *stream, gpointer *op) { - /* FIXME: */ - *op = NULL; + pa_operation *o; + guint index; + const GvcChannelMap *map; + pa_context *context; + const pa_cvolume *cv; + + index = gvc_mixer_stream_get_index (stream); + + map = gvc_mixer_stream_get_channel_map (stream); + + cv = gvc_channel_map_get_cvolume(map); + + context = gvc_mixer_stream_get_pa_context (stream); + + o = pa_context_set_source_output_volume (context, + index, + cv, + NULL, + NULL); + + if (o == NULL) { + g_warning ("pa_context_set_source_output_volume() failed"); + return FALSE; + } + + *op = o; + return TRUE; } @@ -54,7 +81,26 @@ static gboolean gvc_mixer_source_output_change_is_muted (GvcMixerStream *stream, gboolean is_muted) { - /* FIXME: */ + pa_operation *o; + guint index; + pa_context *context; + + index = gvc_mixer_stream_get_index (stream); + context = gvc_mixer_stream_get_pa_context (stream); + + o = pa_context_set_source_output_mute (context, + index, + is_muted, + NULL, + NULL); + + if (o == NULL) { + g_warning ("pa_context_set_source_output_mute_by_index() failed"); + return FALSE; + } + + pa_operation_unref(o); + return TRUE; }