2011/03/08

ALSA Module not foundとhw_get_module()

昨日の続き。
カメラアプリが起動しないので、その調査。

E/AudioHardwareALSA( 778): ALSA Module not found!!!

omxはどこをたどるとよくわからないので、logcatで最初に出ているこれを見ていこう。


cgrepで探してもいいけど、ALSAでHardwareと書いてあるので、hardwareディレクトリにいってalsaという名前を探すと、alsa_soundがあった。
中にAudioHardwareALSA.cppがあり、見てみると上記のログがあった。

cgrep/jgrepよりも、OESFさんが提供している検索サイトの方が、きっと速い。


さて、話を元に戻そう。

"ALSA Module not found!!!"が出る条件。
それは、ALSAのモジュールが見つからないこと。

・・・

Androidでよく用いられる関数にhw_get_module()がある。
hw_module_tのポインタのアドレスを渡すと、使えるアドレスを返してくれる関数だ。

hw_module_t *module;
err = hw_get_module(ALSA_HARDWARE_MODULE_ID, (hw_module_t const**)&module);

こんな感じ。
hw_module_tはC++の基底クラスみたいなもので、各ハードウェアのI/Fはアドレスを取得した後、それをキャストして自前の構造体として使う。
Cでvirtualっぽいしくみを実現するのによく使う手法だ。


さて、このhw_get_module()。
こんなI/Fだ。

int hw_get_module(const char *id, const struct hw_module_t **module)

ALSA_HARDWARE_MODULE_IDは"alsa"。
つまりhw_get_module()は、"alsa"がわかればhw_module_tを返すことができるのだ。
まず、このプロパティがあるか。

  • ro.hardware
  • ro.product.board
  • ro.board.platform
  • ro.arch

あったら、そっから文字列を引っ張り出して、"/system/lib/hw"か"/vendor/lib/hw"にあるかどうか。
今は"/vendor"って使わなくなったように思うが、これは/deviceに移して、/vendorをそういう意味に使おうとしているだけなのかしら?
歴史を追ってないのでわからん。

それでもなければ、/system/lib/hw/*.default.soがあるかどうか。
それであれば、もういいみたい。

ということは、そこら辺になかったのだろう。


今回は、"alsa.*.so"がほしかったところ。
ないのは、ビルドしてないからか、置き忘れか。。。

こういうところから、少しずつやっていかないかんですな。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。