AC3/DTS/MP3 pass-through via S/PDIF

It seems that this is not supported by pipewire.
This article suggests using Kodi on Silverblue for a HTPC:

But having AC3/DTS pass-through is a critical option for most HTPC enthusiasts when watching movies with surround sound.

So what options does one have to disable pipewire and configure alsa only for some applications or some boot?

What is the best way to do this and still do it properly as it should be done under Silverblue.

I don’t use Silverblue. But I do use ALSA on Fedora Workstation. In my case, just masking pipewire.socket with the following command and creating a global /etc/asound.conf seems to have worked.

systemctl --user mask pipewire.socket

Oh. I forgot one other thing. I also renamed /etc/alsa/conf.d/99-pipewire-default.conf to /etc/alsa/conf.d/99-pipewire-default.original and created an empty file in its place.

@glb, thanks for the response, I needed time to test all possibilities as this did not work.

This did not help me as pipewire was still starting somehow and kodi (in a flatpak) did not see the sound card directly, but again the options looked just the same as if with pipewire. I am not even sure if what I want is possible from within a flatpak, so I don’t know if I should even try to disable pipewire. Or maybe something else is wrong.

You said that this helped you with a regular fedora workstation. You did not mention if you were using Kodi and had AC3/DTS passthrough configuration or just were using alsa directly. If you are, is Kodi installed from dnf, or flatpak?

Sorry, I’m still figuring all of this out myself. Yes, PipeWire is still starting even with the socket disabled. I’ve since re-enabled the socket.

In retrospect, I think it was the following lines added for my sound driver that actually made things work for me. In my case, I was just trying to get surround sound working over HDMI.

$ cat /etc/modprobe.d/sound.conf 
options snd-hda-intel model=dual-codecs
options snd_hda_codec_hdmi static_hdmi_pcm=1

I was changing too many things at once and when it started working, I mistook what it was that did the trick.

I do not use kodi or flatpaks.

FWIW, it think the codecs that you can use can be seen by looking at /proc/asound/card0/codec#0 (the numbers in the path may be different for you).

In my case, AC3 is supported and is listed at that path.

$ cat /proc/asound/card0/codec#0
Codec: ATI R6xx HDMI
Address: 0
AFG Function Id: 0x1 (unsol 0)
Vendor Id: 0x1002aa01
Subsystem Id: 0x00aa0100
Revision Id: 0x100700
No Modem Function Group found
Default PCM:
    rates [0x70]: 32000 44100 48000
    bits [0x2]: 16
    formats [0x5]: PCM AC3

I think PipeWire actually runs “on top of” ALSA (I think ALSA is the low-level kernel driver and both PipeWire and PulseAudio are more or less “wrappers” that make configuring it easier).

Edit: Apparently PipeWire isn’t “just” a wrapper around ALSA. It does a lot on it’s own and replaces ALSA’s “user space library”. But it does still depend on ALSA’s “core functionality” (so the stuff under /proc/asound is still relevant to PipeWire). I could be wrong. Source: Does PipeWire Replace ALSA?

Solved it. It was simpler than I thought, at least in my case.

All that was needed, was to force Kodi to use ALSA instead of Pulseaudio. I didn’t have to disable Pipewire or change any system configuration.

How did I do this? As I said, I was running it via Flatpak, so I only had to open the Kodi configuration in Flatseal, disable Pulseaudio and restart Kodi. On the next run it was showing all the audio cards, and I chose the digital card with the S/PDIF optical output.

AC3/DTS pass-through via S/PDIF does not use special codecs, the raw digital stream is sent over the digital stereo output and it is up to the surround receiver to recognize that this is not stereo PCM, but either AC3 or DTS.

1 Like