Oct 17, 2020

pulseaudioサーバーを強化する(10月24、25日、11月01、05、10日、追記あり)

エントリーをアップした時には出来たと思ったけど、音源によってはノイズが残存していることが分かった。
あれこれ設定を変えたので、該当箇所に追記する。というか、変更が多いので次々に追記している。

11月01日、仮想アース使用でどう変わったかをエントリーの最下部に追記している。
ようやくこれで落ち着いた、となればいいのだけど。
と思ったけど、甘かったな。

11月10日、更にエントリーの最下部に追記している。
今回の手入れで、そこそこ安定となってほしいけど、まだ完璧ではない。当初よりは相当使えるようになっているが、使いこなしが必要だ。

過去のpulseaudio関連のエントリーは以下のとおり。

Pulseaudioを使ってRaspberry piにAmazon Prime Musicを転送再生する(9月8日追記)
http://blown-lei.net/endive/blosxom.cgi/audio_diary/20200906a.htm

音楽ストリーミングサービスのウェブプレーヤーを使う
http://blown-lei.net/endive/blosxom.cgi/audio_diary/20200927a.htm

Pulseaudioの備忘録
http://blown-lei.net/endive/blosxom.cgi/audio_diary/20200930a.htm

ストリーミング音源をpulseaudioで転送しアップサンプリング再生する(10月15日、追記)
http://blown-lei.net/endive/blosxom.cgi/audio_diary/20201011a.htm

前のエントリーで、pulseaudioサーバー強化について検討中と書いた。
Compaq 6730bからElitebook 2570pに移行したのでエントリーにする。

新規に2570pを入手したのではなく、PPAP方式で使っているmpdサーバーに間借りさせた。
サーバーPCの個体数増加はノイズ源を増やすことになるし、mpdとpulseaudioを同時に使うことはない。
だったら1つの機体で運用してもいいんじゃないか、と思った。
図のようなイメージ。

Pulseaudio and Mpd server

インストール手順は前回エントリーに書いた通り。
設定は下記。

vi .pulse/default.pa

#load-module module-alsa-sink
load-module module-alsa-sink device=hw:0,0

.ifexists module-udev-detect.so
# load-module module-udev-detect
load-module module-udev-detect tsched=0
.else
### Use the static hardware detection module (for systems that lack udev support)
# load-module module-detect
load-module module-detect tsched=0
.endif

#load-module module-native-protocol-tcp
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.1.0/24
vi .pulse/daemon.conf

; shm-size-bytes = 0 # setting this 0 will use the system-default, usually 64 MiB
# shm-size-bytes = 262144
shm-size-bytes = 131072
# shm-size-bytes = 65536
# shm-size-bytes = 32768

; resample-method = speex-float-1
resample-method = src-sinc-fastest

; default-sample-format = s16le
; default-sample-rate = 44100
; alternate-sample-rate = 48000

default-sample-format = s32le

# default-sample-rate = 384000
# alternate-sample-rate = 384000
default-sample-rate = 352800
alternate-sample-rate = 352800
# default-sample-rate = 192000
# alternate-sample-rate = 192000

; default-fragments = 4
; default-fragment-size-msec = 25

default-fragments = 2
# default-fragment-size-msec = 1000
default-fragment-size-msec = 500
# default-fragment-size-msec = 200
# default-fragment-size-msec = 100
# default-fragment-size-msec = 50

10.24. 追記。
下の方に、エントリーアップした時に問題なくなったとか書いているが、そうではなかった。
上記のノイズがでる設定は削除して、下のほうに現在の設定を書き直した。

10.25. 早々に追記、訂正。
shm-size-bytesが、64000000になった。
デフォルトだと64MiBが充てられるはずで、それでもノイズが出たので小さい値にしてマシになったかと思っていたのだけど、全く勘違いしていたようだ。
数値を設定で固定してやらないと安定しないみたい。

実際には256000000まで試したけど、それでも384kHzはノイズが入る。
このあたりmpdとは挙動が違っていて、pulseaudioのほうがCPUへの依存が大きいのだろうか。mpdは速いメモリを充てがったら768kHzまで行けるようになったのだけど。

352.8kHzだったら、8000000以上から安定した印象。
デフォルトの数値だからというのではないけど64000000にした。音に余裕がある気がする。逆にこれ以上増やしても却って重くなる感じだ。
しかし、、、もうノイズが出なかったらいいんだけど。

vi .pulse/daemon.conf

; shm-size-bytes = 0 # setting this 0 will use the system-default, usually 64 MiB

# shm-size-bytes = 128000000
shm-size-bytes = 64000000
# shm-size-bytes = 32000000
# shm-size-bytes = 16000000
# shm-size-bytes = 8000000
# shm-size-bytes = 2000000
# shm-size-bytes = 262144
# shm-size-bytes = 131072
# shm-size-bytes = 65536
# shm-size-bytes = 32768

; realtime-scheduling = yes
; realtime-priority = 5
realtime-priority = 99

; resample-method = speex-float-1
resample-method = src-sinc-fastest

; flat-volumes = yes
flat-volumes = no

; default-sample-format = s16le
; default-sample-rate = 44100
; alternate-sample-rate = 48000

default-sample-format = s32le

# default-sample-rate = 384000
# alternate-sample-rate = 384000
default-sample-rate = 352800
alternate-sample-rate = 352800
# default-sample-rate = 192000
# alternate-sample-rate = 192000

; default-fragments = 4
; default-fragment-size-msec = 25

default-fragments = 2
default-fragment-size-msec = 500

; enable-deferred-volume = yes
enable-deferred-volume = no

あれやこれやと変わった。
突き詰めないうちにアップしたのは失敗だった。default-fragments関係の設定はデフォルトに戻ってしまった。
とか言って、またノイズが出て変わるかもしれない、、、
そうなったら、また訂正する。

微妙な調整だけど、これでノイズはなくなった。 ハードによって最適な設定値が異なるようで、試行錯誤しながら詰めていくしかないようだ。
384kHz再生でのノイズはかなり減ったが残存している。だから352.8kHzのままだ。

音質は、PPAPの音とはDACも違うので比較してないけど、十分に使えると判断した。確かに300kHz台の音が出ている、という感じ。
本当は700kHz台で使いたいのだけど、pulseaudioの限界なのか、エラー表示が出てpulseaudio自体が起動しないので設定できない。これは機械を変えても同じだった。

ともかく、かなりやっつけな建て付けだがストリーミングを主力音源にする体制ができたと思う。

11.01. 追記。
10月半ばに「主力音源にする体制ができた」と書いていたが、なんともはや。
ノイズが収まったかと思えば再発し、あれこれと手を入れる日々が続いていた。

設定をどう弄っても、しばらく使ううちにノイズが出てくる。
以前、音源によるのかと思ったこともあったが、今となっては大きな関連はなかったと思っている。
設定自体もあれこれ弄りすぎて、何をどうしたら良いのかもよく分からなくなった。
アップサンプリングしない設定にしていてもノイズが出るときは出る。システムへの負荷とか関係ないのだろうか。

どうしたものかと思っていたんだけど、ふと思い付いて、銅板仮想アースを使ってみた。
PPAP Back-Endで音質改善が得られていて、過去にエントリーを上げている。あれこれ試した末、うちではデジタル系に対してのみ有効良好な効果が得られると判断している。しかし、その効果は強力だ。
http://blown-lei.net/endive/blosxom.cgi/audio_diary/20200107a.htm
http://blown-lei.net/endive/blosxom.cgi/audio_diary/20200524a.htm

PPAP Back-Endのapu2に2セット直列で使っていた銅板を1セット外して、Pulseaudio serverに回してみた。
何処の端子に使おうかと思ったけど、Phono端子のGNDにつなぐことにした。
これで、ノイズが消えた。
様子を見ているけど、今のところ問題なく再生を継続出来ている。
同時に音も、格段に良くなっている。

銅板仮想アースでノイズが消えたということは、ハード(おそらくはクロック)が安定する必要があったということだろう。もともとノートPCなので、音楽再生に適さないハードだということでもあるのだろうか。
ようやく本当の意味でコンスタントに使えるように、、、なったんだろうか。
まだ安心は出来ないかな。様子見だ。

11.05. 追記。
そろそろ終わりにしたいんだけど、なんともはや。
ノイズが収まったかと思えば再発する。

default-fragments関係の設定を、以前に変更していた設定に戻した。 default-fragments = 2
default-fragment-size-msec = 500

あと、ブチブチノイズはサーバーだけの問題ではなく、クライアントの負荷が高いときも起きるようだ。
一見、メモリに余裕がある様でも、firefoxが動いている上位のターミナルソフトに負荷が溜まるみたいで(gnome-terminalになのかbashになのか分からないけど)、一旦、firefox、ターミナルともに終了して再起動したら治ることがある。

いろんなノウハウが蓄積されつつある。おんぼろ宇宙船をぶん殴って飛ばす船長のような気分だよ、、、

11.10. 追記。
現在の設定は下記の通り。

vi .pulse/default.pa

load-module module-alsa-sink device=hw:0,0
load-module module-udev-detect tsched=0
load-module module-detect tsched=0
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.1.0/24

default.paの設定、デフォルトからの変更点だけ記載しているが、以前と変わらず。

vi .pulse/daemon.conf

shm-size-bytes =64000000
realtime-priority = 88
default-script-file = /home/tc/.pulse/default.pa
resample-method = src-sinc-fastest
flat-volumes = no
default-sample-format = s32le
default-sample-rate = 352800
alternate-sample-rate = 352800
default-fragments = 2
default-fragment-size-msec = 25
enable-deferred-volume = no

daemon.confの設定。

default-fragments関係の設定は初心に還って、計算値に合わせた。
20だろうが500だろうが、数値を何にしても大して挙動は変わらず、pulseaudioが最適値を勝手に決めているのだろうと思うに至ったのだけど、じゃあ、詳しいサイトに載っている計算に合わせた設定を書き込んでおいてもいいだろう。もうこれ以上は弄らないことにする。
参考にしたのはarchlinuxのサイト。
https://wiki.archlinux.jp/index.php/PulseAudio/トラブルシューティング
計算の仕方は下記。
コマンド「pactl list sinks」でusbデバイスへの伝送の状況が表示されるので、その数値から計算する。

pactl list sinks

Sample Specification: s32le 2ch 352800Hz
Properties:
 device.buffering.buffer_size = "1048576"
 device.buffering.fragment_size = "524288"

32*2*352800 = 22579200 (bps)
device.buffering.buffer_size (1048576) / 22579200 = 0.046439909 (50ms)
device.buffering.fragment_size (524288) / 22579200 = 0.023219955 (25ms) = default-fragment-size-msec

default-fragments = buffer_size/fragment_size = 0.046439909/0.023219955 =2

今回、新たに追加したのは「default-script-file」の設定。default.paの場所を指定した。
daemon.confで設定しなくても読み込んでいるから放置していて問題ないとずっと思っていたが、記述しておくほうが挙動が安定するようだ。これは盲点だった。
設定を弄るのは、もうこれぐらいで最後にしたい。。。

あと、クライアント側の問題?でノイズが出ることがある。こっちのほうは手を入れられることが少ない。実際のところ、大量にメモリを喰うこと以外はどうなってるのか分からないのだ。
ウェブプレーヤーを動かしているタグを閉じてメモリを解放し、再度プレーヤーを開いたら治ることがある。
ウェブブラウザを再起動したら治る場合。
ウェブブラウザの上位でpulseサーバーにデータを送っている(と思われる)端末ソフトのウインドウを閉じて、そこから操作を再開する必要がある場合。
クライアントPC自体を再起動するまで治らない場合と、いろいろだ。
今の時点では、使いこなしで何とかするしかないかなと思っている。

それにしても、raspberry pi2でamazon prime musicを聴いていたときには、そこまでノイズに悩まされることはなかったのだけど。まあ、やってることは色々と違ってきているけど、それでもCD音源相当のデータをpulseaudio serverに送っているという点では同じはず。
何が違うんだろうと思うことはあるけど、そこを考えるのは余裕が出来たらにしようと思う。

Edit this entry...

wikieditish message: Ready to edit this entry.
















A quick preview will be rendered here when you click "Preview" button.