Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android sound latency using SoundPool

public class AndroidSound implements Sound {
int soundId;
SoundPool soundPool;

public AndroidSound(SoundPool soundPool, int soundId) {
    this.soundId = soundId;
    this.soundPool = soundPool;
}

@Override
public void play(float volume) {
    soundPool.play(soundId, volume, volume, 0, 0, 1);
}

@Override
public void dispose() {
    soundPool.unload(soundId);
}}





public class Assets{

public Music theme;
public static Sound sound;

public static void load(Game game) {
        theme = game.getAudio().createMusic("theme.mp3");
        theme.setLooping(true);
        theme.setVolume(0.85f);
        theme.play();

        sound = game.getAudio().createSound("death.wav");
    }
}

Then I play this sound in different class by calling play() on it, but it plays with really huge delay, something around 500ms. Why is that? I tried looking for solution, but there is tons of people with that problem and I haven't found any answer that actually worked. Most of topics was bit old tho, maybe there is a simple solution for this already, counting on your help.

public class AndroidAudio implements Audio {
    AssetManager assets;
    SoundPool soundPool;

    public AndroidAudio(Activity activity) {
        activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);
        this.assets = activity.getAssets();
        this.soundPool = new SoundPool(20, AudioManager.STREAM_MUSIC, 0);
    }

    @Override
    public Sound createSound(String filename) {
        try {
            AssetFileDescriptor assetDescriptor = assets.openFd(filename);
            int soundId = soundPool.load(assetDescriptor, 0);
            return new AndroidSound(soundPool, soundId);
        } catch (IOException e) {
            throw new RuntimeException("Couldn't load sound '" + filename + "'");
        }
    }
}
like image 270
Shadov Avatar asked Jul 01 '26 00:07

Shadov


1 Answers

I don't know if this will be helpful now but also answering.

Use of SoundPool

1)First load your audio as required in the levels in the beginning of application initialization.Suppose you need 5 sound in the level load them in the beginning and keep the soundID's handy.

2) Now on any event just call play with the soundID.

3) This plays with a very less delay while I debugged from SoundPool play till HAL layer.Around 10-15 ms in my device.

For more info on SoundPool implementation follow my github thread: https://github.com/sauravpradhan/Basic-Audio-Routing

like image 96
Saurav Avatar answered Jul 02 '26 14:07

Saurav



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!