Oct 11, 2020
ストリーミング音源をpulseaudioで転送しアップサンプリング再生する(10月15日、追記)
ストリーミング音源利用に際して懸案だった、CDレベル音源のlibsamplerateによるアップサンプリングが、一応出来たので、備忘録にしておく。
そこそこ梃子摺ったけど、出来てみればそんなに複雑でもない。
ただ、作業行程で何が足りないのか推測し繰り返し試みないといけなかったので時間がかかった。まあ、僕の手際が悪いんだけど。
なにしろ、ログを読んでも何が足りないとかいけないとか、簡単に分からない。基本的なlinuxの知識が少ないので、初歩的なことを書いているのに気付かず、躓いたまま苦心惨憺の後に気付いたり、ということが多々ある。気付くまでログのあっち読んだりこっち読んだり、あれやったりこれやったりになるのだ。はっきりエラーと明言されていない記述も注意する必要があって、気付いたらそんなことだったのかなんだけど。
そういうときは、もしかして、この記述が怪しいのかな、ポイントなのかな?という、感が頼りになってくる。例えばログの中に「capability」という言葉があって、capability?、、cap?、、libcapというのが要るのかな?、、という感じで追い込む。
コンピューターをいじってるのにそんなんでいいのかという感じだ。
最初はpiCore 9で試みたが上手くいかず、tiny core 64 11.1で作っている。
そもそも、本気でアップサンプリングするならraspberry pi2とかだと限界がある。
ともあれ、以下、手順の要約。
tiny core pure 64 11.1のインストール行程を最初からなぞるのは面倒だったので、PPAP Frontを作る際のベースに使って、バックアップを保存していたディスクイメージを使うことにした。これをSDカードに書込み、Compaq 6730bに刺して起動、sshでログインしbulseaudioサーバーの環境を作っていく。
まず、tceコマンドで足りないライブラリ等をインストール。
alsa関連を足りないことがないように拡充、libcap関連、dbus関連を追加。
あと、以下に経過を記録。
wget http://freedesktop.org/software/pulseaudio/releases/pulseaudio-13.0.tar.xz tar -xf pulse*xz cd pulseaudio-13.0 ./configure --disable-x11 --enable-alsa --enable-samplerate make mkdir ../pulseaudio sudo make DESTDIR=/home/tc/pulseaudio install cd mksquashfs pulseaudio pulseaudio-13.0.tcz md5sum pulseaudio-13.0.tcz > pulseaudio-13.0.tcz.md5.txt sudo cp *tcz* /mnt/*2/tce/optional sudo vi /mnt/*2/tce/onboot.lst (pulseaudio-13.0.tcz)
wgetでpulseaudio-13.0をダウンロード。
展開しディレクトリに入る。alsaとsamplerate(libsamplerate)は使えるように、x11は使わない設定で、インストール。
tczファイルなど作成し、optionalディレクトリにコピー、onboot.lstにOS起動時読み込みの設定を書き込み。
これで、pulseaudio-13.0をインストール終了。
この時点でのインストール済みのtcz一覧は、下記アドレスのファイルに記載。ずいぶん沢山入っている。本来なら要らないものも多く入っていると思う。
http://blown-lei.net/blog/pulseaudio-optional-tcz.txt
onboot.lstは下記のとおり。
less /mnt/*2/tce/onboot.lst openssh.tcz i2c-5.4.3-tinycore64.tcz nfs-utils.tcz alsa-modules-5.4.3-tinycore64.tcz alsa.tcz nmap.tcz gcc.tcz boost-1.65-dev.tcz pkg-config.tcz bison.tcz autoconf.tcz libtool-dev.tcz bc.tcz cmake.tcz compiletc.tcz squashfs-tools.tcz ntpclient.tcz libsamplerate.tcz libsamplerate-dev.tcz lame.tcz lame-dev.tcz libmad.tcz libmad-dev.tcz alsa-plugins-dev.tcz alsa-config.tcz alsa-dev.tcz libcap.tcz libcap-dev.tcz dbus-dev.tcz pulseaudio-13.0.tcz
こんな環境に出来上がった。
pulseaudioサーバーを設定していく。
mkdir .pulse cp pulseaudio/usr/local/etc/pulse/default.pa .pulse cp pulseaudio/usr/local/etc/pulse/daemon.conf .pulse rm -rf pulseaudio*
ホームtcディレクトリに「.pulse」ディレクトリを作成。
設定ファイル「default.pa」と「daemon.conf」をソースからコピー複製し「.pulse」に設置。
インストールに使った残骸は「rm -rf」で削除。
設定ファイルの内容を、使用環境などに合わせて下記の通り変更。
vi .pulse/default.pa #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 ; resample-method = speex-float-1 resample-method = src-sinc-fastest ; default-sample-rate = 44100 ; alternate-sample-rate = 48000 default-sample-rate = 192000 alternate-sample-rate = 192000 ; default-sample-format = s16le default-sample-format = s32le
以前のエントリーに書いたけど、module-native-protocol-tcpを設定することで、クライアントからの信号を受ける事ができるようになる。 src-sinc-fastestはlibsamplerateの設定。USB-DACの状況に合わせて記載。
filetool.sh -b sudo reboot
設定を保存。リブート。
再度、sshでログインし、試用を開始。使えるリサンプラーを確認する。
tc@box:~$ pulseaudio --dump-resample-methods src-sinc-best-quality src-sinc-medium-quality src-sinc-fastest src-zero-order-hold src-linear 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 tc@box:~$
src-sinc-best-quality、src-sinc-medium-quality、src-sinc-fastest、と表示がある。
libsamplerateは使えるはずだ。
さて、鳴らしてみましょうか、、、「pulseaudio -D」で起動し、クライアントのfirefoxから音声信号を伝送する。
さっそく、音がでない。「top」を打つと、pulseaudioは仕事をしている様子。
状況は?
tc@box:~$ aplay -l **** List of PLAYBACK Hardware Devices **** card 0: IncRAL2496UT1 [RATOC Systems, Inc.RAL-2496UT1_], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0 tc@box:~$ pactl list sinks Sink #0 State: RUNNING Name: auto_null Description: Dummy Output Driver: module-null-sink.c Sample Specification: s32le 2ch 192000Hz Channel Map: front-left,front-right Owner Module: 13 Mute: no Volume: front-left: 65536 / 100% / 0.00 dB, front-right: 65536 / 100% / 0.00 dB balance 0.00 Base Volume: 65536 / 100% / 0.00 dB Monitor Source: auto_null.monitor Latency: 206 usec, configured 500 usec Flags: DECIBEL_VOLUME LATENCY Properties: device.description = "Dummy Output" device.class = "abstract" device.icon_name = "audio-card" Formats: pcm tc@box:~$
Name: auto_null、Description: Dummy Output、って、何?。
alsaはdacを認識しているが、pulseaudioは認識していない。
というか、クライアントから送られてきた信号が何処かに消えていくように設定されてるらしい。
原因は不明。多分何処かでミスってるのだろう。普通は自動的に読み込まれるのでハードの設定はpulseaudioではしなくていいものらしい。
しかしそんなことは言ってられないので、下記のように設定する。
vi .pulse/default.pa #load-module module-alsa-sink load-module module-alsa-sink device=hw:0,0
aplay -lで、「card 0: IncRAL2496UT1 [//], device 0: USB Audio」なので、hw:0,0だ。
これでどうか。
tc@box:~$ pactl list sinks Sink #0 State: RUNNING Name: alsa_output.hw_0_0 Description: RATOC Systems, Inc.RAL-2496UT1_ Driver: module-alsa-sink.c (... 以下略 )
一応、認識した、、、
pulseaudioを再起動して、信号伝送すると、、、音が出た。
ようやく一息、これで、なんとかなるのかな?
取り敢えず現状、音質は後回しで、ちゃんと運用できる事が優先なんだけど、いくつか問題が。
まず、192kHzだとブツブツ途切れるようなノイズが入って使えなかった。96kHzだと問題ないんだけど。
DACを変えたら、、、問題なくなったのかな?、、、
一応、384kHzで音は出るが700kHz台だと「Invalid sample rate '768000'.」とかエラー表示される。どうも微妙だ。
しかし、300kHz台が使える。
音は、、、
さすがに768kHzの深淵には及ばないけど、そこそこ良いんじゃないかな。
月にCD1枚程度の金額で、この音で聴けるなら、、、相当安いんじゃないかな。いや、、、使えますよこれ。
次に、ギャップレス再生ができない問題。これは、、、どうなんだろうね。
自宅NASの音源をmpdで聴いてきた限りでは、この問題は全く気にしなくても良かった。まあ、、、仕方がないのかな、、、
もうひとつは、クライアントPCにキャッシュが積み重なるようで、どんどんメモリが消費されていく。つまり、鳴らし始めのうちはいいけど数時間鳴らすとクライアントPCが不安定になるのだ。不可逆圧縮音源を使っていた時には、消費される容量が少なかったので、気付かなかったのだろうか。
しかし、8GB積んでるんだよ?
それが気付けば100%近く使用になりswapまで消費し始める。何にそんなに使ってるんだろう、、、firefoxを閉じると忽ち使用メモリ量は低下する。
一方、、、pulseaudioサーバー側は、ほとんどメモリを使っていない。
tc@box:~$ free total used free shared buff/cache available Mem: 3946904 239024 3592700 20636 115180 3440612 Swap: 959968 0 959968 tc@box:~$
何がどうなっているのやら。
素直にNode2iあたり導入するほうが楽なのかもしれない、、、(でもあれ、Linux用の操作アプリはないんじゃないかな、、、)
まあ、もうちょっと弄ってみましょうか、、、
弄れるかな、、、
弄れるかどうかはともかくとして、メインソースとして充分に使えそうなのが非常にありがたい。CD購入も減らせそうだ。
10月15日追記。
数日かけて使ってみたけど、なかなか手強い。
まず、スムーズに聴けるときとノイズで音楽にならないときがある。ブツブツ途切れる感じの雑音だ。音源によっても違う。
対策としてdefault.pa、daemon.confの設定をあれこれ弄ってみた。
詳細は省くけど、現在は352.8kHzにアップサンプリングで聴いている。これならほぼノイズがない。384kHzだとノイズで聴けない音源のほうが殆どになる。192kHzだと全く問題ないようだけど、現在は試行錯誤中なので300kHz台で使う。
他の設定も匙加減が必要で、なんだか綱渡り的。
現在の設定内容は下記に記載。
vi .pulse/default.pa #load-module module-alsa-sink load-module module-alsa-sink device=hw:0,0 ### Automatically load driver modules depending on the hardware available .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 = 131072 # shm-size-bytes = 65536 shm-size-bytes = 32768 ; resample-method = speex-float-1 resample-method = src-sinc-fastest default-sample-format = s32le default-sample-rate = 352800 alternate-sample-rate = 352800 ; default-fragments = 4 ; default-fragment-size-msec = 25 default-fragments = 2 # default-fragment-size-msec = 500 default-fragment-size-msec = 200 # default-fragment-size-msec = 100 # default-fragment-size-msec = 25
こういうのは、経験的にはハードを良くしたら解消すると思うので、検討中。
クライアント側の状況も音に影響する。
ファンが回るとてきめんに音質悪化する。止まると比較的速やかに回復する。
lanケーブルやスイッチングハブをいくつも介して遠く離れているのに、不思議なものだ。
キャッシュが積み重なるのは、抜本的対策は見えない。現状はウェブプレーヤーのタグを閉じてキャッシュ消去することで対応している(何を数GBも蓄積しているのかが分からない。音楽データだとしても大きすぎると思うのだけど)。
そんなこんなで、クライアントPC自体を新しくした。6730bからPro Book 450G3に。6730bは最近はYoutubeを見るだけでファンが回っていたので、いい機会ではあった。
HDDを積み替えるだけで移行できたのはラッキーだった。
メモリは12GBに増量。
450G3だとDeezer再生時にもファンが回らない。
wikieditish message: Ready to edit this entry.
A quick preview will be rendered here when you click "Preview" button.