diff options
Diffstat (limited to 'libmatemixer/matemixer-stream.c')
-rw-r--r-- | libmatemixer/matemixer-stream.c | 311 |
1 files changed, 187 insertions, 124 deletions
diff --git a/libmatemixer/matemixer-stream.c b/libmatemixer/matemixer-stream.c index 1902de3..03902bd 100644 --- a/libmatemixer/matemixer-stream.c +++ b/libmatemixer/matemixer-stream.c @@ -24,6 +24,7 @@ #include "matemixer-enum-types.h" #include "matemixer-stream.h" #include "matemixer-stream-control.h" +#include "matemixer-stream-private.h" #include "matemixer-switch.h" /** @@ -34,27 +35,29 @@ struct _MateMixerStreamPrivate { gchar *name; - GList *controls; - GList *switches; - gboolean monitor_enabled; + gchar *label; + MateMixerDirection direction; MateMixerDevice *device; - MateMixerStreamFlags flags; - MateMixerStreamState state; + MateMixerStreamControl *control; }; enum { PROP_0, PROP_NAME, + PROP_LABEL, + PROP_DIRECTION, PROP_DEVICE, - PROP_FLAGS, - PROP_STATE, + PROP_DEFAULT_CONTROL, N_PROPERTIES }; static GParamSpec *properties[N_PROPERTIES] = { NULL, }; enum { - MONITOR_VALUE, + CONTROL_ADDED, + CONTROL_REMOVED, + SWITCH_ADDED, + SWITCH_REMOVED, N_SIGNALS }; @@ -105,6 +108,25 @@ mate_mixer_stream_class_init (MateMixerStreamClass *klass) G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + properties[PROP_LABEL] = + g_param_spec_string ("label", + "Label", + "Label of the stream", + NULL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); + + properties[PROP_DIRECTION] = + g_param_spec_enum ("direction", + "Direction", + "Direction of the stream", + MATE_MIXER_TYPE_DIRECTION, + MATE_MIXER_DIRECTION_UNKNOWN, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); + properties[PROP_DEVICE] = g_param_spec_object ("device", "Device", @@ -114,39 +136,64 @@ mate_mixer_stream_class_init (MateMixerStreamClass *klass) G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); - properties[PROP_FLAGS] = - g_param_spec_flags ("flags", - "Flags", - "Capability flags of the stream", - MATE_MIXER_TYPE_STREAM_FLAGS, - MATE_MIXER_STREAM_NO_FLAGS, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS); - - properties[PROP_STATE] = - g_param_spec_enum ("state", - "State", - "Current state of the stream", - MATE_MIXER_TYPE_STREAM_STATE, - MATE_MIXER_STREAM_STATE_UNKNOWN, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY | - G_PARAM_STATIC_STRINGS); + properties[PROP_DEFAULT_CONTROL] = + g_param_spec_object ("default-control", + "Default control", + "Default control of the stream", + MATE_MIXER_TYPE_STREAM_CONTROL, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); g_object_class_install_properties (object_class, N_PROPERTIES, properties); - signals[MONITOR_VALUE] = - g_signal_new ("monitor-value", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (MateMixerStreamClass, monitor_value), + signals[CONTROL_ADDED] = + g_signal_new ("control-added", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (MateMixerStreamClass, control_added), + NULL, + NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, + 1, + G_TYPE_STRING); + + signals[CONTROL_REMOVED] = + g_signal_new ("control-removed", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (MateMixerStreamClass, control_removed), NULL, NULL, - g_cclosure_marshal_VOID__DOUBLE, + g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, - G_TYPE_DOUBLE); + G_TYPE_STRING); + + signals[SWITCH_ADDED] = + g_signal_new ("switch-added", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (MateMixerStreamClass, switch_added), + NULL, + NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, + 1, + G_TYPE_STRING); + + signals[SWITCH_REMOVED] = + g_signal_new ("switch-removed", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (MateMixerStreamClass, switch_removed), + NULL, + NULL, + g_cclosure_marshal_VOID__STRING, + G_TYPE_NONE, + 1, + G_TYPE_STRING); g_type_class_add_private (object_class, sizeof (MateMixerStreamPrivate)); } @@ -165,14 +212,17 @@ mate_mixer_stream_get_property (GObject *object, case PROP_NAME: g_value_set_string (value, stream->priv->name); break; + case PROP_LABEL: + g_value_set_string (value, stream->priv->label); + break; + case PROP_DIRECTION: + g_value_set_enum (value, stream->priv->direction); + break; case PROP_DEVICE: g_value_set_object (value, stream->priv->device); break; - case PROP_FLAGS: - g_value_set_flags (value, stream->priv->flags); - break; - case PROP_STATE: - g_value_set_enum (value, stream->priv->state); + case PROP_DEFAULT_CONTROL: + g_value_set_object (value, stream->priv->control); break; default: @@ -196,15 +246,25 @@ mate_mixer_stream_set_property (GObject *object, /* Construct-only string */ stream->priv->name = g_value_dup_string (value); break; + case PROP_LABEL: + /* Construct-only string */ + stream->priv->label = g_value_dup_string (value); + break; + case PROP_DIRECTION: + stream->priv->direction = g_value_get_enum (value); + break; case PROP_DEVICE: /* Construct-only object */ - stream->priv->device = g_value_dup_object (value); - break; - case PROP_FLAGS: - stream->priv->flags = g_value_get_flags (value); + stream->priv->device = g_value_get_object (value); + + if (stream->priv->device != NULL) { + g_object_add_weak_pointer (G_OBJECT (stream->priv->device), + (gpointer *) &stream->priv->device); + } break; - case PROP_STATE: - stream->priv->state = g_value_get_enum (value); + case PROP_DEFAULT_CONTROL: + /* Construct-only object */ + stream->priv->control = g_value_dup_object (value); break; default: @@ -228,7 +288,7 @@ mate_mixer_stream_dispose (GObject *object) stream = MATE_MIXER_STREAM (object); - g_clear_object (&stream->priv->device); + g_clear_object (&stream->priv->control); G_OBJECT_CLASS (mate_mixer_stream_parent_class)->dispose (object); } @@ -245,6 +305,10 @@ mate_mixer_stream_finalize (GObject *object) G_OBJECT_CLASS (mate_mixer_stream_parent_class)->finalize (object); } +/** + * mate_mixer_stream_get_name: + * @stream: a #MateMixerStream + */ const gchar * mate_mixer_stream_get_name (MateMixerStream *stream) { @@ -253,30 +317,46 @@ mate_mixer_stream_get_name (MateMixerStream *stream) return stream->priv->name; } -MateMixerDevice * -mate_mixer_stream_get_device (MateMixerStream *stream) +/** + * mate_mixer_stream_get_label: + * @stream: a #MateMixerStream + */ +const gchar * +mate_mixer_stream_get_label (MateMixerStream *stream) { g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), NULL); - return stream->priv->device; + return stream->priv->label; } -MateMixerStreamFlags -mate_mixer_stream_get_flags (MateMixerStream *stream) +/** + * mate_mixer_stream_get_direction: + * @stream: a #MateMixerStream + */ +MateMixerDirection +mate_mixer_stream_get_direction (MateMixerStream *stream) { - g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), MATE_MIXER_STREAM_NO_FLAGS); + g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), MATE_MIXER_DIRECTION_UNKNOWN); - return stream->priv->flags; + return stream->priv->direction; } -MateMixerStreamState -mate_mixer_stream_get_state (MateMixerStream *stream) +/** + * mate_mixer_stream_get_device: + * @stream: a #MateMixerStream + */ +MateMixerDevice * +mate_mixer_stream_get_device (MateMixerStream *stream) { - g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), MATE_MIXER_STREAM_STATE_UNKNOWN); + g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), NULL); - return stream->priv->state; + return stream->priv->device; } +/** + * mate_mixer_stream_get_control: + * @stream: a #MateMixerStream + */ MateMixerStreamControl * mate_mixer_stream_get_control (MateMixerStream *stream, const gchar *name) { @@ -286,6 +366,10 @@ mate_mixer_stream_get_control (MateMixerStream *stream, const gchar *name) return MATE_MIXER_STREAM_GET_CLASS (stream)->get_control (stream, name); } +/** + * mate_mixer_stream_get_switch: + * @stream: a #MateMixerStream + */ MateMixerSwitch * mate_mixer_stream_get_switch (MateMixerStream *stream, const gchar *name) { @@ -295,92 +379,40 @@ mate_mixer_stream_get_switch (MateMixerStream *stream, const gchar *name) return MATE_MIXER_STREAM_GET_CLASS (stream)->get_switch (stream, name); } +/** + * mate_mixer_stream_get_default_control: + * @stream: a #MateMixerStream + */ MateMixerStreamControl * mate_mixer_stream_get_default_control (MateMixerStream *stream) { g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), NULL); - return MATE_MIXER_STREAM_GET_CLASS (stream)->get_default_control (stream); + return stream->priv->control; } +/** + * mate_mixer_stream_list_controls: + * @stream: a #MateMixerStream + */ const GList * mate_mixer_stream_list_controls (MateMixerStream *stream) { g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), NULL); - if (stream->priv->controls == NULL) - stream->priv->controls = MATE_MIXER_STREAM_GET_CLASS (stream)->list_controls (stream); - - return (const GList *) stream->priv->controls; + return MATE_MIXER_STREAM_GET_CLASS (stream)->list_controls (stream); } +/** + * mate_mixer_stream_list_switches: + * @stream: a #MateMixerStream + */ const GList * mate_mixer_stream_list_switches (MateMixerStream *stream) { g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), NULL); - if (stream->priv->switches == NULL) { - MateMixerStreamClass *klass = MATE_MIXER_STREAM_GET_CLASS (stream); - - if (klass->list_switches != NULL) - stream->priv->switches = klass->list_switches (stream); - } - - return (const GList *) stream->priv->switches; -} - -gboolean -mate_mixer_stream_suspend (MateMixerStream *stream) -{ - g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), FALSE); - - if (stream->priv->state == MATE_MIXER_STREAM_STATE_SUSPENDED) - return TRUE; - - if (stream->priv->flags & MATE_MIXER_STREAM_CAN_SUSPEND) - return MATE_MIXER_STREAM_GET_CLASS (stream)->suspend (stream); - - return FALSE; -} - -gboolean -mate_mixer_stream_resume (MateMixerStream *stream) -{ - g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), FALSE); - - if (stream->priv->state != MATE_MIXER_STREAM_STATE_SUSPENDED) - return TRUE; - - if (stream->priv->flags & MATE_MIXER_STREAM_CAN_SUSPEND) - return MATE_MIXER_STREAM_GET_CLASS (stream)->resume (stream); - - return FALSE; -} - -gboolean -mate_mixer_stream_monitor_get_enabled (MateMixerStream *stream) -{ - g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), FALSE); - - return stream->priv->monitor_enabled; -} - -gboolean -mate_mixer_stream_monitor_set_enabled (MateMixerStream *stream, gboolean enabled) -{ - g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), FALSE); - - if (stream->priv->monitor_enabled == enabled) - return TRUE; - - if (stream->priv->flags & MATE_MIXER_STREAM_HAS_MONITOR) { - if (enabled) - return MATE_MIXER_STREAM_GET_CLASS (stream)->monitor_start (stream); - else - return MATE_MIXER_STREAM_GET_CLASS (stream)->monitor_stop (stream); - } - - return FALSE; + return MATE_MIXER_STREAM_GET_CLASS (stream)->list_switches (stream); } static MateMixerStreamControl * @@ -422,3 +454,34 @@ mate_mixer_stream_real_get_switch (MateMixerStream *stream, const gchar *name) } return NULL; } + +void +_mate_mixer_stream_set_default_control (MateMixerStream *stream, + MateMixerStreamControl *control) +{ + g_return_if_fail (MATE_MIXER_IS_STREAM (stream)); + g_return_if_fail (control == NULL || MATE_MIXER_IS_STREAM_CONTROL (control)); + + if (stream->priv->control == control) + return; + + if (stream->priv->control != NULL) + g_object_unref (stream->priv->control); + + /* The default control is allowed to be NULL */ + if (control != NULL) { + stream->priv->control = g_object_ref (control); + + g_debug ("Stream %s default control changed to %s", + mate_mixer_stream_get_name (stream), + mate_mixer_stream_control_get_name (control)); + } else { + stream->priv->control = NULL; + + g_debug ("Stream %s default control unset", + mate_mixer_stream_get_name (stream)); + } + + g_object_notify_by_pspec (G_OBJECT (stream), + properties[PROP_DEFAULT_CONTROL]); +} |