gnome-media r4029 - in trunk/gnome-volume-control: . src
- From: mccann svn gnome org
- To: svn-commits-list gnome org
- Subject: gnome-media r4029 - in trunk/gnome-volume-control: . src
- Date: Thu, 6 Nov 2008 01:26:27 +0000 (UTC)
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]