Prelude

标题写的有点大,希望新手可以读读这篇文章。具体软件的详细配置相对更容易找到。

上次谈了些在 Ubuntu 上配合 mpd 使用 USB DAC/AMP 的初步配置,写完之后自己也觉得有很多地方没有仔细提及。于是之后又浏览互联网查找信息,整理出了这篇短文。

Episode #1

费了很多时间去看其他用户们的讨论,才在谷歌中看到了 mpd 官方文档的链接,唉……

使用的还是 ALSA 输出,不过相对之前还是做了些修改。在这里贴一下自用 mpd 配置中 alsa 输出部分:

1
2
3
4
5
6
7
8
9
audio_output {
type "alsa"
name "Grace Design m9XX"
device "hw:1,0"
mixer_type "software"
auto_resample "no"
auto_format "no"
dop "yes"
}

回过神来才发现上次没有写 mpd 配置使用 ALSA 输出部分,只是在文末给了一个未注明的链接

相应的解释可以在官方文档(其一其二)中读到。需要注意的是,这段配置文件并不能直接粘贴使用,用户需要对配置文件进行一定的修改。(是的,官方文档还是需要读的。)

对于外置 DAC/AMP 一体机用户来说,音量调节完全可以通过转动设备上的旋钮实现,不过我还是将 mixer_type 行设置为了 "software"(调用 dmix)以在 ncmpcpp 上实现音量调节(其实几乎是完全出于美观的考虑)。

在互联网上检索相关信息,可以看到在以上配置文件中指定输出设备有两种配置写法,分别是 device "plughw:1,0"device "hw:1,0"plughwhw 的区别在于 plughw 调用插件与硬件进行通信,而 hw 则直接与硬件进行通信;对于特定格式 / 采样率 / 量化位数 / 通道数等等的音频,前者会检测输出硬件是否能够处理,若为否则加以转换(转换质量很可能很差),后者则尝试直接输出。在我的系统上(这几年发布的桌面解码器除了 DSD128 等等外基本上是全格式支持了),这两者的行为并没有表现出明显的不同。冒号后面的参数则需要用户在终端下输入 aplay -l 显示已连接在系统上的音频设备(需要安装 alsa-utils)来决定使用的设备编号和通道编号,并以设备编号,通道编号的格式填写。

Episode #2

网页 mpd clients 给出了详细的 mpd 前端列表。我选择了 Cantata 和 ncmpcpp 分别搭配 KDE 和 i3wm 使用(起初是出于美观)。在两者分别播放歌曲的时候打开 pavucontrol,只有 Cantata 以 ALSA plugin 的形式出现在应用程序列表中。那么两者分别是如何输出的呢?在终端中输入 fuser -v /dev/snd/* 可以看到当前使用中的音频设备及其对应进程。经过实验,Cantata 播放时的对应进程是 pulseaudio 而 ncmpcpp 的对应进程则为 mpd,如此看来,以上的现象就解释的通了(参见文末)。

那么这种转换实际表现如何呢?事实上有些糟糕:高采样率 PCM 和 DSD 都被 pulseaudio 强制转换为 44.1kHz PCM 输出。对我来说 pulseaudio 也是必要组件吧。我只测试了 QMPDclient,这个 Qt4 前端在我的系统上并不受 pulseaudio 掌控,同时也和 ncmpcpp 高度同步。

那么,问题奇妙地出现在了前端选择上。事实上,不同前端对带 tag 的整轨 FLAC(这部分不太了解)和 cue 文件的(默认)标签解析支持也并不相同;在此之上自然还有用户本身审美层面的选择问题了。

顺带一提,前述 fuser 命令的另一个作用在于当你发现某输出(其实是 pulseaudio 搞的鬼(笑))占用硬件而 pulseaudio -k 又返回当前无进程时,可以用这条命令找出占用设备的进程,结局自然是直接 kill 掉了(笑)。

Episode #3

mpd 支持 DSD 播放吗?其实是完全支持的嘛,毕竟有补丁和定制版的存在(笑),于是在此仅讨论从 ubuntu 默认源安装的 mpd。在不对其进行魔改的情况下,mpd 并不能自动读取 SACD-ISO 中的音频文件,仅能够支持 DSF 或者 DFF 文件。于是在此贴出转换文件的神奇魔咒(请在 root 下运行):

1
2
3
4
5
6
7
apt install cmake
wget https://github.com/sacd-ripper/sacd-ripper/archive/0.3.8.tar.gz
tar zxvf 0.3.8.tar.gz
cd sacd-ripper-0.3.8/tools/sacd_extract
cmake .
make
cp sacd_extract /usr/local/bin/

咒语还没有念完:之后在存放 SACD-ISO 目录下使用 sacd_extract -2 -s -i EXAMPLE.ISO 就可以进行转换了,提取出来的(在此为)DSF 文件会被保存到一个新建的文件夹中。关于这个工具的其他用法可以参照这个页面

Epilogue

首先贴上上文提到的链接:http://www.techradar.com/news/audio/linux-audio-explained-685419 不想读英文可以看这一条:https://linux.cn/thread-3314-1-1.html

呃…… 然后很明显,魔咒那段其实就是我不想详细写出来了……

关于 dop 选项,在此猜测是不同设备的情况不同。在我的系统下,设置为 yes 时的输出信号最终会被 m9XX 成功辨识为 DSD64,而设置为 no 时则会转化为 352.8kHz PCM,并且事实上 mpd 转换效果并不理想,大概系统并没有将 m9XX 识别为支持 DSD 的设备吧。

至于 ALSA 内建的 dmix 的重采样能力?啊,这个不能听的。