summaryrefslogtreecommitdiff
path: root/libmatemixer/matemixer-stream.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmatemixer/matemixer-stream.c')
-rw-r--r--libmatemixer/matemixer-stream.c311
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]);
+}