DSD rates above DSD64 do not play correctly with PipeWire
- PipeWire version (
pipewire --version
):
Compiled with libpipewire 0.3.53
Linked with libpipewire 0.3.53
Actually, this is git master, at commit 76350ceb. WirePlumber is also from git master, at commit 80b3559963f0ad40a7bfa6c23b0098275c0b5ebe (release 0.4.11).
-
Distribution and distribution version (
PRETTY_NAME
from/etc/os-release
): Ubuntu 22.04 LTS -
Desktop Environment: KDE:
$ plasmashell --version
plasmashell 5.24.4
$ kf5-config --version
Qt: 5.15.3
KDE Frameworks: 5.92.0
kf5-config: 1.0
- Kernel version (
uname -r
):5.15.0-40-generic
Description of Problem:
Attempts at playing any DSD128 ("double-rate DSD") produces choppy audio. DSD64 works fine. Test files are attached. Playing the DSD64 file with pw-dsdplay
works fine, the DSD128 file doesn't work. Bizarrely, the choppy DSD128 output seems to "speed up" after a while, and its pitch increases. This may be an artifact of underruns and the sigma-delta decoding that is the basis for DSD.
Test files:
test-30s-44100hz-2ch-left-sine-right-sawtooth-dsd64-silence-middle.dsf test-30s-44100hz-2ch-left-sine-right-sawtooth-dsd128-silence-middle.dsf
Both files are stereo.
How Reproducible:
By playing DSD128 DSF files with pw-dsdplay
. Use a sound card that is natively capable of DSD playback (DSD-over-PCM does not count). For this test, I used an iFi nano iOne, which is capable of native DSD_U32BE stereo playback, with rates of up to and including DSD256. ALSA hw-params of this DAC are (the device was hw:3,0
in my setup):
$ cat /dev/zero | aplay -f dat --dump-hw-params -D hw:3,0
Playing raw data 'stdin' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo
HW Params of device "hw:3,0":
--------------------
ACCESS: MMAP_INTERLEAVED RW_INTERLEAVED
FORMAT: S32_LE SPECIAL DSD_U32_BE
SUBFORMAT: STD
SAMPLE_BITS: 32
FRAME_BITS: 64
CHANNELS: 2
RATE: [44100 384000]
PERIOD_TIME: [125 1000000]
PERIOD_SIZE: [8 384000]
PERIOD_BYTES: [64 3072000]
PERIODS: [2 1024]
BUFFER_TIME: (41 2000000]
BUFFER_SIZE: [16 768000]
BUFFER_BYTES: [128 6144000]
TICK_TIME: ALL
--------------------
aplay: set_params:1352: Sample format non available
Available formats:
- S32_LE
- SPECIAL
- DSD_U32_BE
Actual Results:
Choppy playback.
Expected Results:
Continuous, uninterrupted playback.
Additional Info (as attachments):
-
pw-dump > pw-dump.log
:
pw-dump.log pw.dot pipewire.conf
Recordings of the output to demonstrate the expected audio and the one I get with DSD128, including that weird speedup (ignore the low-grade noise at the very beginning of the recordings, that's an artifact of the recording hardware):