From: Steve Baker Date: Sat, 6 Oct 2001 12:46:50 +0000 (+0000) Subject: gstsinesrc is being moved into plugins/synthesis/sinesrc X-Git-Tag: BRANCH-EVENTS1-200110161-ROOT~11 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b48fa3d758e39a4676196abda0a7fdbd13026e3c;p=platform%2Fupstream%2Fgstreamer.git gstsinesrc is being moved into plugins/synthesis/sinesrc Original commit message from CVS: gstsinesrc is being moved into plugins/synthesis/sinesrc --- diff --git a/gst/elements/Makefile.am b/gst/elements/Makefile.am index 0b2cf62..61c5ad7 100644 --- a/gst/elements/Makefile.am +++ b/gst/elements/Makefile.am @@ -23,7 +23,6 @@ libgstelements_la_SOURCES = \ gstpipefilter.c \ gsttee.c \ gstaggregator.c \ - gstsinesrc.c \ $(GSTHTTPSRC) noinst_HEADERS = \ @@ -38,9 +37,7 @@ noinst_HEADERS = \ gstfdsink.h \ gstpipefilter.h \ gsttee.h \ - gstaggregator.h \ - gstsinesrc.h - + gstaggregator.h CFLAGS += -O2 -Wall LDFLAGS += -lm diff --git a/gst/elements/gstelements.c b/gst/elements/gstelements.c index 7d32062..bdd540d 100644 --- a/gst/elements/gstelements.c +++ b/gst/elements/gstelements.c @@ -32,7 +32,6 @@ #include "gstfdsrc.h" #include "gstmultidisksrc.h" #include "gstpipefilter.h" -#include "gstsinesrc.h" #include "gsttee.h" #include "gstaggregator.h" @@ -64,7 +63,6 @@ static struct _elements_entry _elements[] = { { "fdsrc", gst_fdsrc_get_type, &gst_fdsrc_details, NULL }, { "multidisksrc", gst_multidisksrc_get_type, &gst_multidisksrc_details, NULL }, { "pipefilter", gst_pipefilter_get_type, &gst_pipefilter_details, NULL }, - { "sinesrc", gst_sinesrc_get_type, &gst_sinesrc_details, gst_sinesrc_factory_init }, { "tee", gst_tee_get_type, &gst_tee_details, gst_tee_factory_init }, { "aggregator", gst_aggregator_get_type, &gst_aggregator_details, gst_aggregator_factory_init }, diff --git a/gst/elements/gstsinesrc.c b/gst/elements/gstsinesrc.c deleted file mode 100644 index 3cb614cf..0000000 --- a/gst/elements/gstsinesrc.c +++ /dev/null @@ -1,428 +0,0 @@ -/* GStreamer - * Copyright (C) 1999,2000 Erik Walthinsen - * 2000 Wim Taymans - * 2001 Steve Baker - * - * gstsinesrc.c: - * - * 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. - */ - -#include -#include -#include - -#include - - -GstElementDetails gst_sinesrc_details = { - "Sine-wave src", - "Source/Audio", - "Create a sine wave of a given frequency and volume", - VERSION, - "Erik Walthinsen ", - "(C) 1999", -}; - - -/* SineSrc signals and args */ -enum { - /* FILL ME */ - LAST_SIGNAL -}; - -enum { - ARG_0, - ARG_FORMAT, - ARG_SAMPLERATE, - ARG_TABLESIZE, - ARG_BUFFER_SIZE, -}; - -// FIXME: this is not core business... -GST_PADTEMPLATE_FACTORY (sinesrc_src_factory, - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_CAPS_NEW ( - "sinesrc_src", - "audio/raw", - "format", GST_PROPS_STRING ("int"), - "law", GST_PROPS_INT (0), - "endianness", GST_PROPS_INT (G_BYTE_ORDER), - "signed", GST_PROPS_BOOLEAN (TRUE), - "width", GST_PROPS_INT (16), - "depth", GST_PROPS_INT (16), - "rate", GST_PROPS_INT_RANGE (8000, 48000), - "channels", GST_PROPS_INT (1) - ) -); - -static void gst_sinesrc_class_init (GstSineSrcClass *klass); -static void gst_sinesrc_init (GstSineSrc *src); -static GstPadNegotiateReturn gst_sinesrc_negotiate (GstPad *pad, GstCaps **caps, gpointer *data); -static void gst_sinesrc_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec); -static void gst_sinesrc_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec); -//static gboolean gst_sinesrc_change_state(GstElement *element, -// GstElementState state); -//static void gst_sinesrc_close_audio(GstSineSrc *src); -//static gboolean gst_sinesrc_open_audio(GstSineSrc *src); - -static void gst_sinesrc_update_freq(GValue *value, gpointer data); -static void gst_sinesrc_populate_sinetable (GstSineSrc *src); -static inline void gst_sinesrc_update_table_inc (GstSineSrc *src); -static void gst_sinesrc_force_caps (GstSineSrc *src); - -static GstBuffer* gst_sinesrc_get (GstPad *pad); - -static GstElementClass *parent_class = NULL; -//static guint gst_sinesrc_signals[LAST_SIGNAL] = { 0 }; - -GType -gst_sinesrc_get_type (void) -{ - static GType sinesrc_type = 0; - - if (!sinesrc_type) { - static const GTypeInfo sinesrc_info = { - sizeof(GstSineSrcClass), - NULL, - NULL, - (GClassInitFunc)gst_sinesrc_class_init, - NULL, - NULL, - sizeof(GstSineSrc), - 0, - (GInstanceInitFunc)gst_sinesrc_init, - }; - sinesrc_type = g_type_register_static (GST_TYPE_ELEMENT, "GstSineSrc", &sinesrc_info, 0); - } - return sinesrc_type; -} - -static void -gst_sinesrc_class_init (GstSineSrcClass *klass) -{ - GObjectClass *gobject_class; - GstElementClass *gstelement_class; - - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; - - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); - - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_FORMAT, - g_param_spec_int("format","format","format", - G_MININT,G_MAXINT,0,G_PARAM_READWRITE)); // CHECKME - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_SAMPLERATE, - g_param_spec_int("samplerate","samplerate","samplerate", - G_MININT,G_MAXINT,0,G_PARAM_READWRITE)); // CHECKME - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_TABLESIZE, - g_param_spec_int("tablesize","tablesize","tablesize", - G_MININT,G_MAXINT,0,G_PARAM_READWRITE)); // CHECKME - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_BUFFER_SIZE, - g_param_spec_int("buffersize","buffersize","buffersize", - 0, G_MAXINT, 1024, G_PARAM_READWRITE)); - - gobject_class->set_property = gst_sinesrc_set_property; - gobject_class->get_property = gst_sinesrc_get_property; - -// gstelement_class->change_state = gst_sinesrc_change_state; -} - -static void -gst_sinesrc_init (GstSineSrc *src) -{ - GstElement *element = GST_ELEMENT(src); - GstDParamManager *dpman; - GstDParamSpec *spec; - - src->srcpad = gst_pad_new_from_template ( - GST_PADTEMPLATE_GET (sinesrc_src_factory), "src"); - gst_element_add_pad(GST_ELEMENT(src), src->srcpad); - gst_pad_set_negotiate_function (src->srcpad, gst_sinesrc_negotiate); - - gst_pad_set_get_function(src->srcpad, gst_sinesrc_get); - - src->format = 16; - src->samplerate = 44100; - - src->newcaps = TRUE; - - src->table_pos = 0.0; - src->table_size = 1024; - src->buffer_size=1024; - src->timestamp=0LL; - - src->seq = 0; - - dpman = gst_dpman_new ("sinesrc_dpman", GST_ELEMENT(src)); - - gst_dpman_add_required_dparam_callback (dpman, "freq", G_TYPE_FLOAT, gst_sinesrc_update_freq, src); - spec = gst_dpman_get_dparam_spec (dpman, "freq"); - g_value_set_float(spec->min_val, 10.0); - g_value_set_float(spec->max_val, 10000.0); - g_value_set_float(spec->default_val, 350.0); - spec->unit_name = "frequency"; - spec->is_log = TRUE; - - gst_dpman_add_required_dparam_direct (dpman, "volume", G_TYPE_FLOAT, &(src->volume)); - spec = gst_dpman_get_dparam_spec (dpman, "volume"); - g_value_set_float(spec->min_val, 0.0); - g_value_set_float(spec->max_val, 1.0); - g_value_set_float(spec->default_val, 0.8); - spec->unit_name = "scalar"; - - src->volume = 0.0; - - gst_dpman_set_rate_change_pad(dpman, src->srcpad); - - GST_ELEMENT_DPARAM_MANAGER(element) = dpman; - - gst_sinesrc_populate_sinetable(src); - gst_sinesrc_update_table_inc(src); - -} - -static GstPadNegotiateReturn -gst_sinesrc_negotiate (GstPad *pad, GstCaps **caps, gpointer *data) -{ - GstSineSrc *src; - - if (*caps) { - g_return_val_if_fail (pad != NULL, GST_PAD_NEGOTIATE_FAIL); - src = GST_SINESRC(gst_pad_get_parent (pad)); - src->samplerate = gst_caps_get_int (*caps, "rate"); - gst_sinesrc_update_table_inc(src); - return GST_PAD_NEGOTIATE_AGREE; - } - - return GST_PAD_NEGOTIATE_FAIL; -} - -static GstBuffer * -gst_sinesrc_get(GstPad *pad) -{ - GstSineSrc *src; - GstBuffer *buf; - GstDParamManager *dpman; - - gint16 *samples; - gint i=0, frame_countdown; - - g_return_val_if_fail (pad != NULL, NULL); - src = GST_SINESRC(gst_pad_get_parent (pad)); - - buf = gst_buffer_new(); - g_return_val_if_fail (buf, NULL); - samples = g_new(gint16, src->buffer_size); - GST_BUFFER_DATA(buf) = (gpointer) samples; - GST_BUFFER_SIZE(buf) = 2 * src->buffer_size; - - dpman = GST_ELEMENT_DPARAM_MANAGER(GST_ELEMENT(src)); - frame_countdown = GST_DPMAN_PREPROCESS(dpman, src->buffer_size, src->timestamp); - - src->timestamp += (gint64)src->buffer_size * 1000000000LL / (gint64)src->samplerate; - - while(GST_DPMAN_PROCESS_COUNTDOWN(dpman, frame_countdown, i)) { - - src->table_lookup = (gint)(src->table_pos); - src->table_lookup_next = src->table_lookup + 1; - src->table_interp = src->table_pos - src->table_lookup; - - // wrap the array lookups if we're out of bounds - if (src->table_lookup_next >= src->table_size){ - src->table_lookup_next -= src->table_size; - if (src->table_lookup >= src->table_size){ - src->table_lookup -= src->table_size; - src->table_pos -= src->table_size; - } - } - - src->table_pos += src->table_inc; - - //no interpolation - //samples[i] = src->table_data[src->table_lookup] - // * src->volume * 32767.0; - - //linear interpolation - samples[i++] = ((src->table_interp - *(src->table_data[src->table_lookup_next] - -src->table_data[src->table_lookup] - ) - )+src->table_data[src->table_lookup] - )* src->volume * 32767.0; - } - - if (src->newcaps) { - gst_sinesrc_force_caps(src); - } - return buf; -} - -static void -gst_sinesrc_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) -{ - GstSineSrc *src; - - /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_SINESRC(object)); - src = GST_SINESRC(object); - - switch (prop_id) { - case ARG_FORMAT: - src->format = g_value_get_int (value); - src->newcaps=TRUE; - break; - case ARG_SAMPLERATE: - src->samplerate = g_value_get_int (value); - src->newcaps=TRUE; - gst_sinesrc_update_table_inc(src); - break; - case ARG_TABLESIZE: - src->table_size = g_value_get_int (value); - gst_sinesrc_populate_sinetable(src); - gst_sinesrc_update_table_inc(src); - break; - case ARG_BUFFER_SIZE: - src->buffer_size = g_value_get_int (value); - break; - default: - break; - } -} - -static void -gst_sinesrc_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) -{ - GstSineSrc *src; - - /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_SINESRC(object)); - src = GST_SINESRC(object); - - switch (prop_id) { - case ARG_FORMAT: - g_value_set_int (value, src->format); - break; - case ARG_SAMPLERATE: - g_value_set_int (value, src->samplerate); - break; - case ARG_TABLESIZE: - g_value_set_int (value, src->table_size); - break; - case ARG_BUFFER_SIZE: - g_value_set_int (value, src->buffer_size); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -/* -static gboolean gst_sinesrc_change_state(GstElement *element, - GstElementState state) { - g_return_if_fail(GST_IS_SINESRC(element)); - - switch (state) { - case GST_STATE_RUNNING: - if (!gst_sinesrc_open_audio(GST_SINESRC(element))) - return FALSE; - break; - case ~GST_STATE_RUNNING: - gst_sinesrc_close_audio(GST_SINESRC(element)); - break; - default: - break; - } - - if (GST_ELEMENT_CLASS(parent_class)->change_state) - return GST_ELEMENT_CLASS(parent_class)->change_state(element,state); - return TRUE; -} -*/ - -static void -gst_sinesrc_populate_sinetable (GstSineSrc *src) -{ - gint i; - gdouble pi2scaled = M_PI * 2 / src->table_size; - gfloat *table = g_new(gfloat, src->table_size); - - for(i=0 ; i < src->table_size ; i++){ - table[i] = (gfloat)sin(i * pi2scaled); - } - - g_free(src->table_data); - src->table_data = table; -} - -static void -gst_sinesrc_update_freq(GValue *value, gpointer data) -{ - GstSineSrc *src = (GstSineSrc*)data; - g_return_if_fail(GST_IS_SINESRC(src)); - - src->freq = g_value_get_float(value); - src->table_inc = src->table_size * src->freq / src->samplerate; - - //GST_DEBUG(GST_CAT_PARAMS, "freq %f\n", src->freq); -} - -static inline void -gst_sinesrc_update_table_inc (GstSineSrc *src) -{ - src->table_inc = src->table_size * src->freq / src->samplerate; -} - -static void -gst_sinesrc_force_caps(GstSineSrc *src) { - GstCaps *caps; - - if (!src->newcaps) - return; - - src->newcaps=FALSE; - - caps = gst_caps_new ( - "sinesrc_src_caps", - "audio/raw", - gst_props_new ( - "format", GST_PROPS_STRING ("int"), - "law", GST_PROPS_INT (0), - "endianness", GST_PROPS_INT (G_BYTE_ORDER), - "signed", GST_PROPS_BOOLEAN (TRUE), - "width", GST_PROPS_INT (16), - "depth", GST_PROPS_INT (16), - "rate", GST_PROPS_INT (src->samplerate), - "channels", GST_PROPS_INT (1), - NULL - ) - ); - - gst_pad_set_caps (src->srcpad, caps); -} - -gboolean -gst_sinesrc_factory_init (GstElementFactory *factory) -{ - gst_elementfactory_add_padtemplate (factory, GST_PADTEMPLATE_GET (sinesrc_src_factory)); - - return TRUE; -} diff --git a/gst/elements/gstsinesrc.h b/gst/elements/gstsinesrc.h deleted file mode 100644 index 6baf28e..0000000 --- a/gst/elements/gstsinesrc.h +++ /dev/null @@ -1,97 +0,0 @@ -/* GStreamer - * Copyright (C) 1999,2000 Erik Walthinsen - * 2000 Wim Taymans - * - * gstsinesrc.h: - * - * 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_SINESRC_H__ -#define __GST_SINESRC_H__ - - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - -GstElementDetails gst_sinesrc_details; - - -#define GST_TYPE_SINESRC \ - (gst_sinesrc_get_type()) -#define GST_SINESRC(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SINESRC,GstSineSrc)) -#define GST_SINESRC_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SINESRC,GstSineSrcClass)) -#define GST_IS_SINESRC(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SINESRC)) -#define GST_IS_SINESRC_CLASS(obj) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SINESRC)) - -typedef struct _GstSineSrc GstSineSrc; -typedef struct _GstSineSrcClass GstSineSrcClass; - -struct _GstSineSrc { - GstElement element; - - /* pads */ - GstPad *srcpad; - - /* parameters */ - gfloat volume; - gfloat freq; - - /* lookup table data */ - gfloat *table_data; - gdouble table_pos; - gdouble table_inc; - gint table_size; - gdouble table_interp; - gint table_lookup; - gint table_lookup_next; - - /* audio parameters */ - gint format; - gint samplerate; - - gint buffer_size; - gulong seq; - - gint64 timestamp; - - gboolean newcaps; - -}; - -struct _GstSineSrcClass { - GstElementClass parent_class; -}; - -GType gst_sinesrc_get_type(void); -gboolean gst_sinesrc_factory_init (GstElementFactory *factory); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - - -#endif /* __GST_SINESRC_H__ */ diff --git a/plugins/elements/Makefile.am b/plugins/elements/Makefile.am index 0b2cf62..61c5ad7 100644 --- a/plugins/elements/Makefile.am +++ b/plugins/elements/Makefile.am @@ -23,7 +23,6 @@ libgstelements_la_SOURCES = \ gstpipefilter.c \ gsttee.c \ gstaggregator.c \ - gstsinesrc.c \ $(GSTHTTPSRC) noinst_HEADERS = \ @@ -38,9 +37,7 @@ noinst_HEADERS = \ gstfdsink.h \ gstpipefilter.h \ gsttee.h \ - gstaggregator.h \ - gstsinesrc.h - + gstaggregator.h CFLAGS += -O2 -Wall LDFLAGS += -lm diff --git a/plugins/elements/gstelements.c b/plugins/elements/gstelements.c index 7d32062..bdd540d 100644 --- a/plugins/elements/gstelements.c +++ b/plugins/elements/gstelements.c @@ -32,7 +32,6 @@ #include "gstfdsrc.h" #include "gstmultidisksrc.h" #include "gstpipefilter.h" -#include "gstsinesrc.h" #include "gsttee.h" #include "gstaggregator.h" @@ -64,7 +63,6 @@ static struct _elements_entry _elements[] = { { "fdsrc", gst_fdsrc_get_type, &gst_fdsrc_details, NULL }, { "multidisksrc", gst_multidisksrc_get_type, &gst_multidisksrc_details, NULL }, { "pipefilter", gst_pipefilter_get_type, &gst_pipefilter_details, NULL }, - { "sinesrc", gst_sinesrc_get_type, &gst_sinesrc_details, gst_sinesrc_factory_init }, { "tee", gst_tee_get_type, &gst_tee_details, gst_tee_factory_init }, { "aggregator", gst_aggregator_get_type, &gst_aggregator_details, gst_aggregator_factory_init }, diff --git a/plugins/elements/gstsinesrc.c b/plugins/elements/gstsinesrc.c deleted file mode 100644 index 3cb614cf..0000000 --- a/plugins/elements/gstsinesrc.c +++ /dev/null @@ -1,428 +0,0 @@ -/* GStreamer - * Copyright (C) 1999,2000 Erik Walthinsen - * 2000 Wim Taymans - * 2001 Steve Baker - * - * gstsinesrc.c: - * - * 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. - */ - -#include -#include -#include - -#include - - -GstElementDetails gst_sinesrc_details = { - "Sine-wave src", - "Source/Audio", - "Create a sine wave of a given frequency and volume", - VERSION, - "Erik Walthinsen ", - "(C) 1999", -}; - - -/* SineSrc signals and args */ -enum { - /* FILL ME */ - LAST_SIGNAL -}; - -enum { - ARG_0, - ARG_FORMAT, - ARG_SAMPLERATE, - ARG_TABLESIZE, - ARG_BUFFER_SIZE, -}; - -// FIXME: this is not core business... -GST_PADTEMPLATE_FACTORY (sinesrc_src_factory, - "src", - GST_PAD_SRC, - GST_PAD_ALWAYS, - GST_CAPS_NEW ( - "sinesrc_src", - "audio/raw", - "format", GST_PROPS_STRING ("int"), - "law", GST_PROPS_INT (0), - "endianness", GST_PROPS_INT (G_BYTE_ORDER), - "signed", GST_PROPS_BOOLEAN (TRUE), - "width", GST_PROPS_INT (16), - "depth", GST_PROPS_INT (16), - "rate", GST_PROPS_INT_RANGE (8000, 48000), - "channels", GST_PROPS_INT (1) - ) -); - -static void gst_sinesrc_class_init (GstSineSrcClass *klass); -static void gst_sinesrc_init (GstSineSrc *src); -static GstPadNegotiateReturn gst_sinesrc_negotiate (GstPad *pad, GstCaps **caps, gpointer *data); -static void gst_sinesrc_set_property (GObject *object, guint prop_id, - const GValue *value, GParamSpec *pspec); -static void gst_sinesrc_get_property (GObject *object, guint prop_id, - GValue *value, GParamSpec *pspec); -//static gboolean gst_sinesrc_change_state(GstElement *element, -// GstElementState state); -//static void gst_sinesrc_close_audio(GstSineSrc *src); -//static gboolean gst_sinesrc_open_audio(GstSineSrc *src); - -static void gst_sinesrc_update_freq(GValue *value, gpointer data); -static void gst_sinesrc_populate_sinetable (GstSineSrc *src); -static inline void gst_sinesrc_update_table_inc (GstSineSrc *src); -static void gst_sinesrc_force_caps (GstSineSrc *src); - -static GstBuffer* gst_sinesrc_get (GstPad *pad); - -static GstElementClass *parent_class = NULL; -//static guint gst_sinesrc_signals[LAST_SIGNAL] = { 0 }; - -GType -gst_sinesrc_get_type (void) -{ - static GType sinesrc_type = 0; - - if (!sinesrc_type) { - static const GTypeInfo sinesrc_info = { - sizeof(GstSineSrcClass), - NULL, - NULL, - (GClassInitFunc)gst_sinesrc_class_init, - NULL, - NULL, - sizeof(GstSineSrc), - 0, - (GInstanceInitFunc)gst_sinesrc_init, - }; - sinesrc_type = g_type_register_static (GST_TYPE_ELEMENT, "GstSineSrc", &sinesrc_info, 0); - } - return sinesrc_type; -} - -static void -gst_sinesrc_class_init (GstSineSrcClass *klass) -{ - GObjectClass *gobject_class; - GstElementClass *gstelement_class; - - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; - - parent_class = g_type_class_ref(GST_TYPE_ELEMENT); - - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_FORMAT, - g_param_spec_int("format","format","format", - G_MININT,G_MAXINT,0,G_PARAM_READWRITE)); // CHECKME - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_SAMPLERATE, - g_param_spec_int("samplerate","samplerate","samplerate", - G_MININT,G_MAXINT,0,G_PARAM_READWRITE)); // CHECKME - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_TABLESIZE, - g_param_spec_int("tablesize","tablesize","tablesize", - G_MININT,G_MAXINT,0,G_PARAM_READWRITE)); // CHECKME - g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_BUFFER_SIZE, - g_param_spec_int("buffersize","buffersize","buffersize", - 0, G_MAXINT, 1024, G_PARAM_READWRITE)); - - gobject_class->set_property = gst_sinesrc_set_property; - gobject_class->get_property = gst_sinesrc_get_property; - -// gstelement_class->change_state = gst_sinesrc_change_state; -} - -static void -gst_sinesrc_init (GstSineSrc *src) -{ - GstElement *element = GST_ELEMENT(src); - GstDParamManager *dpman; - GstDParamSpec *spec; - - src->srcpad = gst_pad_new_from_template ( - GST_PADTEMPLATE_GET (sinesrc_src_factory), "src"); - gst_element_add_pad(GST_ELEMENT(src), src->srcpad); - gst_pad_set_negotiate_function (src->srcpad, gst_sinesrc_negotiate); - - gst_pad_set_get_function(src->srcpad, gst_sinesrc_get); - - src->format = 16; - src->samplerate = 44100; - - src->newcaps = TRUE; - - src->table_pos = 0.0; - src->table_size = 1024; - src->buffer_size=1024; - src->timestamp=0LL; - - src->seq = 0; - - dpman = gst_dpman_new ("sinesrc_dpman", GST_ELEMENT(src)); - - gst_dpman_add_required_dparam_callback (dpman, "freq", G_TYPE_FLOAT, gst_sinesrc_update_freq, src); - spec = gst_dpman_get_dparam_spec (dpman, "freq"); - g_value_set_float(spec->min_val, 10.0); - g_value_set_float(spec->max_val, 10000.0); - g_value_set_float(spec->default_val, 350.0); - spec->unit_name = "frequency"; - spec->is_log = TRUE; - - gst_dpman_add_required_dparam_direct (dpman, "volume", G_TYPE_FLOAT, &(src->volume)); - spec = gst_dpman_get_dparam_spec (dpman, "volume"); - g_value_set_float(spec->min_val, 0.0); - g_value_set_float(spec->max_val, 1.0); - g_value_set_float(spec->default_val, 0.8); - spec->unit_name = "scalar"; - - src->volume = 0.0; - - gst_dpman_set_rate_change_pad(dpman, src->srcpad); - - GST_ELEMENT_DPARAM_MANAGER(element) = dpman; - - gst_sinesrc_populate_sinetable(src); - gst_sinesrc_update_table_inc(src); - -} - -static GstPadNegotiateReturn -gst_sinesrc_negotiate (GstPad *pad, GstCaps **caps, gpointer *data) -{ - GstSineSrc *src; - - if (*caps) { - g_return_val_if_fail (pad != NULL, GST_PAD_NEGOTIATE_FAIL); - src = GST_SINESRC(gst_pad_get_parent (pad)); - src->samplerate = gst_caps_get_int (*caps, "rate"); - gst_sinesrc_update_table_inc(src); - return GST_PAD_NEGOTIATE_AGREE; - } - - return GST_PAD_NEGOTIATE_FAIL; -} - -static GstBuffer * -gst_sinesrc_get(GstPad *pad) -{ - GstSineSrc *src; - GstBuffer *buf; - GstDParamManager *dpman; - - gint16 *samples; - gint i=0, frame_countdown; - - g_return_val_if_fail (pad != NULL, NULL); - src = GST_SINESRC(gst_pad_get_parent (pad)); - - buf = gst_buffer_new(); - g_return_val_if_fail (buf, NULL); - samples = g_new(gint16, src->buffer_size); - GST_BUFFER_DATA(buf) = (gpointer) samples; - GST_BUFFER_SIZE(buf) = 2 * src->buffer_size; - - dpman = GST_ELEMENT_DPARAM_MANAGER(GST_ELEMENT(src)); - frame_countdown = GST_DPMAN_PREPROCESS(dpman, src->buffer_size, src->timestamp); - - src->timestamp += (gint64)src->buffer_size * 1000000000LL / (gint64)src->samplerate; - - while(GST_DPMAN_PROCESS_COUNTDOWN(dpman, frame_countdown, i)) { - - src->table_lookup = (gint)(src->table_pos); - src->table_lookup_next = src->table_lookup + 1; - src->table_interp = src->table_pos - src->table_lookup; - - // wrap the array lookups if we're out of bounds - if (src->table_lookup_next >= src->table_size){ - src->table_lookup_next -= src->table_size; - if (src->table_lookup >= src->table_size){ - src->table_lookup -= src->table_size; - src->table_pos -= src->table_size; - } - } - - src->table_pos += src->table_inc; - - //no interpolation - //samples[i] = src->table_data[src->table_lookup] - // * src->volume * 32767.0; - - //linear interpolation - samples[i++] = ((src->table_interp - *(src->table_data[src->table_lookup_next] - -src->table_data[src->table_lookup] - ) - )+src->table_data[src->table_lookup] - )* src->volume * 32767.0; - } - - if (src->newcaps) { - gst_sinesrc_force_caps(src); - } - return buf; -} - -static void -gst_sinesrc_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) -{ - GstSineSrc *src; - - /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_SINESRC(object)); - src = GST_SINESRC(object); - - switch (prop_id) { - case ARG_FORMAT: - src->format = g_value_get_int (value); - src->newcaps=TRUE; - break; - case ARG_SAMPLERATE: - src->samplerate = g_value_get_int (value); - src->newcaps=TRUE; - gst_sinesrc_update_table_inc(src); - break; - case ARG_TABLESIZE: - src->table_size = g_value_get_int (value); - gst_sinesrc_populate_sinetable(src); - gst_sinesrc_update_table_inc(src); - break; - case ARG_BUFFER_SIZE: - src->buffer_size = g_value_get_int (value); - break; - default: - break; - } -} - -static void -gst_sinesrc_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) -{ - GstSineSrc *src; - - /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_SINESRC(object)); - src = GST_SINESRC(object); - - switch (prop_id) { - case ARG_FORMAT: - g_value_set_int (value, src->format); - break; - case ARG_SAMPLERATE: - g_value_set_int (value, src->samplerate); - break; - case ARG_TABLESIZE: - g_value_set_int (value, src->table_size); - break; - case ARG_BUFFER_SIZE: - g_value_set_int (value, src->buffer_size); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -/* -static gboolean gst_sinesrc_change_state(GstElement *element, - GstElementState state) { - g_return_if_fail(GST_IS_SINESRC(element)); - - switch (state) { - case GST_STATE_RUNNING: - if (!gst_sinesrc_open_audio(GST_SINESRC(element))) - return FALSE; - break; - case ~GST_STATE_RUNNING: - gst_sinesrc_close_audio(GST_SINESRC(element)); - break; - default: - break; - } - - if (GST_ELEMENT_CLASS(parent_class)->change_state) - return GST_ELEMENT_CLASS(parent_class)->change_state(element,state); - return TRUE; -} -*/ - -static void -gst_sinesrc_populate_sinetable (GstSineSrc *src) -{ - gint i; - gdouble pi2scaled = M_PI * 2 / src->table_size; - gfloat *table = g_new(gfloat, src->table_size); - - for(i=0 ; i < src->table_size ; i++){ - table[i] = (gfloat)sin(i * pi2scaled); - } - - g_free(src->table_data); - src->table_data = table; -} - -static void -gst_sinesrc_update_freq(GValue *value, gpointer data) -{ - GstSineSrc *src = (GstSineSrc*)data; - g_return_if_fail(GST_IS_SINESRC(src)); - - src->freq = g_value_get_float(value); - src->table_inc = src->table_size * src->freq / src->samplerate; - - //GST_DEBUG(GST_CAT_PARAMS, "freq %f\n", src->freq); -} - -static inline void -gst_sinesrc_update_table_inc (GstSineSrc *src) -{ - src->table_inc = src->table_size * src->freq / src->samplerate; -} - -static void -gst_sinesrc_force_caps(GstSineSrc *src) { - GstCaps *caps; - - if (!src->newcaps) - return; - - src->newcaps=FALSE; - - caps = gst_caps_new ( - "sinesrc_src_caps", - "audio/raw", - gst_props_new ( - "format", GST_PROPS_STRING ("int"), - "law", GST_PROPS_INT (0), - "endianness", GST_PROPS_INT (G_BYTE_ORDER), - "signed", GST_PROPS_BOOLEAN (TRUE), - "width", GST_PROPS_INT (16), - "depth", GST_PROPS_INT (16), - "rate", GST_PROPS_INT (src->samplerate), - "channels", GST_PROPS_INT (1), - NULL - ) - ); - - gst_pad_set_caps (src->srcpad, caps); -} - -gboolean -gst_sinesrc_factory_init (GstElementFactory *factory) -{ - gst_elementfactory_add_padtemplate (factory, GST_PADTEMPLATE_GET (sinesrc_src_factory)); - - return TRUE; -} diff --git a/plugins/elements/gstsinesrc.h b/plugins/elements/gstsinesrc.h deleted file mode 100644 index 6baf28e..0000000 --- a/plugins/elements/gstsinesrc.h +++ /dev/null @@ -1,97 +0,0 @@ -/* GStreamer - * Copyright (C) 1999,2000 Erik Walthinsen - * 2000 Wim Taymans - * - * gstsinesrc.h: - * - * 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_SINESRC_H__ -#define __GST_SINESRC_H__ - - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - -GstElementDetails gst_sinesrc_details; - - -#define GST_TYPE_SINESRC \ - (gst_sinesrc_get_type()) -#define GST_SINESRC(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_SINESRC,GstSineSrc)) -#define GST_SINESRC_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_SINESRC,GstSineSrcClass)) -#define GST_IS_SINESRC(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SINESRC)) -#define GST_IS_SINESRC_CLASS(obj) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SINESRC)) - -typedef struct _GstSineSrc GstSineSrc; -typedef struct _GstSineSrcClass GstSineSrcClass; - -struct _GstSineSrc { - GstElement element; - - /* pads */ - GstPad *srcpad; - - /* parameters */ - gfloat volume; - gfloat freq; - - /* lookup table data */ - gfloat *table_data; - gdouble table_pos; - gdouble table_inc; - gint table_size; - gdouble table_interp; - gint table_lookup; - gint table_lookup_next; - - /* audio parameters */ - gint format; - gint samplerate; - - gint buffer_size; - gulong seq; - - gint64 timestamp; - - gboolean newcaps; - -}; - -struct _GstSineSrcClass { - GstElementClass parent_class; -}; - -GType gst_sinesrc_get_type(void); -gboolean gst_sinesrc_factory_init (GstElementFactory *factory); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - - -#endif /* __GST_SINESRC_H__ */