summaryrefslogtreecommitdiff
path: root/backends/pulse/pulse-source.c
diff options
context:
space:
mode:
Diffstat (limited to 'backends/pulse/pulse-source.c')
-rw-r--r--backends/pulse/pulse-source.c170
1 files changed, 89 insertions, 81 deletions
diff --git a/backends/pulse/pulse-source.c b/backends/pulse/pulse-source.c
index 2aea6b6..e4de5fa 100644
--- a/backends/pulse/pulse-source.c
+++ b/backends/pulse/pulse-source.c
@@ -24,30 +24,22 @@
#include <pulse/pulseaudio.h>
#include "pulse-connection.h"
+#include "pulse-monitor.h"
#include "pulse-stream.h"
#include "pulse-source.h"
-struct _PulseSourcePrivate
-{
- guint32 index_monitored_sink;
-};
-
-static gboolean source_set_mute (MateMixerStream *stream,
- gboolean mute);
-static gboolean source_set_volume (MateMixerStream *stream,
- pa_cvolume *volume);
-static gboolean source_set_active_port (MateMixerStream *stream,
- const gchar *port_name);
+static void pulse_source_class_init (PulseSourceClass *klass);
+static void pulse_source_init (PulseSource *source);
G_DEFINE_TYPE (PulseSource, pulse_source, PULSE_TYPE_STREAM);
-static void
-pulse_source_init (PulseSource *source)
-{
- source->priv = G_TYPE_INSTANCE_GET_PRIVATE (source,
- PULSE_TYPE_SOURCE,
- PulseSourcePrivate);
-}
+static gboolean source_set_mute (MateMixerStream *stream,
+ gboolean mute);
+static gboolean source_set_volume (MateMixerStream *stream,
+ pa_cvolume *volume);
+static gboolean source_set_active_port (MateMixerStream *stream,
+ const gchar *port_name);
+static PulseMonitor *source_create_monitor (MateMixerStream *stream);
static void
pulse_source_class_init (PulseSourceClass *klass)
@@ -59,55 +51,28 @@ pulse_source_class_init (PulseSourceClass *klass)
stream_class->set_mute = source_set_mute;
stream_class->set_volume = source_set_volume;
stream_class->set_active_port = source_set_active_port;
+ stream_class->create_monitor = source_create_monitor;
+}
- g_type_class_add_private (klass, sizeof (PulseSourcePrivate));
+static void
+pulse_source_init (PulseSource *source)
+{
}
PulseStream *
pulse_source_new (PulseConnection *connection, const pa_source_info *info)
{
PulseSource *source;
- GList *ports = NULL;
- int i;
-
- for (i = 0; i < info->n_ports; i++) {
- MateMixerPort *port;
- MateMixerPortStatus status = MATE_MIXER_PORT_UNKNOWN_STATUS;
- pa_source_port_info *p_info = info->ports[i];
-#if PA_CHECK_VERSION(2, 0, 0)
- switch (p_info->available) {
- case PA_PORT_AVAILABLE_YES:
- status = MATE_MIXER_PORT_AVAILABLE;
- break;
- case PA_PORT_AVAILABLE_NO:
- status = MATE_MIXER_PORT_UNAVAILABLE;
- break;
- default:
- break;
- }
-#endif
- port = mate_mixer_port_new (p_info->name,
- p_info->description,
- NULL,
- p_info->priority,
- status);
-
- ports = g_list_prepend (ports, port);
- }
+ g_return_val_if_fail (PULSE_IS_CONNECTION (connection), NULL);
+ g_return_val_if_fail (info != NULL, NULL);
+ /* Consider the sink index as unchanging parameter */
source = g_object_new (PULSE_TYPE_SOURCE,
"connection", connection,
"index", info->index,
NULL);
- /* According to the PulseAudio code, the list of sink port never changes with
- * updates.
- * This may be not future-proof, but checking and validating the list of ports on
- * each update would be an expensive operation, so let's set the list only during
- * the construction */
- pulse_stream_update_ports (PULSE_STREAM (source), g_list_reverse (ports));
-
/* Other data may change at any time, so let's make a use of our update function */
pulse_source_update (PULSE_STREAM (source), info);
@@ -117,42 +82,59 @@ pulse_source_new (PulseConnection *connection, const pa_source_info *info)
gboolean
pulse_source_update (PulseStream *stream, const pa_source_info *info)
{
- PulseSource *source;
- MateMixerStreamFlags flags = MATE_MIXER_STREAM_INPUT |
- MATE_MIXER_STREAM_HAS_MUTE |
- MATE_MIXER_STREAM_HAS_VOLUME |
- MATE_MIXER_STREAM_CAN_SET_VOLUME;
+ MateMixerStreamFlags flags = MATE_MIXER_STREAM_INPUT |
+ MATE_MIXER_STREAM_HAS_MUTE |
+ MATE_MIXER_STREAM_HAS_VOLUME |
+ MATE_MIXER_STREAM_CAN_SET_VOLUME |
+ MATE_MIXER_STREAM_CAN_SUSPEND;
+ GList *ports = NULL;
+ guint32 i;
g_return_val_if_fail (PULSE_IS_SOURCE (stream), FALSE);
- source = PULSE_SOURCE (stream);
-
/* Let all the information update before emitting notify signals */
g_object_freeze_notify (G_OBJECT (stream));
pulse_stream_update_name (stream, info->name);
pulse_stream_update_description (stream, info->description);
pulse_stream_update_mute (stream, info->mute ? TRUE : FALSE);
- pulse_stream_update_channel_map (stream, &info->channel_map);
- pulse_stream_update_volume_extended (stream,
- &info->volume,
- info->base_volume,
- info->n_volume_steps);
+
+ /* List of ports */
+ for (i = 0; i < info->n_ports; i++) {
+ MateMixerPortFlags flags = MATE_MIXER_PORT_NO_FLAGS;
+
+#if PA_CHECK_VERSION(2, 0, 0)
+ if (info->ports[i]->available == PA_PORT_AVAILABLE_YES)
+ flags |= MATE_MIXER_PORT_AVAILABLE;
+#endif
+ ports = g_list_prepend (ports,
+ mate_mixer_port_new (info->ports[i]->name,
+ info->ports[i]->description,
+ NULL,
+ info->ports[i]->priority,
+ flags));
+ }
+ pulse_stream_update_ports (stream, ports);
+
+ /* Active port */
if (info->active_port)
pulse_stream_update_active_port (stream, info->active_port->name);
+ else
+ pulse_stream_update_active_port (stream, NULL);
+ /* Stream state */
switch (info->state) {
case PA_SOURCE_RUNNING:
- pulse_stream_update_status (stream, MATE_MIXER_STREAM_RUNNING);
+ pulse_stream_update_state (stream, MATE_MIXER_STREAM_RUNNING);
break;
case PA_SOURCE_IDLE:
- pulse_stream_update_status (stream, MATE_MIXER_STREAM_IDLE);
+ pulse_stream_update_state (stream, MATE_MIXER_STREAM_IDLE);
break;
case PA_SOURCE_SUSPENDED:
- pulse_stream_update_status (stream, MATE_MIXER_STREAM_SUSPENDED);
+ pulse_stream_update_state (stream, MATE_MIXER_STREAM_SUSPENDED);
break;
default:
- pulse_stream_update_status (stream, MATE_MIXER_STREAM_UNKNOWN_STATUS);
+ pulse_stream_update_state (stream, MATE_MIXER_STREAM_UNKNOWN_STATE);
break;
}
@@ -167,14 +149,14 @@ pulse_source_update (PulseStream *stream, const pa_source_info *info)
if (pa_channel_map_can_fade (&info->channel_map))
flags |= MATE_MIXER_STREAM_CAN_FADE;
+ /* Flags must be updated before volume */
pulse_stream_update_flags (stream, flags);
- if (source->priv->index_monitored_sink != info->monitor_of_sink) {
- source->priv->index_monitored_sink = info->monitor_of_sink;
-
- // TODO: provide a property
- // g_object_notify (G_OBJECT (stream), "monitor");
- }
+ pulse_stream_update_volume_extended (stream,
+ &info->volume,
+ &info->channel_map,
+ info->base_volume,
+ info->n_volume_steps);
g_object_thaw_notify (G_OBJECT (stream));
return TRUE;
@@ -183,31 +165,57 @@ pulse_source_update (PulseStream *stream, const pa_source_info *info)
static gboolean
source_set_mute (MateMixerStream *stream, gboolean mute)
{
+ PulseStream *pulse;
+
g_return_val_if_fail (PULSE_IS_SOURCE (stream), FALSE);
- return pulse_connection_set_source_mute (pulse_stream_get_connection (PULSE_STREAM (stream)),
- pulse_stream_get_index (PULSE_STREAM (stream)),
+ pulse = PULSE_STREAM (stream);
+
+ return pulse_connection_set_source_mute (pulse_stream_get_connection (pulse),
+ pulse_stream_get_index (pulse),
mute);
}
static gboolean
source_set_volume (MateMixerStream *stream, pa_cvolume *volume)
{
+ PulseStream *pulse;
+
g_return_val_if_fail (PULSE_IS_SOURCE (stream), FALSE);
g_return_val_if_fail (volume != NULL, FALSE);
- return pulse_connection_set_source_volume (pulse_stream_get_connection (PULSE_STREAM (stream)),
- pulse_stream_get_index (PULSE_STREAM (stream)),
+ pulse = PULSE_STREAM (stream);
+
+ return pulse_connection_set_source_volume (pulse_stream_get_connection (pulse),
+ pulse_stream_get_index (pulse),
volume);
}
static gboolean
source_set_active_port (MateMixerStream *stream, const gchar *port_name)
{
+ PulseStream *pulse;
+
g_return_val_if_fail (PULSE_IS_SOURCE (stream), FALSE);
g_return_val_if_fail (port_name != NULL, FALSE);
- return pulse_connection_set_source_port (pulse_stream_get_connection (PULSE_STREAM (stream)),
- pulse_stream_get_index (PULSE_STREAM (stream)),
+ pulse = PULSE_STREAM (stream);
+
+ return pulse_connection_set_source_port (pulse_stream_get_connection (pulse),
+ pulse_stream_get_index (pulse),
port_name);
}
+
+static PulseMonitor *
+source_create_monitor (MateMixerStream *stream)
+{
+ PulseStream *pulse;
+
+ g_return_val_if_fail (PULSE_IS_SOURCE (stream), NULL);
+
+ pulse = PULSE_STREAM (stream);
+
+ return pulse_connection_create_monitor (pulse_stream_get_connection (pulse),
+ pulse_stream_get_index (pulse),
+ PA_INVALID_INDEX);
+}