[gst-devel] Spectrum plug-in ins't dumping analysis results.
Guilherme
grlongo.ireland at gmail.com
Fri May 15 19:54:30 CEST 2009
Hello..
I don't know if someone could give me a hand on this... I've implemented
the spectrum plug-in using the alsasrc, but I can't get the analysis
that it should dump in my screen, even with the "message" parameter set
TRUE.
The original script use audiotestsrc as src and works pretty well.
That's is the code:
#include <string.h>
#include <stdlib.h>
#include <gst/gst.h>
static guint spect_bands = 20;
#define AUDIOFREQ 32000
/* receive spectral data from element message */
gboolean
message_handler (GstBus * bus, GstMessage * message, gpointer data)
{
if (message->type == GST_MESSAGE_ELEMENT) {
const GstStructure *s = gst_message_get_structure (message);
const gchar *name = gst_structure_get_name (s);
GstClockTime endtime;
if (strcmp (name, "spectrum") == 0) {
const GValue *magnitudes;
const GValue *phases;
const GValue *mag, *phase;
gdouble freq;
guint i;
if (!gst_structure_get_clock_time (s, "endtime", &endtime))
endtime = GST_CLOCK_TIME_NONE;
g_print ("New spectrum message, endtime %" GST_TIME_FORMAT "\n",
GST_TIME_ARGS (endtime));
magnitudes = gst_structure_get_value (s, "magnitude");
phases = gst_structure_get_value (s, "phase");
for (i = 0; i < spect_bands; ++i) {
freq = (gdouble) ((AUDIOFREQ / 2) * i + AUDIOFREQ / 4) /
spect_bands;
mag = gst_value_list_get_value (magnitudes, i);
phase = gst_value_list_get_value (phases, i);
if (mag != NULL && phase != NULL) {
g_print ("band %d (freq %g): magnitude %f dB phase %f\n", i, freq,
g_value_get_float (mag), g_value_get_float (phase));
}
}
g_print ("\n");
}
}
return TRUE;
}
int
main (int argc, char *argv[])
{
GstElement *bin;
GstElement *src, *audioconvert, *spectrum, *sink;
GstBus *bus;
GMainLoop *loop;
gst_init (&argc, &argv);
bin = gst_pipeline_new ("bin");
src = gst_element_factory_make ("alsasrc", "src");
audioconvert = gst_element_factory_make ("audioconvert", NULL);
g_assert (audioconvert);
//spectrum properties
spectrum = gst_element_factory_make ("spectrum", "spectrum");
g_object_set (G_OBJECT (spectrum), "bands", spect_bands, "threshold", -80,
"message", TRUE, "message-phase", TRUE, NULL);
sink = gst_element_factory_make ("fakesink", "sink");
g_object_set (G_OBJECT (sink), "sync", TRUE, NULL);
gst_bin_add_many (GST_BIN (bin), src, audioconvert, spectrum, sink, NULL);
if (!gst_element_link (src, audioconvert) ||
!gst_element_link (audioconvert, spectrum) ||
!gst_element_link (spectrum, sink)) {
fprintf (stderr, "can't link elements\n");
exit (1);
}
bus = gst_element_get_bus (bin);
gst_bus_add_watch (bus, message_handler, NULL);
gst_object_unref (bus);
gst_element_set_state (bin, GST_STATE_PLAYING);
/* we need to run a GLib main loop to get the messages */
loop = g_main_loop_new (NULL, FALSE);
g_main_loop_run (loop);
gst_element_set_state (bin, GST_STATE_NULL);
gst_object_unref (bin);
return 0;
}
Am I forgetting something???
Thanks in advance..
Tks!
-------------------
Guilherme Longo
Dept. Eng. da Computação
Unaerp
Linux User - #484927
*Before Asking
http://www.istf.com.br/?page=perguntas
!- I'd rather die on my feet than live on my knees -!
More information about the gstreamer-devel
mailing list