mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-04 05:22:30 +00:00
Interface example: a mixer
Original commit message from CVS: Interface example: a mixer
This commit is contained in:
parent
2282985957
commit
9620e2ede9
5 changed files with 255 additions and 2 deletions
|
@ -1282,6 +1282,7 @@ gst-libs/gst/floatcast/Makefile
|
||||||
gst-libs/gst/gconf/Makefile
|
gst-libs/gst/gconf/Makefile
|
||||||
gst-libs/gst/idct/Makefile
|
gst-libs/gst/idct/Makefile
|
||||||
gst-libs/gst/media-info/Makefile
|
gst-libs/gst/media-info/Makefile
|
||||||
|
gst-libs/gst/mixer/Makefile
|
||||||
gst-libs/gst/play/Makefile
|
gst-libs/gst/play/Makefile
|
||||||
gst-libs/gst/resample/Makefile
|
gst-libs/gst/resample/Makefile
|
||||||
gst-libs/gst/riff/Makefile
|
gst-libs/gst/riff/Makefile
|
||||||
|
|
|
@ -5,7 +5,8 @@ GCONF_DIR=
|
||||||
endif
|
endif
|
||||||
|
|
||||||
SUBDIRS = audio idct resample riff floatcast \
|
SUBDIRS = audio idct resample riff floatcast \
|
||||||
$(GCONF_DIR) media-info play video
|
$(GCONF_DIR) media-info mixer \
|
||||||
|
play video
|
||||||
|
|
||||||
DIST_SUBDIRS = audio idct resample riff floatcast \
|
DIST_SUBDIRS = audio idct resample riff floatcast \
|
||||||
gconf media-info play video
|
gconf media-info mixer play video
|
||||||
|
|
10
gst-libs/gst/mixer/Makefile.am
Normal file
10
gst-libs/gst/mixer/Makefile.am
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
lib_LTLIBRARIES = libgstmixer.la
|
||||||
|
|
||||||
|
libgstmixer_la_SOURCES = mixer.c
|
||||||
|
|
||||||
|
libgstmixerincludedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/mixer
|
||||||
|
libgstmixerinclude_HEADERS = mixer.h
|
||||||
|
|
||||||
|
libgstmixer_la_LIBADD =
|
||||||
|
libgstmixer_la_CFLAGS = $(GST_CFLAGS) $(GST_OPT_CFLAGS)
|
||||||
|
libgstmixer_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
|
134
gst-libs/gst/mixer/mixer.c
Normal file
134
gst-libs/gst/mixer/mixer.c
Normal file
|
@ -0,0 +1,134 @@
|
||||||
|
/* GStreamer
|
||||||
|
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
|
||||||
|
* 2000 Wim Taymans <wim.taymans@chello.be>
|
||||||
|
*
|
||||||
|
* mixer.c: mixer design virtual class function wrappers
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Library General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Library General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Library General Public
|
||||||
|
* License along with this library; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
* Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <gst/mixer/mixer.h>
|
||||||
|
|
||||||
|
static void gst_mixer_class_init (GstMixerClass *klass);
|
||||||
|
|
||||||
|
GType
|
||||||
|
gst_mixer_get_type (void)
|
||||||
|
{
|
||||||
|
static GType gst_mixer_type = 0;
|
||||||
|
|
||||||
|
if (!gst_mixer_type) {
|
||||||
|
static const GTypeInfo gst_mixer_info = {
|
||||||
|
sizeof (GstMixerClass),
|
||||||
|
(GBaseInitFunc) gst_mixer_class_init,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
gst_mixer_type = g_type_register_static (G_TYPE_INTERFACE,
|
||||||
|
"GstMixer",
|
||||||
|
&gst_mixer_info, 0);
|
||||||
|
g_type_interface_add_prerequisite (gst_mixer_type,
|
||||||
|
GST_TYPE_INTERFACE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return gst_mixer_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_mixer_class_init (GstMixerClass *klass)
|
||||||
|
{
|
||||||
|
/* default virtual functions */
|
||||||
|
klass->list_channels = NULL;
|
||||||
|
klass->set_volume = NULL;
|
||||||
|
klass->get_volume = NULL;
|
||||||
|
klass->set_mute = NULL;
|
||||||
|
klass->set_record = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
const GList *
|
||||||
|
gst_mixer_list_channels (GstMixer *mixer)
|
||||||
|
{
|
||||||
|
GstMixerClass *klass = GST_MIXER_GET_CLASS (mixer);
|
||||||
|
|
||||||
|
if (klass->list_channels) {
|
||||||
|
return klass->list_channels (mixer);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gst_mixer_set_volume (GstMixer *mixer,
|
||||||
|
GstMixerChannel *channel,
|
||||||
|
gint *volumes)
|
||||||
|
{
|
||||||
|
GstMixerClass *klass = GST_MIXER_GET_CLASS (mixer);
|
||||||
|
|
||||||
|
if (klass->set_volume) {
|
||||||
|
klass->set_volume (mixer, channel, volumes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gst_mixer_get_volume (GstMixer *mixer,
|
||||||
|
GstMixerChannel *channel,
|
||||||
|
gint *volumes)
|
||||||
|
{
|
||||||
|
GstMixerClass *klass = GST_MIXER_GET_CLASS (mixer);
|
||||||
|
|
||||||
|
if (klass->get_volume) {
|
||||||
|
klass->get_volume (mixer, channel, volumes);
|
||||||
|
} else {
|
||||||
|
gint i;
|
||||||
|
|
||||||
|
for (i = 0; i < channel->num_channels; i++) {
|
||||||
|
volumes[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gst_mixer_set_mute (GstMixer *mixer,
|
||||||
|
GstMixerChannel *channel,
|
||||||
|
gboolean mute)
|
||||||
|
{
|
||||||
|
GstMixerClass *klass = GST_MIXER_GET_CLASS (mixer);
|
||||||
|
|
||||||
|
if (klass->set_mute) {
|
||||||
|
klass->set_mute (mixer, channel, mute);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gst_mixer_set_record (GstMixer *mixer,
|
||||||
|
GstMixerChannel *channel,
|
||||||
|
gboolean record)
|
||||||
|
{
|
||||||
|
GstMixerClass *klass = GST_MIXER_GET_CLASS (mixer);
|
||||||
|
|
||||||
|
if (klass->set_record) {
|
||||||
|
klass->set_record (mixer, channel, record);
|
||||||
|
}
|
||||||
|
}
|
107
gst-libs/gst/mixer/mixer.h
Normal file
107
gst-libs/gst/mixer/mixer.h
Normal file
|
@ -0,0 +1,107 @@
|
||||||
|
/* GStreamer
|
||||||
|
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
|
||||||
|
* 2000 Wim Taymans <wim.taymans@chello.be>
|
||||||
|
*
|
||||||
|
* mixer.h: mixer interface design
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Library General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Library General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Library General Public
|
||||||
|
* License along with this library; if not, write to the
|
||||||
|
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
* Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __GST_MIXER_H__
|
||||||
|
#define __GST_MIXER_H__
|
||||||
|
|
||||||
|
#include <gst/gst.h>
|
||||||
|
|
||||||
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
#define GST_TYPE_MIXER \
|
||||||
|
(gst_mixer_get_type ())
|
||||||
|
#define GST_MIXER(obj) \
|
||||||
|
(GST_INTERFACE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_MIXER, GstMixer))
|
||||||
|
#define GST_MIXER_CLASS(klass) \
|
||||||
|
(G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_MIXER, GstMixerClass))
|
||||||
|
#define GST_IS_MIXER(obj) \
|
||||||
|
(GST_INTERFACE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_MIXER))
|
||||||
|
#define GST_IS_MIXER_CLASS(klass) \
|
||||||
|
(G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_MIXER))
|
||||||
|
#define GST_MIXER_GET_CLASS(inst) \
|
||||||
|
(G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_MIXER, GstMixerClass))
|
||||||
|
|
||||||
|
/* I fully realise that this naming being used here is confusing.
|
||||||
|
* A channel is referred to both as the number of simultaneous
|
||||||
|
* sound streams the input can handle as well as the in-/output
|
||||||
|
* itself. We need to fix this some day, I just cannot come up
|
||||||
|
* with something better.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define GST_MIXER_CHANNEL_INPUT (1<<0)
|
||||||
|
#define GST_MIXER_CHANNEL_OUTPUT (1<<1)
|
||||||
|
#define GST_MIXER_CHANNEL_MUTE (1<<2)
|
||||||
|
#define GST_MIXER_CHANNEL_RECORD (1<<3)
|
||||||
|
|
||||||
|
typedef struct _GstMixerChannel {
|
||||||
|
gchar *label;
|
||||||
|
gint num_channels,
|
||||||
|
flags,
|
||||||
|
min_volume, max_volume;
|
||||||
|
} GstMixerChannel;
|
||||||
|
|
||||||
|
#define GST_MIXER_CHANNEL_HAS_FLAG(channel, flag) \
|
||||||
|
((channel)->flags & flag)
|
||||||
|
|
||||||
|
typedef struct _GstMixer GstMixer;
|
||||||
|
|
||||||
|
typedef struct _GstMixerClass {
|
||||||
|
GTypeInterface klass;
|
||||||
|
|
||||||
|
/* virtual functions */
|
||||||
|
const GList * (* list_channels) (GstMixer *mixer);
|
||||||
|
|
||||||
|
void (* set_volume) (GstMixer *mixer,
|
||||||
|
GstMixerChannel *channel,
|
||||||
|
gint *volumes);
|
||||||
|
void (* get_volume) (GstMixer *mixer,
|
||||||
|
GstMixerChannel *channel,
|
||||||
|
gint *volumes);
|
||||||
|
|
||||||
|
void (* set_mute) (GstMixer *mixer,
|
||||||
|
GstMixerChannel *channel,
|
||||||
|
gboolean mute);
|
||||||
|
void (* set_record) (GstMixer *mixer,
|
||||||
|
GstMixerChannel *channel,
|
||||||
|
gboolean record);
|
||||||
|
} GstMixerClass;
|
||||||
|
|
||||||
|
GType gst_mixer_get_type (void);
|
||||||
|
|
||||||
|
/* virtual class function wrappers */
|
||||||
|
const GList * gst_mixer_list_channels (GstMixer *mixer);
|
||||||
|
void gst_mixer_set_volume (GstMixer *mixer,
|
||||||
|
GstMixerChannel *channel,
|
||||||
|
gint *volumes);
|
||||||
|
void gst_mixer_get_volume (GstMixer *mixer,
|
||||||
|
GstMixerChannel *channel,
|
||||||
|
gint *volumes);
|
||||||
|
void gst_mixer_set_mute (GstMixer *mixer,
|
||||||
|
GstMixerChannel *channel,
|
||||||
|
gboolean mute);
|
||||||
|
void gst_mixer_set_record (GstMixer *mixer,
|
||||||
|
GstMixerChannel *channel,
|
||||||
|
gboolean record);
|
||||||
|
|
||||||
|
G_END_DECLS
|
||||||
|
|
||||||
|
#endif /* __GST_MIXER_H__ */
|
Loading…
Reference in a new issue