Aug 25, 2020
引き続き、hwとplughwについて
まずはちょっとしたメモから。
前回エントリーで出て来たコマンド「cat /proc/asound/card0/stream0」なんだけど。
ふだんpiCore7とi2s DACでusbメモリの音源を鳴らしているシステムで、試しに打ってみた結果が以下。
tc@box:~$ cat /proc/asound/card0/stream0 cat: can't open '/proc/asound/card0/stream0': No such file or directory tc@box:~$
No such file or directory、、、
usb出力だとusb DACのデータが表示されたけど、i2s出力だとそれがない。考えてみたら、i2sだと出力先デバイスを特定するデータを扱う必要がないのだろう。
出力自体のデータは、下記のように確認できる。.mpdconfの設定は24/96だ。
tc@box:~$ cat /proc/asound/card0/pcm0p/sub0/hw_params access: RW_INTERLEAVED format: S24_LE subformat: STD channels: 2 rate: 96000 (96000/1) period_size: 12000 buffer_size: 48000 tc@box:~$
2年前のエントリーで、USB出力は48kHzにリサンプリングされるがi2s出力はされずに設定どおりに出力されるようだ、という記載がある。出力先が何なのかを気にしないのだから、48kHzにリサンプリングする理由がない。
つまり今更だけど、i2s出力とUSB出力はalsaの動き方が違うということだ。
ここで、.mpdconfのaudio_output_format設定を変えて、出力のファイルフォーマットがどうなるかを確認してみた。
「96000:24:2」のとき出力はS24_LE、「44100:16:2」のときS16_LE、「192:32:2」のときS32_LEになった。
audio_output_formatをコメントアウトしたら、出力は44100でS24_LE。あれ?っと思ったけど、よく考えたら、このシステムではmp3を再生していたんだった。CDリッピングのflacデータを再生したら、S16_LEになった。
mp3って、S24_LEになるのかね、、、いろいろ謎がある。
前回エントリーの話では、「-D hw:0,0」を設定したらファイルフォーマットを厳密に設定しないといけないけど、「-D plughw:0,0」は緩いのではないか?ということだった。
今回は、実際のところどうなのか、やってみようということだ。
うちでは珍しくもないけど、長々だらだらとしたエントリーになった。
テスト用環境として、Raspberry Piを2台使って、usb出力のPPAP環境を作る。
Frontに、Ras pi2、mpd 0.19.19、libsamplerateを使用。
Back-endに、Ras piB+。
OSはともにpiCore7。
USB DACはいくつか手持ちがあるけど、何を使うか、、、ちょっと古いが、取り敢えずRATOCのRAL-2496ut1を使うことにした。
これにオーディオテクニカのAT-SP150 bkというデスクトップ用のパワードスピーカーをつないで出力した。
ファイルフォーマットやBack-Endのコマンドを変えながら、音が出るかどうかのデータをとってみる。
Back-endのRas piB+にsshでログインし確認すると以下の通り。
tc@box:~$ cat /proc/asound/card0/stream0 RATOC Systems,Inc. RAL-2496UT1 USB-Transport at usb-20980000.usb-1.4, full spee : USB Audio Playback: Status: Stop Interface 1 Altset 1 Format: S16_LE Channels: 2 Endpoint: 1 OUT (ASYNC) Rates: 44100, 48000, 88200, 96000 Interface 1 Altset 2 Format: S24_3LE Channels: 2 Endpoint: 1 OUT (ASYNC) Rates: 44100, 48000, 88200, 96000 tc@box:~$
ほほう、、、面白い。
ADI-2 DACなんかS32_LEしか出ないのに。S16_LEとS24_3LEが表示されている。
Frontの.mpdconfはこんな感じ。
samplerate_converter "Fastest Sinc Interpolator" audio_buffer_size "8192" buffer_before_play "20%" audio_output_format "192000:32:2" audio_output { type "pipe" name "ppappipe" always_on "yes" command "/usr/local/bin/ncat 192.168.1.18 4444" }
2496ut1は24/96までのDACなので、192/32はオーバースペックだ。
しかし、ここでBack-endのコマンドを下記のように設定。
/usr/local/bin/ncat -kl 4444 -e "/usr/local/bin/aplay -D plughw:0,0 -M --period-size=512 --buffer-size=4096 -t raw -f S24_LE -r192000 -c2"
音を出してみる。
Back-endの出力はこんな感じに。
tc@box:~$ cat /proc/asound/card*/pcm0p/sub0/hw_params access: MMAP_INTERLEAVED format: S24_3LE subformat: STD channels: 2 rate: 96000 (96000/1) period_size: 256 buffer_size: 2048 tc@box:~$
音はちゃんと出ている。
Frontの設定「192/32」が、「24/96」にリサンプリングされている。Back-endの「-f S24_LE -r192000」という設定も、どこにいったのかという感じ。
ちなみにBack-endの構成はこんな感じ。
tc@box:~$ df Filesystem Size Used Available Use% Mounted on tmpfs 391.1M 9.4M 381.6M 2% / tmpfs 217.3M 0 217.3M 0% /dev/shm /dev/mmcblk0p2 43.7M 13.1M 28.2M 32% /mnt/mmcblk0p2 /dev/loop0 1.1M 1.1M 0 100% /tmp/tcloop/mc /dev/loop1 1.9M 1.9M 0 100% /tmp/tcloop/openssh /dev/loop2 4.9M 4.9M 0 100% /tmp/tcloop/nmap /dev/loop3 768.0K 768.0K 0 100% /tmp/tcloop/alsa-modules-4.1.13-piCore+ /dev/loop4 256.0K 256.0K 0 100% /tmp/tcloop/alsa /dev/loop5 1.1M 1.1M 0 100% /tmp/tcloop/glib2 /dev/loop6 68.0K 68.0K 0 100% /tmp/tcloop/libssh2 /dev/loop7 256.0K 256.0K 0 100% /tmp/tcloop/ncurses /dev/loop8 1.5M 1.5M 0 100% /tmp/tcloop/openssl /dev/loop9 292.0K 292.0K 0 100% /tmp/tcloop/libnl /dev/loop10 128.0K 128.0K 0 100% /tmp/tcloop/libpcap /dev/loop11 128.0K 128.0K 0 100% /tmp/tcloop/lua-lib /dev/loop12 384.0K 384.0K 0 100% /tmp/tcloop/libasound /dev/loop13 28.0K 28.0K 0 100% /tmp/tcloop/gamin /dev/loop14 36.0K 36.0K 0 100% /tmp/tcloop/libelf /dev/loop15 256.0K 256.0K 0 100% /tmp/tcloop/pcre /dev/loop16 384.0K 384.0K 0 100% /tmp/tcloop/libgcrypt /dev/loop17 128.0K 128.0K 0 100% /tmp/tcloop/libusb /dev/loop18 36.0K 36.0K 0 100% /tmp/tcloop/bzip2-lib /dev/loop19 128.0K 128.0K 0 100% /tmp/tcloop/libgpg-error /dev/loop20 128.0K 128.0K 0 100% /tmp/tcloop/libudev tc@box:~$
alsa.tcz、alsa-modules-4.1.13-piCore+.tcz、libasound.tczだけで、リサンプリングしてるんだろうか?
まあ、ダウンサンプリングに関してはひとつ飛ばしするだけでいいっちゃいいもんなあ、、、
フォーマットはS32_LEだった?のが、S24_3LEに変換されているけど、これってRas piB+的に簡単なのだろうか、、、
設定を変えてみる。
Back-endのコマンドのオプション設定が「-D plughw:0,0」だったのを「-D hw:0,0」に。
さらに「-f S24_3LE -r96000」、つまり2496ut1で使えるはずの設定記載にする。
Back-end : /usr/local/bin/ncat -kl 4444 -e "/usr/local/bin/aplay -D hw:0,0 -M --period-size=512 --buffer-size=4096 -t raw -f S24_3LE -r96000 -c2" Front : samplerate_converter "Fastest Sinc Interpolator" audio_buffer_size "8192" buffer_before_play "20%" audio_output_format "96000:24:2" audio_output { type "pipe" name "ppappipe" always_on "yes" command "/usr/local/bin/ncat 192.168.1.18 4444" }
音は出た、、、盛大なホワイトノイズが。はっきりしないけど、S24_3LEがいけないのではと思う。
S24_3LEをS24_LEにしたら、「Paused」で音が出ない。
そういうことなんだね。
じゃあ、もうひとつの使えるはずの設定「S16_LE」にしてみる。
Back-end : /usr/local/bin/ncat -kl 4444 -e "/usr/local/bin/aplay -D hw:0,0 -M --period-size=512 --buffer-size=4096 -t raw -f S16_LE -r96000 -c2" Front : samplerate_converter "Fastest Sinc Interpolator" audio_buffer_size "8192" buffer_before_play "20%" audio_output_format "96000:16:2" audio_output { type "pipe" name "ppappipe" always_on "yes" command "/usr/local/bin/ncat 192.168.1.18 4444" }
tc@box:~$ cat /proc/asound/card*/pcm0p/sub0/hw_params access: MMAP_INTERLEAVED format: S16_LE subformat: STD channels: 2 rate: 96000 (96000/1) period_size: 512 buffer_size: 4096 tc@box:~$
mpdは動いている。Back-endも信号を受け入れているようだ、、、でも、音が出ない。、、、
じゃあ、、、ここで「-D hw:0,0」だったのを「-D plughw:0,0」に変えてみるか、、、同じ、、、いや、、、出てる?音量が小さい、、、
設定を「-D hw:0,0」に戻す。
ボリュームを上げると、普通に音が出ていたのが分かった。音量が大きく違ったのだ。
S16_LEだと音量が下がるのか?、いや、、、むしろこっちのほうが適正な音量だ。先刻、鳴っていた音量が大き過ぎたのだ。
これは、一筋縄には行かないな、、、
こんな感じでだらだらやってても大変だ。データを取るのに変数は、、、
1) Front : .mpdconf / audio_output_format (44100, 48000, 88200, 96000, 19200 : 16, 24, 32)
2) Back-end : aplay -D (hw:0,0 or plughw:0,0)
3) Back-end : aplay -f (S16_LE, S24_3LE, S24_LE, S32_LE)
4) Back-end : aplay -r (44100, 48000, 88200, 96000, 19200)
変数が4つもある、、、
1)は、44100, 96000, 19200 : 16, 24, 32、ぐらい?
2)aplay -Dオプションは、hwとplughw。
3)はS16_LE、S24_3LE、S24_LE、4)は44100, 96000, 19200ぐらいに絞ろうか、、、
総当たりでやったら、162とおりの組み合わせ。、、、やって出来ないこともないけど、なかなか終わりそうにないな。
さらに絞る。
1)は、44100, 96000 : 16, 24。
2)aplay -Dオプションは、hwとplughw。
3)はS16_LE、S24_LE、4)は44100, 96000。1)の設定に数値を合わせる。
これで、8とおり。
削り過ぎか?、もうちょっと、他の設定もしてみようか、、、以下、結果。
hw |
plughw |
|
front:44.1/16 |
ok |
ok |
front:96/16 |
ok |
ok |
front:44.1/24 |
paused |
ok (format: S24_3LE) |
front:96/24 |
paused |
ok (format: S24_3LE) |
front:44.1/24 |
white noise |
white noise |
front:96/24 |
white noise |
white noise |
front:192/24 |
paused |
ok (format: S24_3LE rate: 96000) |
front:192/32 |
paused |
?ok? loud? |
front:176.4/24 |
paused |
?ok? |
front:176.4/24 |
paused |
?ok? |
こんなところかなあ、、、、
やはり、aplay -Dオプションで「hw:0,0」を設定すると、ファイルフォーマットをきちんと合わせないと音が出ない。
2496ut1の場合、24bitのフォーマットの扱いが難しい。
Back-endで「S24_3LE」と設定したら、正確な設定のはずなのに、ノイズで音声が聞けなくなる。むしろ「S24_LE」に設定した方が、「plughw」で問題なく音声を鳴らせる分、随分ましだということになる。これは10年ほど前にも問題視されていた事らしくて、alsaはS24_3LEを扱えないという話がネット上に残っているようだ。最近の機械はS32_LEをサポートしている機種がほとんどのようで、こうした問題はなくなったらしい。
入力が176.4kHzや192kHzのフォーマットでも、plughwで設定したら音を出すことができるのには、正直驚いた。
ただ、ダウンサンプリングされてしまうけど。
といっても、dmixがインストールされていないからだと思うけど、48kHzにはならない。
176.4kHzは2分の1の88.2kHzになるのかと思ったら、96kHzにダウンサンプリングされた。そのせいかどうか分からないけど、高音がきつくうるさい感じに聴こえた。同じダウンサンプリングされるのでも、192kHzからのほうが聴きやすく自然な感触に感じた。192/32で音が大きくなるのは、理由がわからない。
本当は、S32_LEをサポートしている新しいDACだとどうなのか、確認したほうがいいんだろうけど、息切れ気味。
このぐらいにしておこうと思う。
wikieditish message: Ready to edit this entry.
A quick preview will be rendered here when you click "Preview" button.