2012-07-11 7 views
5

Tengo un juego de Android que necesito para reproducir sonidos cortos. SoundPool bloqueos en dual core phones, Mediaplayer tiene hasta 200 ms + retrasos, OpenSL requiere SDK 9+ (apoyo 1.5). Entonces eso deja AudioTrack.¿Cuál es la forma correcta de usar AudioTrack en modo estático?

Esto es lo que he intentado. Creo los objetos de AudioTrack como este.

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); 
} 

continuación, se crea un ejecutable para cada sonido en el juego (aproximadamente 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(); 
    } 

} 

Luego, cuando necesito reproducir el sonido, lo envío a un ThreadPool.

private void playSound(final int soundToPlay) { 
    final SoundRunnable soundRunnable = mediaPlayers.get(soundToPlay); 
    if(soundRunnable != null){ 
     threadPool.execute(soundRunnable); 
    } 
} 

El principal problema que tengo es que los sonidos se reproducen dos veces la primera vez que ejecuto el ejecutable. Después de eso, de vez en cuando todavía podría obtener un sonido doble, pero funciona bastante bien.

También he experimentado con la creación de un solo AudioTrack en modo de transmisión y la escritura de audio sin procesar de los ejecutables. Esto fue un tanto exitoso, pero era difícil saber cuándo detener la reproducción. Me detengo temprano, el sonido se interrumpe demasiado tarde y obtienes un error de obtención de errores y la aplicación se bloquea. También es difícil tocar dos sonidos al mismo tiempo (podría usar un grupo de AudioTracks).

Me encantaría ver un código de muestra para AudioTrack que no implique la transmisión de audio.

Respuesta

1

Hice esta pregunta durante el horario de oficina de Google. Dijeron que AudioTrack tiene el mismo error que SoundPool. La única solución a este problema es escribir un reproductor multimedia nativo. Aunque, este problema solo parece afectar a los teléfonos Dual Core con Gingerbread.

Cuestiones relacionadas