mSoundManager.addSound(1,R.raw.dit);
mSoundManager.addSound(1,R.raw.dah);
È necessario modificare la seconda linea a:
mSoundManager.addSound(2,R.raw.dah);
Per poter riprodurre più suoni in una sola volta, in primo luogo è necessario lasciare che il Soundpool sapere che. Nella dichiarazione di SoundPool ho specificato che ho specificato 20 stream. Ho molte pistole e cattivi che fanno rumore nel mio gioco, e ognuno ha un loop sonoro molto breve, < 3000 ms. Notate che quando aggiungo un suono di seguito tengo traccia dell'indice specificato in un vettore chiamato "mAvailibleSounds", in questo modo il mio gioco può provare a riprodurre suoni per oggetti che non esistono e continuano senza andare in crash. Ogni indice in questo caso corrisponde a un id sprite. Solo così capisci come mappare suoni particolari a sprite specifici.
Successivamente accodiamo i suoni, con playSound(). Ogni volta che ciò accade, un SoundId viene inserito in una pila, che viene quindi visualizzata ogni volta che si verifica il timeout. Questo mi consente di uccidere un flusso dopo averlo riprodotto e riutilizzarlo di nuovo. Scelgo 20 stream perché il mio gioco è molto rumoroso. Dopo di che i suoni vengono cancellati, quindi ogni applicazione richiederà un numero magico.
Ho trovato questa fonte here e ho aggiunto la coda di esecuzione & eseguibile.
private SoundPool mSoundPool;
private HashMap<Integer, Integer> mSoundPoolMap;
private AudioManager mAudioManager;
private Context mContext;
private Vector<Integer> mAvailibleSounds = new Vector<Integer>();
private Vector<Integer> mKillSoundQueue = new Vector<Integer>();
private Handler mHandler = new Handler();
public SoundManager(){}
public void initSounds(Context theContext) {
mContext = theContext;
mSoundPool = new SoundPool(20, AudioManager.STREAM_MUSIC, 0);
mSoundPoolMap = new HashMap<Integer, Integer>();
mAudioManager = (AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);
}
public void addSound(int Index, int SoundID)
{
mAvailibleSounds.add(Index);
mSoundPoolMap.put(Index, mSoundPool.load(mContext, SoundID, 1));
}
public void playSound(int index) {
// dont have a sound for this obj, return.
if(mAvailibleSounds.contains(index)){
int streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
int soundId = mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, 0, 1f);
mKillSoundQueue.add(soundId);
// schedule the current sound to stop after set milliseconds
mHandler.postDelayed(new Runnable() {
public void run() {
if(!mKillSoundQueue.isEmpty()){
mSoundPool.stop(mKillSoundQueue.firstElement());
}
}
}, 3000);
}
}
Qual è l'eccezione che causa l'arresto anomalo? Traccia dello stack? –