Sunday, August 10, 2014

Dropboxを再生してたら5秒ぐらいして、勝手に次にいくバグの原因はこれじゃないかな?

以前、JUST PLAYERのユーザからDropboxを使って再生をしているとき、いろいろ操作をすると5秒ぐらいしたら勝手に次の曲にくようになって一旦そうなると全部そうなるという報告がありました。
この現象は僕のところでは再現していなかったので、なんなんだろうとおもっていたのですが、Boxnetで長時間再生テストをしていたら、たまに上記のような現象が発生していたので調べて修正をしてみました。
原因は、エラーで次の曲のバッファリングが終了すると、本来飛んでこないはずのOnCompletionに飛んでくる場合がある。というもの。
ソースコードが複雑になってきているため、NextPlayerにOmCompletionを設定していないはずなのに、飛んでくるってことはどこかまずいところがあるんだろうなぁ。。。
あと、プロバイダによっては、同時に張れるセッション数が決まってる場合があるよう、たとえば、GoogleDriveだと同時に2セッションあるとエラーになる。
DropboxやBoxnetではあんまりきにならなかったんだけど、、画像とかもサーバー経由でとったりしているので、それらも含めると数セッション発生したりするんだとおもう、そんでエラーになるみたい。
Dropboxでなにか操作をすると次の曲へ行っちゃうってのは、画像の取得でセッションが増えて切れちゃうからなんじゃないかとおもう。
そんなこんなで、errorがでてもちゃんと処理をするようにOnCompletionを修正しました。
すでに、お家芸になりつつあるOnCompletion処理をご覧ください。

        public void onCompletion(MediaPlayer mediaPlayer) {
            LogUtil.d(TAG, "onCompletion");
            //これ現在再生中のMediaPlayerがonCompletionになった事を想定しているんだけど、
            //NextPlayerがたまにきて、勝手に次の曲へ移動しちゃう事があるようなので
            //ちゃんとチェックしましようよ。ってことでいれた。
            //でも本来、Secondsがくるのおかしい設計のはず、どこが悪さしてんのかちゃんと調べましょう。
            if(!mCurrentMediaPlayer.equals(mediaPlayer)){
                return;
            }
            if (mRepeatMode == REPEATMODE_ONE) {
                mMediaPlayer.seekTo((int) mCurrentMediaPlayer.getTrack().getPosition());
                startSchedule();
            } else {
                if (mNextMediaPlayer != null && mNextMediaPlayer.getTrack() != null) {
                    if (mTimer != null) {
                        mTimer.cancel();
                    }
                    mCurrentMediaPlayer.replace(mNextMediaPlayer);
                    LogUtil.d(TAG, "mCurrentMediaPlayer.mPrepared:" + mCurrentMediaPlayer.mPrepared);
                    if (mCurrentMediaPlayer.mPrepared) {
                        mMediaPlayerService.onStartMediaPlayer(mCurrentMediaPlayer.getTrack());
                        mCurrentMediaPlayer.start();
                        startSchedule();
                    }else if(mCurrentMediaPlayer.hasError()){
                        //エラーによって停止しているはず、再度スタートしたほうがよい。
                        play();
                        return;
                    }
                    //再生中フラグを設定
                    setPlaying(mCurrentMediaPlayer.getTrack(), 0);
                    setNextTrack(mCurrentMediaPlayer.getTrack());
                } else {
                    setPlaying(mCurrentMediaPlayer.getTrack(), 1);
                    mCurrentMediaPlayer.reset();
                    if (mPlayOrderHelper.isReadyStart(mMediaPlayerService)) {
                        next();
                    } else {
                        if (mRepeatMode == REPEATMODE_ALL) {
                            play();
                        } else {
                            stop();
                        }
                    }
                }
            }
        }

プログラムが難解になりつつあるので、処理の見直しが必要です、、
ひとまず、上記のプログラムで5秒で次の曲へいっちゃう不具合が治ったようなので、同様の問題で困っている
方はこちらのAPKをお試しください。

https://bitbucket.org/yokmama/just-player/downloads/JUSTPLAYER3_v4.0_2071900010.apk

追記、、ビルドバージョンのナンバリングに間違いがありました。
正しくは 2071900010 が最新
どうりでベータテストのAPKが更新されないわけだ、、
次の修正からは、2071900011からになります。

追記の追記:あと、Range指定の再生がちゃんと鳴るようになってた。Dropbox調べ。
もし、手元に30分ぐらいの曲がある場合は次のようなファイルを作成し同一フォルダに置いてみてください。
拡張子は .index で
長い曲を頭出しできるように、別々のタイトルとしてリスト表示してくれます。
最新のバージョンでは、まだキャッシュ化されてない曲でもちゃんと頭出ししてくれました。
ちなみに、下記ファイルの書き方ですが、、製品版をリリースするときにきちんとフォーマットを公開する予定です。なので、いまのところは下記のデータをみてなんとなくで書いてみていただけると助かります。

PERFORMER "IA"
TITLE "ボーカロイド IA 好きが選んだ個人的メドレー"
FILE "ボーカロイド IA 好きが選んだ個人的メドレー.mp3" MP3
TRACK 01
 TITLE "現実的論理主義者"
 ARTIST "IA"
 INDEX 00:00
TRACK 02
 TITLE "夜咄ディセイブ"
 ARTIST "IA"
 INDEX 04:33
<長いので途中略>

TRACK 12
 TITLE "宵、桜"
 ARTIST "IA"
 INDEX 42:30
TRACK 13
 TITLE "イアイア☆イヤークラッシャー"
 ARTIST "IA"
 INDEX 46:16


No comments:

Post a Comment