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.c763
1 files changed, 262 insertions, 501 deletions
diff --git a/libmatemixer/matemixer-stream.c b/libmatemixer/matemixer-stream.c
index 6bec2be..1902de3 100644
--- a/libmatemixer/matemixer-stream.c
+++ b/libmatemixer/matemixer-stream.c
@@ -15,20 +15,44 @@
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
+#include <string.h>
#include <glib.h>
#include <glib-object.h>
#include "matemixer-device.h"
#include "matemixer-enums.h"
#include "matemixer-enum-types.h"
-#include "matemixer-port.h"
#include "matemixer-stream.h"
+#include "matemixer-stream-control.h"
+#include "matemixer-switch.h"
/**
* SECTION:matemixer-stream
* @include: libmatemixer/matemixer.h
*/
+struct _MateMixerStreamPrivate
+{
+ gchar *name;
+ GList *controls;
+ GList *switches;
+ gboolean monitor_enabled;
+ MateMixerDevice *device;
+ MateMixerStreamFlags flags;
+ MateMixerStreamState state;
+};
+
+enum {
+ PROP_0,
+ PROP_NAME,
+ PROP_DEVICE,
+ PROP_FLAGS,
+ PROP_STATE,
+ N_PROPERTIES
+};
+
+static GParamSpec *properties[N_PROPERTIES] = { NULL, };
+
enum {
MONITOR_VALUE,
N_SIGNALS
@@ -36,449 +60,285 @@ enum {
static guint signals[N_SIGNALS] = { 0, };
-G_DEFINE_INTERFACE (MateMixerStream, mate_mixer_stream, G_TYPE_OBJECT)
+static void mate_mixer_stream_class_init (MateMixerStreamClass *klass);
+
+static void mate_mixer_stream_get_property (GObject *object,
+ guint param_id,
+ GValue *value,
+ GParamSpec *pspec);
+static void mate_mixer_stream_set_property (GObject *object,
+ guint param_id,
+ const GValue *value,
+ GParamSpec *pspec);
+
+static void mate_mixer_stream_init (MateMixerStream *stream);
+static void mate_mixer_stream_dispose (GObject *object);
+static void mate_mixer_stream_finalize (GObject *object);
+
+G_DEFINE_ABSTRACT_TYPE (MateMixerStream, mate_mixer_stream, G_TYPE_OBJECT)
+
+static MateMixerStreamControl *mate_mixer_stream_real_get_control (MateMixerStream *stream,
+ const gchar *name);
+static MateMixerSwitch * mate_mixer_stream_real_get_switch (MateMixerStream *stream,
+ const gchar *name);
static void
-mate_mixer_stream_default_init (MateMixerStreamInterface *iface)
-{
- g_object_interface_install_property (iface,
- g_param_spec_string ("name",
- "Name",
- "Name of the stream",
- NULL,
- G_PARAM_READABLE |
- G_PARAM_STATIC_STRINGS));
-
- g_object_interface_install_property (iface,
- g_param_spec_string ("description",
- "Description",
- "Description of the stream",
- NULL,
- G_PARAM_READABLE |
- G_PARAM_STATIC_STRINGS));
-
- g_object_interface_install_property (iface,
- g_param_spec_object ("device",
- "Device",
- "Device the stream belongs to",
- MATE_MIXER_TYPE_DEVICE,
- G_PARAM_READABLE |
- G_PARAM_STATIC_STRINGS));
-
- g_object_interface_install_property (iface,
- g_param_spec_flags ("flags",
- "Flags",
- "Capability flags of the stream",
- MATE_MIXER_TYPE_STREAM_FLAGS,
- MATE_MIXER_STREAM_NO_FLAGS,
- G_PARAM_READABLE |
- G_PARAM_STATIC_STRINGS));
-
- g_object_interface_install_property (iface,
- g_param_spec_enum ("state",
- "State",
- "Current state of the stream",
- MATE_MIXER_TYPE_STREAM_STATE,
- MATE_MIXER_STREAM_STATE_UNKNOWN,
- G_PARAM_READABLE |
- G_PARAM_STATIC_STRINGS));
-
- g_object_interface_install_property (iface,
- g_param_spec_boolean ("mute",
- "Mute",
- "Mute state of the stream",
- FALSE,
- G_PARAM_READABLE |
- G_PARAM_STATIC_STRINGS));
-
- g_object_interface_install_property (iface,
- g_param_spec_uint ("volume",
- "Volume",
- "Volume of the stream",
- 0,
- G_MAXUINT,
- 0,
- G_PARAM_READABLE |
- G_PARAM_STATIC_STRINGS));
-
- g_object_interface_install_property (iface,
- g_param_spec_float ("balance",
- "Balance",
- "Balance value of the stream",
- -1.0f,
- 1.0f,
- 0.0f,
- G_PARAM_READABLE |
- G_PARAM_STATIC_STRINGS));
-
- g_object_interface_install_property (iface,
- g_param_spec_float ("fade",
- "Fade",
- "Fade value of the stream",
- -1.0f,
- 1.0f,
- 0.0f,
- G_PARAM_READABLE |
- G_PARAM_STATIC_STRINGS));
-
- g_object_interface_install_property (iface,
- g_param_spec_object ("active-port",
- "Active port",
- "The currently active port of the stream",
- MATE_MIXER_TYPE_PORT,
- G_PARAM_READABLE |
- G_PARAM_STATIC_STRINGS));
+mate_mixer_stream_class_init (MateMixerStreamClass *klass)
+{
+ GObjectClass *object_class;
+
+ klass->get_control = mate_mixer_stream_real_get_control;
+ klass->get_switch = mate_mixer_stream_real_get_switch;
+
+ object_class = G_OBJECT_CLASS (klass);
+ object_class->dispose = mate_mixer_stream_dispose;
+ object_class->finalize = mate_mixer_stream_finalize;
+ object_class->get_property = mate_mixer_stream_get_property;
+ object_class->set_property = mate_mixer_stream_set_property;
+
+ properties[PROP_NAME] =
+ g_param_spec_string ("name",
+ "Name",
+ "Name of the stream",
+ NULL,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS);
+
+ properties[PROP_DEVICE] =
+ g_param_spec_object ("device",
+ "Device",
+ "Device the stream belongs to",
+ MATE_MIXER_TYPE_DEVICE,
+ G_PARAM_READWRITE |
+ 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);
+
+ g_object_class_install_properties (object_class, N_PROPERTIES, properties);
signals[MONITOR_VALUE] =
g_signal_new ("monitor-value",
- G_TYPE_FROM_INTERFACE (iface),
+ G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (MateMixerStreamInterface, monitor_value),
+ G_STRUCT_OFFSET (MateMixerStreamClass, monitor_value),
NULL,
NULL,
g_cclosure_marshal_VOID__DOUBLE,
G_TYPE_NONE,
1,
G_TYPE_DOUBLE);
-}
-
-const gchar *
-mate_mixer_stream_get_name (MateMixerStream *stream)
-{
- return MATE_MIXER_STREAM_GET_INTERFACE (stream)->get_name (stream);
-}
-
-const gchar *
-mate_mixer_stream_get_description (MateMixerStream *stream)
-{
- MateMixerStreamInterface *iface;
-
- g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), NULL);
-
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
-
- if (iface->get_description)
- return iface->get_description (stream);
-
- return NULL;
-}
-
-MateMixerDevice *
-mate_mixer_stream_get_device (MateMixerStream *stream)
-{
- MateMixerStreamInterface *iface;
-
- g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), NULL);
-
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
-
- if (iface->get_device)
- return iface->get_device (stream);
-
- return NULL;
-}
-
-MateMixerStreamFlags
-mate_mixer_stream_get_flags (MateMixerStream *stream)
-{
- MateMixerStreamInterface *iface;
-
- g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), MATE_MIXER_STREAM_NO_FLAGS);
-
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
-
- if (iface->get_flags)
- return iface->get_flags (stream);
-
- return MATE_MIXER_STREAM_NO_FLAGS;
-}
-
-MateMixerStreamState
-mate_mixer_stream_get_state (MateMixerStream *stream)
-{
- MateMixerStreamInterface *iface;
-
- g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), MATE_MIXER_STREAM_STATE_UNKNOWN);
-
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
-
- if (iface->get_state)
- return iface->get_state (stream);
-
- return MATE_MIXER_STREAM_STATE_UNKNOWN;
-}
-
-gboolean
-mate_mixer_stream_get_mute (MateMixerStream *stream)
-{
- MateMixerStreamInterface *iface;
-
- g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), FALSE);
-
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
-
- if (iface->get_mute)
- return iface->get_mute (stream);
- return FALSE;
+ g_type_class_add_private (object_class, sizeof (MateMixerStreamPrivate));
}
-gboolean
-mate_mixer_stream_set_mute (MateMixerStream *stream, gboolean mute)
-{
- MateMixerStreamInterface *iface;
-
- g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), FALSE);
-
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
-
- if (iface->set_mute)
- return iface->set_mute (stream, mute);
-
- return FALSE;
-}
-
-guint
-mate_mixer_stream_get_volume (MateMixerStream *stream)
-{
- MateMixerStreamInterface *iface;
-
- g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), 0);
-
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
-
- if (iface->get_volume)
- return iface->get_volume (stream);
-
- return 0;
-}
-
-gboolean
-mate_mixer_stream_set_volume (MateMixerStream *stream, guint volume)
-{
- MateMixerStreamInterface *iface;
-
- g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), FALSE);
-
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
-
- if (iface->set_volume)
- return iface->set_volume (stream, volume);
-
- return FALSE;
+static void
+mate_mixer_stream_get_property (GObject *object,
+ guint param_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ MateMixerStream *stream;
+
+ stream = MATE_MIXER_STREAM (object);
+
+ switch (param_id) {
+ case PROP_NAME:
+ g_value_set_string (value, stream->priv->name);
+ 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);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+ break;
+ }
}
-gdouble
-mate_mixer_stream_get_decibel (MateMixerStream *stream)
-{
- MateMixerStreamInterface *iface;
-
- g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), -MATE_MIXER_INFINITY);
-
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
-
- if (iface->get_decibel)
- return iface->get_decibel (stream);
-
- return -MATE_MIXER_INFINITY;
+static void
+mate_mixer_stream_set_property (GObject *object,
+ guint param_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ MateMixerStream *stream;
+
+ stream = MATE_MIXER_STREAM (object);
+
+ switch (param_id) {
+ case PROP_NAME:
+ /* Construct-only string */
+ stream->priv->name = g_value_dup_string (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);
+ break;
+ case PROP_STATE:
+ stream->priv->state = g_value_get_enum (value);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+ break;
+ }
}
-gboolean
-mate_mixer_stream_set_decibel (MateMixerStream *stream, gdouble decibel)
+static void
+mate_mixer_stream_init (MateMixerStream *stream)
{
- MateMixerStreamInterface *iface;
-
- g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), FALSE);
-
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
-
- if (iface->set_decibel)
- return iface->set_decibel (stream, decibel);
-
- return FALSE;
+ stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (stream,
+ MATE_MIXER_TYPE_STREAM,
+ MateMixerStreamPrivate);
}
-guint
-mate_mixer_stream_get_num_channels (MateMixerStream *stream)
+static void
+mate_mixer_stream_dispose (GObject *object)
{
- MateMixerStreamInterface *iface;
-
- g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), 0);
+ MateMixerStream *stream;
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
+ stream = MATE_MIXER_STREAM (object);
- if (iface->get_num_channels)
- return iface->get_num_channels (stream);
+ g_clear_object (&stream->priv->device);
- return 0;
+ G_OBJECT_CLASS (mate_mixer_stream_parent_class)->dispose (object);
}
-MateMixerChannelPosition
-mate_mixer_stream_get_channel_position (MateMixerStream *stream, guint channel)
+static void
+mate_mixer_stream_finalize (GObject *object)
{
- MateMixerStreamInterface *iface;
-
- g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), MATE_MIXER_CHANNEL_UNKNOWN);
+ MateMixerStream *stream;
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
+ stream = MATE_MIXER_STREAM (object);
- if (iface->get_channel_position)
- return iface->get_channel_position (stream, channel);
+ g_free (stream->priv->name);
- return MATE_MIXER_CHANNEL_UNKNOWN;
+ G_OBJECT_CLASS (mate_mixer_stream_parent_class)->finalize (object);
}
-guint
-mate_mixer_stream_get_channel_volume (MateMixerStream *stream, guint channel)
+const gchar *
+mate_mixer_stream_get_name (MateMixerStream *stream)
{
- MateMixerStreamInterface *iface;
-
- g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), 0);
-
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
-
- if (iface->get_channel_volume)
- return iface->get_channel_volume (stream, channel);
+ g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), NULL);
- return 0;
+ return stream->priv->name;
}
-gboolean
-mate_mixer_stream_set_channel_volume (MateMixerStream *stream,
- guint channel,
- guint volume)
+MateMixerDevice *
+mate_mixer_stream_get_device (MateMixerStream *stream)
{
- MateMixerStreamInterface *iface;
-
- g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), FALSE);
-
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
-
- if (iface->set_channel_volume)
- return iface->set_channel_volume (stream, channel, volume);
+ g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), NULL);
- return FALSE;
+ return stream->priv->device;
}
-gdouble
-mate_mixer_stream_get_channel_decibel (MateMixerStream *stream, guint channel)
+MateMixerStreamFlags
+mate_mixer_stream_get_flags (MateMixerStream *stream)
{
- MateMixerStreamInterface *iface;
-
- g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), -MATE_MIXER_INFINITY);
-
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
-
- if (iface->get_channel_decibel)
- return iface->get_channel_decibel (stream, channel);
+ g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), MATE_MIXER_STREAM_NO_FLAGS);
- return -MATE_MIXER_INFINITY;
+ return stream->priv->flags;
}
-gboolean
-mate_mixer_stream_set_channel_decibel (MateMixerStream *stream,
- guint channel,
- gdouble decibel)
+MateMixerStreamState
+mate_mixer_stream_get_state (MateMixerStream *stream)
{
- MateMixerStreamInterface *iface;
-
- g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), FALSE);
-
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
-
- if (iface->set_channel_decibel)
- return iface->set_channel_decibel (stream, channel, decibel);
+ g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), MATE_MIXER_STREAM_STATE_UNKNOWN);
- return FALSE;
+ return stream->priv->state;
}
-gboolean
-mate_mixer_stream_has_channel_position (MateMixerStream *stream,
- MateMixerChannelPosition position)
+MateMixerStreamControl *
+mate_mixer_stream_get_control (MateMixerStream *stream, const gchar *name)
{
- MateMixerStreamInterface *iface;
-
- g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), FALSE);
-
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
-
- if (iface->has_channel_position)
- return iface->has_channel_position (stream, position);
+ g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), NULL);
+ g_return_val_if_fail (name != NULL, NULL);
- return FALSE;
+ return MATE_MIXER_STREAM_GET_CLASS (stream)->get_control (stream, name);
}
-gfloat
-mate_mixer_stream_get_balance (MateMixerStream *stream)
+MateMixerSwitch *
+mate_mixer_stream_get_switch (MateMixerStream *stream, const gchar *name)
{
- MateMixerStreamInterface *iface;
-
- g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), 0.0f);
-
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
-
- if (iface->get_balance)
- return iface->get_balance (stream);
+ g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), NULL);
+ g_return_val_if_fail (name != NULL, NULL);
- return 0.0f;
+ return MATE_MIXER_STREAM_GET_CLASS (stream)->get_switch (stream, name);
}
-gboolean
-mate_mixer_stream_set_balance (MateMixerStream *stream, gfloat balance)
+MateMixerStreamControl *
+mate_mixer_stream_get_default_control (MateMixerStream *stream)
{
- MateMixerStreamInterface *iface;
-
- g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), FALSE);
-
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
-
- if (iface->set_balance)
- return iface->set_balance (stream, balance);
+ g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), NULL);
- return FALSE;
+ return MATE_MIXER_STREAM_GET_CLASS (stream)->get_default_control (stream);
}
-gfloat
-mate_mixer_stream_get_fade (MateMixerStream *stream)
+const GList *
+mate_mixer_stream_list_controls (MateMixerStream *stream)
{
- MateMixerStreamInterface *iface;
-
- g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), 0.0f);
-
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
+ g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), NULL);
- if (iface->get_fade)
- return iface->get_fade (stream);
+ if (stream->priv->controls == NULL)
+ stream->priv->controls = MATE_MIXER_STREAM_GET_CLASS (stream)->list_controls (stream);
- return 0.0f;
+ return (const GList *) stream->priv->controls;
}
-gboolean
-mate_mixer_stream_set_fade (MateMixerStream *stream, gfloat fade)
+const GList *
+mate_mixer_stream_list_switches (MateMixerStream *stream)
{
- MateMixerStreamInterface *iface;
-
- g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), FALSE);
+ g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), NULL);
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
+ if (stream->priv->switches == NULL) {
+ MateMixerStreamClass *klass = MATE_MIXER_STREAM_GET_CLASS (stream);
- if (iface->set_fade)
- return iface->set_fade (stream, fade);
+ if (klass->list_switches != NULL)
+ stream->priv->switches = klass->list_switches (stream);
+ }
- return FALSE;
+ return (const GList *) stream->priv->switches;
}
gboolean
mate_mixer_stream_suspend (MateMixerStream *stream)
{
- MateMixerStreamInterface *iface;
-
g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), FALSE);
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
+ if (stream->priv->state == MATE_MIXER_STREAM_STATE_SUSPENDED)
+ return TRUE;
- if (iface->suspend)
- return iface->suspend (stream);
+ if (stream->priv->flags & MATE_MIXER_STREAM_CAN_SUSPEND)
+ return MATE_MIXER_STREAM_GET_CLASS (stream)->suspend (stream);
return FALSE;
}
@@ -486,178 +346,79 @@ mate_mixer_stream_suspend (MateMixerStream *stream)
gboolean
mate_mixer_stream_resume (MateMixerStream *stream)
{
- MateMixerStreamInterface *iface;
-
g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), FALSE);
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
+ if (stream->priv->state != MATE_MIXER_STREAM_STATE_SUSPENDED)
+ return TRUE;
- if (iface->resume)
- return iface->resume (stream);
+ 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_start (MateMixerStream *stream)
+mate_mixer_stream_monitor_get_enabled (MateMixerStream *stream)
{
- MateMixerStreamInterface *iface;
-
g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), FALSE);
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
-
- if (iface->monitor_start)
- return iface->monitor_start (stream);
-
- return FALSE;
-}
-
-void
-mate_mixer_stream_monitor_stop (MateMixerStream *stream)
-{
- MateMixerStreamInterface *iface;
-
- g_return_if_fail (MATE_MIXER_IS_STREAM (stream));
-
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
-
- if (iface->monitor_stop)
- iface->monitor_stop (stream);
+ return stream->priv->monitor_enabled;
}
gboolean
-mate_mixer_stream_monitor_is_running (MateMixerStream *stream)
+mate_mixer_stream_monitor_set_enabled (MateMixerStream *stream, gboolean enabled)
{
- MateMixerStreamInterface *iface;
-
g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), FALSE);
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
+ if (stream->priv->monitor_enabled == enabled)
+ return TRUE;
- if (iface->monitor_is_running)
- return iface->monitor_is_running (stream);
+ 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;
}
-gboolean
-mate_mixer_stream_monitor_set_name (MateMixerStream *stream, const gchar *name)
+static MateMixerStreamControl *
+mate_mixer_stream_real_get_control (MateMixerStream *stream, const gchar *name)
{
- MateMixerStreamInterface *iface;
-
- g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), FALSE);
-
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
-
- if (iface->monitor_set_name)
- return iface->monitor_set_name (stream, name);
-
- return FALSE;
-}
-
-const GList *
-mate_mixer_stream_list_ports (MateMixerStream *stream)
-{
- MateMixerStreamInterface *iface;
+ const GList *list;
g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), NULL);
+ g_return_val_if_fail (name != NULL, NULL);
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
+ list = mate_mixer_stream_list_controls (stream);
+ while (list != NULL) {
+ MateMixerStreamControl *control = MATE_MIXER_STREAM_CONTROL (list->data);
- if (iface->list_ports)
- return iface->list_ports (stream);
+ if (strcmp (name, mate_mixer_stream_control_get_name (control)) == 0)
+ return control;
+ list = list->next;
+ }
return NULL;
}
-MateMixerPort *
-mate_mixer_stream_get_active_port (MateMixerStream *stream)
+static MateMixerSwitch *
+mate_mixer_stream_real_get_switch (MateMixerStream *stream, const gchar *name)
{
- MateMixerStreamInterface *iface;
+ const GList *list;
g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), NULL);
+ g_return_val_if_fail (name != NULL, NULL);
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
+ list = mate_mixer_stream_list_switches (stream);
+ while (list != NULL) {
+ MateMixerSwitch *swtch = MATE_MIXER_SWITCH (list->data);
- if (iface->get_active_port)
- return iface->get_active_port (stream);
+ if (strcmp (name, mate_mixer_switch_get_name (swtch)) == 0)
+ return swtch;
+ list = list->next;
+ }
return NULL;
}
-
-gboolean
-mate_mixer_stream_set_active_port (MateMixerStream *stream, MateMixerPort *port)
-{
- MateMixerStreamInterface *iface;
-
- g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), FALSE);
- g_return_val_if_fail (MATE_MIXER_IS_PORT (port), FALSE);
-
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
-
- if (iface->set_active_port)
- return iface->set_active_port (stream, port);
-
- return FALSE;
-}
-
-guint
-mate_mixer_stream_get_min_volume (MateMixerStream *stream)
-{
- MateMixerStreamInterface *iface;
-
- g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), 0);
-
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
-
- if (iface->get_min_volume)
- return iface->get_min_volume (stream);
-
- return 0;
-}
-
-guint
-mate_mixer_stream_get_max_volume (MateMixerStream *stream)
-{
- MateMixerStreamInterface *iface;
-
- g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), 0);
-
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
-
- if (iface->get_max_volume)
- return iface->get_max_volume (stream);
-
- return 0;
-}
-
-guint
-mate_mixer_stream_get_normal_volume (MateMixerStream *stream)
-{
- MateMixerStreamInterface *iface;
-
- g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), 0);
-
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
-
- if (iface->get_normal_volume)
- return iface->get_normal_volume (stream);
-
- return 0;
-}
-
-guint
-mate_mixer_stream_get_base_volume (MateMixerStream *stream)
-{
- MateMixerStreamInterface *iface;
-
- g_return_val_if_fail (MATE_MIXER_IS_STREAM (stream), 0);
-
- iface = MATE_MIXER_STREAM_GET_INTERFACE (stream);
-
- if (iface->get_base_volume)
- return iface->get_base_volume (stream);
-
- return 0;
-}