Armadilloフォーラム

Armadillo-640 USBオーディオを長時間使用で遅延する

bobchin

2022年10月27日 7時48分

いつもお世話になっております。
市橋ともうします。

Armadillo 640 にてUSBオーディオアダプタを使用し、
ヘッドセットを接続して会話をしたいと考えています。

https://armadillo.atmark-techno.com/blog/615/4086
上記を参考にしてカーネルをビルドしてUSBオーディオが使用できることを確認しました。
USBオーディオアダプタは、エレコムのUSB-AADC02BKを使用しています。

arecord -D plughw:0,0 -f S16_LE -r 44100 -c 1 | aplay -f S16_LE -r 44100 -c 1

テストとして上記のようにマイク音声をヘッドホンで聞くようにしました。
数ミリ秒ほど遅延して聞こえますが、許容範囲のため問題ないと思っていましたが、
この状態を数時間続けていると遅延が数秒ほどまで拡大してしまいます。

以下arecordの引数で試してみましたが回避できませんでした。
・ -Mオプション追加
・ -Bオプションで0~1000000まで
・ -tオプションでwav, raw
・ -cオプションで 1 or 2
・ -rオプションで44100, 16000
・ --period-size=0
・ --buffer-size=0

また、USBオーディオアダプタを違うものに変えても回避できませんでした。
他に見るところがあるでしょうか?何か情報があればと思います。

コメント

佐藤です。

> また、USBオーディオアダプタを違うものに変えても回避できませんでした。
> 他に見るところがあるでしょうか?何か情報があればと思います。
aplay/arecord共に、 -N, --nonblock オプションを付けてみるどどうでしょうか。
(おそらく遅延はユーザランド側で発生しているのでもしかしたら効果ないかもしれません。)

> ・ --period-size=0
> ・ --buffer-size=0
また、上記の引数は、arecord の方だけに付けてみたのでしょうか。
そうであれば、aplay の方にも付けてみてください。

市橋です。

佐藤様ご返信ありがとうございます。

> aplay/arecord共に、 -N, --nonblock オプションを付けてみるどどうでしょうか。
> (おそらく遅延はユーザランド側で発生しているのでもしかしたら効果ないかもしれません。)

-Nオプションも試してみましたが回避できませんでした。

> > ・ --period-size=0
> > ・ --buffer-size=0
> また、上記の引数は、arecord の方だけに付けてみたのでしょうか。
> そうであれば、aplay の方にも付けてみてください。

arecord側だけでしたので、aplay側にも付けてみましたが、
遅延の回避はできませんでした。

以上よろしくお願いいたします。

佐藤です。

以下のカーネルコンフィグを有効にしたカーネルイメージを作成してA640に入れるとどうでしょうか。

[ATDE ~/linux-v4.14-at[version]]$ make ARCH=arm armadillo-640_defconfig
[ATDE ~/linux-v4.14-at[version]]$ make ARCH=arm menuconfig
Device Drivers  --->
  [*] Sound card support  --->
    [*]   Advanced Linux Sound Architecture  --->
      [*]   Generic sound devices  ---> 
        [*]   Generic loopback driver (PCM)  <-- スペースキーを押して有効[*]にする

カーネルのビルド方法と書き換え方法については以下を参照してください。
https://manual.atmark-techno.com/armadillo-640/armadillo-640_product_ma…
https://manual.atmark-techno.com/armadillo-640/armadillo-640_product_ma…

市橋です。

佐藤様、情報ありがとうございます。
カーネルイメージを作成して試してみたところ、無事遅延が回避できました。

カーネルの変更によりループバックデバイスが追加されたため、
USBサウンドカードの番号が変わったため以下のように変更して試しました。

arecord -D plughw:1,0 -f S16_LE -r 44100 -c 1 | aplay -D plughw:1,0 -f S16_LE -r 44100 -c 1

佐藤です。

もし、arecord/aplay を使用することに特にこだわりがないのであれば、
以下のように gstreamer を使用する方法もあります。

[armadillo]# apt install pulseaudio gstreamer1.0-pulseaudio gstreamer1.0-plugins-bad \
libgstreamer-plugins-bad1.0-0 gstreamer1.0-plugins-base libgstreamer-plugins-base1.0-0 \
gstreamer1.0-plugins-good libgstreamer1.0-0 gstreamer1.0-tools
 
[armadillo]# pulseaudio --start --exit-idle-time=-1
 
[armadillo]# gst-launch-1.0 pulsesrc ! autoaudiosink

これであれば、カーネルのループバックを有効にしなくても遅延なく聞こえると思います。