[[PageOutline]] [=#audio] = Audio = This page will attempt to give examples of audio-based GStreamer pipelines using GStreamer-1.0, with 'enhanced' encoders and decoders from the gstreamer-imx set of plugins. Note that 'enhanced' just means that the software algorithms are especially tuned for the imx6 family. To see GStreamer-0.10 (deprecated) examples, please refer to [http://trac.gateworks.com/wiki/Yocto/gstreamer/audio?version=2 this older revision page]. For a description of Audio devices see: * [wiki:ventana/audio Ventana Audio devices] [=#gstreamer-alsa] == GStreamer alsasrc and alsasink == The GStreamer {{{alsasrc}}} and {{{alsasink}}} provide audio capture and playback to Advanced Linux Sound Architecture (ALSA) devices. ALSA is the modern device-driver API for the Linux kernel. The Gstreamer alsasrc and alsasink can be passed a {{{device}}} property which can represent either the device name (reported from {{{aplay -L}}} for playback, or {{{arecord -L}}} for record) (ie {{{sysdefault:CARD=sgtl5000audio}}}) or the hw:x,y notation (ie {{{hw:0,0}}} for first device, first subdevice) If not specified via the {{{device}}} property, the device used for alsasrc and alsasink will depend on {{{/etc/asound.conf}}} and/or {{{~/.asoundrc}}}. Playback and Capture also depends on your ALSA mixer ({{{amixer}}}) settings. See [wiki:ventana/audio#Mixermuxgainvolume mixer settings] for more info. [=#audio-output] == Audio Output == Generally, a 'sink' plugin is one that will take an audio stream and send it to an audio device. Please refer to [http://trac.gateworks.com/wiki/ventana/audio this audio] page for more details on audio devices on the ventana platform. A list of output sinks on the imx6: * alsasink (recommended) * autoaudiosink * fakesink * filesink === alsasink === This audio sink is our recommended audio sink. It can accept the following formats via {{{audio/x-raw}}}: S8, U8, S16LE, S16BE, U16LE, U16BE, S24_32LE, S24_32BE, U24_32LE, U24_32BE, S32LE, S32BE, U32LE, U32BE, S24LE, S24BE, U24LE, U24BE, S20LE, S20BE, U20LE, U20BE, S18LE, S18BE, U18LE, U18BE, F32LE, F32BE, F64LE, F64BE === fakesink === This is a very useful debugging sink. It takes whatever data is given to it and drops them. This might help debugging pipelines if problems ever arise. === filesink === This sink is very useful when a user wants to record and save audio to a file. === autoaudiosink === This GStreamer sink is not really an 'audio' sink in the traditional sense. Similar to {{{playbin}}} and {{{decodebin}}}, this element selects what it thinks is the best available audio sink and uses it. Generally not recommended. === Examples === The GStreamer {{{alsasink}}} element will playback a 1KHz tone to any Advanced Linux Sound Architecture (ALSA) device driver: {{{#!bash gst-launch-1.0 audiotestsrc ! alsasink device="hw:0,0" }}} * see [wiki:ventana/audio#devices here] for details on specifying audio input and output devices [=#audio-input] == Audio Input == An input source is anything coming from a capture device on the SBC, e.g. HDMI audio in/analog audio in. Please refer to [http://trac.gateworks.com/wiki/ventana/audio this audio] page for more details on audio devices on the ventana platform. A list of input sources on the imx6: * alsasrc (recommended) * autoaudiosrc * audiotestsrc * filesrc === alsasrc === This is the recommended audio capture source when capturing audio onto the SBC. This plugin can output the following source types in {{{audio/x-raw}}}: S8, U8, S16LE, S16BE, U16LE, U16BE, S24_32LE, S24_32BE, U24_32LE, U24_32BE, S32LE, S32BE, U32LE, U32BE, S24LE, S24BE, U24LE, U24BE, S20LE, S20BE, U20LE, U20BE, S18LE, S18BE, U18LE, U18BE, F32LE, F32BE, F64LE, F64BE === autoaudiosrc === This GStreamer source is not really an 'audio' source in the traditional sense. Similar to {{{playbin}}} and {{{decodebin}}}, this element selects what it thinks is the best available audio source and uses it. Generally not recommended. === audiotestsrc === This is a very useful plugin for testing. It can output 16-64bit {{{audio/x-raw}}}: S16LE, S32LE, F32LE, F64LE This can output audio signals from {{{sine}}} to {{{violet-noise}}}. === filesrc === This source is very useful when a user wants to playback audio from a file. === Examples === The GStreamer {{{alsasrc}}} element will capture audio from any Advanced Linux Sound Architecture (ALSA) device driver: {{{#!bash gst-launch-1.0 alsasrc device="hw:0,0" ! "audio/x-raw,rate=32000,channels=2,depth=16" ! \ audioconvert ! avimux ! filesink location=./audio.avi }}} * see [wiki:ventana/audio#devices here] for details on specifying audio input and output devices [=#audio-encoding] == Encoding == Encoding is the term used to capture audio and encode it to a new format type. A list of audio encoders on the imx6 platform: * {{{gstreamer-imx}}} specific * imxmp3audioenc * Other GStreamer encoders * vorbisenc * mulawenc * wavenc * alawenc * flacenc * lamemp3enc There are many more. You can search for your specified one by running a similar search: {{{gst-inspect-1.0 | grep enc}}}. === imxmp3audioenc === This encoder can encode {{{audio/x-raw}}} S16LE to {{{audio/mpeg}}}. === vorbisenc === This encoder can encode {{{audio/x-raw}}} F32LE to {{{audio/x-vorbis}}}. === mulawenc === This encoder can encode {{{audio/x-raw}}} S16LE to {{{audio/x-mulaw}}}. === wavenc === This encoder can encode {{{audio/x-raw}}} S32LE, S24LE, S16LE, U8, F32LE, F64LE, {{{audio/x-alaw}}}, and {{{audio/x-mulaw}}} to {{{audio/x-wav}}}. === alawenc === This encoder can encode {{{audio/x-raw}}} S16LE to {{{audio/x-alaw}}}. === flacenc === This encoder can encode {{{audio/x-raw}}} S24LE, S24_32LE, S16LE, S8 to {{{audio/x-flac}}}. === lamemp3enc === This encoder can encode {{{audio/x-raw}}} S16LE to {{{audio/mpeg}}}. === Examples === This will take in an audio source from the mic and save it as an mp3. {{{#!bash gst-launch-1.0 alsasrc device="hw:0,0" ! audioconvert ! imxmp3audioenc ! filesink location=/tmp/mic.mp3 }}} * Note the audioconvert element is used to convert audio samplerate / bitwidth / format (via software algorithms) as needed between two elements. [=#audio-decoding] == Decoding == Decoding is the term used to decode an encoded audio stream to a raw audio stream. A list of audio encoders on the imx6 platform: * {{{gstreamer-imx}}} specific * imxuniaudiodec * Other GStreamer encoders * vorbisdec * ivorbisdec * a52dec * mulawdec * alawdec * flacdec === imxuniaudiodec === This decoder can decode {{{audio/mpeg}}} to {{{audio/x-raw}}} S32LE, S24LE, S16LE, S8. === vorbisdec === This decoder can decode {{{audio/x-vorbis}}} to {{{audio/x-raw}}} F32LE. === ivorbisdec === This decoder can decode {{{audio/x-vorbis}}} to {{{audio/x-raw}}} S16LE. === a52dec === This decoder can decode {{{audio/x-ac3}}}, {{{audio/ac3}}}, and {{{audio/x-private1-ac3}}} to {{{audio/x-raw}}} F32LE. === mulawdec === This decoder can decode {{{audio/x-mulaw}}} to {{{audio/x-raw}}} S16LE. === alawdec === This decoder can decode {{{audio/x-alaw}}} to {{{audio/x-raw}}} S16LE. === flacdec === This decoder can decode {{{audio/x-flac}}} to {{{audio/x-raw}}} S8, S16LE, S24_32LE, S32LE. === Examples === We can decode the MP3 audio saved previously and playback to the default audio device with the following: {{{#!bash gst-launch-1.0 filesrc location=/tmp/mic.mp3 ! mpegaudioparse ! imxuniaudiodec ! alsasink }}} [=#audio-format] == Audio Format Conversion == In specify the details of the audio format, you use a GStreamer {{{capsfilter}}} and to convert it from one format to another you use the GStreamer {{{audioconvert}}} element. {{{#!bash gst-launch-1.0 alsasrc device="hw:0,0" ! "audio/x-raw,rate=32000,channels=2,depth=16" ! \ audioconvert ! avimux ! filesink location=./audio.avi }}} [=#audio-loopback] == Audio loopback (Useful for testing audio input and output) == A simple aduio loopback test can take audio input from an input device and output it to an output device. loopback audio from the first audio card: {{{#!bash gst-launch-1.0 alsasrc device="hw:0,0" ! alsasink device="hw:0,0" }}} To send audio from the sgtl5000 (analog input) to the imxhdmisoc (HDMI output): * using device/function numbers (ie from {{{aplay -l}}}): {{{#!bash gst-launch-1.0 alsasrc device="hw:0,0" ! alsasink device="hw:2,0" }}} * or, using names (ie from {{{aplay -L}}}): {{{#!bash gst-launch-1.0 alsasrc device="sysdefault:CARD=sgtl5000audio" ! \ alsasink device="sysdefault:CARD=imxhdmisoc" }}} To send audio from the tda1997x HDMI receiver (digital input) to the imxhdmisoc (digital output): {{{#!bash gst-launch-1.0 alsasrc device="sysdefault:CARD=tda1997xaudio" ! \ "audio/x-raw,rate=44100" ! alsasink device="sysdefault:CARD=imxhdmisoc" }}} * Note here we need to specify the audio sample-rate as it can vary per input stream (and gstreamer does not validate the rate). This rate must match the source stream samplrate which can be found via sysfs {{{/sys/bus/i2c/drivers/tda1997x/2-0048/audmode}}}. If your output device requires a different sample-rate than the source input device, you need to perform a sample-rate conversion.