Linux で DSD をコマンドラインで再生する備忘録です.
いつもの通り結論から記すと,pipewire に含まれている
pw-dsdplay
で再生できます.ただし,DSD Direct 再生できる DAC が必要です.
Pipewire の導入方法(Ubuntu の場合)
pw-dsdplay を使うには pipewire を導入しないといけません.
pipewire は Linux の次世代の,これまで広く使われてきた Pulseaudio や Jack を置き換えを目指しているサウンドサーバーで,公式ページは以下の通りです.
したがって,pipewire を使うには Pulseaudio 等から置き換える結構面倒な作業をやらなければいけません.ただし,最新開発版の Ubuntu では最初から導入済みであり,安定版の Ubuntu 22.04 でも全てではありませんが,かなりの部分が pipewire に置き換え済みです.
Ubuntu 22.04 でなるべく最新の pipewire を使うにはまず PipeWire の PPA を導入します.
$ sudo sudo add-apt-repository ppa:pipewire-debian/pipewire-upstream $ sudo apt update
次に英語のページですが,以下に示されている通りに関係するパッケージを導入していきます.
$ 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
最後に元に戻す手順についても,最初に挙げたページ
の後半に記されていますので,必要がある場合は参照されてください.
pw-dsdplay の使い方
pipewire のパッケージが正しく導入されていれば pw-dsdplay も導入できているはずです.使い方は,
pw-dsdplay test.dsf
のようにするだけです.ただし,DSD Direct (DOP ではだめ)の再生に対応した USB-DAC などをあらかじめ再生する Linux 機に接続しておく必要があります.
とは言っても DSD の音源がないとはじまりませんが,oppo Digital(中華スマホメーカーの OPPO ではなくてアメリカの音響・映像機器メーカーみたいです)がお試し用の音源を以下のページで公開してくれています.
実際に再生してみた様子は以下の通りです.まず,比較として 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 再生できる機器として認識してくれません.
これを対応させる方法については以前にも
で取り上げたのですが,情報がかなり古くなっているようなので,改めて以下に手順を示しておきます.なお,上の記事では Raspberry pi OS ですが,今回は Ubuntu での手順となることも注意しておきます.
やらなければならない作業は Linux が NW-A45 を DSD Direct 再生可能機器だと認識するよう Linux Kernel の該当部分を書き換えることです.したがってまず Ubuntu で Linux のカーネルをコンパイルする準備をします.これは Ubuntu 公式の記事
の手順に従います.なお,以下の手順の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 さえ用意すれば良いという状況になるのではないかと思います.
あと,一つ気がついたこととして記しておきますが,以前の記事
で DSD のサンプル音源をダウンロードできるページとして紹介した
ですが,サイト移転と合わせて DSD サンプル音源の提供がなしになってしまったようです.購入することはできるみたいですが……現状,品揃えがものすごく少ないなぁ……
以上!