SoundPool issue on Android 11 - android

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);

Related

Sound pool volume level

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 ?

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 : when using MediaPlayer to play background music, sound effects are stopped prematurely

I'm trying to play background music on my app and occasional sound effects when you kill an enemy and stuff like that.
All the sound effects worked, but then I started using a MusicManager class (similar to this tutorial: http://www.rbgrn.net/content/307-light-racer-20-days-61-64-completion) to try to play background music and it works, but the sound effects get chopped after half a second or so.
I'm playing the sound effects using:
MediaPlayer mp = MediaPlayer.create(context, R.raw.fire);
mp.start();
Use soundpool instead.
SoundPool can play multiple streams at once at different volumes, speeds, and looping.
MediaPLayer isn't really meant to handle game audio.
I have 2 games published in the market, and both use SoundPool and have no issues.
here these two functions are taken right out of my game.
public static void playSound(int index, float speed)
{
float streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
streamVolume = streamVolume / mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, 0, speed);
}
public static void playLoop(int index, float speed)
{
float streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
streamVolume = streamVolume / mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
streamVolume = streamVolume / 3f;
mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, -1, speed);
}
that is how easy it is. To take a closer look at this, I only use my playLoop() to play background music, so I lower the volume on it, but you could easily modify the code to manually set the volume each time you play.
also
mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, -1, speed);
the first argument mSoundPoolMap.get(index) is just a container holding all of my sounds. I assign each sound a final number such as
final static int SOUND_FIRE = 0, SOUND_DEATH = 1, SOUND_OUCH = 2;
I load thos sounds into those positions and the play them from it. (remember you dont want to be loading all your sounds every time you run one, just load them once.) The next 2 arguments are left/right volume, priority, and then -1 to set to loop.
mSoundPool = new SoundPool(8, AudioManager.STREAM_MUSIC, 0);
this sets my soundpool to 8 streams. the other is the source type and then the quality.
have fun!

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