2013-01-13 3 views
1

Voici mon code:SOUNDPOOL Chargement Never Ends

import java.util.Locale; 

    import android.app.Activity; 
    import android.content.Context; 
    import android.media.AudioManager; 
    import android.media.SoundPool; 
    import android.media.SoundPool.OnLoadCompleteListener; 
    import android.os.Bundle; 
    import android.os.Vibrator; 
    import android.util.Log; 
    import android.view.MotionEvent; 
    import android.view.View; 
    import android.view.View.OnClickListener; 
    import android.widget.Button; 
    import android.widget.TextView; 
    import android.view.GestureDetector; 
    import android.view.GestureDetector.OnGestureListener; 
    import android.speech.tts.TextToSpeech; 
    import android.speech.tts.TextToSpeech.OnInitListener; 

    public class GameActivity extends Activity implements OnGestureListener, OnInitListener { 

     private SoundPool soundPool; 
     private int wallSound, moveSound, completeSound, restartSound, readysetgoSound; 
     boolean loaded = false; 
     float actualVolume, maxVolume, volume; 

     GestureDetector gDetector; 
     Vibrator vibrator; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 

      super.onCreate(savedInstanceState); 

      gDetector = new GestureDetector(this); 
      vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 

      // Set the hardware buttons to control the music 
      this.setVolumeControlStream(AudioManager.STREAM_MUSIC); 
      // Load the sound 
      soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 0); 

      soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() { 
       @Override 
       public void onLoadComplete(SoundPool soundPool, int sampleId, 
         int status) { 
        loaded = true; 
       } 
      }); 

      wallSound = soundPool.load(this, R.raw.wall, 1); 
      moveSound = soundPool.load(this, R.raw.move, 1); 
      completeSound = soundPool.load(this, R.raw.complete, 1); 
      restartSound = soundPool.load(this, R.raw.restart, 1); 
      readysetgoSound = soundPool.load(this, R.raw.readysetgo, 1); 

      // Getting the user sound settings 
      AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); 
      actualVolume = (float) audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
      maxVolume = (float) audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); 
      volume = actualVolume/maxVolume; 

      while (!loaded) { 
       Log.e("Load Status", "Loading..."); 
      } 
     } 

     public void onStart() { 
      super.onStart(); 
      while(soundPool.play(readysetgoSound, volume, volume, 1, 0, 1f) == 0) {} 
     } 
... 

Le problème que je fais l'expérience est de vérifier si mes fichiers sonores sont chargés. Dans la méthode onCreate, notez la dernière boucle while. Théoriquement, si je comprends bien, une fois les sons chargés, le code devrait passer à autre chose. Cependant, l'application ne quitte jamais la boucle while, et continue à l'itérer pour toujours. Je crois que je peux mal comprendre le onLoadCompleteListener pour SoundPool et l'implémenter incorrectement. Je veux m'assurer que mon application ne quitte pas la méthode onCreate jusqu'à ce que les cinq sons soient complètement chargés. La seule manière que j'ai trouvée pour m'assurer que le son que je veux est joué seulement quand elle est chargée est en utilisant la boucle while montrée dans la méthode onStart. Jusqu'à ce qu'il soit chargé, la méthode play renvoie toujours zéro. Cependant, je n'aime pas cette approche, car je devrais l'utiliser chaque fois que je veux jouer un son. Probablement très inefficace aussi.

Répondre

0

J'ai décidé d'aller avec MediaPlayer. Au prix de l'utilisation de plus de ressources, la facilité relative de mise en œuvre et la plus grande étendue des méthodes de contrôle de la lecture justifiaient le changement.

Voici un bref aperçu de ma mise en œuvre:

MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.readysetgo); 
... 
mediaPlayer.start(); 
while (mediaPlayer.isPlaying()) {} //wait until finished to move on 
...