Thursday, May 22, 2014

Equalizerをもつ位置について

長いこと問題として認識しつつも放置していたEqualizer使用時の問題について。
問題をまず整理しておくと、

MediaPlayerを管理するServiceと、それにEqualizerの設定を変更する為、Equalizerを別にもつActivityクラス。

EqualizerはMediaPlayerにAttachする必要があるため、MediaPlayerのAudioSessionIDが必要になる。

最初の実装では、ServiceからAIDLによってMediaPlayerのAudioSessionIDを取得し、Activity側が保持するEqualizerにAttachをしていた。
このとき、優先度を上げるためPriorityをService側が保持するEqualizerよりも高くすることで一旦はうまく動作するようなった、ようにみえていた。
しかし、テストでActivity側で設定したEqualizerをsetEnabledでTrue,Falseを繰り返し行うと、稀に落ちる不具合が発生することに気づく。

当初この問題は、Equalizerのノイズに関連する問題なのではと思っていたため、原因の追求は後回しにし、まずはノイズ対策をしていたのだが、ノイズ対策をした後にもこの問題が残っているため。この問題は関連性のないものだと再認識することになった。

昨日の時点で、とりあえず問題をややこしくしているEqualizerをServiceとActivityで別々のものを使うという点に着目し、これを一旦やめて、Service側でもつEqualizerだけにし、Activity側はEqualizerの状態をAIDL経由で取得する方法に変更してみた。

結果、落ちる不具合はかなり改善された、通常使いではほとんど落ちることはないと思われる。
しかし、やはり落ちた。
setEnabledで繰り返しTrue,Falseの切り替えを行い、その後曲の切り替えを行うと落ちる症状が確認された。
狙ってテストをするとかなりの確度で発生する。
この落ちたときに出力されるログは、修正前のログと酷似しているためおそらくこの問題にはEqualizerが関連していると考えられる。

この問題を考察すると、曲の切り替え処理に問題があるのではと考えらえる。
現在の実装では曲の切り替え時にMediaPlayerを一旦破棄し、再生成をしている。
このときAudioSessionIDが新しく生成されるので、ひょっとしたらこれが問題なのかもしれない。
AudioSessionIDが再生成されないように、工夫してみようとおもう。
そうなると、この修正の前に行ったEqualizerのもつ位置の変更はあまり関係がなかったのかもしれない。
一旦この修正を行い落ち着いたら、再度EqualizerをActivity側に移動してみようとおもう。








No comments:

Post a Comment