S/PDIF transmit

lib_xua supports the development of devices with S/PDIF transmit through the use of lib_spdif. The XMOS S/SPDIF transmitter component runs in a single thread and supports sample-rates upto 192 kHz.

The S/PDIF transmitter thread takes PCM audio samples via a channel and outputs them in S/PDIF format to a port. A lookup table is used to encode the audio data into the required format.

It receives samples from the Audio I/O thread two at a time (for left and right). For each sample, it performs a lookup on each byte, generating 16 bits of encoded data which it outputs to a port.

S/PDIF sends data in frames, each containing 192 samples of the left and right channels.

Audio samples are encapsulated into S/PDIF words (adding preamble, parity, channel status and validity bits) and transmitted in biphase-mark encoding (BMC) with respect to an external master clock.

Table 35 S/PDIF capabilities

Sample frequencies

44.1, 48, 88.2, 96, 176.4, 192 kHz

Master clock ratios

128x, 256x, 512x

Library

lib_spdif

Clocking

../../_images/spdif.png

Fig. 10 D-Type jitter reduction

The S/PDIF signal is output at a rate dictated by the external master clock. The master clock must be 1x 2x or 4x the BMC bit rate (that is 128x 256x or 512x audio sample rate, respectively). For example, the minimum master clock frequency for 192kHz is therefore 24.576 MHz.

This resamples the master clock to its clock domain (oscillator), which introduces jitter of 2.5-5 ns on the S/PDIF signal. A typical jitter-reduction scheme is an external D-type flip-flop clocked from the master clock (as shown in Fig. 9).

Usage

The interface to the S/PDIF transmitter thread is via a normal channel using streaming builtin functions (outuint, inuint). Data format should be 24-bit left-aligned in a 32-bit word: 0x12345600

The following protocol is used on the channel:

Table 36 S/PDIF Component Protocol

outct

New sample rate command

outuint

Sample frequency (Hz)

outuint

Master clock frequency (Hz)

outuint

Left sample

outuint

Right sample

outuint

Left sample

outuint

Right sample

...

...

This communication is wrapped up in the API functions provided by lib_spdif.

Output stream structure

The stream is composed of words with the structure shown in Table 37. The channel status bits are 0x0nc07A4, where c=1 for left channel, c=2 for right channel and n indicates sampling frequency as shown in Table 38.

Table 37 S/PDIF stream structure

Bits

0:3

Preamble

Correct B M W order, starting at sample 0

4:27

Audio sample

Top 24 bits of given word

28

Validity bit

Always 0

29

Subcode data (user bits)

Unused, set to 0

30

Channel status

See below

31

Parity

Correct parity across bits 4:30

Table 38 Channel status bits

Frequency (kHz)

n

44.1

0x0

48

0x2

88.2

0x8

96

0xA

176.4

0xC

192

0xE