HiFi on Linux 另一则

非常难得(?)的填坑

Prelude

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

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

Episode #1

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

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

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下运行):

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的重采样能力?啊,这个不能听的。

Leave a Reply

Your email address will not be published. Required fields are marked *