[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 メーリングリストの案内