From ffbaee33908adccfe1afb1d7d6c0fcb79fbca6ca Mon Sep 17 00:00:00 2001 From: Michal Ratajsky Date: Sat, 9 Jan 2016 22:50:44 +0100 Subject: pulse: Handle moving of sink inputs and source outputs --- backends/pulse/pulse-sink-input.c | 87 ++++++++++++++++++++++++++++++++------- 1 file changed, 72 insertions(+), 15 deletions(-) (limited to 'backends/pulse/pulse-sink-input.c') diff --git a/backends/pulse/pulse-sink-input.c b/backends/pulse/pulse-sink-input.c index 16637c8..b65aa07 100644 --- a/backends/pulse/pulse-sink-input.c +++ b/backends/pulse/pulse-sink-input.c @@ -30,11 +30,20 @@ #include "pulse-stream.h" #include "pulse-stream-control.h" +enum { + STREAM_CHANGED_BY_REQUEST, + N_SIGNALS +}; + +static guint signals[N_SIGNALS] = { 0, }; + static void pulse_sink_input_class_init (PulseSinkInputClass *klass); static void pulse_sink_input_init (PulseSinkInput *input); G_DEFINE_TYPE (PulseSinkInput, pulse_sink_input, PULSE_TYPE_STREAM_CONTROL); +static gboolean pulse_sink_input_set_stream (MateMixerStreamControl *mmsc, + MateMixerStream *mms); static guint pulse_sink_input_get_max_volume (MateMixerStreamControl *mmsc); static gboolean pulse_sink_input_set_mute (PulseStreamControl *psc, @@ -50,12 +59,25 @@ pulse_sink_input_class_init (PulseSinkInputClass *klass) PulseStreamControlClass *control_class; mmsc_class = MATE_MIXER_STREAM_CONTROL_CLASS (klass); + mmsc_class->set_stream = pulse_sink_input_set_stream; mmsc_class->get_max_volume = pulse_sink_input_get_max_volume; control_class = PULSE_STREAM_CONTROL_CLASS (klass); control_class->set_mute = pulse_sink_input_set_mute; control_class->set_volume = pulse_sink_input_set_volume; control_class->create_monitor = pulse_sink_input_create_monitor; + + signals[STREAM_CHANGED_BY_REQUEST] = + g_signal_new ("stream-changed-by-request", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (PulseSinkInputClass, stream_changed_by_request), + NULL, + NULL, + g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, + 1, + G_TYPE_OBJECT); } static void @@ -76,6 +98,7 @@ pulse_sink_input_new (PulseConnection *connection, MateMixerStreamControlFlags flags = MATE_MIXER_STREAM_CONTROL_MUTE_READABLE | MATE_MIXER_STREAM_CONTROL_MUTE_WRITABLE | + MATE_MIXER_STREAM_CONTROL_MOVABLE | MATE_MIXER_STREAM_CONTROL_HAS_MONITOR; MateMixerStreamControlRole role = MATE_MIXER_STREAM_CONTROL_ROLE_UNKNOWN; @@ -157,36 +180,70 @@ pulse_sink_input_new (PulseConnection *connection, TRUE); } - pulse_sink_input_update (input, info); + /* Read the rest of the input's values, parent was already given during + * the construction */ + pulse_sink_input_update (input, info, NULL); return input; } void -pulse_sink_input_update (PulseSinkInput *input, const pa_sink_input_info *info) +pulse_sink_input_update (PulseSinkInput *input, + const pa_sink_input_info *info, + PulseSink *parent) { g_return_if_fail (PULSE_IS_SINK_INPUT (input)); - g_return_if_fail (info != NULL); + g_return_if_fail (parent == NULL || PULSE_IS_SINK (parent)); /* Let all the information update before emitting notify signals */ g_object_freeze_notify (G_OBJECT (input)); - _mate_mixer_stream_control_set_mute (MATE_MIXER_STREAM_CONTROL (input), - info->mute ? TRUE : FALSE); + if (info != NULL) { + _mate_mixer_stream_control_set_mute (MATE_MIXER_STREAM_CONTROL (input), + info->mute ? TRUE : FALSE); + + pulse_stream_control_set_channel_map (PULSE_STREAM_CONTROL (input), + &info->channel_map); + if (info->has_volume) + pulse_stream_control_set_cvolume (PULSE_STREAM_CONTROL (input), + &info->volume, + 0); + else + pulse_stream_control_set_cvolume (PULSE_STREAM_CONTROL (input), + NULL, + 0); + } - pulse_stream_control_set_channel_map (PULSE_STREAM_CONTROL (input), - &info->channel_map); - if (info->has_volume) - pulse_stream_control_set_cvolume (PULSE_STREAM_CONTROL (input), - &info->volume, - 0); - else - pulse_stream_control_set_cvolume (PULSE_STREAM_CONTROL (input), - NULL, - 0); + /* Sink input must always have a parent sink, but it is possible to + * pass a NULL parent to indicate that it has not changed */ + if (parent != NULL) + _mate_mixer_stream_control_set_stream (MATE_MIXER_STREAM_CONTROL (input), + MATE_MIXER_STREAM (parent)); g_object_thaw_notify (G_OBJECT (input)); } +static gboolean +pulse_sink_input_set_stream (MateMixerStreamControl *mmsc, MateMixerStream *mms) +{ + PulseStreamControl *psc; + gboolean ret; + + g_return_val_if_fail (PULSE_IS_SINK_INPUT (mmsc), FALSE); + g_return_val_if_fail (PULSE_IS_SINK (mms), FALSE); + + psc = PULSE_STREAM_CONTROL (mmsc); + ret = pulse_connection_move_sink_input (pulse_stream_control_get_connection (psc), + pulse_stream_control_get_index (psc), + pulse_stream_get_index (PULSE_STREAM (mms))); + if (ret == TRUE) + g_signal_emit (G_OBJECT (psc), + signals[STREAM_CHANGED_BY_REQUEST], + 0, + mms); + + return ret; +} + static guint pulse_sink_input_get_max_volume (MateMixerStreamControl *mmsc) { -- cgit v1.2.1