2011-05-10 17 views
10

Estoy creando un juego en Android y he solucionado este problema por un tiempo, y ahora estoy volviendo a él. En mi juego tengo un ritmo de fondo, disparos, explosiones ... etc. y necesito poder jugarlos simultáneamente. En este momento, cuando llamo a jugar en la clase SoundPool, el sonido que se reproduce se interrumpe y el nuevo comienza a reproducirse. Mi clase SoundManager está abajo, así como el uso. Cualquier ayuda sería muy apreciada ya que este es realmente mi primer juego donde he necesitado muchos efectos de sonido. ¡Gracias!Reproducción de sonidos simultáneamente Android

public class SoundManager { 
private SoundPool mSoundPool; 
private HashMap<Integer, Integer> mSoundPoolMap; 
private AudioManager mAudioManager; 
private Context mContext; 

public SoundManager(Context theContext) { 
    mContext = theContext; 
    mSoundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 0); 
    mSoundPoolMap = new HashMap<Integer, Integer>(); 
    mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); 
} 

public void addSound(int index, int SoundID) { 
    mSoundPoolMap.put(index, mSoundPool.load(mContext, SoundID, 1)); 
} 

public void playSound(int index) { 
    float streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_RING); 
    streamVolume = streamVolume/mAudioManager.getStreamMaxVolume(AudioManager.STREAM_RING); 

    mSoundPool.play((Integer) mSoundPoolMap.get(index), streamVolume, streamVolume, 1, 0, 1f); 
} 

public void playLoopedSound(int index) { 
    float streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
    streamVolume = streamVolume/mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); 

    mSoundPool.play((Integer) mSoundPoolMap.get(index), streamVolume, streamVolume, 1, -1, 1f); 
} 
} 

... y aquí hay un ejemplo de cómo uso la clase.

SoundManager sm = new SoundManager(this); 
sm.addSound(0, R.raw.explosion); 
sm.playSound(0); 

... Así que con este estilo agrego todos mis sonidos a la soundpool de la carga y luego sobre la base de la entrada del usuario sólo quiero reproducir el sonido. ¿Esto parece correcto? ¿O debería tratar de hacerlo de otra manera?

Respuesta

15

Bueno, terminé averiguando esto en caso de que alguien más quiera saberlo. El problema no era que no podía reproducir más de un sonido a la vez, sino que solo podía reproducir 4 sonidos al mismo tiempo, lo que me daba la impresión de que los sonidos se detenían y comenzaban. En el constructor de esta línea

mSoundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 0);

necesitaba ser cambiado para permitir que más corrientes para jugar al mismo tiempo. Así que al cambiar el primer argumento de un 4 a decir, un 20, podría tocar 20 sonidos al mismo tiempo. El juego suena mucho mejor ahora jaja. Espero que esto ayude a alguien.

+1

¡Es bueno saber que no olvides aceptar tu propia respuesta! – schwiz

+0

¡gracias por recordarme! – DRiFTy

+0

¿Puedo preguntar cuáles son sus motivos para usar STREAM_MUSIC y STREAM_RING en su código? ¿Es este un caso de uso especial? – Salx

Cuestiones relacionadas