Search code examples
androidsoundpool

Android SoundPool.play() sometimes lags


I'm currently facing an issue with my android game. Normally when calling SoundPool.play() the function needs about 0.003 seconds to finish, but sometimes it takes 0.2 seconds which makes my game stutter. where could his anomaly come from?


Solution

  • thanks to Tim, using a Thread for playing seemed to workaround the problem successfully.

    Thread

    package org.racenet.racesow.threads;
    
    import java.util.concurrent.BlockingQueue;
    import java.util.concurrent.LinkedBlockingQueue;
    
    import org.racenet.racesow.models.SoundItem;
    
    import android.media.SoundPool;
    
    /**
     * Thread for playing sounds
     * 
     * @author soh#zolex
     *
     */
    public class SoundThread extends Thread {
    
        private SoundPool soundPool;
        public BlockingQueue<SoundItem> sounds = new LinkedBlockingQueue<SoundItem>();
        public boolean stop = false;
    
        /**
         * Constructor
         * 
         * @param soundPool
         */
        public SoundThread(SoundPool soundPool) {
    
            this.soundPool = soundPool;
        }
    
        /**
         * Dispose a sound
         * 
         * @param soundID
         */
        public void unloadSound(int soundID) {
    
            this.soundPool.unload(soundID);
        }
    
        @Override
        /**
         * Wait for sounds to play
         */
        public void run() {         
    
            try {
    
                SoundItem item;
                while (!this.stop) {
    
                    item = this.sounds.take();
                    if (item.stop) {
    
                        this.stop = true;
                        break;
                    }
    
                    this.soundPool.play(item.soundID, item.volume, item.volume, 0, 0, 1);
                }
    
            } catch (InterruptedException e) {}
        }
    }
    

    SoundItem

    package org.racenet.racesow.models;
    
    /**
     * SoundItem will be passed to the SoundThread which
     * will handle the playing of sounds
     * 
     * @author soh#zolex
     *
     */
    public class SoundItem {
    
        public int soundID;
        public float volume;
        public boolean stop = false;
    
        /**
         * Default constructor
         * 
         * @param soundID
         * @param volume
         */
        public SoundItem(int soundID, float volume) {
    
            this.soundID = soundID;
            this.volume = volume;
        }
    
        /**
         * Constructor for the item
         * which will kill the thread
         * 
         * @param stop
         */
        public SoundItem(boolean stop) {
    
            this.stop = stop;
        }
    }