Playback tutorial 9: Digital audio pass-through

Goal

This tutorial shows how GStreamer handles digital audio pass-through.

Introduction

Besides the common analog format, high-end audio systems usually also accept data in digital form, either compressed or uncompressed. This is convenient because the audio signal then travels from the computer to the speakers in a form that is more resilient to interference and noise, resulting higher quality.

The connection is typically made through an S/PDIF cable which can either be optical (with TOSLINK connectors) or coaxial (with RCA connectors). S/PDIF is also known as IEC 60958 type II (IEC 958 before 1998).

In this scenario, GStreamer does not need to perform audio decoding; it can simply output the encoded data, acting in pass-through mode, and let the external audio system perform the decoding.

Inner workings of GStreamer audio sinks

First off, digital audio output must be enabled at the system level. The method to achieve this depend on the operating system, but it generally involves going to the audio control panel and activating a checkbox reading “Digital Audio Output” or similar.

The main GStreamer audio sinks for each platform, Pulse Audio (pulsesink) for Linux, osxaudiosink for OS X and Direct Sound (directsoundsink) for Windows, detect when digital audio output is available and change their input caps accordingly to accept encoded data. For example, these elements typically accept audio/x-raw data: when digital audio output is enabled in the system, they may also accept audio/mpeg, audio/x-ac3, audio/x-eac3 or audio/x-dts.

Then, when playbin builds the decoding pipeline, it realizes that the audio sink can be directly connected to the encoded data (typically coming out of a demuxer), so there is no need for a decoder. This process is automatic and does not need any action from the application.

On Linux, there exist other audio sinks, like Alsa (alsasink) which work differently (a “digital device” needs to be manually selected through the device property of the sink). Pulse Audio, though, is the commonly preferred audio sink on Linux.

Precautions with digital formats

When Digital Audio Output is enabled at the system level, the GStreamer audio sinks automatically expose all possible digital audio caps, regardless of whether the actual audio decoder at the end of the S/PDIF cable is able to decode all those formats. This is so because there is no mechanism to query an external audio decoder which formats are supported, and, in fact, the cable can even be disconnected during this process.

For example, after enabling Digital Audio Output in the system’s Control Panel, directsoundsink will automatically expose audio/x-ac3, audio/x-eac3 and audio/x-dts caps in addition to audio/x-raw. However, one particular external decoder might only understand raw integer streams and would try to play the compressed data as such (a painful experience for your ears, rest assured).

Solving this issue requires user intervention, since only the user knows the formats supported by the external decoder.

On some systems, the simplest solution is to inform the operating system of the formats that the external audio decoder can accept. In this way, the GStreamer audio sinks will only offer these formats. The acceptable audio formats are commonly selected from the operating system’s audio configuration panel, from the same place where Digital Audio Output is enabled, but, unfortunately, this option is not available in all audio drivers.

Another solution involves, using a custom sinkbin (see Playback tutorial 7: Custom playbin sinks) which includes a capsfilter element (see Basic tutorial 14: Handy elements) and an audio sink. The caps that the external decoder supports are then set in the capsfiler so the wrong format is not output. This allows the application to enforce the appropriate format instead of relying on the user to have the system correctly configured. Still requires user intervention, but can be used regardless of the options the audio driver offers.

Please do not use autoaudiosink as the audio sink, as it currently only supports raw audio, and will ignore any compressed format.

Conclusion

This tutorial has shown a bit of how GStreamer deals with digital audio. In particular, it has shown that:

  • Applications using playbin do not need to do anything special to enable digital audio output: it is managed from the audio control panel of the operating system.

It has been a pleasure having you here, and see you soon!

The results of the search are