gnome-media r4029 - in trunk/gnome-volume-control: . src



Author: mccann
Date: Thu Nov  6 01:26:27 2008
New Revision: 4029
URL: http://svn.gnome.org/viewvc/gnome-media?rev=4029&view=rev

Log:
2008-11-05  William Jon McCann  <jmccann redhat com>

	* src/Makefile.am:
	* src/gvc-mixer-control.c (gvc_mixer_control_get_default_source),
	(gvc_mixer_control_get_sources), (remove_stream), (add_stream),
	(update_sink), (update_source), (update_sink_input),
	(update_event_role_stream), (remove_sink), (remove_source),
	(remove_sink_input), (remove_source_output):
	* src/gvc-mixer-control.h:
	* src/gvc-mixer-dialog.c (add_stream),
	(gvc_mixer_dialog_constructor):
	* src/gvc-mixer-source.c (gvc_mixer_source_change_volume),
	(gvc_mixer_source_change_is_muted), (gvc_mixer_source_constructor),
	(gvc_mixer_source_class_init), (gvc_mixer_source_init),
	(gvc_mixer_source_finalize), (gvc_mixer_source_new):
	* src/gvc-mixer-source.h:
	Add support for input streams.  Only show default input and
	output stream.



Added:
   trunk/gnome-volume-control/src/gvc-mixer-source.c
   trunk/gnome-volume-control/src/gvc-mixer-source.h
Modified:
   trunk/gnome-volume-control/ChangeLog
   trunk/gnome-volume-control/src/Makefile.am
   trunk/gnome-volume-control/src/gvc-mixer-control.c
   trunk/gnome-volume-control/src/gvc-mixer-control.h
   trunk/gnome-volume-control/src/gvc-mixer-dialog.c

Modified: trunk/gnome-volume-control/src/Makefile.am
==============================================================================
--- trunk/gnome-volume-control/src/Makefile.am	(original)
+++ trunk/gnome-volume-control/src/Makefile.am	Thu Nov  6 01:26:27 2008
@@ -24,6 +24,8 @@
 	gvc-mixer-stream.c			\
 	gvc-mixer-sink.h			\
 	gvc-mixer-sink.c			\
+	gvc-mixer-source.h			\
+	gvc-mixer-source.c			\
 	gvc-mixer-sink-input.h			\
 	gvc-mixer-sink-input.c			\
 	gvc-mixer-control.h			\
@@ -45,6 +47,8 @@
 	gvc-mixer-stream.c			\
 	gvc-mixer-sink.h			\
 	gvc-mixer-sink.c			\
+	gvc-mixer-source.h			\
+	gvc-mixer-source.c			\
 	gvc-mixer-sink-input.h			\
 	gvc-mixer-sink-input.c			\
 	gvc-mixer-control.h			\

Modified: trunk/gnome-volume-control/src/gvc-mixer-control.c
==============================================================================
--- trunk/gnome-volume-control/src/gvc-mixer-control.c	(original)
+++ trunk/gnome-volume-control/src/gvc-mixer-control.c	Thu Nov  6 01:26:27 2008
@@ -35,6 +35,7 @@
 
 #include "gvc-mixer-control.h"
 #include "gvc-mixer-sink.h"
+#include "gvc-mixer-source.h"
 #include "gvc-mixer-sink-input.h"
 
 #define GVC_MIXER_CONTROL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GVC_TYPE_MIXER_CONTROL, GvcMixerControlPrivate))
@@ -110,6 +111,23 @@
 }
 
 GvcMixerStream *
+gvc_mixer_control_get_default_source (GvcMixerControl *control)
+{
+        GvcMixerStream *stream;
+
+        g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL);
+
+        if (control->priv->default_source_is_set) {
+                stream = g_hash_table_lookup (control->priv->all_streams,
+                                              GUINT_TO_POINTER (control->priv->default_source_id));
+        } else {
+                stream = NULL;
+        }
+
+        return stream;
+}
+
+GvcMixerStream *
 gvc_mixer_control_lookup_stream_id (GvcMixerControl *control,
                                     guint            id)
 {
@@ -163,6 +181,20 @@
 }
 
 GSList *
+gvc_mixer_control_get_sources (GvcMixerControl *control)
+{
+        GSList *retval;
+
+        g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL);
+
+        retval = NULL;
+        g_hash_table_foreach (control->priv->sources,
+                              listify_hash_values_hfunc,
+                              &retval);
+        return g_slist_sort (retval, (GCompareFunc) gvc_stream_collate);
+}
+
+GSList *
 gvc_mixer_control_get_sink_inputs (GvcMixerControl *control)
 {
         GSList *retval;
@@ -215,6 +247,33 @@
 }
 
 static void
+remove_stream (GvcMixerControl *control,
+               GvcMixerStream  *stream)
+{
+        g_object_ref (stream);
+        g_hash_table_remove (control->priv->all_streams,
+                             GUINT_TO_POINTER (gvc_mixer_stream_get_id (stream)));
+        g_signal_emit (G_OBJECT (control),
+                       signals[STREAM_ADDED],
+                       0,
+                       gvc_mixer_stream_get_id (stream));
+        g_object_unref (stream);
+}
+
+static void
+add_stream (GvcMixerControl *control,
+            GvcMixerStream  *stream)
+{
+        g_hash_table_insert (control->priv->all_streams,
+                             GUINT_TO_POINTER (gvc_mixer_stream_get_id (stream)),
+                             stream);
+        g_signal_emit (G_OBJECT (control),
+                       signals[STREAM_ADDED],
+                       0,
+                       gvc_mixer_stream_get_id (stream));
+}
+
+static void
 update_sink (GvcMixerControl    *control,
              const pa_sink_info *info)
 {
@@ -237,13 +296,6 @@
                 stream = gvc_mixer_sink_new (control->priv->pa_context,
                                              info->index,
                                              info->channel_map.channels);
-                g_hash_table_insert (control->priv->sinks,
-                                     GUINT_TO_POINTER (info->index),
-                                     g_object_ref (stream));
-
-                g_hash_table_insert (control->priv->all_streams,
-                                     GUINT_TO_POINTER (gvc_mixer_stream_get_id (stream)),
-                                     stream);
                 is_new = TRUE;
         }
 
@@ -263,10 +315,10 @@
         //w->type = info.flags & PA_SINK_HARDWARE ? SINK_HARDWARE : SINK_VIRTUAL;
 
         if (is_new) {
-                g_signal_emit (G_OBJECT (control),
-                               signals[STREAM_ADDED],
-                               0,
-                               gvc_mixer_stream_get_id (stream));
+                g_hash_table_insert (control->priv->sinks,
+                                     GUINT_TO_POINTER (info->index),
+                                     g_object_ref (stream));
+                add_stream (control, stream);
         }
 
         if (is_default) {
@@ -281,11 +333,56 @@
 update_source (GvcMixerControl      *control,
                const pa_source_info *info)
 {
+        GvcMixerStream *stream;
+        gboolean        is_new;
+        gboolean        is_default;
+        pa_volume_t     avg_volume;
+#if 0
         g_debug ("Updating source: index=%u name='%s' description='%s'",
                  info->index,
                  info->name,
                  info->description);
+#endif
+        is_new = FALSE;
+        is_default = FALSE;
+
+        stream = g_hash_table_lookup (control->priv->sources,
+                                      GUINT_TO_POINTER (info->index));
+        if (stream == NULL) {
+                stream = gvc_mixer_source_new (control->priv->pa_context,
+                                               info->index,
+                                               info->channel_map.channels);
+                is_new = TRUE;
+        }
+
+        if (control->priv->default_source_name != NULL
+            && info->name != NULL
+            && strcmp (control->priv->default_source_name, info->name) == 0) {
+                is_default = TRUE;
+        }
+        avg_volume = pa_cvolume_avg (&info->volume);
+
+        gvc_mixer_stream_set_name (stream, info->name);
+        gvc_mixer_stream_set_icon_name (stream, "audio-input-microphone");
+        gvc_mixer_stream_set_volume (stream, (guint)avg_volume);
+        gvc_mixer_stream_set_is_muted (stream, info->mute);
+        gvc_mixer_stream_set_is_default (stream, is_default);
+
+        //w->type = info.flags & PA_SINK_HARDWARE ? SINK_HARDWARE : SINK_VIRTUAL;
+
+        if (is_new) {
+                g_hash_table_insert (control->priv->sources,
+                                     GUINT_TO_POINTER (info->index),
+                                     g_object_ref (stream));
+                add_stream (control, stream);
+        }
+
+        if (is_default) {
+                control->priv->default_source_id = gvc_mixer_stream_get_id (stream);
+                control->priv->default_source_is_set = TRUE;
 
+                /* FIXME: property w/ changed event */
+        }
 }
 
 static void
@@ -358,13 +455,6 @@
                 stream = gvc_mixer_sink_input_new (control->priv->pa_context,
                                                    info->index,
                                                    info->channel_map.channels);
-                g_hash_table_insert (control->priv->sink_inputs,
-                                     GUINT_TO_POINTER (info->index),
-                                     g_object_ref (stream));
-
-                g_hash_table_insert (control->priv->all_streams,
-                                     GUINT_TO_POINTER (gvc_mixer_stream_get_id (stream)),
-                                     stream);
                 is_new = TRUE;
         }
 
@@ -378,6 +468,10 @@
         gvc_mixer_stream_set_is_default (stream, is_default);
 
         if (is_new) {
+                g_hash_table_insert (control->priv->sink_inputs,
+                                     GUINT_TO_POINTER (info->index),
+                                     g_object_ref (stream));
+                add_stream (control, stream);
                 g_signal_emit (G_OBJECT (control),
                                signals[STREAM_ADDED],
                                0,
@@ -575,9 +669,6 @@
                 stream = gvc_mixer_sink_input_new (control->priv->pa_context,
                                                    0,
                                                    1);
-                g_hash_table_insert (control->priv->all_streams,
-                                     GUINT_TO_POINTER (gvc_mixer_stream_get_id (stream)),
-                                     stream);
                 control->priv->event_sink_input_id = gvc_mixer_stream_get_id (stream);
                 control->priv->event_sink_input_is_set = TRUE;
 
@@ -596,6 +687,7 @@
         gvc_mixer_stream_set_is_muted (stream, info->mute);
 
         if (is_new) {
+                add_stream (control, stream);
                 g_signal_emit (G_OBJECT (control),
                                signals[STREAM_ADDED],
                                0,
@@ -792,32 +884,76 @@
 remove_sink (GvcMixerControl *control,
              guint            index)
 {
+        GvcMixerStream *stream;
+
         g_debug ("Removing sink: index=%u", index);
-        /* FIXME: */
+
+        stream = g_hash_table_lookup (control->priv->sinks,
+                                      GUINT_TO_POINTER (index));
+        if (stream == NULL) {
+                return;
+        }
+        g_hash_table_remove (control->priv->sinks,
+                             GUINT_TO_POINTER (index));
+
+        remove_stream (control, stream);
 }
 
 static void
 remove_source (GvcMixerControl *control,
                guint            index)
 {
+        GvcMixerStream *stream;
+
         g_debug ("Removing source: index=%u", index);
-        /* FIXME: */
+
+        stream = g_hash_table_lookup (control->priv->sources,
+                                      GUINT_TO_POINTER (index));
+        if (stream == NULL) {
+                return;
+        }
+        g_hash_table_remove (control->priv->sources,
+                             GUINT_TO_POINTER (index));
+
+        remove_stream (control, stream);
 }
 
 static void
 remove_sink_input (GvcMixerControl *control,
                    guint            index)
 {
-        g_debug ("Removing source: index=%u", index);
-        /* FIXME: */
+        GvcMixerStream *stream;
+
+        g_debug ("Removing sink input: index=%u", index);
+
+        stream = g_hash_table_lookup (control->priv->sink_inputs,
+                                      GUINT_TO_POINTER (index));
+        if (stream == NULL) {
+                return;
+        }
+        g_hash_table_remove (control->priv->sink_inputs,
+                             GUINT_TO_POINTER (index));
+
+        remove_stream (control, stream);
 }
 
 static void
 remove_source_output (GvcMixerControl *control,
                       guint            index)
 {
+        GvcMixerStream *stream;
+
         g_debug ("Removing source output: index=%u", index);
-        /* FIXME: */
+
+        stream = g_hash_table_lookup (control->priv->source_outputs,
+                                      GUINT_TO_POINTER (index));
+        if (stream == NULL) {
+                return;
+        }
+        g_hash_table_remove (control->priv->source_outputs,
+                             GUINT_TO_POINTER (index));
+
+        remove_stream (control, stream);
 }
 
 static void

Modified: trunk/gnome-volume-control/src/gvc-mixer-control.h
==============================================================================
--- trunk/gnome-volume-control/src/gvc-mixer-control.h	(original)
+++ trunk/gnome-volume-control/src/gvc-mixer-control.h	Thu Nov  6 01:26:27 2008
@@ -61,12 +61,14 @@
 gboolean            gvc_mixer_control_is_ready            (GvcMixerControl *control);
 
 GSList *            gvc_mixer_control_get_sinks           (GvcMixerControl *control);
+GSList *            gvc_mixer_control_get_sources         (GvcMixerControl *control);
 GSList *            gvc_mixer_control_get_sink_inputs     (GvcMixerControl *control);
 
 GvcMixerStream *    gvc_mixer_control_lookup_stream_id    (GvcMixerControl *control,
                                                            guint            id);
 
 GvcMixerStream *    gvc_mixer_control_get_default_sink    (GvcMixerControl *control);
+GvcMixerStream *    gvc_mixer_control_get_default_source  (GvcMixerControl *control);
 GvcMixerStream *    gvc_mixer_control_get_event_sink_input (GvcMixerControl *control);
 
 G_END_DECLS

Modified: trunk/gnome-volume-control/src/gvc-mixer-dialog.c
==============================================================================
--- trunk/gnome-volume-control/src/gvc-mixer-dialog.c	(original)
+++ trunk/gnome-volume-control/src/gvc-mixer-dialog.c	Thu Nov  6 01:26:27 2008
@@ -31,6 +31,7 @@
 #include "gvc-channel-bar.h"
 #include "gvc-mixer-control.h"
 #include "gvc-mixer-sink.h"
+#include "gvc-mixer-source.h"
 #include "gvc-mixer-dialog.h"
 
 #define SCALE_SIZE 128
@@ -43,6 +44,7 @@
         GHashTable      *bars;
         GtkWidget       *streams_box;
         GtkWidget       *output_streams_box;
+        GtkWidget       *input_streams_box;
         GtkWidget       *application_streams_box;
 };
 
@@ -235,6 +237,9 @@
                                           _("Speakers"));
                 gtk_widget_set_sensitive (dialog->priv->application_streams_box,
                                           !is_muted);
+        } else if (stream == gvc_mixer_control_get_default_source (dialog->priv->mixer_control)) {
+                gvc_channel_bar_set_name (GVC_CHANNEL_BAR (bar),
+                                          _("Microphone"));
         } else {
                 gvc_channel_bar_set_name (GVC_CHANNEL_BAR (bar),
                                           gvc_mixer_stream_get_name (stream));
@@ -248,6 +253,8 @@
 
         if (GVC_IS_MIXER_SINK (stream)) {
                 gtk_box_pack_start (GTK_BOX (dialog->priv->output_streams_box), bar, TRUE, FALSE, 0);
+        } else if (GVC_IS_MIXER_SOURCE (stream)) {
+                gtk_box_pack_start (GTK_BOX (dialog->priv->input_streams_box), bar, TRUE, FALSE, 0);
         } else {
                 gtk_box_pack_start (GTK_BOX (dialog->priv->application_streams_box), bar, TRUE, FALSE, 0);
         }
@@ -326,6 +333,11 @@
                             self->priv->output_streams_box,
                             FALSE, FALSE, 6);
 
+        self->priv->input_streams_box = gtk_hbox_new (FALSE, 12);
+        gtk_box_pack_start (GTK_BOX (self->priv->streams_box),
+                            self->priv->input_streams_box,
+                            FALSE, FALSE, 6);
+
         separator = gtk_vseparator_new ();
         gtk_box_pack_start (GTK_BOX (self->priv->streams_box),
                             separator,
@@ -347,12 +359,11 @@
                           G_CALLBACK (on_control_stream_removed),
                           self);
 
-        streams = gvc_mixer_control_get_sinks (self->priv->mixer_control);
-        for (l = streams; l != NULL; l = l->next) {
-                stream = l->data;
-                add_stream (self, stream);
-        }
-        g_slist_free (streams);
+        stream = gvc_mixer_control_get_default_sink (self->priv->mixer_control);
+        add_stream (self, stream);
+
+        stream = gvc_mixer_control_get_default_source (self->priv->mixer_control);
+        add_stream (self, stream);
 
         stream = gvc_mixer_control_get_event_sink_input (self->priv->mixer_control);
         add_stream (self, stream);

Added: trunk/gnome-volume-control/src/gvc-mixer-source.c
==============================================================================
--- (empty file)
+++ trunk/gnome-volume-control/src/gvc-mixer-source.c	Thu Nov  6 01:26:27 2008
@@ -0,0 +1,172 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2008 William Jon McCann
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include <glib.h>
+#include <glib/gi18n.h>
+
+#include <pulse/pulseaudio.h>
+
+#include "gvc-mixer-source.h"
+
+#define GVC_MIXER_SOURCE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GVC_TYPE_MIXER_SOURCE, GvcMixerSourcePrivate))
+
+struct GvcMixerSourcePrivate
+{
+        gpointer dummy;
+};
+
+static void     gvc_mixer_source_class_init (GvcMixerSourceClass *klass);
+static void     gvc_mixer_source_init       (GvcMixerSource      *mixer_source);
+static void     gvc_mixer_source_finalize   (GObject            *object);
+
+G_DEFINE_TYPE (GvcMixerSource, gvc_mixer_source, GVC_TYPE_MIXER_STREAM)
+
+static gboolean
+gvc_mixer_source_change_volume (GvcMixerStream *stream,
+                              guint           volume)
+{
+        pa_operation *o;
+        guint         index;
+        guint         num_channels;
+        pa_context   *context;
+        pa_cvolume    cv;
+
+        index = gvc_mixer_stream_get_index (stream);
+        num_channels = gvc_mixer_stream_get_num_channels (stream);
+
+        pa_cvolume_set (&cv, num_channels, (pa_volume_t)volume);
+
+        context = gvc_mixer_stream_get_pa_context (stream);
+
+        o = pa_context_set_source_volume_by_index (context,
+                                                   index,
+                                                   &cv,
+                                                   NULL,
+                                                   NULL);
+
+        if (o == NULL) {
+                g_warning ("pa_context_set_source_volume_by_index() failed");
+                return FALSE;
+        }
+
+        pa_operation_unref(o);
+
+        return TRUE;
+}
+
+static gboolean
+gvc_mixer_source_change_is_muted (GvcMixerStream *stream,
+                                gboolean        is_muted)
+{
+        pa_operation *o;
+        guint         index;
+        pa_context   *context;
+
+        index = gvc_mixer_stream_get_index (stream);
+        context = gvc_mixer_stream_get_pa_context (stream);
+
+        o = pa_context_set_source_mute_by_index (context,
+                                                 index,
+                                                 is_muted,
+                                                 NULL,
+                                                 NULL);
+
+        if (o == NULL) {
+                g_warning ("pa_context_set_source_mute_by_index() failed");
+                return FALSE;
+        }
+
+        pa_operation_unref(o);
+
+        return TRUE;
+}
+
+static GObject *
+gvc_mixer_source_constructor (GType                  type,
+                            guint                  n_construct_properties,
+                            GObjectConstructParam *construct_params)
+{
+        GObject       *object;
+        GvcMixerSource *self;
+
+        object = G_OBJECT_CLASS (gvc_mixer_source_parent_class)->constructor (type, n_construct_properties, construct_params);
+
+        self = GVC_MIXER_SOURCE (object);
+
+        return object;
+}
+
+static void
+gvc_mixer_source_class_init (GvcMixerSourceClass *klass)
+{
+        GObjectClass        *object_class = G_OBJECT_CLASS (klass);
+        GvcMixerStreamClass *stream_class = GVC_MIXER_STREAM_CLASS (klass);
+
+        object_class->constructor = gvc_mixer_source_constructor;
+        object_class->finalize = gvc_mixer_source_finalize;
+
+        stream_class->change_volume = gvc_mixer_source_change_volume;
+        stream_class->change_is_muted = gvc_mixer_source_change_is_muted;
+
+        g_type_class_add_private (klass, sizeof (GvcMixerSourcePrivate));
+}
+
+static void
+gvc_mixer_source_init (GvcMixerSource *source)
+{
+        source->priv = GVC_MIXER_SOURCE_GET_PRIVATE (source);
+
+}
+
+static void
+gvc_mixer_source_finalize (GObject *object)
+{
+        GvcMixerSource *mixer_source;
+
+        g_return_if_fail (object != NULL);
+        g_return_if_fail (GVC_IS_MIXER_SOURCE (object));
+
+        mixer_source = GVC_MIXER_SOURCE (object);
+
+        g_return_if_fail (mixer_source->priv != NULL);
+        G_OBJECT_CLASS (gvc_mixer_source_parent_class)->finalize (object);
+}
+
+GvcMixerStream *
+gvc_mixer_source_new (pa_context *context,
+                    guint       index,
+                    guint       num_channels)
+{
+        GObject *object;
+
+        object = g_object_new (GVC_TYPE_MIXER_SOURCE,
+                               "pa-context", context,
+                               "index", index,
+                               "num-channels", num_channels,
+                               NULL);
+
+        return GVC_MIXER_STREAM (object);
+}

Added: trunk/gnome-volume-control/src/gvc-mixer-source.h
==============================================================================
--- (empty file)
+++ trunk/gnome-volume-control/src/gvc-mixer-source.h	Thu Nov  6 01:26:27 2008
@@ -0,0 +1,57 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2008 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+#ifndef __GVC_MIXER_SOURCE_H
+#define __GVC_MIXER_SOURCE_H
+
+#include <glib-object.h>
+#include "gvc-mixer-stream.h"
+
+G_BEGIN_DECLS
+
+#define GVC_TYPE_MIXER_SOURCE         (gvc_mixer_source_get_type ())
+#define GVC_MIXER_SOURCE(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), GVC_TYPE_MIXER_SOURCE, GvcMixerSource))
+#define GVC_MIXER_SOURCE_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), GVC_TYPE_MIXER_SOURCE, GvcMixerSourceClass))
+#define GVC_IS_MIXER_SOURCE(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), GVC_TYPE_MIXER_SOURCE))
+#define GVC_IS_MIXER_SOURCE_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), GVC_TYPE_MIXER_SOURCE))
+#define GVC_MIXER_SOURCE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GVC_TYPE_MIXER_SOURCE, GvcMixerSourceClass))
+
+typedef struct GvcMixerSourcePrivate GvcMixerSourcePrivate;
+
+typedef struct
+{
+        GvcMixerStream       parent;
+        GvcMixerSourcePrivate *priv;
+} GvcMixerSource;
+
+typedef struct
+{
+        GvcMixerStreamClass parent_class;
+} GvcMixerSourceClass;
+
+GType               gvc_mixer_source_get_type            (void);
+
+GvcMixerStream *    gvc_mixer_source_new               (pa_context *context,
+                                                        guint       index,
+                                                        guint       num_channels);
+
+G_END_DECLS
+
+#endif /* __GVC_MIXER_SOURCE_H */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]