Tuesday, May 27, 2014

Shuffleの実装

Shuffleの実装は意外と難しい。
Equalizerの実装は納得はしてないけど、とりあえずこれ以上掘ってもわからないので一旦ペンディングすることにしてRepeatとShuffleの実装にとりかかることにした。

Repeatはそんなに難しくない、1曲リピートはOnCompleteのときにSeekで0に戻せばいいだけだし、RepeatAllは最終の曲が再生され次の曲がないとき一曲目から再生するようにするだけでよい。
ただ、JUST PLAYER3にはBookmark機能があるのでその分実装が少し複雑になるけども。
まぁ、これはいいとして問題はShuffle。
Shuffleは、ShuffleをOnにしているときに再生順がランダムになるようにする機能だ。
このランダムというのが先読み機能と相性が悪くて、次の曲が何を再生するのかわからないようなShuffleは実装できない。
それに、一度再生された曲が何度もでてくるのもいただけない。
なので、再生済みフラグを設定し、フラグのたっていない曲から次の曲をランダムに選ぶというのが簡単に思いつく実装だとおもう。
前バージョンのJUST PLAYERはこの方法を取り入れていた。
しかし、この方法には欠点があり、プレイリストの数が数千曲もあると、再生後に実行されるシャッフルでもたつきが発生し、折角ギャップレス再生をしていても意味がないものになってしまう。
なので、これをなんとか解決したいと思っていた。
JUST PLAYER3ではそのため、プレイリストの曲順とは別に再生順用の曲順をプレイリストに設定し、シャッフルでそれを一遍に変更することにした。
このシャッフルの設定は曲の登録後に毎回設定することで見かけじょうShuffleされているようにみえるとおもう。
ただ、これでも問題があるとおもう。
Shuffle自体のアルゴリズムだ、既ににあるプレリストに曲を追加した場合、再生中の位置から以降の曲をシャッフルするのが自然だし、まだ一度も再生をしていない状態のプレイリストをShuffleすると一曲目からシャッフルされるべきだし。
数万曲とかのShuffleをしても高速に曲順を設定できるべきだし。
そう考えるとけっこう複雑になってしまう。
実際にShuffleの実装は思った以上に実装ステップ数が多くなってしまったのでバグが潜んでいるのではないかとちょっと心配。

https://bitbucket.org/yokmama/just-player/downloads/JUSTPLAYER3_v1.0_052701.apk






No comments:

Post a Comment