けさらんぱの自由帳

とあるFF14プレイヤーがFF14のこととか関係ないことを書いていく予定のブログです。記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

PulseAudioの出力をハイレゾにしてみた話

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_sizefragment_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-loopbackadjust_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のサントラを聴いてみましたが、自分の耳では設定前との違いがよく分かりません(というか設定変えてデーモン再起動して…ってやってるうちに分かんなくなる)。とはいえ、悪くはなっていないはずなので、問題が出ない限りこのままで行こうと思います。

記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。