Interleave with Alsasink Pipeline Problem

Tim Müller tim at centricular.com
Mon Jul 7 16:12:18 PDT 2014


On Mon, 2014-07-07 at 15:50 -0700, adweldon wrote:

> In my application, I tried to set the channel-mask by doing the
> following below; which never seemed to work.  Using your debug trap, I
> see now that channel_mask is set to 0x21 for some reason??  Even
> hard-coding it to 0x03 still still results in the wrong mask.  Perhaps
> I'm setting the caps on the pad incorrectly...

0x21 is FRONT_LEFT | REAR_RIGHT, which is what your GValueArray code
does. Maybe you meant FRONT_RIGHT ?

Regards
 -Tim

> 
> Output:
> 
> 0:00:00.705327387 12248 0xccf770 DEBUG GST_EVENT
> gstpad.c:5098:gst_pad_send_event_unchecked:<alsasink:sink> have event
> type caps event: 0x7f9be4003c70, time 99:99:99.999999999, seq-num 66,
> GstEventCaps, caps=(GstCaps)"audio/x-raw\,\ format\=\(string\)S16LE\,\
> layout\=\(string\)interleaved\,\ rate\=\(int\)44100\,\ channels\=\(int
> \)2\,\ channel-mask\=\(bitmask\)0x0000000000000021";
> 0:00:00.705378555 12248 0xccf770 DEBUG GST_CAPS
> gstutils.c:2852:gst_pad_query_accept_caps:<alsasink:sink> accept caps
> of audio/x-raw, format=(string)S16LE, layout=(string)interleaved,
> rate=(int)44100, channels=(int)2,
> channel-mask=(bitmask)0x0000000000000021
> 
> 
> Code Snippet:
> 
>     interleave = gst_element_factory_make ("interleave",
> "interleave");
>     g_assert (interleave != NULL);
> 
>     //Create audiochannel position array... Compiled with ignore
> warnings flag becuase GValueArray is not supported any longer.
>     GValueArray *positions = g_value_array_new (2);
>     GValue val = { 0, };
>     g_value_init (&val, GST_TYPE_AUDIO_CHANNEL_POSITION);
>     g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT);
>     g_value_array_append (positions, &val);
>     g_value_reset (&val);
>     g_value_set_enum (&val, GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT);
>     g_value_array_append (positions, &val);
>     g_value_unset (&val);
> 
>     g_print ("setting channel positions\n");
>     g_object_set(G_OBJECT(interleave), "channel-positions-from-input",
> FALSE, NULL);
>     g_object_set (interleave, "channel-positions", positions, NULL);
> 
>     guint64 channel_mask = GST_AUDIO_CHANNEL_POSITION_MASK(FRONT_LEFT)
> | GST_AUDIO_CHANNEL_POSITION_MASK(FRONT_RIGHT);
>     g_print ("channel_mask: 0x%x\n", channel_mask);
> 
>     GstCaps *caps = gst_caps_new_simple(
>     "audio/x-raw",
>     "rate", G_TYPE_INT, 22000,
>     "channels", G_TYPE_INT, 2,
>     "channel-mask", GST_TYPE_BITMASK, channel_mask,
>     NULL);
> 
>     GstPad *srcpad = gst_element_get_static_pad (interleave, "src");
>     g_assert(srcpad);
>     gst_pad_set_caps(srcpad, caps );
> 
> 
> 
>                                    
> ______________________________________________________________________
> From: Tim Müller [via GStreamer-devel] [ml-node+[hidden email]]
> Sent: Monday, July 07, 2014 2:57 PM
> To: David Weldon
> Subject: Re: Interleave with Alsasink Pipeline Problem
> 
> 
> On Mon, 2014-07-07 at 11:04 -0700, adweldon wrote: 
> 
> Hi David, 
> 
> 
> > I'm trying to create a fairly simple pipeline using test sources,
> the 
> > interleave element and my alsasink.  I'm essentially trying to have 
> > different test sources interleaved into a multichannel stream, and
> played 
> > out on the alsasink.  We are starting with basic two channel stereo
> right 
> > now, so nothing too complicated. 
> > 
> > The following pipeline using pulsesink, works: 
> > gst-launch-1.0 -v interleave name=i ! pulsesink  audiotestsrc
> name=t1 
> > volume=0.2 freq=133 ! queue ! i.  audiotestsrc name=t2 volume=0.1
> freq=200 ! 
> > queue ! i. 
> > 
> > Replacing pulsesink with alsasink results in: 
> > 
> > WARN basesrc gstbasesrc.c:2933:gst_base_src_loop:<t1> error:
> Internal data 
> > flow error. 
> > WARN basesrc gstbasesrc.c:2933:gst_base_src_loop:<t1> error:
> streaming task 
> > paused, reason not-negotiated (-4) 
> > INFO GST_ERROR_SYSTEM
> gstelement.c:1834:gst_element_message_full:<t1> 
> > posting message: Internal data flow error. 
> > GST_ERROR_SYSTEM gstelement.c:1857:gst_element_message_full:<t1>
> posted 
> > error message: Internal data flow error. 
> > 
> > Also: 
> > WARN alsa conf.c:4694:snd_config_expand: alsalib error: Unknown
> parameters 
> > {AES0 0x02 AES1 0x82 AES2 0x00 AES3 0x02} 
> > WARN alsa pcm.c:2239:snd_pcm_open_noupdate: alsalib error: Unknown
> PCM 
> > default:{AES0 0x02 AES1 0x82 AES2 0x00 AES3 0x02} 
> 
> 
> 
> I don't think this warning has anything to do with it. 
> 
> > Removing a source, the audio will play...  I have created a custom
> app that 
> > does basically the same thing as the launch pipeline, but it results
> in the 
> > same errors.  I have also tried playing with channel masks and what
> not in 
> > the app to no avail... 
> > 
> > Any help is appreciated, 
> 
> The debug log should tell you what the problem is: 
> 
>  $ GST_DEBUG=*:6 gst-launch-1.0 -v interleave name=i ! alsasink \ 
>     audiotestsrc name=t1 volume=0.2 freq=133 ! queue ! i. \ 
>     audiotestsrc name=t2 volume=0.1 freq=200 ! queue ! i. \ 
>     2>&1 | grep --max-count=1 -B25 not-negotiated 
> 
> Problem appears to be that interleave output audio with 2
> unpositioned 
> channels (channels=2,channel-mask=0), whereas alsa wants left/right
> for 
> channels=2 (i.e. channels=2,channel-mask=3). pulsesink doesn't seem
> to 
> care that's why it works. 
> 
> This makes it work (i.e. forcing a left/right layout on the caps): 
> 
> gst-launch-1.0 -v interleave name=i ! capssetter 
> caps='audio/x-raw,channel-mask=(bitmask)0x03' ! alsasink
>  audiotestsrc 
> name=t1 volume=0.2 freq=133 ! queue ! i.  audiotestsrc name=t2 
> volume=0.1 freq=200 ! queue ! i. 
> 
> In code one would do that via interleave's properties I suppose, but 
> with gst-launch this is the only way. 
> 
>  Cheers 
>   -Tim 
> 
> 
> 
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel

-- 
Tim Müller, Centricular Ltd - http://www.centricular.com



More information about the gstreamer-devel mailing list