2010-06-14 15 views
8

Wenn ich einen einzelnen Sound spiele, läuft es gut.Abspielen mehrerer Sounds mit SoundManager

Das Hinzufügen eines zweiten Sounds führt zum Absturz.

Wer weiß, was das Problem verursacht?

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

Was ist die Ausnahme, die zum Absturz führt? Stapelverfolgung? –

Antwort

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

Sie müssen die zweite Zeile ändern:

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

Um auf einmal mehrere Sounds zu spielen, müssen Sie zuerst die Soundpool das wissen lassen. In der Deklaration von SoundPool merke ich, dass ich 20 Streams angegeben habe. Ich habe viele Waffen und Bösewichte, die in meinem Spiel Lärm machen, und jeder hat eine sehr kurze Tonschleife, < 3000ms. Beachten Sie, wenn ich unten einen Ton hinzufüge, verfolge ich den angegebenen Index in einem Vektor namens "mAvailibleSounds", auf diese Weise kann mein Spiel versuchen, Sounds für Elemente zu spielen, die nicht existieren und weitermachen, ohne abzustürzen. Jeder Index entspricht in diesem Fall einer Sprite ID. Nur damit du verstehst, wie ich bestimmte Sounds bestimmten Sprites zuordnen kann.

Als nächstes stellen wir mit playSound() Sounds in die Warteschlange. Jedes Mal, wenn dies passiert, wird eine SoundId in einen Stack geworfen, den ich dann bei jedem Timeout platzen lassen kann. Dadurch kann ich einen Stream nach dem Abspielen beenden und ihn erneut verwenden. Ich wähle 20 Streams, weil mein Spiel sehr laut ist. Danach werden die Sounds ausgewaschen, so dass jede Anwendung eine magische Nummer benötigt.

Ich fand diese Quelle here, und fügte die runnable & Kill-Warteschlange selbst hinzu.

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

Ich habe bemerkt, dass dieser Ansatz manchmal Mikroverzögerungen verursacht. Es ist bemerkenswert, wenn ich nacheinander kurze Töne spiele. Was könnte es sein? –

Verwandte Themen