Linux で DSD をコマンドラインで再生する備忘録

Environment
Photo by hyt.

Linux で DSD をコマンドラインで再生する備忘録です.

いつもの通り結論から記すと,pipewire に含まれている

pw-dsdplay

で再生できます.ただし,DSD Direct 再生できる DAC が必要です.

Pipewire の導入方法(Ubuntu の場合)

pw-dsdplay を使うには pipewire を導入しないといけません.

pipewire は Linux の次世代の,これまで広く使われてきた Pulseaudio や Jack を置き換えを目指しているサウンドサーバーで,公式ページは以下の通りです.

PipeWire
PipeWire: Audio and Video on Linux

したがって,pipewire を使うには Pulseaudio 等から置き換える結構面倒な作業をやらなければいけません.ただし,最新開発版の Ubuntu では最初から導入済みであり,安定版の Ubuntu 22.04 でも全てではありませんが,かなりの部分が pipewire に置き換え済みです.

Ubuntu 22.04 でなるべく最新の pipewire を使うにはまず PipeWire の PPA を導入します.

PipeWire Upstream : SOURAV DAS
​​​​​ ​ ​ ​ ​​​​​ ​​​​ ​​​​ ​​​​ PipeWire 0.3.71 released. ===>>> (See Installation Instructions below) blueman : blueman-git 2.3.5-git-1 added ​ Installation I...
$ sudo sudo add-apt-repository ppa:pipewire-debian/pipewire-upstream
$ sudo apt update

次に英語のページですが,以下に示されている通りに関係するパッケージを導入していきます.

How to Use PipeWire to replace PulseAudio in Ubuntu 22.04 | UbuntuHandbook
$ sudo apt install pipewire-audio-client-libraries libspa-0.2-bluetooth libspa-0.2-jack
$ sudo apt install wireplumber pipewire-media-session-
$ sudo cp /usr/share/doc/pipewire/examples/alsa.conf.d/99-pipewire-default.conf /etc/alsa/conf.d/
$ sudo cp /usr/share/doc/pipewire/examples/ld.so.conf.d/pipewire-jack-*.conf /etc/ld.so.conf.d/
$ sudo ldconfig
$ sudo apt remove pulseaudio-module-bluetooth

ここで上の3行目の “pipewire-media-session-” は最後に “-” が付いていますが,これは typo ではありません.pipewire-media-session をアンインストールするという意味です.最近の pipewire では,pipewire-media-session の代わりに wireplumber が推奨となっていることから,このようにするようです.

最後に,wireplumber が自動起動するよう設定します.

$ systemctl --user --now enable wireplumber.service

実際に pipewire が動作しているかどうかは以下のようにして確かめることができます.以下は実際に私の環境の場合ですが,サーバー名のところを見ると,on PipeWire 0.3.71 のように記されています.

$ pactl info
サーバー文字列: /run/user/1000/pulse/native
ライブラリプロトコルバージョン: 35
サーバープロトコルバージョン: 35
Is ローカル: はい
クライアントインデックス: 87
タイルサイズ: 65472
ユーザー名: hyt
ホスト名: x1c6
サーバー名: PulseAudio (on PipeWire 0.3.71)
サーバーバージョン: 15.0.0
デフォルトサンプル仕様: float32le 2ch 48000Hz
デフォルトチャンネルマップ: front-left,front-right
デフォルトシンク: auto_null
デフォルトソース: auto_null.monitor
クッキー: b5e4:7aea

最後に元に戻す手順についても,最初に挙げたページ

How to Use PipeWire to replace PulseAudio in Ubuntu 22.04 | UbuntuHandbook

の後半に記されていますので,必要がある場合は参照されてください.

pw-dsdplay の使い方

pipewire のパッケージが正しく導入されていれば pw-dsdplay も導入できているはずです.使い方は,

pw-dsdplay test.dsf

のようにするだけです.ただし,DSD Direct (DOP ではだめ)の再生に対応した USB-DAC などをあらかじめ再生する Linux 機に接続しておく必要があります.

とは言っても DSD の音源がないとはじまりませんが,oppo Digital(中華スマホメーカーの OPPO ではなくてアメリカの音響・映像機器メーカーみたいです)がお試し用の音源を以下のページで公開してくれています.

DSDデモトラック | サポート | OPPO Digital Japan
DSDフォーマットの第一人者 /ミュージシャン David Elias のデモトラック近年ハイレゾリューション音源のダウンロード配信への人気が高まっていますが、デジタル化された音源ファイルにはDSD方式とPCM方式という異なるフォーマットが存在します。OPPO BDP-10Xシリーズは双方の異なるフォーマットに対応して...

実際に再生してみた様子は以下の通りです.まず,比較として DSD Direct 再生に対応した USB-DAC を接続していない場合を示します.

$ wget http://download.oppodigital.com/hra/davidelias/01%20-%20David%20Elias%20-%20The%20Window%20-%20Vision%20of%20Her%20%28DSD64%29.dsf
--2023-07-15 10:40:04--  http://download.oppodigital.com/hra/davidelias/01%20-%20David%20Elias%20-%20The%20Window%20-%20Vision%20of%20Her%20%28DSD64%29.dsf
download.oppodigital.com (download.oppodigital.com) をDNSに問いあわせています... 54.230.189.149, 54.230.189.2, 54.230.189.228, ...
download.oppodigital.com (download.oppodigital.com)|54.230.189.149|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 216695034 (207M) [application/octet-stream]
‘01 - David Elias - The Window - Vision of Her (DSD64).dsf’ に保存中

01 - David Elias - The Window 100%[=================================================>] 206.66M  24.8MB/s    in 9.2s

2023-07-15 10:40:13 (22.5 MB/s) - ‘01 - David Elias - The Window - Vision of Her (DSD64).dsf’ へ保存完了 [216695034/216695034]

$ pw-dsdplay 01\ -\ David\ Elias\ -\ The\ Window\ -\ Vision\ of\ Her\ \(DSD64\).dsf
stream node 48 error: no node available
remote error: id=2 seq:7 res:-2 (そのようなファイルやディレクトリはありません): no node available

次は DSD Direct で再生可能な USB-DAC(試したのは Sony WALKMAN NW-A45)を接続した場合です.上と違いエラメッセージも何も表示されずに再生が行われます.

$ pw-dsdplay 01\ -\ David\ Elias\ -\ The\ Window\ -\ Vision\ of\ Her\ \(DSD64\).dsf

なお,DSD Direct で再生できる DAC でも,Linux でその旨きちんと認識されないと再生は行えません.この辺りについては次の節をご覧ください.

おまけ(NW-A45 を DSD Direct に再対応させる)

上記した通り,pw-dsdplay で DSD を再生させるには Linux で DSD Direct に対応した DAC を認識させなければならないのですが,残念ながら私の持っている Sony WALKMAN NW-A45 はそのままでは Linux がきちんと DSD Direct 再生できる機器として認識してくれません.

これを対応させる方法については以前にも

Linux で Sony WALKMAN NW-A45 を DSD Direct に対応させる備忘録
Linux で Sony WALKMAN NW-A45 を DSD Direct に対応させる備忘録です. はじめに Sony WALKMAN の最近の Aシリーズ(NW-A45 とか NW-A55 とかですね.残念ながら NW-A100 ...

で取り上げたのですが,情報がかなり古くなっているようなので,改めて以下に手順を示しておきます.なお,上の記事では Raspberry pi OS ですが,今回は Ubuntu での手順となることも注意しておきます.

やらなければならない作業は Linux が NW-A45 を DSD Direct 再生可能機器だと認識するよう Linux Kernel の該当部分を書き換えることです.したがってまず Ubuntu で Linux のカーネルをコンパイルする準備をします.これは Ubuntu 公式の記事

Kernel/BuildYourOwnKernel - Ubuntu Wiki

の手順に従います.なお,以下の手順の1行目だけは公式の記事と少し違うことにご注意ください(公式の方法だとエラーが出る).

$ sudo apt-get build-dep linux linux-image-unsigned-$(uname -r)
$ sudo apt-get install libncurses-dev gawk flex bison openssl libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf llvm
$ sudo apt-get install git
$ mkdir ~/src
$ cd ~/src
$ apt-get source linux-image-unsigned-$(uname -r)

私の場合は ~/src/linux-hwe-5.19-5.19.0 以下にカーネルのソースコードが展開されました.

次にカーネルのソースコードの中の sound/usb/quirks.c を以下のように書き換えます.

diff -p sound/usb/quirks.c.orig sound/usb/quirks.c
*** sound/usb/quirks.c.orig	2023-07-15 11:24:20.243692343 +0900
--- sound/usb/quirks.c	2023-07-14 23:28:06.859036613 +0900
*************** static const struct usb_audio_quirk_flag
*** 2062,2068 ****
  	DEVICE_FLG(0x04e8, 0xa051, /* Samsung USBC Headset (AKG) */
  		   QUIRK_FLAG_SKIP_CLOCK_SELECTOR | QUIRK_FLAG_CTL_MSG_DELAY_5M),
  	DEVICE_FLG(0x054c, 0x0b8c, /* Sony WALKMAN NW-A45 DAC */
! 		   QUIRK_FLAG_SET_IFACE_FIRST),
  	DEVICE_FLG(0x0556, 0x0014, /* Phoenix Audio TMX320VC */
  		   QUIRK_FLAG_GET_SAMPLE_RATE),
  	DEVICE_FLG(0x05a3, 0x9420, /* ELP HD USB Camera */
--- 2062,2068 ----
  	DEVICE_FLG(0x04e8, 0xa051, /* Samsung USBC Headset (AKG) */
  		   QUIRK_FLAG_SKIP_CLOCK_SELECTOR | QUIRK_FLAG_CTL_MSG_DELAY_5M),
  	DEVICE_FLG(0x054c, 0x0b8c, /* Sony WALKMAN NW-A45 DAC */
! 		   QUIRK_FLAG_SET_IFACE_FIRST | QUIRK_FLAG_DSD_RAW),
  	DEVICE_FLG(0x0556, 0x0014, /* Phoenix Audio TMX320VC */
  		   QUIRK_FLAG_GET_SAMPLE_RATE),
  	DEVICE_FLG(0x05a3, 0x9420, /* ELP HD USB Camera */

私は持っていないので確かめることができませんが,NW-A45 以外の Sony 製 DAC を対応させる場合は,

$ diff -p sound/usb/quirks.c.orig sound/usb/quirks.c
*** sound/usb/quirks.c.orig	2023-07-15 11:24:20.243692343 +0900
*************** static const struct usb_audio_quirk_flag
*** 2202,2207 ****
--- 2202,2209 ----
  		   QUIRK_FLAG_VALIDATE_RATES),
  	VENDOR_FLG(0x1235, /* Focusrite Novation */
  		   QUIRK_FLAG_VALIDATE_RATES),
+ 	VENDOR_FLG(0x054c /*  Sony devices */
+                                    QUIRK_FLAG_DSD_RAW),
  	VENDOR_FLG(0x152a, /* Thesycon devices */
  		   QUIRK_FLAG_DSD_RAW),
  	VENDOR_FLG(0x1de7, /* Phoenix Audio */

のように書き換えれば良いのではないかと思います.と言うかなんで NW-A45 だけ元々からエントリがあるのかちょっと不思議です.カーネルメインテナの誰かがたまたま所有しているとかなんでしょうかね?

あとは,以下の通りカーネルのコンパイルを行います.所要時間はPCにもよると思いますが,私の場合は2時間程度かかりました.

$ LANG=C fakeroot debian/rules clean
$ LANG=C fakeroot debian/rules binary-headers binary-generic binary-perarch

コンパイルが終了すると,~/src 以下にカーネルのパッケージが出来上がっています.

$ ls
linux-hwe-5.19-5.19.0
linux-buildinfo-5.19.0-46-generic_5.19.0-46.47~22.04.1_amd64.deb
linux-cloud-tools-5.19.0-46-generic_5.19.0-46.47~22.04.1_amd64.deb
linux-headers-5.19.0-46-generic_5.19.0-46.47~22.04.1_amd64.deb
linux-hwe-5.19-cloud-tools-5.19.0-46_5.19.0-46.47~22.04.1_amd64.deb
linux-hwe-5.19-headers-5.19.0-46_5.19.0-46.47~22.04.1_all.deb
linux-hwe-5.19-tools-5.19.0-46_5.19.0-46.47~22.04.1_amd64.deb
linux-hwe-5.19_5.19.0-46.47~22.04.1.diff.gz
linux-hwe-5.19_5.19.0-46.47~22.04.1.dsc
linux-hwe-5.19_5.19.0.orig.tar.gz
linux-image-unsigned-5.19.0-46-generic_5.19.0-46.47~22.04.1_amd64.deb
linux-modules-5.19.0-46-generic_5.19.0-46.47~22.04.1_amd64.deb
linux-modules-extra-5.19.0-46-generic_5.19.0-46.47~22.04.1_amd64.deb
linux-modules-ipu6-5.19.0-46-generic_5.19.0-46.47~22.04.1_amd64.deb
linux-modules-ivsc-5.19.0-46-generic_5.19.0-46.47~22.04.1_amd64.deb
linux-modules-iwlwifi-5.19.0-46-generic_5.19.0-46.47~22.04.1_amd64.deb
linux-tools-5.19.0-46-generic_5.19.0-46.47~22.04.1_amd64.deb

あとは,以下のようにパッケージをインストールすれば完了です.

$ cd src
$ dpkg -i linux-image-unsigned-5.19.0-46-generic_5.19.0-46.47~22.04.1_amd64.deb linux-modules-5.19.0-46-generic_5.19.0-46.47~22.04.1_amd64.deb linux-modules-extra-5.19.0-46-generic_5.19.0-46.47~22.04.1_amd64.deb

再起動後,

$ sudo cat /proc/asound/WALKMAN/stream0
Sony WALKMAN at usb-0000:01:00.0-1.1, high speed : USB Audio
......
  Interface 1
    Altset 7
    Format: SPECIAL DSD_U32_BE
    Channels: 2
    Endpoint: 1 OUT (ASYNC)
    Rates: 44100, 48000, 88200, 96000, 176400, 192000
    Data packet interval: 125 us
    Bits: 32
    DSD raw: DOP=0, bitrev=0
    Channel map: FL FR

のように,DSD_U32_BE の文字列があれば DSD Direct 再生できる機器として認識されています.

雑感

と言うことで,これで Linux で DSD 音源をコマンドラインで再生できるようになりましたが,いまのところはまだかなり手間がかかります.しかし,最新のディストリビューションだと pulseaudio から pipewire への置き換えが急速に進んでいるようなので,じきになにもしなくても DSD Direct 対応の DAC さえ用意すれば良いという状況になるのではないかと思います.

あと,一つ気がついたこととして記しておきますが,以前の記事

Linux で Sony WALKMAN NW-A45 を DSD Direct に対応させる備忘録
Linux で Sony WALKMAN NW-A45 を DSD Direct に対応させる備忘録です. はじめに Sony WALKMAN の最近の Aシリーズ(NW-A45 とか NW-A55 とかですね.残念ながら NW-A100 ...

で DSD のサンプル音源をダウンロードできるページとして紹介した

2L High Resolution Music .:. free TEST BENCH
We invite you to join us in this evaluation of future consumer delivery formats. Download high resolution audio files from Norwegian 2L in stereo 96kHz, 192kHz,...

ですが,サイト移転と合わせて DSD サンプル音源の提供がなしになってしまったようです.購入することはできるみたいですが……現状,品揃えがものすごく少ないなぁ……

以上!

EnvironmentGadget
スポンサーリンク
Following hyt!
hyt adversaria
タイトルとURLをコピーしました