PulseAudioの出力をハイレゾにしてみたので、そのことを書いてみようと思います。
出力の設定
まずは出力の設定からです。
出力をハイレゾにするには、 /etc/pulse/daemon.conf
に下記の設定を追加します。サンプリングフォーマットとサンプリングレートの具体的な値は、当然ハードウェアが対応している値にします。
default-sample-format = s32le default-sample-rate = 192000 alternate-sample-rate = 192000 default-sample-channels = 2
リサンプリングの設定
次にハイレゾじゃない音源を再生するときのためのリサンプリングの設定です。
PulseAudioが対応しているリサンプリングの手法は、 pulseaudio --dump-resample-methods
を実行することで確認できます。うちの場合はこんな感じでした。
% pulseaudio --dump-resample-methods trivial speex-float-0 speex-float-1 speex-float-2 speex-float-3 speex-float-4 speex-float-5 speex-float-6 speex-float-7 speex-float-8 speex-float-9 speex-float-10 speex-fixed-0 speex-fixed-1 speex-fixed-2 speex-fixed-3 speex-fixed-4 speex-fixed-5 speex-fixed-6 speex-fixed-7 speex-fixed-8 speex-fixed-9 speex-fixed-10 ffmpeg auto copy peaks soxr-mq soxr-hq soxr-vhq
何も設定しないと、 speex-float-1
という音質的にはあんまりよろしくない手法が使われます(数字が小さいほど音質よりもパフォーマンス優先)。これを音質が良いものに変更します。この設定も /etc/pulse/daemon.conf
に追記します。
resample-method = soxr-vhq
man pulse-daemon.conf
によるとspeexよりsoxrの方がCPU使用率の割に音が良いらしいので上記の設定にしました。ただし、 pactl list | grep Resample
で確認したところ、アプリによっては設定が無視されて speex-float-1
になってしまうことがあるようです…
フラグメントの最適化
PulseAudio - Tune your setting and prevent glitching に書いてあることを実行します。
% echo autospawn = no >> ~/.pulse/client.conf % killall pulseaudio % LANG=C pulseaudio -vvvv > ~/pulseverbose.log 2>&1 (Ctrl+Cを押す) % rm ~/.pulse/client.conf % grep device.buffering -m2 ~/pulseverbose.log
うちの場合、 buffer_size
と fragment_size
は下記のようになりました。
device.buffering.buffer_size = "3072000" device.buffering.fragment_size = "1536000"
これらから、下記の式で設定値を計算します。
default-fragment-size-msec = 1536000 / (192000 * 32 * 2) = 125 default-fragments = 3072000 / 1536000 = 2
計算した値を例によって /etc/pulse/daemon.conf
に追記します。
default-fragments = 2 default-fragment-size-msec = 125
module-loopbackがハングする!!
自分は module-loopback
を使用することがあるのですが、上記の設定をしたところ module-loopback
がPulseAudioごと数十秒で落ちるようになりました。詳しい説明は省きますが、これは module-loopback
に adjust_time=0
というオプションをつければ解決しました。
結果下記のようなコマンドで module-loopback
をロードしています。
% pactl load-module module-loopback \ source=alsa_input.pci-0000_00_1f.3.analog-stereo \ adjust_time=0 latency_msec=16
感想
という具合にしてPulseAudioの出力をハイレゾにしてみて、moraで買ったFF14のサントラを聴いてみましたが、自分の耳では設定前との違いがよく分かりません(というか設定変えてデーモン再起動して…ってやってるうちに分かんなくなる)。とはいえ、悪くはなっていないはずなので、問題が出ない限りこのままで行こうと思います。