2010-06-14 10 views
8

Tek bir ses yürütürsem iyi çalışır.SoundManager'ı kullanarak birden fazla ses çalma

İkinci bir ses eklemek çökmesine neden olur.

Soruna neden olan bilen var mı? öncelikle SoundPool bildirmek gerekir, bir kerede birden fazla sesleri oynatmak için

mSoundManager.addSound(2,R.raw.dah); 

:

private SoundManager mSoundManager; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.sos); 

    mSoundManager = new SoundManager(); 
    mSoundManager.initSounds(getBaseContext()); 

    mSoundManager.addSound(1,R.raw.dit); 
    mSoundManager.addSound(1,R.raw.dah); 

    Button SoundButton = (Button)findViewById(R.id.SoundButton); 
    SoundButton.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      mSoundManager.playSound(1); 
      mSoundManager.playSound(2); 
     } 
    }); 
} 
+0

Kilitlenmesine neden olan istisna nedir? Yığın izleme? –

cevap

14
mSoundManager.addSound(1,R.raw.dit); 
mSoundManager.addSound(1,R.raw.dah); 

Sen ikinci satırı değiştirmeniz gerekir. SoundPool bildiriminin 20 akışını belirttiğime dair beyanında. Oyunumda çok fazla silah ve kötü adam var ve her biri çok kısa bir ses döngüsüne sahip, < 3000ms. Aşağıda bir ses eklediğimde, "mAvailibleSounds" isimli bir vektörde belirtilen indeksi takip ettiğime dikkat edin, bu şekilde oyunum var olmayan ve çökmeden devam eden öğeler için sesleri deneyebilir ve çalabilir. Bu durumda her bir Endeks bir sprite kimliğine karşılık gelir. Sadece belirli sesleri belirli spritelarla nasıl eşleştirdiğimi anlıyorsunuz.

Sonraki playSound() ile sesleri sıraya koyarız. Her seferinde bu bir soundId bir yığınının içine düşer, bu da zaman aşımım her ne zaman olursa olsun açılır. Bu, oynatıldıktan sonra bir akışı durdurmamı ve tekrar kullanmamı sağlar. 20 akış seçiyorum çünkü oyunum çok gürültülü. Bundan sonra sesler yıkanır, böylece her uygulama bir sihirli numara gerektirecektir.

Bu kaynak here bulundu ve runnable & kill kuyruğunu kendim ekledim.

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

Bu yaklaşımın bazen mikro gecikmelere neden olduğunu fark ettim. Birbiri ardına kısa sesler çalarken fark edilir. Ne olabilirdi? –