Translate

BTemplates.com

Powered by Blogger.

2017年9月10日日曜日

2017-09-09 到達点メモ


知恵を絞れば案外何とかなるものだなぁ。
昨日言っていたASUS ZenPad 7.0のAndroid5.0.2で音声ファイルがロードできない時があるという問題は対処することができた。

割と力業ではあるが要するに
ロードを失敗したファイルをロードできるまで
ロードすればいいだけの話である。
具体的には以下のように実装した

        soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
            @Override
            public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
                Log.d(TAG,"sampleId = "+sampleId);
                Log.d(TAG,"status   = "+status);
                if(status != 0){
                    Log.d(TAG,"failed_reload");
                    int failed_number = 1;
                    failed_number = soundPool.play(woman_voice, 0 ,0, 1, 0,(float)2.0);
                    if(failed_number == 0){
                        soundPool.unload(woman_voice);
                        woman_voice = soundPool.load(l_context, R.raw.woman_voice_short_c, 1);
                    }
                    failed_number = soundPool.play(man_voice, 0 ,0, 1, 0,(float)2.0);
                    if(failed_number == 0){
                        soundPool.unload(man_voice);
                        man_voice = soundPool.load(l_context, R.raw.man_voice_short_c, 1);
                    }
                    failed_number = soundPool.play(clock_alarm, 0 ,0, 1, 0,(float)2.0);
                    if(failed_number == 0){
                        soundPool.unload(clock_alarm);
                        clock_alarm = soundPool.load(l_context, R.raw.clock_alarmdig_short, 1);
                    }
                    //sampleIDは、unloadしても数は減らないので
                    //sampleIDが30になったら、全部で10回は試行して失敗しているので
                    //そのときはもうアプリを終了させて再度立ち上げたほうが良い
                    if(sampleId > 30){
                        Toast.makeText(l_context,R.string.message_when_audio_file_loading_failed,Toast.LENGTH_SHORT);
                        MainActivity.getInstace().finishAndRemoveTask();
                    }


                }
            }
        });

コードに大体書いてあるのだが
sampleIDは事実上ロードした回数を指しているので
これをもとにピンポイントにロードすることができない。
その為、失敗したファイルのみをピンポイントで音声を再生する為には
別の工夫が必要である。
具体的には公式ドキュメントに音声再生できない場合は値が0で返ってくるので
再生できなかったファイルをunloadしてもう一度再生しなおせばよい。

公式ドキュメントを見てもonLoadCompleteのstatusについては、0が成功ぐらいしか
書いていないので何もわからないのだが、誰か-22の意味を知っている人はいないだろうか?

サンプル数は10も満たないので正確ではないが
自分がテストした限りでは、もう一度ロードすれば大体読み込めて
ロード失敗は多くても二回だけだった。

今日はこれを作ってほぼ満足したので今日はこれまで。

0 コメント:

コメントを投稿