Skip to content

Native DSD Playback With PipeWire

Ever wondered how to play your fancy DSD files on Linux? PipeWire has a nice and simple option build right in.

📅 Created: Nov 13, 2022•🕒 Updated: Nov 8, 2023

Playing DSD files can be a tricky task, especially on Linux. Some guides just straight up don't work or have issues with your distro's setup or require a decent amount of knowledge, but iit doesn't have to be that hard.
PipeWire actually has the capability for that built right in and it's quite easy to use.

This guide only touches on native DSD playback. If your hardware is not capable of DSD playback or DSD features are not available with your install, this won't work for you.

pw-play ​

pw-play is a commandline tool for playing music files directly and is comes with a standard PipeWire installation.

To play PCM music you just open a terminal and type:

bash
$ pw-play file.wav # WAV files only

for a DSD file we then just need to add the -d param and that was it:

bash
$ pw-play -d file.dsf # DSF files only

Once the music is playing you can also try to mess with some additional params, like -v for verbose output with all the technical details.
All the params can be found in the docs at docs.pipewire.org (the tool is actually called pw-cat, pw-play is just a different name which calls pw-cat in playback mode, so that's why the name is different).

How do I know if my hardware supports DSD playback (on Linux)? ​

Execute aplay -l and figure out which number your sound card is.

Now enter this number in the following command:

bash
$ cat /proc/asound/card0/stream0
#                      ^ change this number

The output should look something like this:

bash
Playback:
  Status: Stop
  Interface 1
    Altset 1
    Format: S32_LE
    Channels: 2
    ( . . . )
  Interface 1
    Altset 2
    Format: S16_LE
    Channels: 2
    ( . . . )
  Interface 1
    Altset 3
    Format: SPECIAL DSD_U32_BE
    Channels: 2
    Endpoint: 0x01 (1 OUT) (ASYNC)
    Rates: 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000
    Data packet interval: 125 us
    Bits: 32
    DSD raw: DOP=0, bitrev=0
    Channel map: FL FR
    Sync Endpoint: 0x81 (1 IN)
    Sync EP Interface: 1
    Sync EP Altset: 3
    Implicit Feedback Mode: No

There are multiple options listed here, S32_LE and S16_LE for example describe PCM audio with 32 and with 16 bits. What you want to look for is DSD_U32_BE. If you see it listed as a format like with mine, then it your DAC supports DSD playback and is also compatible.

Troubleshooting ​

Some Q&A style fixes I found out myself while discovering this tool include:

  1. There is nothing on my screen
    pw-play is a command line tool that won't give you any response by default. If you'd like to see what happens, try using it with the -v flag: pw-play -vd file.dsf.

  2. I don't hear any sound
    The tool likes to sometimes not work on the first try. Try quitting with Ctrl + C and launching it again, you should have no issues from here on after.

  3. How do I change the playback device?
    It'll use whatever your default is at the time. Just use the audio settings in whatever GUI you are using and rerun the command.

Archived Comments

name•Nov 23, 2024
The DAC might not be able to mix PCM and DSD. In that case if there's an application playing PCM sound, it will make pw-play to fail when trying to play the .dsf file. pw-top shows all the applications outputting audio, as well as the format they are using (and the soundcard). When using a DSD format, it will be shown as DSDXXX. (DSD64, for example)