ユーザの要望でクロスフェード機能を実装してみたのですが、この機能のためいくつか犠牲になっているものがあります。
そのまえにクロスフェードとはどういう機能なのかというと、曲の終わりをフェードアウトし、次の曲のはじまりをフェードインすることを同時に行う機能です。
JUST PLAYERはクロスフェードの設定を有効にすると、曲の終了6秒前にフェードアウト処理にはいり、同時に次の曲をフェードインします。
いまのところ6秒固定になっています。
この数値を変更出来るようすることは可能ですが、いまのところ変更するUIを実装していません。マニアックな機能なので特に必要だとはおもっていませんが、もし要望があれば検討したいです。
実際の実装方法は、2つのMediaPlayerを準備し、片方の時間をチェックし、6秒前にはいったら、次の曲を再生するという単純な方法なのですが、これをつかうことで、一時的ではあってもMediaPlayerのインスタンスを2つ準備しなければなりません。
これは、ギャップレス再生でも必要な処理なのでこれ自体は問題ではないのですが、ギャップレス再生とは異なり、違うボリュームをそれぞれに適用する必要があるためAudioSessionIDを共通化することができなくなります。
つまり、AudioEffectも別々になるというわけです。
この問題は、これまで何度MediaPlayerを作りなおしてもAudioSessionIDを共通化しておけば、AudioEffectは共通でつかえていたものが使えなくなったことになります。
そのおかげで、Equqlizerの処理、Visualizerの処理といったAudioSessionIDをもとにインスタンスを生成していた処理の扱いが面倒になってしまいました。
いろいろ、苦労はあったものの今のところなんとか、うまく動いている状態までもってこれました。(手元の最新版において)
しかし、完璧というわけではなく一部の端末では、MP3ファイルを同時に再生するとStartが実行されない問題がおきています。
具体的にいうと、Nexus5さん。
これは個体差があるのかもしれませんが、2台の端末で同じ現象を確認しています。
簡単なサンプルプログラムを作ってもやはり同じ現象がおきるので、MediaPlayer自体に問題があるのではないかと思っています。
No comments:
Post a Comment