ALSA にまだ苦労している
Raspberry Pi に Behringer UCA202 を繋いでいるのですが、なぜか 48kHz サンプリングしか動かない。あ、もちろん --disable-resample ですよ。
デバイスがどんな機能を持っているかは、こうやって調べられるらしい。
$ cat /proc/asound/card1/stream0 (略) Capture: Status: Stop Interface 2 Altset 1 Format: S16_LE Channels: 2 Endpoint: 4 IN (ASYNC) Rates: 48000 Interface 2 Altset 2 Format: S16_LE Channels: 1 Endpoint: 4 IN (ASYNC) Rates: 48000 Interface 2 Altset 3 Format: S16_LE Channels: 2 Endpoint: 4 IN (ASYNC) Rates: 44100 Interface 2 Altset 4 Format: S16_LE Channels: 1 Endpoint: 4 IN (ASYNC) Rates: 44100
なんかいろいろサポートしているっぽいんですけど。(ハード的にはデータシートを見れば分かるけど)
どうして、arecord で指定できない!?
少し進展
arecord -D default ではダメだけど、-D hw:1,0 と指定すると、サンプルレートを正しく指定できることが分かった。16kHz サンプリングもオーケー。
このサイト (http://www.alsa-project.org/main/index.php/Asoundrc) を見て、いままで .asoundrc を
defaults.ctl.card 1 defaults.pcm.card 1 defaults.timer.card 1
と書いていたのを、
pcm.!default { type hw card 1 } ctl.!default { type hw card 1 }
にしたら、-D default でもオーケーのようだ。むずかし。
とりあえず、これで 16kHz サンプリングは動くようになりました。48kHz は別の理由でダメっぽい。
参考: USB Audio setting sample rate broken · Issue #197 · raspberrypi/firmware · GitHub
ま、サンプリングレートが指定できるなら 48kHz である必要性は低い(いままでのツールが 48kHz 前提で書かれていただけ)ので、なんとかなるかな。
なんかレートが正確でないように見える
まずは arecord で 1000秒キャプチャしてみた。誤差は、140ppm (1.4 x 10^2 ppm) 程度に収まっているように見える。これは、自作ツールの ALSA の設定上の問題かも知れない。
yokoyama@raspberrypi(10:12:31)[1]:~/beacon/alsa/alsa-utils-1.0.25/aplay$ python Python 2.7.3 (default, Mar 18 2014, 05:13:23) [GCC 4.6.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> 1406596351.167512976-1406595350.967889392 1000.1996235847473 >>> _-0.06 1000.1396235847474 >>> _/1000*1e6 1000139.6235847473 >>> _-1e6 139.62358474731445 >>>