I am so confused…
SoundPool.play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)
volume here is from 0.0 to 1.0
Tutorials I’ve seen recommend to calculate stream volume as:
AudioManager mgr = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE); int streamVolume = mgr.getStreamVolume(AudioManager.STREAM_MUSIC); streamVolume = streamVolume / AudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, 1, 0, 1f);
which makes sense.
I would assume that this volume would override global media volume set by user in phone and I can change volume for my app independently by changing stream volume in soundPool.
But in reality it works like multiplier – if I set 0.5 for volume in soundpool, the actual volume will be always half of the global one. Very easy to reproduce:
- set global media volume in
phone settings to max
- set volume in activity using soundpool.play to 0.5 – play sound
- set volume in soundpool.play to 1 – play sound, it will be two times louder
Can somebody explain why it works like that? is volume passed to SoundPool.play method really a multiplier to the global volume?
Yes, the volume parameters are with respect to the global volume. If you want to play a sound at the current volume setting just pass “1” as the volume.