summaryrefslogtreecommitdiff
path: root/backends/pulse/pulse-sink-input.c
diff options
context:
space:
mode:
Diffstat (limited to 'backends/pulse/pulse-sink-input.c')
-rw-r--r--backends/pulse/pulse-sink-input.c87
1 files changed, 72 insertions, 15 deletions
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)
{