I am looking for help from the community here at Head-Fi / this particular thread. First of all, thanks to all here, your advice and communications have been enormously helpful already.
I am looking for specific help in getting Linux to play DSD natively to my Chord Hugo 2 DAC/HA. In short, what I did achieve / think to have achieved in bit-perfect manner is:
- Windows 8.1, foobar2000 with appropriate components, Chord-supplied driver (Windows 10 pre-Creators, incl. ASIO):
PCM, DoP and native DSD - all fine
- Linux openSUSE Tumbleweed (KDE), Linux Mint (Cinnamon):
PCM via stand-alone music players (DeaDBeeF, Audacious, some others)
DoP via MPD (Music Player Daemon) and some clients (GMPC, Cantata)
At this point one can lean back and enjoy the music fully. However, the completist / perfectionist / curious person in me still is looking for how to achieve the last missing piece, native DSD to the Hugo 2 under Linux. Any help from the community is very welcome.
Now, for the long write-up.
- Chord Hugo 2:
- Capable of accepting PCM in both 44.1 and 48 kHz series, complete up to 705.6 and 768 kHz
- Capable of accepting native DSD64 (single), DSD128 (double), DSD256 (fourfold), DSD512 (eightfold)
- Capable of DoP (DSD over PCM), for DSD64 to DSD256, resulting in "fake" 24/176.4, 24/352.8 and 24/705.6, resp.
This is not stated in the Chord specs on their website / the Hugo 2 manual, but it is (a) understood for an Apple-compatible device, and (b) it was confirmed to me in an e-mail from Chord.
For a good reference on DoP, I'd like to quote http://dsd-guide.com/dop-open-standard.
- My main Linux system is openSUSE Tumbleweed (KDE version), since it offers up-to-date software in quite a complete manner. In particular:
- ALSA 1.1.5
- MPD 0.20.16
- GMPC 11.8.16
- Cantata 2.2.0
According to the MPD documentation at
https://www.musicpd.org/doc/user/, these building blocks should be sufficient to do native DSD output: ALSA >= 1.0.27.1, current MPD doing native DSD automatically when throwing *.dsf or *.dff DSD files at it if the receiving device is capable of it. Otherwise, DoP can be enabled in the MPD configuration file (/etc/mpd.conf).
Thus, my question seems to boil down as to whether the Hugo 2 is informing Linux / ALSA of its native DSD capability. The crucial point might be that Chord is using a custom-coded Xilinx Artix 7 chipset in the Hugo 2, i.e. not the common XMOS chipset.
Here are my diagnoses on Tumbleweed and ALSA:
Code:
aplay -l
**** Liste der Hardware-Geräte (PLAYBACK) ****
Karte 0: PCH [HDA Intel PCH], Gerät 0: 92HD81B1X5 Analog [92HD81B1X5 Analog]
Sub-Geräte: 1/1
Sub-Gerät #0: subdevice #0
Karte 1: NVidia [HDA NVidia], Gerät 3: HDMI 0 [HDMI 0]
Sub-Geräte: 1/1
Sub-Gerät #0: subdevice #0
Karte 1: NVidia [HDA NVidia], Gerät 7: HDMI 0 [HDMI 0]
Sub-Geräte: 1/1
Sub-Gerät #0: subdevice #0
Karte 1: NVidia [HDA NVidia], Gerät 8: HDMI 0 [HDMI 0]
Sub-Geräte: 1/1
Sub-Gerät #0: subdevice #0
Karte 1: NVidia [HDA NVidia], Gerät 9: HDMI 0 [HDMI 0]
Sub-Geräte: 1/1
Sub-Gerät #0: subdevice #0
Karte 2: Hugo2 [Hugo2], Gerät 0: USB Audio [USB Audio]
Sub-Geräte: 1/1
Sub-Gerät #0: subdevice #0
Code:
aplay -L
null
Discard all samples (playback) or generate zero samples (capture)
default
Default ALSA Output (currently PulseAudio Sound Server)
... abridged ...
sysdefault:CARD=Hugo2
Hugo2, USB Audio
Default Audio Device
front:CARD=Hugo2,DEV=0
Hugo2, USB Audio
Front speakers
surround21:CARD=Hugo2,DEV=0
Hugo2, USB Audio
2.1 Surround output to Front and Subwoofer speakers
surround40:CARD=Hugo2,DEV=0
Hugo2, USB Audio
4.0 Surround output to Front and Rear speakers
surround41:CARD=Hugo2,DEV=0
Hugo2, USB Audio
4.1 Surround output to Front, Rear and Subwoofer speakers
surround50:CARD=Hugo2,DEV=0
Hugo2, USB Audio
5.0 Surround output to Front, Center and Rear speakers
surround51:CARD=Hugo2,DEV=0
Hugo2, USB Audio
5.1 Surround output to Front, Center, Rear and Subwoofer speakers
surround71:CARD=Hugo2,DEV=0
Hugo2, USB Audio
7.1 Surround output to Front, Center, Side, Rear and Woofer speakers
iec958:CARD=Hugo2,DEV=0
Hugo2, USB Audio
IEC958 (S/PDIF) Digital Audio Output
A script published by Ronald van Engelen (RonaldE here, thanks for it!) on
https://lacocina.nl/detect-alsa-output-capabilities shows other details:
Code:
bash alsa-capabilities
... abridged ...
6) USB Audio Class Digital alsa audio output interface `hw:2,0'
- device name = Hugo2
- interface name = USB Audio
- usb audio class = 2 - isochronous asynchronous
- character device = /dev/snd/pcmC2D0p
- encoding formats = S32_LE
- monitor file = /proc/asound/card2/pcm0p/sub0/hw_params
- stream file = /proc/asound/card2/stream0
Now for what happens when playing music.
Here's the monitoring of the ALSA parameter and stream files during playback of a 24/192 PCM (FLAC) file:
Code:
cat /proc/asound/card2/pcm0p/sub0/hw_params
access: RW_INTERLEAVED
format: S32_LE
subformat: STD
channels: 2
rate: 192000 (192000/1)
period_size: 1024
buffer_size: 8192
Code:
cat /proc/asound/card2/stream0
Chord Electronics Ltd Hugo2 at usb-0000:26:00.0-2, high speed : USB Audio
Playback:
Status: Running
Interface = 2
Altset = 1
Packet Size = 288
Momentary freq = 191997 Hz (0x17.ffe8)
Feedback Format = 16.16
Interface 2
Altset 1
Format: S32_LE
Channels: 2
Endpoint: 5 OUT (ASYNC)
Rates: 32000, 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000, 705600, 768000
Data packet interval: 125 us
Switching to MPD now in order to play DSD files, something the stand-alone players like DeadDBeeF or Audacious can't do.
Ronald van Engelen also provides a script to generate an MPD configuration file /etc/mpd.conf for bit-perfect playback at
https://lacocina.nl/audiophile-mpd. My audio section of this file looks like
Code:
audio_output {
type "alsa"
name "Hugo2 - USB Audio"
## device "hw:2,0"
device "hw:CARD=Hugo2,DEV=0"
## device "iec958:CARD=Hugo2,DEV=0"
auto_resample "no"
auto_format "no"
auto_channels "no"
dop "yes"
replay_gain_handler "none"
mixer_type "none"
}
replaygain "off"
As compared to Ronald van Engelen's script output, I have simply inserted the line
dop "yes"
in order to enable DoP playback.
And now the monitoring for playing a DSD64 (*.dsf) file via MPD in DoP mode:
Code:
cat /proc/asound/card2/pcm0p/sub0/hw_params
access: RW_INTERLEAVED
format: S32_LE
subformat: STD
channels: 2
rate: 176400 (176400/1)
period_size: 22050
buffer_size: 88200
Code:
cat /proc/asound/card2/stream0
Chord Electronics Ltd Hugo2 at usb-0000:26:00.0-2, high speed : USB Audio
Playback:
Status: Running
Interface = 2
Altset = 1
Packet Size = 272
Momentary freq = 176404 Hz (0x16.0cf0)
Feedback Format = 16.16
Interface 2
Altset 1
Format: S32_LE
Channels: 2
Endpoint: 5 OUT (ASYNC)
Rates: 32000, 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000, 705600, 768000
Data packet interval: 125 us
When I turn off DoP in MPD, I would have expected MPD (version 0.20.16) to use native DSD automatically, but it doesn't. Instead, it seems to do an upsampled PCM, again for the DSD64 file going out as 352.8 kHz PCM:
Code:
cat /proc/asound/card2/pcm0p/sub0/hw_params
access: RW_INTERLEAVED
format: S32_LE
subformat: STD
channels: 2
rate: 352800 (352800/1)
period_size: 32768
buffer_size: 131072
Code:
cat /proc/asound/card2/stream0
Chord Electronics Ltd Hugo2 at usb-0000:26:00.0-2, high speed : USB Audio
Playback:
Status: Running
Interface = 2
Altset = 1
Packet Size = 536
Momentary freq = 352807 Hz (0x2c.19d0)
Feedback Format = 16.16
Interface 2
Altset 1
Format: S32_LE
Channels: 2
Endpoint: 5 OUT (ASYNC)
Rates: 32000, 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000, 705600, 768000
Data packet interval: 125 us
Further remarks: I have not yet tampered with the alsa configuration files, neither pulseaudio. From the stand-alone players, I think to get as bit-perfect PCM playback as one can get.
Sorry to you, this "long write-up" has become quite long and involved.
In the end, my question to the community is: How do I get Linux (openSUSE Tumbleweed in particular) to play DSD files natively to the Chord Hugo 2, using MPD via bit-perfect ALSA? Is it possible at all?
I would also like to see what settings and alsa monitoring others folks here do get, if somebody has a DAC that does PCM and native DSD under Linux. Maybe the Oppo HA-2SE could be a suitable candidate (has an XMOS chipset).