From 0428d5cf5f24a2bc1f6d141c804468f8d62aa23b Mon Sep 17 00:00:00 2001 From: Stefan Kost Date: Sat, 20 May 2006 22:42:15 +0000 Subject: Initial port of the spectrum element Original commit message from CVS: * configure.ac: * gst/spectrum/demo-osssrc.c: (spectrum_chain), (main): * gst/spectrum/fix_fft.c: (gst_spectrum_fix_dot): * gst/spectrum/gstspectrum.c: (gst_spectrum_get_type), (gst_spectrum_base_init), (gst_spectrum_class_init), (gst_spectrum_init), (gst_spectrum_dispose), (gst_spectrum_set_property), (gst_spectrum_chain): * gst/spectrum/gstspectrum.h: Initial port of the spectrum element --- gst/spectrum/demo-osssrc.c | 51 ++++---- gst/spectrum/fix_fft.c | 317 +++++++++++++++++++++++---------------------- gst/spectrum/gstspectrum.c | 167 ++++++++++++++---------- gst/spectrum/gstspectrum.h | 4 +- 4 files changed, 291 insertions(+), 248 deletions(-) (limited to 'gst') diff --git a/gst/spectrum/demo-osssrc.c b/gst/spectrum/demo-osssrc.c index b51e8c2a..9bdb93f7 100644 --- a/gst/spectrum/demo-osssrc.c +++ b/gst/spectrum/demo-osssrc.c @@ -4,26 +4,26 @@ #include #include -extern gboolean _gst_plugin_spew; - -gboolean idle_func (gpointer data); +#define DEFAULT_AUDIOSRC "alsasrc" +#define SPECT_BANDS 256 GtkWidget *drawingarea; -void +static void spectrum_chain (GstElement * sink, GstBuffer * buf, GstPad * pad, gpointer unused) { gint i; guchar *data = buf->data; - GdkRectangle rect = { 0, 0, GST_BUFFER_SIZE (buf), 25 }; + gint width = GST_BUFFER_SIZE (buf); + GdkRectangle rect = { 0, 0, width, 50 }; gdk_window_begin_paint_rect (drawingarea->window, &rect); gdk_draw_rectangle (drawingarea->window, drawingarea->style->black_gc, - TRUE, 0, 0, GST_BUFFER_SIZE (buf), 25); - for (i = 0; i < GST_BUFFER_SIZE (buf); i++) { + TRUE, 0, 0, width, 50); + for (i = 0; i < width; i++) { gdk_draw_rectangle (drawingarea->window, drawingarea->style->white_gc, - TRUE, i, 32 - data[i], 1, data[i]); + TRUE, i, 64 - data[i], 1, data[i]); } gdk_window_end_paint (drawingarea->window); } @@ -32,7 +32,7 @@ int main (int argc, char *argv[]) { GstElement *bin; - GstElement *src, *spectrum, *sink; + GstElement *src, *conv, *spectrum, *sink; GtkWidget *appwindow; @@ -42,34 +42,35 @@ main (int argc, char *argv[]) bin = gst_pipeline_new ("bin"); src = gst_element_factory_make (DEFAULT_AUDIOSRC, "src"); - g_object_set (G_OBJECT (src), "buffersize", (gulong) 1024, NULL); + g_object_set (G_OBJECT (src), "blocksize", (gulong) 1024 * 2, NULL); + + conv = gst_element_factory_make ("audioconvert", "conv"); + spectrum = gst_element_factory_make ("spectrum", "spectrum"); - g_object_set (G_OBJECT (spectrum), "width", 256, NULL); + g_object_set (G_OBJECT (spectrum), "width", SPECT_BANDS, NULL); + sink = gst_element_factory_make ("fakesink", "sink"); g_object_set (G_OBJECT (sink), "signal-handoffs", TRUE, NULL); + g_signal_connect (sink, "handoff", G_CALLBACK (spectrum_chain), NULL); - gst_bin_add_many (GST_BIN (bin), src, spectrum, sink, NULL); - gst_element_link_many (src, spectrum, sink, NULL); + gst_bin_add_many (GST_BIN (bin), src, conv, spectrum, sink, NULL); + if (!gst_element_link_many (src, conv, spectrum, sink, NULL)) { + fprintf (stderr, "cant link elements\n"); + exit (1); + } appwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); drawingarea = gtk_drawing_area_new (); - gtk_drawing_area_size (GTK_DRAWING_AREA (drawingarea), 256, 32); + gtk_drawing_area_size (GTK_DRAWING_AREA (drawingarea), SPECT_BANDS, 64); gtk_container_add (GTK_CONTAINER (appwindow), drawingarea); gtk_widget_show_all (appwindow); - gst_element_set_state (GST_ELEMENT (bin), GST_STATE_PLAYING); - - g_idle_add (idle_func, bin); - + gst_element_set_state (bin, GST_STATE_PLAYING); gtk_main (); + gst_element_set_state (bin, GST_STATE_NULL); - return 0; -} - + gst_object_unref (bin); -gboolean -idle_func (gpointer data) -{ - return gst_bin_iterate (data); + return 0; } diff --git a/gst/spectrum/fix_fft.c b/gst/spectrum/fix_fft.c index d5aed1f1..c453c6ff 100644 --- a/gst/spectrum/fix_fft.c +++ b/gst/spectrum/fix_fft.c @@ -54,9 +54,6 @@ #define fixed short /* FIX_MPY() - fixed-point multiplication macro. - This macro is a statement, not an expression (uses asm). - BEWARE: make sure _DX is not clobbered by evaluating (A) or DEST. - args are all of type fixed. Scaling ensures that 32767*32767 = 32767. */ #define FIX_MPY(DEST,A,B) DEST = ((long)(A) * (long)(B))>>15 @@ -65,8 +62,9 @@ #define LOG2_N_WAVE 10 /* log2(N_WAVE) */ #define N_LOUD 100 /* dimension of Loudampl[] */ -extern fixed gst_spectrum_Sinewave[N_WAVE]; /* placed at end of this file for clarity */ -extern fixed gst_spectrum_Loudampl[N_LOUD]; +extern fixed const gst_spectrum_Sinewave[N_WAVE]; /* placed at end of this file for clarity */ +extern fixed const gst_spectrum_Loudampl[N_LOUD]; + static int gst_spectrum_db_from_ampl (fixed re, fixed im); static fixed gst_spectrum_fix_mpy (fixed a, fixed b); @@ -221,7 +219,7 @@ gst_spectrum_fix_loud (fixed loud[], fixed fr[], fixed fi[], int n, /* db_from_ampl() - find loudness (in dB) from the complex amplitude. */ -int +static int gst_spectrum_db_from_ampl (fixed re, fixed im) { static long loud2[N_LOUD] = { 0 }; @@ -250,17 +248,18 @@ gst_spectrum_db_from_ampl (fixed re, fixed im) /* fix_mpy() - fixed-point multiplication */ -fixed +static fixed gst_spectrum_fix_mpy (fixed a, fixed b) { FIX_MPY (a, a, b); return a; } +#if 0 /* iscale() - scale an integer value by (numer/denom) */ -int +static int gst_spectrum_iscale (int value, int numer, int denom) { return (long) value *(long) numer / (long) denom; @@ -269,19 +268,20 @@ gst_spectrum_iscale (int value, int numer, int denom) /* fix_dot() - dot product of two fixed arrays */ -fixed +static fixed gst_spectrum_fix_dot (fixed * hpa, fixed * pb, int n) { fixed *pa = hpa; /* FIXME */ long sum; register fixed a, b; -/* seg = FP_SEG(hpa); - off = FP_OFF(hpa); - seg += off>>4; - off &= 0x000F; - pa = MK_FP(seg,off); - */ + /* + seg = FP_SEG(hpa); + off = FP_OFF(hpa); + seg += off>>4; + off &= 0x000F; + pa = MK_FP(seg,off); + */ sum = 0L; while (n--) { a = *pa++; @@ -298,153 +298,156 @@ gst_spectrum_fix_dot (fixed * hpa, fixed * pb, int n) return (fixed) sum; } +#endif #if N_WAVE != 1024 ERROR:N_WAVE != 1024 #endif - fixed gst_spectrum_Sinewave[1024] = { -0, 201, 402, 603, 804, 1005, 1206, 1406, - 1607, 1808, 2009, 2209, 2410, 2610, 2811, 3011, - 3211, 3411, 3611, 3811, 4011, 4210, 4409, 4608, - 4807, 5006, 5205, 5403, 5601, 5799, 5997, 6195, - 6392, 6589, 6786, 6982, 7179, 7375, 7571, 7766, - 7961, 8156, 8351, 8545, 8739, 8932, 9126, 9319, - 9511, 9703, 9895, 10087, 10278, 10469, 10659, 10849, - 11038, 11227, 11416, 11604, 11792, 11980, 12166, 12353, - 12539, 12724, 12909, 13094, 13278, 13462, 13645, 13827, - 14009, 14191, 14372, 14552, 14732, 14911, 15090, 15268, - 15446, 15623, 15799, 15975, 16150, 16325, 16499, 16672, - 16845, 17017, 17189, 17360, 17530, 17699, 17868, 18036, - 18204, 18371, 18537, 18702, 18867, 19031, 19194, 19357, - 19519, 19680, 19840, 20000, 20159, 20317, 20474, 20631, - 20787, 20942, 21096, 21249, 21402, 21554, 21705, 21855, - 22004, 22153, 22301, 22448, 22594, 22739, 22883, 23027, - 23169, 23311, 23452, 23592, 23731, 23869, 24006, 24143, - 24278, 24413, 24546, 24679, 24811, 24942, 25072, 25201, - 25329, 25456, 25582, 25707, 25831, 25954, 26077, 26198, - 26318, 26437, 26556, 26673, 26789, 26905, 27019, 27132, - 27244, 27355, 27466, 27575, 27683, 27790, 27896, 28001, - 28105, 28208, 28309, 28410, 28510, 28608, 28706, 28802, - 28897, 28992, 29085, 29177, 29268, 29358, 29446, 29534, - 29621, 29706, 29790, 29873, 29955, 30036, 30116, 30195, - 30272, 30349, 30424, 30498, 30571, 30643, 30713, 30783, - 30851, 30918, 30984, 31049, - 31113, 31175, 31236, 31297, - 31356, 31413, 31470, 31525, 31580, 31633, 31684, 31735, - 31785, 31833, 31880, 31926, 31970, 32014, 32056, 32097, - 32137, 32176, 32213, 32249, 32284, 32318, 32350, 32382, - 32412, 32441, 32468, 32495, 32520, 32544, 32567, 32588, - 32609, 32628, 32646, 32662, 32678, 32692, 32705, 32717, - 32727, 32736, 32744, 32751, 32757, 32761, 32764, 32766, - 32767, 32766, 32764, 32761, 32757, 32751, 32744, 32736, - 32727, 32717, 32705, 32692, 32678, 32662, 32646, 32628, - 32609, 32588, 32567, 32544, 32520, 32495, 32468, 32441, - 32412, 32382, 32350, 32318, 32284, 32249, 32213, 32176, - 32137, 32097, 32056, 32014, 31970, 31926, 31880, 31833, - 31785, 31735, 31684, 31633, 31580, 31525, 31470, 31413, - 31356, 31297, 31236, 31175, 31113, 31049, 30984, 30918, - 30851, 30783, 30713, 30643, 30571, 30498, 30424, 30349, - 30272, 30195, 30116, 30036, 29955, 29873, 29790, 29706, - 29621, 29534, 29446, 29358, 29268, 29177, 29085, 28992, - 28897, 28802, 28706, 28608, 28510, 28410, 28309, 28208, - 28105, 28001, 27896, 27790, 27683, 27575, 27466, 27355, - 27244, 27132, 27019, 26905, 26789, 26673, 26556, 26437, - 26318, 26198, 26077, 25954, 25831, 25707, 25582, 25456, - 25329, 25201, 25072, 24942, 24811, 24679, 24546, 24413, - 24278, 24143, 24006, 23869, 23731, 23592, 23452, 23311, - 23169, 23027, 22883, 22739, 22594, 22448, 22301, 22153, - 22004, 21855, 21705, 21554, 21402, 21249, 21096, 20942, - 20787, 20631, 20474, 20317, 20159, 20000, 19840, 19680, - 19519, 19357, 19194, 19031, 18867, 18702, 18537, 18371, - 18204, 18036, 17868, 17699, 17530, 17360, 17189, 17017, - 16845, 16672, 16499, 16325, 16150, 15975, 15799, 15623, - 15446, 15268, 15090, 14911, 14732, 14552, 14372, 14191, - 14009, 13827, 13645, 13462, 13278, 13094, 12909, 12724, - 12539, 12353, 12166, 11980, 11792, 11604, 11416, 11227, - 11038, 10849, 10659, 10469, 10278, 10087, 9895, 9703, - 9511, 9319, 9126, 8932, 8739, 8545, 8351, 8156, - 7961, 7766, 7571, 7375, 7179, 6982, 6786, 6589, - 6392, 6195, 5997, 5799, 5601, 5403, 5205, 5006, - 4807, 4608, 4409, 4210, 4011, 3811, 3611, 3411, - 3211, 3011, 2811, 2610, 2410, 2209, 2009, 1808, - 1607, 1406, 1206, 1005, 804, 603, 402, 201, - 0, -201, -402, -603, -804, -1005, -1206, -1406, - -1607, -1808, -2009, -2209, -2410, -2610, -2811, -3011, - -3211, -3411, -3611, -3811, -4011, -4210, -4409, -4608, - -4807, -5006, -5205, -5403, -5601, -5799, -5997, -6195, - -6392, -6589, -6786, -6982, -7179, -7375, -7571, -7766, - -7961, -8156, -8351, -8545, -8739, -8932, -9126, -9319, - -9511, -9703, -9895, -10087, -10278, -10469, -10659, -10849, - -11038, -11227, -11416, -11604, -11792, -11980, -12166, -12353, - -12539, -12724, -12909, -13094, -13278, -13462, -13645, -13827, - -14009, -14191, -14372, -14552, -14732, -14911, -15090, -15268, - -15446, -15623, -15799, -15975, -16150, -16325, -16499, -16672, - -16845, -17017, -17189, -17360, -17530, -17699, -17868, -18036, - -18204, -18371, -18537, -18702, -18867, -19031, -19194, -19357, - -19519, -19680, -19840, -20000, -20159, -20317, -20474, -20631, - -20787, -20942, -21096, -21249, -21402, -21554, -21705, -21855, - -22004, -22153, -22301, -22448, -22594, -22739, -22883, -23027, - -23169, -23311, -23452, -23592, -23731, -23869, -24006, -24143, - -24278, -24413, -24546, -24679, -24811, -24942, -25072, -25201, - -25329, -25456, -25582, -25707, -25831, -25954, -26077, -26198, - -26318, -26437, -26556, -26673, -26789, -26905, -27019, -27132, - -27244, -27355, -27466, -27575, -27683, -27790, -27896, -28001, - -28105, -28208, -28309, -28410, -28510, -28608, -28706, -28802, - -28897, -28992, -29085, -29177, -29268, -29358, -29446, -29534, - -29621, -29706, -29790, -29873, -29955, -30036, -30116, -30195, - -30272, -30349, -30424, -30498, -30571, -30643, -30713, -30783, - -30851, -30918, -30984, -31049, -31113, -31175, -31236, -31297, - -31356, -31413, -31470, -31525, -31580, -31633, -31684, -31735, - -31785, -31833, -31880, -31926, -31970, -32014, -32056, -32097, - -32137, -32176, -32213, -32249, -32284, -32318, -32350, -32382, - -32412, -32441, -32468, -32495, -32520, -32544, -32567, -32588, - -32609, -32628, -32646, -32662, -32678, -32692, -32705, -32717, - -32727, -32736, -32744, -32751, -32757, -32761, -32764, -32766, - -32767, -32766, -32764, -32761, -32757, -32751, -32744, -32736, - -32727, -32717, -32705, -32692, -32678, -32662, -32646, -32628, - -32609, -32588, -32567, -32544, -32520, -32495, -32468, -32441, - -32412, -32382, -32350, -32318, -32284, -32249, -32213, -32176, - -32137, -32097, -32056, -32014, -31970, -31926, -31880, -31833, - -31785, -31735, -31684, -31633, -31580, -31525, -31470, -31413, - -31356, -31297, -31236, -31175, -31113, -31049, -30984, -30918, - -30851, -30783, -30713, -30643, -30571, -30498, -30424, -30349, - -30272, -30195, -30116, -30036, -29955, -29873, -29790, -29706, - -29621, -29534, -29446, -29358, -29268, -29177, -29085, -28992, - -28897, -28802, -28706, -28608, -28510, -28410, -28309, -28208, - -28105, -28001, -27896, -27790, -27683, -27575, -27466, -27355, - -27244, -27132, -27019, -26905, -26789, -26673, -26556, -26437, - -26318, -26198, -26077, -25954, -25831, -25707, -25582, -25456, - -25329, -25201, -25072, -24942, -24811, -24679, -24546, -24413, - -24278, -24143, -24006, -23869, -23731, -23592, -23452, -23311, - -23169, -23027, -22883, -22739, -22594, -22448, -22301, -22153, - -22004, -21855, -21705, -21554, -21402, -21249, -21096, -20942, - -20787, -20631, -20474, -20317, -20159, -20000, -19840, -19680, - -19519, -19357, -19194, -19031, -18867, -18702, -18537, -18371, - -18204, -18036, -17868, -17699, -17530, -17360, -17189, -17017, - -16845, -16672, -16499, -16325, -16150, -15975, -15799, -15623, - -15446, -15268, -15090, -14911, -14732, -14552, -14372, -14191, - -14009, -13827, -13645, -13462, -13278, -13094, -12909, -12724, - -12539, -12353, -12166, -11980, -11792, -11604, -11416, -11227, - -11038, -10849, -10659, -10469, -10278, -10087, -9895, -9703, - -9511, -9319, -9126, -8932, -8739, -8545, -8351, -8156, - -7961, -7766, -7571, -7375, -7179, -6982, -6786, -6589, - -6392, -6195, -5997, -5799, -5601, -5403, -5205, -5006, - -4807, -4608, -4409, -4210, -4011, -3811, -3611, -3411, - -3211, -3011, -2811, -2610, -2410, -2209, -2009, -1808, - -1607, -1406, -1206, -1005, -804, -603, -402, -201,}; +fixed const gst_spectrum_Sinewave[1024] = { + 0, 201, 402, 603, 804, 1005, 1206, 1406, + 1607, 1808, 2009, 2209, 2410, 2610, 2811, 3011, + 3211, 3411, 3611, 3811, 4011, 4210, 4409, 4608, + 4807, 5006, 5205, 5403, 5601, 5799, 5997, 6195, + 6392, 6589, 6786, 6982, 7179, 7375, 7571, 7766, + 7961, 8156, 8351, 8545, 8739, 8932, 9126, 9319, + 9511, 9703, 9895, 10087, 10278, 10469, 10659, 10849, + 11038, 11227, 11416, 11604, 11792, 11980, 12166, 12353, + 12539, 12724, 12909, 13094, 13278, 13462, 13645, 13827, + 14009, 14191, 14372, 14552, 14732, 14911, 15090, 15268, + 15446, 15623, 15799, 15975, 16150, 16325, 16499, 16672, + 16845, 17017, 17189, 17360, 17530, 17699, 17868, 18036, + 18204, 18371, 18537, 18702, 18867, 19031, 19194, 19357, + 19519, 19680, 19840, 20000, 20159, 20317, 20474, 20631, + 20787, 20942, 21096, 21249, 21402, 21554, 21705, 21855, + 22004, 22153, 22301, 22448, 22594, 22739, 22883, 23027, + 23169, 23311, 23452, 23592, 23731, 23869, 24006, 24143, + 24278, 24413, 24546, 24679, 24811, 24942, 25072, 25201, + 25329, 25456, 25582, 25707, 25831, 25954, 26077, 26198, + 26318, 26437, 26556, 26673, 26789, 26905, 27019, 27132, + 27244, 27355, 27466, 27575, 27683, 27790, 27896, 28001, + 28105, 28208, 28309, 28410, 28510, 28608, 28706, 28802, + 28897, 28992, 29085, 29177, 29268, 29358, 29446, 29534, + 29621, 29706, 29790, 29873, 29955, 30036, 30116, 30195, + 30272, 30349, 30424, 30498, 30571, 30643, 30713, 30783, + 30851, 30918, 30984, 31049, + 31113, 31175, 31236, 31297, + 31356, 31413, 31470, 31525, 31580, 31633, 31684, 31735, + 31785, 31833, 31880, 31926, 31970, 32014, 32056, 32097, + 32137, 32176, 32213, 32249, 32284, 32318, 32350, 32382, + 32412, 32441, 32468, 32495, 32520, 32544, 32567, 32588, + 32609, 32628, 32646, 32662, 32678, 32692, 32705, 32717, + 32727, 32736, 32744, 32751, 32757, 32761, 32764, 32766, + 32767, 32766, 32764, 32761, 32757, 32751, 32744, 32736, + 32727, 32717, 32705, 32692, 32678, 32662, 32646, 32628, + 32609, 32588, 32567, 32544, 32520, 32495, 32468, 32441, + 32412, 32382, 32350, 32318, 32284, 32249, 32213, 32176, + 32137, 32097, 32056, 32014, 31970, 31926, 31880, 31833, + 31785, 31735, 31684, 31633, 31580, 31525, 31470, 31413, + 31356, 31297, 31236, 31175, 31113, 31049, 30984, 30918, + 30851, 30783, 30713, 30643, 30571, 30498, 30424, 30349, + 30272, 30195, 30116, 30036, 29955, 29873, 29790, 29706, + 29621, 29534, 29446, 29358, 29268, 29177, 29085, 28992, + 28897, 28802, 28706, 28608, 28510, 28410, 28309, 28208, + 28105, 28001, 27896, 27790, 27683, 27575, 27466, 27355, + 27244, 27132, 27019, 26905, 26789, 26673, 26556, 26437, + 26318, 26198, 26077, 25954, 25831, 25707, 25582, 25456, + 25329, 25201, 25072, 24942, 24811, 24679, 24546, 24413, + 24278, 24143, 24006, 23869, 23731, 23592, 23452, 23311, + 23169, 23027, 22883, 22739, 22594, 22448, 22301, 22153, + 22004, 21855, 21705, 21554, 21402, 21249, 21096, 20942, + 20787, 20631, 20474, 20317, 20159, 20000, 19840, 19680, + 19519, 19357, 19194, 19031, 18867, 18702, 18537, 18371, + 18204, 18036, 17868, 17699, 17530, 17360, 17189, 17017, + 16845, 16672, 16499, 16325, 16150, 15975, 15799, 15623, + 15446, 15268, 15090, 14911, 14732, 14552, 14372, 14191, + 14009, 13827, 13645, 13462, 13278, 13094, 12909, 12724, + 12539, 12353, 12166, 11980, 11792, 11604, 11416, 11227, + 11038, 10849, 10659, 10469, 10278, 10087, 9895, 9703, + 9511, 9319, 9126, 8932, 8739, 8545, 8351, 8156, + 7961, 7766, 7571, 7375, 7179, 6982, 6786, 6589, + 6392, 6195, 5997, 5799, 5601, 5403, 5205, 5006, + 4807, 4608, 4409, 4210, 4011, 3811, 3611, 3411, + 3211, 3011, 2811, 2610, 2410, 2209, 2009, 1808, + 1607, 1406, 1206, 1005, 804, 603, 402, 201, + 0, -201, -402, -603, -804, -1005, -1206, -1406, + -1607, -1808, -2009, -2209, -2410, -2610, -2811, -3011, + -3211, -3411, -3611, -3811, -4011, -4210, -4409, -4608, + -4807, -5006, -5205, -5403, -5601, -5799, -5997, -6195, + -6392, -6589, -6786, -6982, -7179, -7375, -7571, -7766, + -7961, -8156, -8351, -8545, -8739, -8932, -9126, -9319, + -9511, -9703, -9895, -10087, -10278, -10469, -10659, -10849, + -11038, -11227, -11416, -11604, -11792, -11980, -12166, -12353, + -12539, -12724, -12909, -13094, -13278, -13462, -13645, -13827, + -14009, -14191, -14372, -14552, -14732, -14911, -15090, -15268, + -15446, -15623, -15799, -15975, -16150, -16325, -16499, -16672, + -16845, -17017, -17189, -17360, -17530, -17699, -17868, -18036, + -18204, -18371, -18537, -18702, -18867, -19031, -19194, -19357, + -19519, -19680, -19840, -20000, -20159, -20317, -20474, -20631, + -20787, -20942, -21096, -21249, -21402, -21554, -21705, -21855, + -22004, -22153, -22301, -22448, -22594, -22739, -22883, -23027, + -23169, -23311, -23452, -23592, -23731, -23869, -24006, -24143, + -24278, -24413, -24546, -24679, -24811, -24942, -25072, -25201, + -25329, -25456, -25582, -25707, -25831, -25954, -26077, -26198, + -26318, -26437, -26556, -26673, -26789, -26905, -27019, -27132, + -27244, -27355, -27466, -27575, -27683, -27790, -27896, -28001, + -28105, -28208, -28309, -28410, -28510, -28608, -28706, -28802, + -28897, -28992, -29085, -29177, -29268, -29358, -29446, -29534, + -29621, -29706, -29790, -29873, -29955, -30036, -30116, -30195, + -30272, -30349, -30424, -30498, -30571, -30643, -30713, -30783, + -30851, -30918, -30984, -31049, -31113, -31175, -31236, -31297, + -31356, -31413, -31470, -31525, -31580, -31633, -31684, -31735, + -31785, -31833, -31880, -31926, -31970, -32014, -32056, -32097, + -32137, -32176, -32213, -32249, -32284, -32318, -32350, -32382, + -32412, -32441, -32468, -32495, -32520, -32544, -32567, -32588, + -32609, -32628, -32646, -32662, -32678, -32692, -32705, -32717, + -32727, -32736, -32744, -32751, -32757, -32761, -32764, -32766, + -32767, -32766, -32764, -32761, -32757, -32751, -32744, -32736, + -32727, -32717, -32705, -32692, -32678, -32662, -32646, -32628, + -32609, -32588, -32567, -32544, -32520, -32495, -32468, -32441, + -32412, -32382, -32350, -32318, -32284, -32249, -32213, -32176, + -32137, -32097, -32056, -32014, -31970, -31926, -31880, -31833, + -31785, -31735, -31684, -31633, -31580, -31525, -31470, -31413, + -31356, -31297, -31236, -31175, -31113, -31049, -30984, -30918, + -30851, -30783, -30713, -30643, -30571, -30498, -30424, -30349, + -30272, -30195, -30116, -30036, -29955, -29873, -29790, -29706, + -29621, -29534, -29446, -29358, -29268, -29177, -29085, -28992, + -28897, -28802, -28706, -28608, -28510, -28410, -28309, -28208, + -28105, -28001, -27896, -27790, -27683, -27575, -27466, -27355, + -27244, -27132, -27019, -26905, -26789, -26673, -26556, -26437, + -26318, -26198, -26077, -25954, -25831, -25707, -25582, -25456, + -25329, -25201, -25072, -24942, -24811, -24679, -24546, -24413, + -24278, -24143, -24006, -23869, -23731, -23592, -23452, -23311, + -23169, -23027, -22883, -22739, -22594, -22448, -22301, -22153, + -22004, -21855, -21705, -21554, -21402, -21249, -21096, -20942, + -20787, -20631, -20474, -20317, -20159, -20000, -19840, -19680, + -19519, -19357, -19194, -19031, -18867, -18702, -18537, -18371, + -18204, -18036, -17868, -17699, -17530, -17360, -17189, -17017, + -16845, -16672, -16499, -16325, -16150, -15975, -15799, -15623, + -15446, -15268, -15090, -14911, -14732, -14552, -14372, -14191, + -14009, -13827, -13645, -13462, -13278, -13094, -12909, -12724, + -12539, -12353, -12166, -11980, -11792, -11604, -11416, -11227, + -11038, -10849, -10659, -10469, -10278, -10087, -9895, -9703, + -9511, -9319, -9126, -8932, -8739, -8545, -8351, -8156, + -7961, -7766, -7571, -7375, -7179, -6982, -6786, -6589, + -6392, -6195, -5997, -5799, -5601, -5403, -5205, -5006, + -4807, -4608, -4409, -4210, -4011, -3811, -3611, -3411, + -3211, -3011, -2811, -2610, -2410, -2209, -2009, -1808, + -1607, -1406, -1206, -1005, -804, -603, -402, -201, +}; #if N_LOUD != 100 ERROR:N_LOUD != 100 #endif - fixed gst_spectrum_Loudampl[100] = { -32767, 29203, 26027, 23197, 20674, 18426, 16422, 14636, - 13044, 11626, 10361, 9234, 8230, 7335, 6537, 5826, - 5193, 4628, 4125, 3676, 3276, 2920, 2602, 2319, - 2067, 1842, 1642, 1463, 1304, 1162, 1036, 923, - 823, 733, 653, 582, 519, 462, 412, 367, - 327, 292, 260, 231, 206, 184, 164, 146, - 130, 116, 103, 92, 82, 73, 65, 58, - 51, 46, 41, 36, 32, 29, 26, 23, - 20, 18, 16, 14, 13, 11, 10, 9, - 8, 7, 6, 5, 5, 4, 4, 3, - 3, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; +fixed const gst_spectrum_Loudampl[100] = { + 32767, 29203, 26027, 23197, 20674, 18426, 16422, 14636, + 13044, 11626, 10361, 9234, 8230, 7335, 6537, 5826, + 5193, 4628, 4125, 3676, 3276, 2920, 2602, 2319, + 2067, 1842, 1642, 1463, 1304, 1162, 1036, 923, + 823, 733, 653, 582, 519, 462, 412, 367, + 327, 292, 260, 231, 206, 184, 164, 146, + 130, 116, 103, 92, 82, 73, 65, 58, + 51, 46, 41, 36, 32, 29, 26, 23, + 20, 18, 16, 14, 13, 11, 10, 9, + 8, 7, 6, 5, 5, 4, 4, 3, + 3, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; diff --git a/gst/spectrum/gstspectrum.c b/gst/spectrum/gstspectrum.c index 4f01ceff..12762c58 100644 --- a/gst/spectrum/gstspectrum.c +++ b/gst/spectrum/gstspectrum.c @@ -1,5 +1,6 @@ /* GStreamer * Copyright (C) <1999> Erik Walthinsen + * <2006> Stefan Kost * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -24,12 +25,33 @@ #include "gstspectrum.h" +GST_DEBUG_CATEGORY_STATIC (gst_spectrum_debug); +#define GST_CAT_DEFAULT gst_spectrum_debug + /* elementfactory information */ static const GstElementDetails gst_spectrum_details = GST_ELEMENT_DETAILS ("Spectrum analyzer", "Filter/Analyzer/Audio", "Run an FFT on the audio signal, output spectrum data", - "Erik Walthinsen "); + "Erik Walthinsen ," + "Stefan Kost "); + +static GstStaticPadTemplate sink_template_factory = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("audio/x-raw-int, " + "rate = (int) [ 1, MAX ], " + "channels = (int) 1, " + "endianness = (int) BYTE_ORDER, " + "width = (int) 16, " "depth = (int) 16, " "signed = (boolean) true") + ); + +static GstStaticPadTemplate src_template_factory = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS_ANY); /* Spectrum signals and args */ enum @@ -48,18 +70,17 @@ enum static void gst_spectrum_base_init (gpointer g_class); static void gst_spectrum_class_init (GstSpectrumClass * klass); static void gst_spectrum_init (GstSpectrum * spectrum); - +static void gst_spectrum_dispose (GObject * object); static void gst_spectrum_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); -static void gst_spectrum_chain (GstPad * pad, GstData * _data); +static GstFlowReturn gst_spectrum_chain (GstPad * pad, GstBuffer * buffer); #define fixed short -int gst_spectrum_fix_fft (fixed fr[], fixed fi[], int m, int inverse); -void gst_spectrum_fix_loud (fixed loud[], fixed fr[], fixed fi[], int n, +extern int gst_spectrum_fix_fft (fixed fr[], fixed fi[], int m, int inverse); +extern void gst_spectrum_fix_loud (fixed loud[], fixed fr[], fixed fi[], int n, int scale_shift); -void gst_spectrum_window (fixed fr[], int n); - +extern void gst_spectrum_window (fixed fr[], int n); static GstElementClass *parent_class = NULL; @@ -83,9 +104,10 @@ gst_spectrum_get_type (void) (GInstanceInitFunc) gst_spectrum_init, }; - spectrum_type = - g_type_register_static (GST_TYPE_ELEMENT, "GstSpectrum", &spectrum_info, - 0); + spectrum_type = g_type_register_static (GST_TYPE_ELEMENT, "GstSpectrum", + &spectrum_info, 0); + GST_DEBUG_CATEGORY_INIT (gst_spectrum_debug, "spectrum", 0, + "audio spectrum analyser element"); } return spectrum_type; } @@ -95,113 +117,128 @@ gst_spectrum_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template_factory)); gst_element_class_set_details (element_class, &gst_spectrum_details); } + static void gst_spectrum_class_init (GstSpectrumClass * klass) { - GObjectClass *gobject_class; - - gobject_class = (GObjectClass *) klass; + GObjectClass *gobject_class = (GObjectClass *) klass; parent_class = g_type_class_peek_parent (klass); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_WIDTH, g_param_spec_int ("width", "width", "width", G_MININT, G_MAXINT, 0, G_PARAM_WRITABLE)); /* CHECKME */ - gobject_class->set_property = gst_spectrum_set_property; + gobject_class->dispose = gst_spectrum_dispose; + + g_object_class_install_property (gobject_class, ARG_WIDTH, + g_param_spec_int ("width", "width", "width", + G_MININT, G_MAXINT, 0, G_PARAM_WRITABLE)); + } static void gst_spectrum_init (GstSpectrum * spectrum) { - spectrum->sinkpad = gst_pad_new ("sink", GST_PAD_SINK); + spectrum->sinkpad = + gst_pad_new_from_static_template (&sink_template_factory, "sink"); gst_element_add_pad (GST_ELEMENT (spectrum), spectrum->sinkpad); gst_pad_set_chain_function (spectrum->sinkpad, gst_spectrum_chain); - spectrum->srcpad = gst_pad_new ("src", GST_PAD_SRC); + + spectrum->srcpad = + gst_pad_new_from_static_template (&src_template_factory, "src"); gst_element_add_pad (GST_ELEMENT (spectrum), spectrum->srcpad); spectrum->width = 75; + spectrum->base = 8; + spectrum->len = 1024; + + spectrum->loud = g_malloc (spectrum->len * sizeof (gint16)); + spectrum->im = g_malloc (spectrum->len * sizeof (gint16)); + memset (spectrum->im, 0, spectrum->len * sizeof (gint16)); + spectrum->re = g_malloc (spectrum->len * sizeof (gint16)); + memset (spectrum->re, 0, spectrum->len * sizeof (gint16)); +} + +static void +gst_spectrum_dispose (GObject * object) +{ + GstSpectrum *spectrum = GST_SPECTRUM (object); + + g_free (spectrum->re); + g_free (spectrum->im); + g_free (spectrum->loud); + + G_OBJECT_CLASS (parent_class)->dispose (object); } static void gst_spectrum_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { - GstSpectrum *spectrum; - - g_return_if_fail (GST_IS_SPECTRUM (object)); - spectrum = GST_SPECTRUM (object); + GstSpectrum *spectrum = GST_SPECTRUM (object); switch (prop_id) { case ARG_WIDTH: spectrum->width = g_value_get_int (value); break; default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } -static void -gst_spectrum_chain (GstPad * pad, GstData * _data) +static GstFlowReturn +gst_spectrum_chain (GstPad * pad, GstBuffer * buffer) { - GstBuffer *buf = GST_BUFFER (_data); GstSpectrum *spectrum; - gint spec_base, spec_len; - gint16 *re, *im, *loud; gint16 *samples; - gint step, pos, i; + gint step, pos, num, i; guchar *spect; GstBuffer *newbuf; - g_return_if_fail (pad != NULL); - g_return_if_fail (GST_IS_PAD (pad)); - g_return_if_fail (buf != NULL); - spectrum = GST_SPECTRUM (GST_OBJECT_PARENT (pad)); + samples = (gint16 *) GST_BUFFER_DATA (buffer); + + GST_LOG ("buffer-size = %ld", GST_BUFFER_SIZE (buffer)); + + /* FIXME:need a gst_adapter */ + num = GST_BUFFER_SIZE (buffer) / 2; + num = MIN (num, spectrum->len); + + for (i = 0; i < num; i++) + spectrum->re[i] = (samples[(i * 2)] + samples[(i * 2) + 1]) >> 1; + + gst_spectrum_window (spectrum->re, spectrum->len); + gst_spectrum_fix_fft (spectrum->re, spectrum->im, spectrum->base, FALSE); + gst_spectrum_fix_loud (spectrum->loud, spectrum->re, spectrum->im, + spectrum->len, 0); - samples = (gint16 *) GST_BUFFER_DATA (buf); - - spec_base = 8; - spec_len = 1024; - - im = g_malloc (spec_len * sizeof (gint16)); - g_return_if_fail (im != NULL); - loud = g_malloc (spec_len * sizeof (gint16)); - g_return_if_fail (loud != NULL); - - memset (im, 0, spec_len * sizeof (gint16)); - /*if (spectrum->meta->channels == 2) { */ - re = g_malloc (spec_len * sizeof (gint16)); - for (i = 0; i < spec_len; i++) - re[i] = (samples[(i * 2)] + samples[(i * 2) + 1]) >> 1; - /*} else */ - /* re = samples; */ - gst_spectrum_window (re, spec_len); - gst_spectrum_fix_fft (re, im, spec_base, FALSE); - gst_spectrum_fix_loud (loud, re, im, spec_len, 0); - if (re != samples) - g_free (re); - g_free (im); - step = spec_len / (spectrum->width * 2); + /* resample to requested width */ + step = spectrum->len / (spectrum->width * 4); /* <-- shouldn't this be 2 instead of 4? */ spect = (guchar *) g_malloc (spectrum->width); for (i = 0, pos = 0; i < spectrum->width; i++, pos += step) { - if (loud[pos] > -60) - spect[i] = (loud[pos] + 60) / 2; - else + /* > -60 db? */ + if (spectrum->loud[pos] > -60) { + spect[i] = spectrum->loud[pos] + 60; + /* + if (spect[i] > 15); + spect[i] = 15; + */ + } else + /* treat as silence */ spect[i] = 0; -/* if (spect[i] > 15); */ -/* spect[i] = 15; */ } - g_free (loud); - gst_buffer_unref (buf); -/* g_free(samples); */ + gst_buffer_unref (buffer); newbuf = gst_buffer_new (); - g_return_if_fail (newbuf != NULL); GST_BUFFER_DATA (newbuf) = spect; GST_BUFFER_SIZE (newbuf) = spectrum->width; - gst_pad_push (spectrum->srcpad, GST_DATA (newbuf)); + return gst_pad_push (spectrum->srcpad, newbuf); } static gboolean diff --git a/gst/spectrum/gstspectrum.h b/gst/spectrum/gstspectrum.h index 8cc546ec..2dbc2242 100644 --- a/gst/spectrum/gstspectrum.h +++ b/gst/spectrum/gstspectrum.h @@ -39,7 +39,7 @@ extern "C" { #define GST_IS_SPECTRUM(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_SPECTRUM)) #define GST_IS_SPECTRUM_CLASS(obj) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_SPECTRUM)) + (G_TYPE_CHECK_CLASS_TYPE((obj),GST_TYPE_SPECTRUM)) typedef struct _GstSpectrum GstSpectrum; typedef struct _GstSpectrumClass GstSpectrumClass; @@ -50,6 +50,8 @@ struct _GstSpectrum { GstPad *sinkpad,*srcpad; gint width; + gint base, len; + gint16 *re, *im, *loud; }; struct _GstSpectrumClass { -- cgit v1.2.1