Roon Bridge on Raspberry Pi 4 performs bit depth conversion 24 bit to 16 bit when playing to HDMI audio output

Hi Everyone,

I am a Roon noob, and hoping to set up a way to play Tidal MQA at the best possible quality on my Denon AVR-X4400H receiver. I am specifically hoping to play MQA content without downsampling to the “Roon Ready” Airplay interface to the Denon. So, I have purchased a Raspberry Pi 4 which I am wanting to set up as a bit-perfect Roon “RAAT” bridge to the Denon.

I am trying to set up:
Tidal MQA music -> Roon Server on Mac -> Roon Server does first MQA unfold on Mac, to 96KHz/24bit -> Raspberry Pi 4 + Ubuntu 20.04 LTS 64bit + Roon Bridge armv8 -> Raspberry Pi HDMI Audio output -> Denon AVR-X4400H Receiver

What I expect is Tidal MQA music being unfolded to 96KHz/24bit on Roon Server -> Roon Bridge and being sent bit-perfect to the Denon over HDMI cable. Instead, what I am getting is Roon showing “bit depth conversion 24 bit to 16 bit”.

From my understanding (but happy to be corrected) the Raspberry Pi 4, with its 2x HDMI outs, can do audio from its HDMI ports at 192KHz/24bits, so not sure where/why in the chain the 24bit to 16bit conversion is happening.

Does anyone have any guidance on what might be the issue here? Thanks in advance!

Here are some screenshots of my Roon setup:

By way of elimination, I thought I’d also follow up that something similar happens when I change the Raspberry Pi software. Instead of using Ubuntu 20.04 LTS 64 bit + Roon Bridge armv8, I also tried a Volumio + Roon Bridge plug in setup has follows:

Tidal MQA music -> Roon Server on Mac -> Roon Server does first MQA unfold on Mac, to 96KHz/24bit -> Raspberry Pi 4 + Volumio + Roon Bridge plug in -> Raspberry Pi HDMI Audio output -> Denon AVR-X4400H Receiver

I get exactly the same 24bit to 16bit conversion in Roon. Here are some screenshots of this set up:

a gotcha on the RPi 4 HDMI is only the one closest to the USBC power connection supports audio…certainly as far as I found out with Kodi on LibreELEC distro

Good to know that. In this case though, I’ve been using the first HDMI port (nearest the USB C power socket) and audio is working. I’m getting audio from my Denon, but Roon is converting the 24bit stream to 16bit.

very hard to find audio related info on the HDMI output specs

Is it because it’s an unidentified device so it’s going down to a default value?

Use ‘aplay -l’ to figure out the ‘card’ number for the HDMI output. Then “cat /proc/asound/card<#>/stream*”. That will tell you what formats (including bit depth) the kernel is advertising to Roon Bridge for the device.

I’m strugling with the same issue. The reason why the Pi is downconverting, is because in the kernel sources it says that it is only supporting 16 bit. However, the hardware is capable of 24 bit. I believe I’ve read somewhere that 24 bit output leads to “crackling” sounds.

At this moment I’m recompiling the kernel with 24 bits support, to see if it works and how it sounds.

It may be that the avr reporting wrong capabilities for the hdmi port. Had the same problem, denon never was able to tell my why or how to fix it. Seems to have something to do with sharing sources to zone 2. Solved by changing to toslink.

You can check what the AVR is reporting by using tvservice -a. I get:

     PCM supported: Max channels: 8, Max samplerate: 192kHz, Max samplesize 24 bits.
     AC3 supported: Max channels: 6, Max samplerate:  48kHz, Max rate  640 kb/s.
     DTS supported: Max channels: 6, Max samplerate:  96kHz, Max rate 1536 kb/s.
    EAC3 supported: Max channels: 8, Max samplerate:  48kHz, Max rate   24 kb/s.
  DTS_HD supported: Max channels: 8, Max samplerate: 192kHz, Max rate    8 kb/s.
     MLP supported: Max channels: 8, Max samplerate: 192kHz, Max rate   24 kb/s.

So the Denon AVR is correctly reporting it supports max 8 channels (7.1) with a maximum rate of 192kHz and a maximum of 24 bits for PCM.

Mine would do that when first powered up. Then it would change randomly. Seemed to be caused by switching between different hdmi sources and/or using zone 2.

Thanks Alex,

This confirms its not the Denon that’s causing the problem. So the problem lies upstream, maybe in the RPi hardware, or maybe in the OS running on RPi. My next step is to try “cwichura” suggestions above: “Use ‘aplay -l’ to figure out the ‘card’ number for the HDMI output. Then “cat /proc/asound/card<#>/stream*”. That will tell you what formats (including bit depth) the kernel is advertising to Roon Bridge for the device.”

I’ll report back once I’ve tried that…

Hi Alex, unfortunately I can’t do tvservice as it’s not available on Ubuntu 20.04. But your post does seem to show generically that Denon receivers aren’t the problem as they support 192/24 over HDMI.

Hi cwichura, I tried this, and it seems the “Ubuntu 20.04 LTS 64 bit” on Rpi 4 is reporting the HDMI device as 48KHz/16bit! So now to dig a bit further… why does Ubuntu (and Volumio also, for that matter) report the RPi’s hardware to be so hobbled? Is it because the RPi 4 really can’t do more than 16bits audio down the HDMI interface, or is it because there is a problem with the RPi4 kernel source code that many of the distros are using?


If your avr is doing weird things, you could add

hdmi_force_edid_audio = 1

to your config.txt file in the /boot/ folder. This tells the pi that all audio formats are supported regardless of what the hdmi device claims.

I expect that this is only a partial solution, though, since the kernel also limits the bit depth to 16.

(My Pi is still busy compiling the kernel, so… no test results yet)

Thanks Alex, I tried as you suggested. On Ubuntu, the location and name of this file is apparently at /boot/firmware/usercfg.txt (I may be wrong). It didn’t seem to make any difference - sounds still plays into the Denon, but Roon is still converting from 24bit to 16bit.

I’m not sure if that’s the same config file. But assuming it is, then the kernel does still not support 24 bit. I recompiled the kernel and I did manage to get Roon to send 24 bit audio to the pi. But I mainly hear a lot of noise, and very faintly in the background I could hear the music I was sending. I don’t have a clue what to do about it. Or if we cannot do anything about it because the Pi doesn’t support 24 bit audio.

Hi Alex, just a thought: is there a way in your kernel recompile to swap the 24bit around (i.e. from big-endian to little-endian or vice-versa, S24_LE vs S24_BE)?
I’m wondering if playing 24bit music to a DAC that’s expecting one but getting the other would sound exactly like what you’re currently getting, i.e. a lot of noise, and very faintly in the background your music.
My theory: noise is coming from the least-significant 8 bits being played instead as the top 8 most significant bits, and the top 8 bits most significant bits being played mistakenly as the least significant 8 bits allows you to very faintly hear your music… I may of course be spitting complete nonsense here :).

I’ve only tried S24_LE because the 16 bit support was also little endian only. But I’ll just try using big endian and then we’re sure :slight_smile:

(O, and I had tried S32_LE, same result)

Too bad… S24_BE gives me static only. Not even faint music…