1

我有一个使用 GstLevel 元素获取和打印 RMS 和峰值的应用程序。

当我读取 level_message_cb(...) 函数中的级别值时,程序会打印警告。似乎所有 GstStructure 字段现在都是 GValueArray 类型。

static gboolean
level_message_cb (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);

        if (strcmp (name, "level") == 0) {
            gint channels;
            GstClockTime endtime;
            gdouble rms_dB, peak_dB, decay_dB;
            gdouble rms;
            const GValue *array_val;
            const GValue *value;

            GValueArray *rms_arr, *peak_arr, *decay_arr;
            gint i;

            if (!gst_structure_get_clock_time (s, "endtime", &endtime))
                g_warning ("Could not parse endtime");

            array_val = gst_structure_get_value (s, "rms");
            rms_arr = (GValueArray *) g_value_get_boxed (array_val);

            array_val = gst_structure_get_value (s, "peak");
            peak_arr = (GValueArray *) g_value_get_boxed (array_val);

            array_val = gst_structure_get_value (s, "decay");
            decay_arr = (GValueArray *) g_value_get_boxed (array_val);

            channels = rms_arr->n_values;

            g_print ("endtime: %" GST_TIME_FORMAT ", channels: %d\n",
                 GST_TIME_ARGS (endtime), channels);

            for (i = 0; i < channels; ++i) {

                g_print ("channel %d\n", i);

                array_val = gst_structure_get_value (s, "rms");
                arr = (GValueArray *) g_value_get_boxed (array_val);

                value = g_value_array_get_nth (rms_arr, i);
                rms_dB = g_value_get_double (value);

                value = g_value_array_get_nth (peak_arr, i);
                peak_dB = g_value_get_double (value);

                value = g_value_array_get_nth (decay_arr, i);
                decay_dB = g_value_get_double (value);

                g_print ("RMS: %f dB, peak: %f dB, decay: %f dB\n",
                     rms_dB, peak_dB, decay_dB);

                rms = pow (10, rms_dB / 20);

                g_print ("normalized rms value: %f\n", rms);
            }
        }
    }
    return TRUE;
}

这是我得到的警告:

warning: 'g_value_array_get_nth' is deprecated. Use 'g_array_index' instead

如何在 GValueArray 类型上使用“g_array_index()”。GArray 有一个 g_array_index() 方法,但 GValueArray 没有。

我在某处读到 GValueArray 也已被弃用或应避免使用。请指导我如何在 level_message_cb() 函数中以正确的方式读取级别值。

请特立尼通。

4

1 回答 1

1

这就是全部g_value_array_get_nth(除了验证它的论点):

return value_array->values + index;

因此,您的代码的相关部分变为:

value = arr->values + i;
于 2013-07-10T21:09:03.773 回答