Hide navigation sidebar
Hide table of contents sidebar
Skip to content
Back to top
Toggle table of contents sidebar

# S/PDIF receive

`lib_xua` supports the development of devices with S/PDIF receive functionality through the use of lib_spdif. The XMOS S/PDIF receiver runs on a single thread and supports rates up to 192 kHz.

The S/PDIF receiver inputs data via a port and outputs samples via a channel. It requires a 1-bit port. For example:

    in port p_spdif_rx = PORT_SPDIF_IN;

It also requires a clock-block, for example:

    clock clk_spd_rx = XS1_CLKBLK_1;

Finally, a channel for the output samples must be declared, note, this should be a streaming channel:

    streaming chan c_spdif_rx;

The S/PDIF receiver should be called on the appropriate tile:

    spdif_rx(c_spdif_rx, p_spdif_rx, clk_spd_rx, 192000);

Note

It is recomended to use the value 192000 for the `sample_freq_estimate` parameter

With the steps above an S/PDIF stream can be captured by the xcore. To be functionally useful the audio master clock must be able to synchronise to this external digital stream. Additionally, the host can be notified regarding changes in the validity of this stream, it’s frequency etc.

To synchronise to external streams the codebase assumes the use of an external Cirrus Logic CS2100 device or lib_sw_pll on xcore.ai designs.

The `ClockGen()` task from `lib_xua` provides the reference signal to the CS2100 device or timing information to lib_sw_pll and also handles recording of clock validity etc. See External clock recovery (Clock Gen) for full details regarding `ClockGen()`.

It also provides a small FIFO for S/PDIF samples before they are forwarded to the `AudioHub` thread. As such it is required to be inserted in the communication path between the S/PDIF receiver and the `AudioHub` thread. For example:

    chan c_dig_rx;
    streaming chan c_spdif_rx;

    par
    {
        SpdifReceive(..., c_spdif_rx, ...);

        clockGen(c_spdif_rx, ..., c_dig_rx, ...);

        XUA_AudioHub(..., c_dig_rx, ...);
    }