[Armadillo:09147] Armadillo800EVAでの音声ストリーミング再生がすぐに止まります

Takeshi Inoue email@hidden
2013年 8月 28日 (水) 22:32:41 JST


井上と申します。

Armadillo800EVAにUSB Bluetoothドングルを指し、
Android携帯の音楽を、BluetoothのA2DPにてArmadilloを
経由して再生させようとしていますが、音がすぐ途切れます。

どうも、fsi-wm8978のサウンドドライバに問題がある可能性が
あるのではと考えています。

●確認できていること

カーネルはat2 (+マルチメディア評価パッケージ)ベースで
Bluetooth周りを有効にし、

1) hciconfig で、Bluetooth USBドングルの認識を確認
2) bluetooth-agentを起動してAndorid携帯(Galaxy Nexus)とのペアリングを確認

また、pulseaudioを使用し
3) parec --device="bluetooth device name" > audio.dat
 で、Android携帯側のミュージックプレイヤーで再生した音声をファイルに録音
4) aplay -f cd -V mono audio.dat にて、上記録音データのArmadilloでの再生を確認
(30秒程度録音して確認)

 以上より、単体レベルでの動作は確認できています。

●問題

上記3)4)をパイプでつなげて
parec --device="bt device name" | aplay -f cd -V mono
を実行すると、1〜2秒で再生が停止し、しばらくして
aplay: pcm_write:1609: write error: Input/output error
のエラーが出ます。

●確認したこと

a) alsa-utilsのaplay.cを修正し、libalsaのsnd_pcm_writei()を呼び出している部分に
 printfを仕込んで動作を確認したところ、

 耳に聞こえるレベルでの音声停止が発生
 -> snd_pcm_writei()で2KB単位の音声データ書き込みはその後も数回正常終了
 -> snd_pcm_writei()がブロックされる
   -> 数秒して-5 (-EIO)が返される。

 という状況でした。EIOを返すまではsnd_pcm_writei()は全て正常終了です。

b) また、aplayに-Nオプションを追加して、non blocking modeでも
 試してみましたが、この場合はEIOの代わりにEAGAINが返され続ける状況です。

c) parec --device="bt device name" | aplay -f cd -V mono -r 24000
 と、aplayの再生レートだけを試しに無理やり半分にしてみたのですが
 (もちろん)再生速度は半分になるものの途中で止まらず再生が続きます。

d) aplayで再生に指定するデバイスを、HDMI側にしてみたところ
 止まらずに再生できています(ただし、当方の環境では、モニタ側が
 HDMI信号を認識せず、実際に音が出るかは確認できていません。
 aplayの-V monoオプションで再生レベルをリアルタイム表示させて
 動作確認しています)。
 また、再生デバイスをnullデバイスにした場合も正常です。

c)alsa周りのソースを目視でちょっとだけ追ってみましたが、
 sound/core/pcm_lib.c: snd_pcm_lib_write1()中の
 snd_pcm_playback_avail()でバッファ空きを待っているのが
   タイムアウトすると、a)で見られたようにEIOのエラーコードを返すようです。

以上から、fsi-wm8978のサウンドドライバに何らかの問題
(上記 cから考えると、underrunが起きた場合の処理?)がある
 可能性を考えていますがいかがでしょうか。



armadillo メーリングリストの案内