24

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:

  1. set global media volume in phone settings to max
  2. set volume in activity using soundpool.play to 0.5 - play sound
  3. 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?

Anthony Graglia
  • 5,355
  • 5
  • 46
  • 75
mishkin
  • 5,932
  • 8
  • 45
  • 64

1 Answers1

31

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.

Darrell
  • 1,945
  • 15
  • 21
  • 3
    documentation does not really say that, it just says from 0 to 1 and does not mention what 1 corresponds to. I was under impression 1 is the max volume of device, but your explanation that 1 is the max volume of current global volume explains my observation. – mishkin Nov 30 '10 at 02:01