mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-18 07:47:17 +00:00
Interface example: a mixer
Original commit message from CVS: Interface example: a mixer
This commit is contained in:
parent
35989ae8d4
commit
beea17989f
7 changed files with 496 additions and 2 deletions
|
@ -1282,6 +1282,7 @@ gst-libs/gst/floatcast/Makefile
|
|||
gst-libs/gst/gconf/Makefile
|
||||
gst-libs/gst/idct/Makefile
|
||||
gst-libs/gst/media-info/Makefile
|
||||
gst-libs/gst/mixer/Makefile
|
||||
gst-libs/gst/play/Makefile
|
||||
gst-libs/gst/resample/Makefile
|
||||
gst-libs/gst/riff/Makefile
|
||||
|
|
|
@ -5,7 +5,8 @@ GCONF_DIR=
|
|||
endif
|
||||
|
||||
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 \
|
||||
gconf media-info play video
|
||||
gconf media-info mixer play video
|
||||
|
|
134
gst-libs/gst/interfaces/mixer.c
Normal file
134
gst-libs/gst/interfaces/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/interfaces/mixer.h
Normal file
107
gst-libs/gst/interfaces/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__ */
|
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