diff options
Diffstat (limited to 'plugins/media-keys/msd-media-keys-manager.c')
-rw-r--r-- | plugins/media-keys/msd-media-keys-manager.c | 101 |
1 files changed, 88 insertions, 13 deletions
diff --git a/plugins/media-keys/msd-media-keys-manager.c b/plugins/media-keys/msd-media-keys-manager.c index 33ac891..7a82cab 100644 --- a/plugins/media-keys/msd-media-keys-manager.c +++ b/plugins/media-keys/msd-media-keys-manager.c @@ -73,7 +73,9 @@ struct _MsdMediaKeysManagerPrivate /* Volume bits */ MateMixerContext *context; MateMixerStream *stream; + MateMixerStream *source_stream; MateMixerStreamControl *control; + MateMixerStreamControl *source_control; #endif GtkWidget *dialog; GSettings *settings; @@ -635,15 +637,21 @@ update_dialog (MsdMediaKeysManager *manager, guint volume, gboolean muted, gboolean sound_changed, - gboolean quiet) + gboolean quiet, + gboolean is_mic) { if (muted) volume = 0.0; dialog_init (manager); - msd_media_keys_window_set_volume_muted (MSD_MEDIA_KEYS_WINDOW (manager->priv->dialog), - muted); + if (is_mic) + msd_media_keys_window_set_mic_muted (MSD_MEDIA_KEYS_WINDOW (manager->priv->dialog), + muted); + else + msd_media_keys_window_set_volume_muted (MSD_MEDIA_KEYS_WINDOW (manager->priv->dialog), + muted); + msd_media_keys_window_set_volume_level (MSD_MEDIA_KEYS_WINDOW (manager->priv->dialog), volume); @@ -652,7 +660,7 @@ update_dialog (MsdMediaKeysManager *manager, dialog_show (manager); #ifdef HAVE_LIBCANBERRA - if (quiet == FALSE && sound_changed != FALSE && muted == FALSE) + if (quiet == FALSE && sound_changed != FALSE && muted == FALSE && is_mic == FALSE) ca_gtk_play_for_widget (manager->priv->dialog, 0, CA_PROP_EVENT_ID, "audio-volume-change", CA_PROP_EVENT_DESCRIPTION, "Volume changed through key press", @@ -675,14 +683,21 @@ do_sound_action (MsdMediaKeysManager *manager, guint volume_min, volume_max; guint volume_step; guint volume_last; + MateMixerStreamControl *control; - if (manager->priv->control == NULL) + gboolean is_input_control = + type == MIC_MUTE_KEY ? TRUE : FALSE; + if (is_input_control) + control = manager->priv->source_control; + else + control = manager->priv->control; + if (control == NULL) return; /* Theoretically the volume limits might be different for different * streams, also the minimum might not always start at 0 */ - volume_min = mate_mixer_stream_control_get_min_volume (manager->priv->control); - volume_max = mate_mixer_stream_control_get_normal_volume (manager->priv->control); + volume_min = mate_mixer_stream_control_get_min_volume (control); + volume_max = mate_mixer_stream_control_get_normal_volume (control); volume_step = g_settings_get_int (manager->priv->settings, "volume-step"); if (volume_step <= 0 || @@ -693,12 +708,13 @@ do_sound_action (MsdMediaKeysManager *manager, volume_step = (volume_max - volume_min) * volume_step / 100; volume = volume_last = - mate_mixer_stream_control_get_volume (manager->priv->control); + mate_mixer_stream_control_get_volume (control); muted = muted_last = - mate_mixer_stream_control_get_mute (manager->priv->control); + mate_mixer_stream_control_get_mute (control); switch (type) { case MUTE_KEY: + case MIC_MUTE_KEY: muted = !muted; break; case VOLUME_DOWN_KEY: @@ -723,13 +739,14 @@ do_sound_action (MsdMediaKeysManager *manager, } if (muted != muted_last) { - if (mate_mixer_stream_control_set_mute (manager->priv->control, muted)) + if (mate_mixer_stream_control_set_mute (control, muted)) sound_changed = TRUE; else muted = muted_last; } - if (volume != mate_mixer_stream_control_get_volume (manager->priv->control)) { - if (mate_mixer_stream_control_set_volume (manager->priv->control, volume)) + + if (volume != mate_mixer_stream_control_get_volume (control)) { + if (mate_mixer_stream_control_set_volume (control, volume)) sound_changed = TRUE; else volume = volume_last; @@ -739,7 +756,8 @@ do_sound_action (MsdMediaKeysManager *manager, CLAMP (100 * volume / (volume_max - volume_min), 0, 100), muted, sound_changed, - quiet); + quiet, + is_input_control); } static void @@ -776,11 +794,44 @@ update_default_output (MsdMediaKeysManager *manager) } static void +update_default_input (MsdMediaKeysManager *manager) +{ + MateMixerStream *stream; + MateMixerStreamControl *control = NULL; + + stream = mate_mixer_context_get_default_input_stream (manager->priv->context); + if (stream != NULL) + control = mate_mixer_stream_get_default_control (stream); + + if (stream == manager->priv->source_stream) + return; + + g_clear_object (&manager->priv->source_stream); + g_clear_object (&manager->priv->source_control); + + if (control != NULL) { + MateMixerStreamControlFlags flags = mate_mixer_stream_control_get_flags (control); + + /* Do not use the stream if it is not possible to mute it or + * change the volume */ + if (!(flags & MATE_MIXER_STREAM_CONTROL_MUTE_WRITABLE)) + return; + + manager->priv->source_stream = g_object_ref (stream); + manager->priv->source_control = g_object_ref (control); + g_debug ("Default input stream updated to %s", + mate_mixer_stream_get_name (stream)); + } else + g_debug ("Default input stream unset"); +} + +static void on_context_state_notify (MateMixerContext *context, GParamSpec *pspec, MsdMediaKeysManager *manager) { update_default_output (manager); + update_default_input (manager); } static void @@ -792,6 +843,14 @@ on_context_default_output_notify (MateMixerContext *context, } static void +on_context_default_input_notify (MateMixerContext *context, + GParamSpec *pspec, + MsdMediaKeysManager *manager) +{ + update_default_input (manager); +} + +static void on_context_stream_removed (MateMixerContext *context, const gchar *name, MsdMediaKeysManager *manager) @@ -805,6 +864,15 @@ on_context_stream_removed (MateMixerContext *context, g_clear_object (&manager->priv->control); } } + if (manager->priv->source_stream != NULL) { + MateMixerStream *stream = + mate_mixer_context_get_stream (manager->priv->context, name); + + if (stream == manager->priv->source_stream) { + g_clear_object (&manager->priv->source_stream); + g_clear_object (&manager->priv->source_control); + } + } } #endif /* HAVE_LIBMATEMIXER */ @@ -1102,6 +1170,7 @@ do_action (MsdMediaKeysManager *manager, case MUTE_KEY: case VOLUME_DOWN_KEY: case VOLUME_UP_KEY: + case MIC_MUTE_KEY: #ifdef HAVE_LIBMATEMIXER do_sound_action (manager, type, FALSE); #endif @@ -1399,6 +1468,10 @@ msd_media_keys_manager_start (MsdMediaKeysManager *manager, GError **error) G_CALLBACK (on_context_default_output_notify), manager); g_signal_connect (manager->priv->context, + "notify::default-input-stream", + G_CALLBACK (on_context_default_input_notify), + manager); + g_signal_connect (manager->priv->context, "stream-removed", G_CALLBACK (on_context_stream_removed), manager); @@ -1483,7 +1556,9 @@ msd_media_keys_manager_stop (MsdMediaKeysManager *manager) #ifdef HAVE_LIBMATEMIXER g_clear_object (&priv->stream); + g_clear_object (&priv->source_stream); g_clear_object (&priv->control); + g_clear_object (&priv->source_control); g_clear_object (&priv->context); #endif |