AndEngine MusicクラスでException

BGMを追加しようと思って org.andengine.audio.music.Music を使ってみたんですがこいつが曲者!! 事あるごとにExceptionが発生します。
ソースを見てみると、単純にMediaPlayerクラスをラップしているようなので、コイツはMediaPlayerクラスだと思う必要があります。MediaPlayerクラスはすごくシビアで、クラス内部の状態遷移を意識してメソッドを実行しないといないと即Exception発生です。
ここに詳しいことが解説してあります → Androidアプリでマルチメディアを扱うための基礎知識 

たとえばBGMを 再生、停止、再生 の順番で再生したいとします。何も考えずに普通にメソッド名で判断して実装すると以下のようになると思います。

BGM.play();

BGM.stop();

BGM.play();

でもこの場合最後のBGM.play()で例外が発生します(上記リンクの2ページ目の状態遷移図を見ると分かると思います )。一度stop()を実行すると、prepare()などを実行して再生可能状態に戻す必要があるからです。じゃぁstop()したらセットでprepare()すればいいかというとあんまりよくない。prepare()が結構遅いのです。ゲームとして使うには終わってます。

で、状態遷移図を良く見てみると、pause()を実行してもstop状態にはならずに再生を停止させることが分かります。これを利用することで遅さを解決できます。

BGM.play();

BGM.pause();

BGM.seekTo(0);

BGM.play();

一時停止をしてポインタを先頭に戻して再生を再開すればいいわけです。