無病呻吟

わたしはこの綵衣を纏い、この筋斗の戯を献じ、この太平を楽しんでいれば不足のない侏儒でございます。

Android MediaPlayerでのエラーにつきまして

背景

リアルタイムで音声を流すため、大量のMediaPlayer対象を初期化して、 prepare()を呼びます。Map<String, MediaPlayer> mediaMapで管理してます。

会ったエラー

  • 症状1: prepareが問題ないが、ある数の音声を流したら、これ以上流せない。
    • 発生する端末
      • AU ISW11F(2.3.5)
    • ロブ: E/MediaPlayer(xxxx): Error (-19,0)
    • 分析: 流してからrelease()しないと、メモリーが無くなる
    • 解決策: 流した後、リリースして、再初期化してみます。
      mp1 = MediaPlayer.create(sound.this, R.raw.pan1);
      mp1.start();
      mp1.setOnCompletionListener(new OnCompletionListener() {
          public void onCompletion(MediaPlayer mp) {
              mp.release();
              mp = MediaPlayer.create();
          };
      });
  • 症状2: prepare()している時、7個しかinitできません
    • 発生する端末
      • SC-02B(2.3.3)
      • IS05(2.2.1)
      • F-10D(4.0.3) ※約20個しかinit出来ません
    • ロブ: error (1, -17) / error (1, -2147483648)
    • 分析: 同時prepareしている数に制限があります
    • 解決策: 必要な音声が生成されてない場合、任意のMap内のインスタンスを 削除して、新たにロードします。

反省

SoundPoolを利用したほうがいいかもしれません。

MediaPlayerエラー一覧

https://github.com/android/platform_external_opencore/blob/master/pvmi/pvmf/include/pvmf_return_codes.h