AudioTrackは同期再生する。非同期再生はthread実装で実現しましょう。

お題の通り、
AudioTrackでplay() すると同期再生されます。
つまり、1秒の再生データがあった場合に、
一秒以内に連続でボタンは3回押したら、
3秒かかってしまいます。一つ目ながして、はい、次の奴流して、はい、最後のひとーつ、、、。

実現したいのは、再生中のデータがあっっても、次に再生要求が来たら、再生中のデータをすっ飛ばして、次の再生要求のデータを流す。

マリオで言うと、連続で頭上のはてなブロックを叩くイメージ。


AudioTrack初期化引数でMODE_STATICを指定して、reloadStaticDataを使って、4時間程、試行錯誤していたが、結局実現できなかった。AudioTrack.MODE_STREAMに変更したところ、やっと、連続再生が実現できた。(ところどころ、音はスムーズではないのだが、、)

public void play(){
//PlaySequencer ps = new PlaySequencer(this);
//ps.start();


(new Thread(new Runnable(){
@Override
public void run(){

if(KomaSound.this.hasplayedOnce == false){
KomaSound.this.mTrack.write(KomaSound.this.mWavBytes, 0, KomaSound.this.mWavBytes.length);
KomaSound.this.mTrack.play();
KomaSound.this.mTrack.stop();

KomaSound.this.hasplayedOnce = true;
}
else{
KomaSound.this.mTrack.flush();
//KomaSound.this.mTrack.reloadStaticData();
KomaSound.this.mTrack.write(KomaSound.this.mWavBytes, 0, KomaSound.this.mWavBytes.length);
KomaSound.this.mTrack.play();
KomaSound.this.mTrack.stop();

}

}
})).start();

}