How to read GstStructure values in Gstreamer 1.0? Avoiding bad warnings.

Alexander Botero alex.botero at
Wed Oct 10 11:16:43 PDT 2012

I have an application that uses the GstLevel element get and print RMS
and peak values.
I have now ported this app to Gstreamer 1.0 on Ubuntu 12.10 beta.

The program prints warnings when I read the level-values in
level_message_cb(...) function. Seems like all the GstStructure fields
are now GValueArray types.

This is the warning I get:

test10.c: In function ‘level_message_cb’:
test10.c:67:10: warning: ‘g_value_array_get_nth’ is deprecated
(declared at /usr/include/glib-2.0/gobject/gvaluearray.h:65): Use
'g_array_index' instead [-Wdeprecated-declarations]

How can I use "g_array_index()" on GValueArray type. GArray has a
g_array_index() method, but GValueArray has not.

I read somewhere that GValueArray is also deprecated or should be avoided.
Please instruct me how to read the level values in right way in the
level_message_cb() function.

Here is a complete test10b.c.
(sorry for possibly bad intendation. all menus are gone in my 12.10 beta...)

Compile for GTK3 and Gstreamer 1.0:
gcc -Wall test10b.c -o test10b $(pkg-config --cflags --libs gtk+-3.0
gthread-2.0 gstreamer-1.0)

The actual code that prints the warning:
All the values like; channels and peak_dB are right, but the warning bugs me!

//Field names:
//level field:endtime (GValueArray)
//level field:timestamp (GValueArray)
//level field:stream-time (GValueArray)
//level field:running-time (GValueArray)
//level field:duration (GValueArray)
//level field:rms (GValueArray)
//level field:peak (GValueArray)
//level field:decay (GValueArray)

 const GValue *value = gst_structure_get_value (s, "rms");

 // value is a GValueArray.
 GValueArray *array = (GValueArray*)g_value_get_boxed(value);

 guint channels = array->n_values;
 if (channels < 1) goto LBL_1;

 value = gst_structure_get_value(s, "peak");

 // value is a GValueArray.
 array = (GValueArray*)g_value_get_boxed(value);

 // g_value_array_get_nth is deprecated.
 GValue *v = g_value_array_get_nth(array, 0);
 gdouble peak_dB = g_value_get_double(v);

 gdouble norm_peak = exp(peak_dB / 20);
 if (norm_peak > 1.0) norm_peak = 1.0;

 // Display the value
  Alex Botero

More information about the gstreamer-devel mailing list