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.