2012-07-11 20 views
5

Ben kısa sesleri oynatmak için gereken bir Android oyunu var. dual core phones üzerinde SoundPool çöküyor, Mediaplayer en çok 200ms + gecikme var, OpenSL SDK 9+ gerektirir (1.5 desteği). Böylece AudioTrack bırakır.AudioTrack'ı statik modda kullanmanın uygun yolu nedir?

Denediğim şey budur. AudioTrack nesnelerini böyle yapıyorum.

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

Oyun seslerinde her biri için bir runable oluşturabilirim (yaklaşık 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(); 
    } 

} 

Ses çalmaya ihtiyacım olduğunda, onu bir ThreadPool'a gönderiyorum.

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

Ben ana konu sesleri ben çalıştırılabilir yürütme iki kez ilk kez oynayacak olması. Bundan sonra her seferinde bir çift ses elde edebilirim ama oldukça iyi çalışıyor.

Ayrıca, akış modunda tek bir AudioTrack oluşturmayı ve runable'lardan ham ses yazmayı denedim. Bu biraz başarılıydı, ama oyunu ne zaman durdurduğunu bilmek zordu. Sesi erken keserim, ses çok kısa kesilir, çok geç olur ve bir GetBuffer hatası alırsınız ve uygulama kilitlenir. Aynı anda iki ses çalmak da zordur (AudioTracks havuzunu kullanabilir).

AudioTrack için ses akışı içermeyen örnek kodları görmeyi çok isterim.

cevap

1

Bu soruyu Google çalışma saatleri sırasında sordum. AudioTrack'in SoundPool ile aynı hataya sahip olduğunu söylediler. Bu soruna yönelik tek çözüm, bir yerel medya oynatıcı yazmaktır. Bununla birlikte, bu sorun sadece Gingerbread çalışan Çift Çekirdekli telefonları etkiliyor gibi görünüyor.

İlgili konular