Soundpool sample not ready

后端 未结 8 1053
孤独总比滥情好
孤独总比滥情好 2020-12-09 03:15

I have a .wav file that I\'d like to use across my game, currently I am loading the sound in onCreate() of each activity in the game.

 soundCoun         


        
相关标签:
8条回答
  • 2020-12-09 03:41

    You'll need to wait for it to finish by adding a listener via SoundPool.setOnLoadCompleteListener.

    0 讨论(0)
  • 2020-12-09 03:44
    private SoundPool soundPool;
    private int my_sound;
    boolean loaded = false;
    

    // In the constructor

    soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
    my_sound = soundPool.load(this, R.raw.blast_sound, 1);
    
    soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
        public void onLoadComplete(SoundPool soundPool, int sampleId,int status) {
           loaded = true;
        }
    });
    

    // then where ever you want to play the sound, type

    if (loaded) {
    soundPool.play(my_sound,  0.9f, 0.9f, 1, 0, 1f);
    }
    
    0 讨论(0)
  • 2020-12-09 03:44

    I solved with problem with simple do-while cicle. The method play() return non-zero streamID if successful, zero if failed. So, it's sufficient to check the return value.

    int streamID = -1;
    do {
        streamID = soundPool.play(soundPoolMap.get(index), streamVolume, streamVolume, 1, 0, 1f);
    } while(streamID==0);
    
    0 讨论(0)
  • 2020-12-09 03:45

    This sounds crazy, but don't play sounds right away. Give your app a couple of seconds to initialize the SoundPool. In my app, this was exactly the issue; I added a fake "loading" screen of ~3 seconds, and then everything worked. (I didn't even need to preload the sounds.)

    0 讨论(0)
  • 2020-12-09 03:47

    Since my project is compatible with Android 1.5 and I couldn't use setOnLoadCompleteListener, I resolved making the play of sound delayed. My source code follows:

        playSound_Delayed(soundId, 100);
    

    // (..)

    private void playSound_Delayed (final int soundId, final long millisec) {
        // TIMER
        final Handler mHandler = new Handler();
        final Runnable mDelayedTimeTask = new Runnable() {
        int counter = 0;
        public void run() {
            counter++;
    
            if (counter == 1) {
                boolean ret = mHandler.postDelayed(this, millisec); 
                if (ret==false) Log.w("playSound_Delayed", "mHandler.postAtTime FAILED!");
           } else {
               playSound(soundId);
           }
        }
        };
        mDelayedTimeTask.run();
    }
    
    0 讨论(0)
  • 2020-12-09 03:52

    you should use setOnLoadCompleteListener if possible ... if not, wrap a while loop around your call to 'play'. something like:

    int waitLimit = 1000;
    int waitCounter = 0;
    int throttle = 10;
    while(soundPool.play(soundId, 1.f, 1.f, 1, 0, 1.f) == 0 && waitCounter < waitLimit)
     {waitCounter++; SystemClock.sleep(throttle);}
    

    this will retry 'play' 1000 times on a 10ms interval. this should be run on a non-ui thread of course, and is still not ideal. but maybe a little stronger than waiting an arbitrary time and expecting the pool to be ready.

    0 讨论(0)
提交回复
热议问题