громкость потока в SoundPool против громкости в AudioManager - PullRequest
18 голосов
/ 15 ноября 2010

Я так растерялся ...

SoundPool.play (int soundID, float leftVolume, float rightVolume , приоритет int, int loop, скорость float)

объем здесь от 0,0 до 1,0

Уроки, которые я видел, рекомендуют рассчитывать объем потока как:

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

что имеет смысл.

Я бы предположил, что эта громкость переопределит глобальную громкость мультимедиа, установленную пользователем в телефоне, и я могу изменить громкость для своего приложения независимо, изменив громкость потока в soundPool.

Но на самом деле это работает как множитель - если я установлю 0.5 для громкости в саундпуле, фактическая громкость будет всегда вдвое меньше глобальной. Очень легко воспроизвести:

  1. установить глобальную громкость в Максимальные настройки телефона
  2. установить громкость в активности с помощью soundpool.play на 0,5 - воспроизвести звук
  3. установить громкость в soundpool.play на 1 - воспроизводить звук, он будет в два раза громче

Может кто-нибудь объяснить, почему это так работает? действительно ли объем, передаваемый методу SoundPool.play, действительно является множителем глобального объема?

1 Ответ

27 голосов
/ 30 ноября 2010

Да, параметры объема относятся к общему объему. Если вы хотите воспроизвести звук с текущей настройкой громкости, просто передайте «1» в качестве громкости.

...