昨日の続き。
カメラアプリが起動しないので、その調査。
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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。