Sound pool volume level - android

Because i had some problem playing small .wav file with MediaPlayer i switched to SoundPool. So far it seems it performing better than MediaPlayer but the problem i am having is the sound level, which should be 0.5 of system sound level.
i tried with
soundPool.play(currentSoundId, 0.5f, 0.5f, 1, 0, 1);
and it was still at the same sound level, i also tried with
int streamId = soundPool.play(currentSoundId, 1, 1, 1, 0, 1);
soundPool.setVolume(streamId, 0.5f, 0.5f);
and it was same level, any idea how to force to play it at specific volume? Its weird because it seems its not accepting any floats for sound i put in.
EDIT:
i initialize with following constructor
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
audioAttributes = new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.setUsage(AudioAttributes.USAGE_GAME)
.build();
soundPool = new SoundPool.Builder()
.setAudioAttributes(audioAttributes)
.setMaxStreams(2)
.build();
}else{
soundPool = new SoundPool(2, AudioManager.STREAM_MUSIC,0);
}

You should start using ExoPlayer, it has more rigid API then MediaPlayer and SoundPool
You can find it here, ExoPlayer.
It has setVolume(float) api
See more here

Is you are using old SoundPool constructor with AudioManager.STREAM_MUSIC stream or more relevant SoundPool.Builder ?
If Builder using, what AudioAttributes passed into initialization ?

Related

SoundPool issue on Android 11

It seems that soundPool Api is not working correctly on android 11. I hear the sound like slow motion. Have anyone any related issue ?
My code
private SoundPool soundPool;
private int wonSound;
...
soundPool = new SoundPool.Builder().setMaxStreams(1).build();
wonSound = soundPool.load(this, R.raw.slot_win_1, 1);
...
soundPool.play(wonSound, 1, 1, 0, 0, 0);
According to the documentation:
https://developer.android.com/reference/android/media/SoundPool#play(int,%20float,%20float,%20int,%20int,%20float)?
SoundPool's function play() takes as its last parameter:
float: playback rate (1.0 = normal playback, range 0.5 to 2.0)
So, playback rates below 1 will sound slower than the original sound. To play your sound in its original playback rate, you should call play() like this:
soundPool.play(wonSound, 1, 1, 0, 0, 1);

changing pitch of an sound file and save to mp3 file

changing pitch:
soundPool = new SoundPool(50, AudioManager.STREAM_MUSIC, 0);
/** Sound ID for Later handling of sound pool **/
soundId = soundPool.load(this, R.raw.sounds, 1);
play:
streamId = soundPool.play(soundId, 1, 1, 1, 3, pitch);
How can I save the file?
I don't think you can do this with the SoundPool, as it does not allow you to work at a byte level. I think you want to look into using AudioTracks.

Android play music in a random amount of time

Now I can play a music in android. But I want to play this sound in a random amount of time between 2 to 8 seconds.How Can I randomly play it that for example the first time, it plays for 2 seconds, the next time 7 sec and so on? Can anybody help me?
Go through these links:
Random number Generation
Media Player
Timer
you will get an idea.
Sound in android is played like this :
AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
int mSoundID = mSoundPool.load(this, R.raw.sound1, 1);
float lActualVolume = (float) audioManager
.getStreamVolume(AudioManager.STREAM_MUSIC);
float lMaxVolume = (float) audioManager
.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float lVolume = lActualVolume / lMaxVolume;
// Is the sound loaded already?
if (mSoundIsLoaded) {
mSoundPool.play(mSoundID, lVolume, lVolume, 1, 0, 1f);
I think you have been given plenty of help to figure the random number part out.
You will have to put the sound file in your assets/raw directory.
edit:
I forgot to mention where the mSoundIsLoaded parameter came from.
I set it when my sound has been loaded. I do this in my onCreate method. when the sound is loaded I set the boolean field called mSoundIsLoaded. I do this to prevent NullPointerExceptions when playing the sound
the loading of the sound looks like this:
mSoundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
mSoundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
#Override
public void onLoadComplete(SoundPool soundPool, int sampleId,
int status) {
mSoundIsLoaded = true;
}
});
mSoundID = mSoundPool.load(this, R.raw.sound1, 1);

Android SoundPool.stop does not seem to work

I have created a class MySoundPool (I am using this class as sigelton, but don't think this is relevant as everyting else works). I am initianalizing SoundPool, a HashMap, and get the context for AudioManager. Thereafter I am loading two sounds.
MySoundpool is used by method MySoundPool.playSound(int index, float rate)
playSound clips rate to 0.5 <= rate >= 2.0 an executes statements
float streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
streamVolume = streamVolume / mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, index, 0, rate);
So far so good. Everything works fine.
No it happens that playSound is called while the previous sound still plays, and I want to stop that before playing the new sound. Prior to the above code snippet I tried
mSoundPool.stop(mSoundPoolMap.get(index));
and
mSoundPool.autoPause();
with no success. The sound just continues to play to its end.
Any comments will be appreciated
I assume that you create a new SoundPool object in the constructor of your MySoundPool class?
If so then the first argument that SoundPool's constructor takes is the number of streams to allow at the same time. for example...
mSoundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
That will allow 10 sounds to play at once so just change the 10 to a 1 and that should do it.
Edit:
The stop() method takes a stream id as an argument, which should be the number returned from the play() method. You could try setting a variable equal to what play() returns and then use that variable when stopping the sound.
Use the soundId to play a sound but use the streamId to stop it. These are not always the same number!
When you start the sound, store the returned streamId:
int myStreamId = mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, index, 0, rate);
Then use that streamId (not the soundId) to stop the sound:
mSoundPool.stop(myStreamId);
As it says in the class document:
public final int play (int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)
Since: API Level 1
Play a sound from a sound ID. Play the sound specified by the soundID. This is the value returned by the load() function. Returns a non-zero streamID if successful, zero if it fails. The streamID can be used to further control playback.
Returns
non-zero streamID if successful, zero if failed
Had the same problem, why does one not read the F M ! :D
-Thanks guys!

How to Sync Sounds using SoundPool

I have been trying to get a few sounds to play at the same time; currently i'm using a shared instance of SoundPool. I would like 1, 2 or 3 sounds to be played at the exact same time with no lag.
When calling SoundPool.play(...) X number of times in succession, the sounds are played in that order as one might think. what is the proper what to achieve this where i can prepare all of the sounds to be played at the same time and then play them as one?
Sudo Code:
SoundPool _soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
_soundPool.load(_context, soundId1, 1);
_soundPool.load(_context, soundId2, 1);
_soundPool.load(_context, soundId3, 1);
_soundPool.play(soundId1, vol, vol, 1, 0, 1f);
_soundPool.play(soundId2, vol, vol, 1, 0, 1f);
_soundPool.play(soundId3, vol, vol, 1, 0, 1f);
i done the sound pool for one sound at time it might help you.
Android:sound pool and service
Thank you
You need to understand that SoundPool.load method is asyncronous, so when you call it 3 times in a row, and then call play, there is no garantee that this sounds actually loaded. So you need to wait until all sounds is loaded. For that use OnLoadCompleteListener:
fun loadAndPlay(soundPool: SoundPool, context: Context, resIds: IntArray) {
val soundIds = IntArray(resIds.size) {
soundPool.load(context, resIds[it], 1)
}
var numLoaded: Int = 0
soundPool.setOnLoadCompleteListener { sPool, sampleId, status ->
numLoaded++
if (numLoaded == resIds.size) {
soundPool.setOnLoadCompleteListener(null)
for (id in soundIds) {
soundPool.play(id, 1f, 1f, 1, 0, 1f)
}
}
}
}
To use:
loadAndPlay(soundPool, context, intArrayOf(R.raw.sound_1, R.raw.sound_2, R.raw.sound_3))

Categories

Resources