ALSA にまだ苦労している

Raspberry PiBehringer 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
>>>