Benefic
dsd dop plex jellyfin hi-res-audio

Can Plex or Jellyfin Play DSD Files?

Benefic Team · · 4 min read
TL;DR

Plex transcodes DSD to PCM on the server — your DAC never sees the original bitstream. Jellyfin’s mobile clients can’t play DSD at all because CoreAudio and ExoPlayer don’t support the format. Benefic decodes DSD itself and outputs it as DoP (lossless, bit-perfect) on platforms that allow it, falling back to high-resolution PCM conversion on iOS where DoP isn’t possible.

If you have a library of DSD files — SACD rips, downloads from NativeDSD or similar sites — and you’ve tried playing them through Plex or Jellyfin, you’ve probably hit a wall. Neither platform handles DSD in a way that preserves what makes the format interesting in the first place.

Plex: it plays, but not really

Plex will happily scan your .dsf and .dff files into your music library. It will show metadata, album art, and even let you hit play. What it won’t do is send the DSD bitstream to your client.

Instead, Plex Media Server transcodes DSD to PCM on the server side before streaming it to your device. By the time audio reaches your player, it’s already been converted. Your DAC — no matter how capable — receives a PCM stream. There’s no DoP, no native DSD, no way to get the original 1-bit signal to your hardware.

For users who just want to hear their music, this works. But the entire reason most people collect DSD files is to send them to a DSD-capable DAC for native playback. Plex makes that impossible by design. As one forum user put it, if you care about DSD playback, you’ll need to look elsewhere — Plex was built for video first, and its audio pipeline reflects that.

There’s also no user-facing control over how the transcode happens. You can’t choose the output sample rate, bit depth, or filter type. The server picks for you.

Jellyfin: the client is the bottleneck

Jellyfin takes a different approach — the server is largely format-agnostic and can recognize DSD files in your library. The problem is on the client side.

The most popular Jellyfin music client for mobile — jellyfin-audio-player — cannot play DSD files at all. The app is built on react-native-track-player, which delegates audio decoding to the platform: CoreAudio on iOS, ExoPlayer on Android. Neither of those frameworks supports DSF or DFF natively.

The maintainer explained the constraint directly:

We are limited by whatever CoreAudio / ExoPlayer will play (which includes PCM but not DSF).

Community members have proposed workarounds — requesting Jellyfin transcode DSD to FLAC server-side, or eventually implementing DoP encoding in the client — but none of these have been implemented. The issue has been open since 2023 with no resolution.

The fundamental problem is architectural: if your player delegates decoding to the OS audio framework, you’re limited to the formats that framework supports. And no major mobile OS supports DSD natively.

Why platform audio frameworks can’t do DSD

This isn’t a laziness problem from Plex or Jellyfin developers. The core issue is that DSD is a niche format that Apple, Google, and Microsoft have never prioritized in their audio APIs:

  • CoreAudio (iOS/macOS): Supports PCM, AAC, ALAC, FLAC, MP3, and others. No DSF/DFF support. No DoP output path.
  • ExoPlayer (Android): Supports PCM-based formats extensively. No DSF/DFF decoder.
  • Windows Audio Session API: PCM-centric. DSD support requires ASIO bypass, which most apps don’t implement.

Any player that wants to handle DSD has to bring its own decoder and, ideally, its own output path. That’s a significant amount of work, which is why most media server clients don’t bother.

How Benefic handles DSD

Benefic doesn’t rely on the OS to decode DSD. It includes its own DSF and DFF decoder, which means DSD support isn’t gated by what CoreAudio or ExoPlayer happen to support.

The output strategy depends on the platform:

DoP on macOS, Linux — On platforms where it’s technically possible to write raw audio frames to the output device, Benefic encodes the DSD bitstream as DoP (DSD over PCM). This packs the original 1-bit DSD samples into 24-bit PCM frames with marker bytes (0x05 / 0xFA), which your DAC detects and unpacks back into a native DSD signal. The result is bit-perfect — your DAC receives the exact same bitstream that’s in the file.

DoP is a lossless transport, not a conversion. No decimation filter runs, no sample rate conversion happens, no bits are changed. It’s just a different container for the same data. (We wrote a detailed breakdown of DoP vs. native DSD if you want the full technical picture.)

PCM conversion on iOS — iOS is the exception. CoreAudio does not expose a low-level output path that allows apps to write arbitrary PCM frames that a DAC could interpret as DoP. The audio pipeline enforces its own processing, which would corrupt the DoP marker bytes and produce noise instead of music.

On iOS, Benefic converts DSD to high-resolution PCM using a proper decimation filter. This is a real conversion — not a crude transcode — with the output sample rate and bit depth chosen to preserve the full audio bandwidth of the source. It’s not bit-perfect DSD, but it’s a far cry from a blind server-side transcode with no user control.

The short version

DSD decodingOutput to DACUser control
PlexServer transcodes to PCMPCM onlyNone
Jellyfin (mobile)Not supportedN/AN/A
Benefic (macOS/Linux)Native decoderDoP (bit-perfect)Yes
Benefic (iOS)Native decoderHigh-res PCMYes

If your DSD library is just sitting in a Plex or Jellyfin server and you’ve been wondering why it doesn’t sound any different from your FLAC files — now you know. The DSD never made it to your DAC.