Swapping Channels with Audioconvert's mix-matrix

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Swapping Channels with Audioconvert's mix-matrix

Mariano Koremblum
This post was updated on .
Hi devs!

I am struggling with the audioconvert's mix-matrix property. I have a two
channel input wav file and the idea is to swap the channels in the middle of
the stream, but I am not even able of swapping them in the start, don't know
why.

First I tried to do this:
g_object_set(convert, "mix-matrix", "<<(float)0.0, (float)1.0>, <(float)1.0,
(float)0.0>>", NULL);
But I've only got "core dump" error when doing so. Then I tried the way it
shows on this link:
https://gstreamer.freedesktop.org/documentation/audioconvert/index.html?gi-language=c
and this is the result:

/
int main(void)
{
    GMainLoop   *mainloop = NULL;
    GstElement  *pipeline = NULL;
    GstElement  *source = NULL, *sink = NULL;
    GstElement  *decode = NULL, *encode = NULL;
    GstElement  *convert = NULL;

    GValue matrix = G_VALUE_INIT;
    GValue vector = G_VALUE_INIT;
    GValue value = G_VALUE_INIT;

    gboolean res;

    gst_init(NULL, NULL);

    /* we need to run a GLib main mainloop to get the messages */
    mainloop = g_main_loop_new(NULL, FALSE);

    pipeline = gst_pipeline_new(NULL);
    g_assert(pipeline);

    source = gst_element_factory_make("filesrc", "source");
    g_assert(source);
    g_object_set(source, "location", "2-channels.wav", NULL);

    decode = gst_element_factory_make("wavparse", "decode");
    g_assert(decode);

    convert = gst_element_factory_make("audioconvert", "convert");
    g_assert(convert);

    /* ********** MIX-MATRIX SETUP & CONFIG ********** */

    g_value_init (&matrix, GST_TYPE_ARRAY);
    g_value_init (&vector, GST_TYPE_ARRAY);
    g_value_init (&value, G_TYPE_FLOAT);

    g_value_set_float (&value, 0.0);
    gst_value_array_append_value (&vector, &value);
    g_value_set_float (&value, 1.0);
    gst_value_array_append_value (&vector, &value);

    gst_value_array_append_value (&matrix, &vector);
    g_value_unset (&vector);

    g_value_init (&vector, GST_TYPE_ARRAY);

    g_value_set_float (&value, 1.0);
    gst_value_array_append_value (&vector, &value);
    g_value_set_float (&value, 0.0);
    gst_value_array_append_value (&vector, &value);
    g_value_unset (&value);
   
    gst_value_array_append_value (&matrix, &vector);
    g_value_unset (&vector);

    g_object_set_property (G_OBJECT (convert), "mix-matrix", &matrix);
    g_value_unset (&matrix);

    /* ********** END OF MIX-MATRIX ********** */

    encode = gst_element_factory_make("wavenc", "encode");
    g_assert(encode);

    sink = gst_element_factory_make("filesink", "sink");
    g_assert(sink);
    g_object_set(sink, "location", "out.wav", "sync", true, NULL);

    gst_bin_add_many(GST_BIN(pipeline), source, decode, convert, encode,
sink, NULL);

    res = gst_element_link_many(source, decode, convert, encode, sink,
NULL);
    g_assert(res == TRUE);

    g_print("Starting pipeline\n\n");
    gst_element_set_state(pipeline, GST_STATE_PLAYING);

    g_main_loop_run(mainloop);

    g_print("Stopping pipeline\n");
    gst_element_set_state(pipeline, GST_STATE_NULL);

    gst_object_unref(pipeline);

    return 0;
}
/


Does anyone know if I am doing something wrong? I really appreciate your
advises and tips :D

Thanks in Advance!!



--
Sent from: http://gstreamer-devel.966125.n4.nabble.com/
_______________________________________________
gstreamer-devel mailing list
gstreamer-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

Re: Swapping Channels with Audioconvert's mix-matrix

Mariano Koremblum
I managed to "solve it". This issue is related with this:
https://gitlab.freedesktop.org/gstreamer/gst-plugins-base/-/issues/521

Apparently it does not work when from N input channels you mix with this
property to N output channels. So, two workarounds are:

1) You add one dummy output channel to the stream ( N to N+1)
2) You add one dummy output channel to the stream and then remove it ( N to
N+1 and then N+1 to N)



--
Sent from: http://gstreamer-devel.966125.n4.nabble.com/
_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel