私は短い音を再生するために必要なAndroidゲームを持っています。 SoundPoolがdual core phonesでクラッシュし、Mediaplayerの遅延が最大200ms +あり、OpenSLにSDK 9+が必要です(1.5がサポートされています)。だからその葉はAudioTrackです。静的モードでAudioTrackを使用する適切な方法は何ですか?
これは私が試みたものです。このようなAudioTrackオブジェクトを作成します。
protected AudioTrack createAudioTrack() {
final int trackSize = 17408;
return new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT, trackSize, AudioTrack.MODE_STATIC);
}
次に、ゲームサウンド(約8)ごとに実行可能ファイルを作成します。
private static class SoundRunnable implements Runnable {
private final AudioTrack sound;
private final byte[] rawAudio;
public SoundRunnable(final AudioTrack sound, final byte[] rawAudio){
this.sound = sound;
this.rawAudio = rawAudio;
sound.write(rawAudio, 0, rawAudio.length);
}
@Override
public void run() {
playSound();
}
private synchronized void playSound() {
switch (sound.getPlayState()) {
case AudioTrack.PLAYSTATE_PAUSED:
sound.stop();
sound.reloadStaticData();
sound.play();
break;
case AudioTrack.PLAYSTATE_PLAYING:
sound.stop();
sound.reloadStaticData();
sound.play();
break;
case AudioTrack.PLAYSTATE_STOPPED:
sound.reloadStaticData();
sound.play();
break;
default:
break;
}
}
public synchronized void release() {
sound.release();
}
}
次に、サウンドを再生する必要があるときに、スレッドプールに送信します。
private void playSound(final int soundToPlay) {
final SoundRunnable soundRunnable = mediaPlayers.get(soundToPlay);
if(soundRunnable != null){
threadPool.execute(soundRunnable);
}
}
私が持っている主な問題は、実行音を初めて実行するときに音が2回再生されることです。その後も、たまには二重の音が聞こえるかもしれませんが、かなりうまく機能します。
私は、ストリーミングモードでAudioTrackを1つ作成し、実行ファイルから生のオーディオを書き込むことも実験しました。これはやや成功しましたが、いつ再生を止めるのかを知ることは困難でした。私はあなたが早く停止する音が短く、遅すぎるとgetBufferエラーが発生し、アプリケーションがロックアップします。同時に2つのサウンドを同時に再生するのは難しい(AudioTrackのプールを使用する可能性がある)。
オーディオをストリーミングしないAudioTrack用のサンプルコードが大好きです。