The answer seems to be yes. It has been reported that devices based on AMLogic S905* chips will not output 24-bit audio. Some tests were done to investigate.
Vero4k (using S905X SoC).
HDMI to audio (TOSlink and analogue) converter, supporting HDMI1.4b
USB soundcard with TOSlink input, supporting up to 192k/24 capture.
Win10 desktop, running soundcard setup software and Audacity.
Generate test signal files as 24-bit or 16-bit triangular wave wavs with peak levels -90.34dB with a range of sampling rates and a range of channel numbers, eg:
sox -c2 -r 192k -b24 -n 4k-90.3dBtri192kc2b24.wav synth 10 tri 4000 gain -90.34
Connect converter to Vero HDMI out and screen HDMI in. Set the converter EDID switch to PASS.
Connect converter S/PDIF out to soundcard S/PDIF in. Set soundcard to 24-bits. Set audacity to capture S/PDIF-in with 32-float format.
Play test signals with kodi and record into audacity. Amplify all recorded tracks by 20dB so that individual sample values can be seen. Here is a selection of results for:
• 4kHz triangular wave, 24-bit, 44.1kHz sampling rate, stereo file
• 4kHz triangular wave, 24-bit, 48kHz sampling rate, stereo file
• 4kHz triangular wave, 24-bit, 48KHz sampling rate, 8 channel file (only FL/FR are output on TOSlink)
• 4kHz triangular wave, 24-bit, 192kHz sampling rate, 8 channel file
• 4kHz triangular wave, 16-bit, 192kHz sampling rate, stereo file
It can be seen that the amplitude of the displayed waveforms is about 0.0003. The captured waveform was 20dB below that, which is about 0.00003 as expected. Therefore the entire waveform is contained in the lowest 8 bits of 24 and the detail is all there. The 16-bit file shows the dithering introduced by sox trying to make sense of creating a -90dB file in only 16 bits.
Is it bit-perfect?
Yes. A 6kHz triangular wave was generated at 192kHz sampling rate so it has 32 samples per period. The amplitude -90dB corresponds to FFh in the lowest 8 bits of 24 bits, so the samples generated are 00h, 20h, 40h, 60h, 80h, 9Fh, BFh, DFh and FFh. With Kodi volume set at 100%, output PCM, Best match, and no up- or down-mixing, the captured signal, when saved as a 32-bit wav, looks like this:
Looks perfect to me - each sample is 8 bytes (4 left, 4 right) and you can see the expected values for the positive samples. If I’ve made a mistake, let me know!