Commit f5a3e61e authored by Sebastian Dröge's avatar Sebastian Dröge

Port GstSpectrum to GstAudioFilter and libgstfft, add support for int32, float...

Port GstSpectrum to GstAudioFilter and libgstfft, add support for int32, float and double, use floats for the message...

Original commit message from CVS:
* configure.ac:
* gst/spectrum/Makefile.am:
* gst/spectrum/demo-audiotest.c: (draw_spectrum),
(message_handler), (main):
* gst/spectrum/demo-osssrc.c: (draw_spectrum), (message_handler):
* gst/spectrum/gstspectrum.c: (gst_spectrum_base_init),
(gst_spectrum_class_init), (gst_spectrum_init),
(gst_spectrum_dispose), (gst_spectrum_set_property),
(gst_spectrum_get_property), (gst_spectrum_start),
(gst_spectrum_setup), (gst_spectrum_message_new),
(gst_spectrum_transform_ip):
* gst/spectrum/gstspectrum.h:
Port GstSpectrum to GstAudioFilter and libgstfft, add support
for int32, float and double, use floats for the message contents,
average all FFTs done in one interval for better results, use
a better windowing function, allow posting the phase in the message
and actually do an FFT with the requested number of bands instead
of interpolating.
* tests/check/elements/spectrum.c: (GST_START_TEST),
(spectrum_suite):
Improve the units tests by checking for a 11025Hz sine wave
and add unit tests for all 4 supported sample types.
parent c8af2199
plugin_LTLIBRARIES = libgstspectrum.la
libgstspectrum_la_SOURCES = gstspectrum.c fix_fft.c
libgstspectrum_la_SOURCES = gstspectrum.c
libgstspectrum_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) \
$(GST_CFLAGS)
libgstspectrum_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS)
libgstspectrum_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) -lgstaudio-$(GST_MAJORMINOR) -lgstfft-$(GST_MAJORMINOR) $(LIBM)
libgstspectrum_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
noinst_HEADERS = gstspectrum.h
......
This diff is collapsed.
......@@ -25,6 +25,7 @@
#include <gst/gst.h>
#include <gst/base/gstadapter.h>
#include <gst/base/gstbasetransform.h>
#include <gst/audio/gstaudiofilter.h>
#ifdef __cplusplus
extern "C" {
......@@ -39,9 +40,11 @@ extern "C" {
typedef struct _GstSpectrum GstSpectrum;
typedef struct _GstSpectrumClass GstSpectrumClass;
typedef void (*GstSpectrumProcessFunc) (GstSpectrum *, const guint8 *);
typedef void (*GstSpectrumFFTFreeFunc) (void *);
struct _GstSpectrum {
GstBaseTransform element;
GstAudioFilter element;
GstPad *sinkpad,*srcpad;
GstAdapter *adapter;
......@@ -49,24 +52,28 @@ struct _GstSpectrum {
/* properties */
gboolean message; /* whether or not to post messages */
gboolean message_magnitude;
gboolean message_phase;
guint64 interval; /* how many seconds between emits */
guint bands; /* number of spectrum bands */
gint threshold; /* energy level treshold */
gint num_frames; /* frame count (1 sample per channel)
* since last emit */
gint num_fft; /* number of FFTs since last emit */
gint rate; /* caps variables */
gint channels;
/* <private> */
gint base, len;
gint16 *re, *im, *loud;
guchar *spect;
gfloat *spect_magnitude;
gfloat *spect_phase;
GstSpectrumProcessFunc process;
void *fft_ctx;
GstSpectrumFFTFreeFunc fft_free_func;
void *in;
void *freqdata;
};
struct _GstSpectrumClass {
GstBaseTransformClass parent_class;
GstAudioFilterClass parent_class;
};
GType gst_spectrum_get_type (void);
......
This diff is collapsed.
......@@ -51,7 +51,7 @@ on_frequency_changed (GtkRange * range, gpointer user_data)
/* draw frequency spectrum as a bunch of bars */
static void
draw_spectrum (guchar * data)
draw_spectrum (gfloat * data)
{
gint i;
GdkRectangle rect = { 0, 0, SPECT_BANDS, 50 };
......@@ -78,15 +78,15 @@ message_handler (GstBus * bus, GstMessage * message, gpointer data)
const gchar *name = gst_structure_get_name (s);
if (strcmp (name, "spectrum") == 0) {
guchar spect[SPECT_BANDS];
gfloat spect[SPECT_BANDS];
const GValue *list;
const GValue *value;
guint i;
list = gst_structure_get_value (s, "spectrum");
list = gst_structure_get_value (s, "magnitude");
for (i = 0; i < SPECT_BANDS; ++i) {
value = gst_value_list_get_value (list, i);
spect[i] = g_value_get_uchar (value);
spect[i] = g_value_get_float (value);
}
draw_spectrum (spect);
}
......@@ -98,7 +98,7 @@ int
main (int argc, char *argv[])
{
GstElement *bin;
GstElement *src, *spectrum, *sink;
GstElement *src, *spectrum, *audioconvert, *sink;
GstBus *bus;
GtkWidget *appwindow, *vbox, *widget;
......@@ -116,10 +116,12 @@ main (int argc, char *argv[])
g_object_set (G_OBJECT (spectrum), "bands", SPECT_BANDS, "threshold", -80,
"message", TRUE, NULL);
audioconvert = gst_element_factory_make ("audioconvert", "audioconvert");
sink = gst_element_factory_make (DEFAULT_AUDIOSINK, "sink");
gst_bin_add_many (GST_BIN (bin), src, spectrum, sink, NULL);
if (!gst_element_link_many (src, spectrum, sink, NULL)) {
gst_bin_add_many (GST_BIN (bin), src, spectrum, audioconvert, sink, NULL);
if (!gst_element_link_many (src, spectrum, audioconvert, sink, NULL)) {
fprintf (stderr, "cant link elements\n");
exit (1);
}
......
......@@ -43,7 +43,7 @@ on_window_destroy (GtkObject * object, gpointer user_data)
/* draw frequency spectrum as a bunch of bars */
static void
draw_spectrum (guchar * data)
draw_spectrum (gfloat * data)
{
gint i;
GdkRectangle rect = { 0, 0, SPECT_WIDTH, SPECT_HEIGHT };
......@@ -70,15 +70,15 @@ message_handler (GstBus * bus, GstMessage * message, gpointer data)
const gchar *name = gst_structure_get_name (s);
if (strcmp (name, "spectrum") == 0) {
guchar spect[SPECT_BANDS];
gfloat spect[SPECT_BANDS];
const GValue *list;
const GValue *value;
guint i;
list = gst_structure_get_value (s, "spectrum");
list = gst_structure_get_value (s, "magnitude");
for (i = 0; i < SPECT_BANDS; ++i) {
value = gst_value_list_get_value (list, i);
spect[i] = g_value_get_uchar (value);
spect[i] = g_value_get_float (value);
}
draw_spectrum (spect);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment