diff options
Diffstat (limited to 'backends/pulse/pulse-source.c')
-rw-r--r-- | backends/pulse/pulse-source.c | 170 |
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); +} |