2012-07-11 11 views
5

私は短い音を再生するために必要なAndroidゲームを持っています。 SoundPooldual 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用のサンプルコードが大好きです。

答えて

1

Googleの営業時間内にこの質問をしました。彼らは、AudioTrackはSoundPoolと同じバグを持っていると言いました。この問題を解決する唯一の方法は、ネイティブメディアプレーヤーを作成することです。しかし、この問題は、ジンジャーブレッドを実行しているデュアルコアの携帯電話に影響するように見えるだけです。

関連する問題