Play sound using soundpool example
Asked Answered
S

5

55

I would like to learn how to use soundpool method. I would like you to show me a very simple example that run 2 sounds.

Semiotics answered 12/6, 2013 at 15:52 Comment(0)
T
73

Create a folder named as raw under your_app/res/. Then paste your ringtone in this folder, for example your_app/res/raw/ringtone.mp3. Now use the following code:

SoundPool soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
int soundId = soundPool.load(context, R.raw.ringtone, 1);
// soundId for reuse later on

soundPool.play(soundId, 1, 1, 0, 0, 1);

Be sure to release the SoundPool resources after use:

soundPool.release();
soundPool = null;
Trollope answered 12/6, 2013 at 16:17 Comment(6)
The SoundPool constructor is deprecated now, but since SoundPool.Builder requires API level 21, I guess I'm still using it.Disbar
The last two lines (the MediaPlayer thing) are not necessary. For the rest, it has been helpful. Thanks:)Gaeta
@Gaeta , why would it not be necessary?Tragedy
@Trollope , after we set things to null doesn't the garbage collector do it's thing automatically? What's the point of calling release?Tragedy
When I tested it, I had to delay in time the soundPool.play(...) part. It did not work if you call the play just after the load.Odyssey
IMHO you need to wait for loading the sample using onLoadListener and then start playbackEveland
C
66

Yes. i went through this too. but for safety i have saved a piece of code i found online. Though havent used it, i know it will come in handy soon...

1) You need to create AudioAttributes object:

AudioAttributes attributes = new AudioAttributes.Builder()
    .setUsage(AudioAttributes.USAGE_GAME)
    .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
    .build();

2) Create SoundPool object:

SoundPool sounds = new SoundPool.Builder()
    .setAudioAttributes(attributes)
    .build();

3) How to use SoundPool on all API levels example :

SoundPool sound;

protected void createSoundPool() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        createNewSoundPool();
    } else {
        createOldSoundPool();
    }
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
protected void createNewSoundPool(){
    AudioAttributes attributes = new AudioAttributes.Builder()
        .setUsage(AudioAttributes.USAGE_GAME)
        .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
        .build();
    sounds = new SoundPool.Builder()
        .setAudioAttributes(attributes)
        .build();
}

@SuppressWarnings("deprecation")
protected void createOldSoundPool(){
    sounds = new SoundPool(5,AudioManager.STREAM_MUSIC,0);
}
Curia answered 18/12, 2014 at 17:41 Comment(1)
Note: You want a .setMaxStreams(5) on the Builder in createNewSoundPool too if you want to have the same behavior, to play several sounds at the same time, as in the old one. Also the 5 could be a final int or something instead.Ganof
W
10

Here is a small, working example of soundPool, it is taken from here and slightly modified to match post 21 API's.

One thing to notice is maxStreams, which indicates how many streams are allowed to run in parallel, if it is one(default), it can be removed from the builder.

import android.app.Activity;
import android.content.Context;
import android.media.AudioManager;
import android.media.SoundPool;

public class SoundManager extends Activity
{
  static SoundPool soundPool;
  static int[] sm;

  public static void InitSound() {

    int maxStreams = 1;
    Context mContext = getApplicationContext();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        soundPool = new SoundPool.Builder()
                .setMaxStreams(maxStreams)
                .build();
    } else {
        soundPool = new SoundPool(maxStreams, AudioManager.STREAM_MUSIC, 0);
    }

    sm = new int[3];
    // fill your sounds
    sm[0] = soundPool.load(mContext, R.raw.sound_1, 1);
    sm[1] = soundPool.load(mContext, R.raw.sound_2, 1);
    sm[2] = soundPool.load(mContext, R.raw.sound_3, 1);

  }

  static void playSound(int sound) {

      soundPool.play(sm[sound], 1, 1, 1, 0, 1f);
  }

   public final void cleanUpIfEnd() {
    sm = null;
    soundPool.release();
    soundPool = null;
  } 
}
Weepy answered 28/2, 2017 at 12:37 Comment(4)
amg isn't usedPecos
It is initialized but never used.Eyespot
Plus one for a useful answer despite the amg line being completed unneeded (tested without it)Loader
getApplicationContext(); causes an error. "Non static method cannot be referenced from static context"Cholon
S
5

I have written a SoundPoolManager which can be used to load sound files and play as and when required. You can see it here.

Thanks.

Shambles answered 22/1, 2015 at 7:58 Comment(2)
I find the SoundPoolManager code readable, but the benefit of using int instead of SoundPool is not clear to me. I'm guessing it is for convenience. It would help if you would explain this more fully. Does SoundPoolManager address shortcomings of SoundPool, make my code safer/more portable/more manageable/more efficient? If so how and why? Thanks in advance.Demonology
Interesting sample. onLoadComplete + callbackGermanophile
D
5
private final int NUMBER_OF_SIMULTANEOUS_SOUNDS = 5;
        private final float LEFT_VOLUME_VALUE = 1.0f;
        private final float RIGHT_VOLUME_VALUE = 1.0f;
        private final int MUSIC_LOOP = 0;
        private final int SOUND_PLAY_PRIORITY = 0;
        private final float PLAY_RATE= 1.0f;


        SoundPool soundPool;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            soundPool= new SoundPool.Builder()
                    .setMaxStreams(NUMBER_OF_SIMULTANEOUS_SOUNDS)
                    .build();
        } else {
            // Deprecated way of creating a SoundPool before Android API 21.
            soundPool= new SoundPool(NUMBER_OF_SIMULTANEOUS_SOUNDS, AudioManager.STREAM_MUSIC, 0);
        }
        int soundId = soundPool.load(getApplicationContext(), R.raw.sound_1, 1);

        soundPool.play(soundId , LEFT_VOLUME_VALUE , RIGHT_VOLUME_VALUE, SOUND_PLAY_PRIORITY , MUSIC_LOOP ,PLAY_RATE);
Disputation answered 6/3, 2019 at 8:50 Comment(1)
Good Job. It worked.Totem

© 2022 - 2024 — McMap. All rights reserved.