diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index e86b40e0baa6e..3a7225ed1daf1 100755 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -65,6 +65,17 @@ master volume stream and nothing else . --> false + + + 0 5 + + true diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index e63872b2d899e..e84cb5c2ee6bd 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -862,6 +862,7 @@ + diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index 23060aa90b1ff..eae03beae6fc0 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -137,10 +137,6 @@ public class AudioService extends IAudioService.Stub { // Timeout for connection to bluetooth headset service private static final int BT_HEADSET_CNCT_TIMEOUT_MS = 3000; - // Amount to raise/lower master volume - // FIXME - this should probably be in a resource - private static final float MASTER_VOLUME_INCREMENT = 0.05f; - /** @see AudioSystemThread */ private AudioSystemThread mAudioSystemThread; /** @see AudioHandler */ @@ -286,6 +282,8 @@ public class AudioService extends IAudioService.Stub { // True if we have master volume support private final boolean mUseMasterVolume; + private final int[] mMasterVolumeRamp; + // List of binder death handlers for setMode() client processes. // The last process to have called setMode() is at the top of the list. private final ArrayList mSetModeDeathHandlers = new ArrayList (); @@ -416,6 +414,9 @@ public class AudioService extends IAudioService.Stub { mUseMasterVolume = context.getResources().getBoolean( com.android.internal.R.bool.config_useMasterVolume); restoreMasterVolume(); + + mMasterVolumeRamp = context.getResources().getIntArray( + com.android.internal.R.array.config_masterVolumeRamp); } private void createAudioSystemThread() { @@ -620,19 +621,27 @@ public class AudioService extends IAudioService.Stub { /** @see AudioManager#adjustMasterVolume(int) */ public void adjustMasterVolume(int direction, int flags) { ensureValidDirection(direction); - - float volume = AudioSystem.getMasterVolume(); - if (volume >= 0.0) { - // get current master volume adjusted to 0 to 100 + int volume = Math.round(AudioSystem.getMasterVolume() * MAX_MASTER_VOLUME); + int delta = 0; + for (int i = 0; i < mMasterVolumeRamp.length; i += 2) { + int testVolume = mMasterVolumeRamp[i]; + int testDelta = mMasterVolumeRamp[i + 1]; if (direction == AudioManager.ADJUST_RAISE) { - volume += MASTER_VOLUME_INCREMENT; - if (volume > 1.0f) volume = 1.0f; + if (volume >= testVolume) { + delta = testDelta; + } else { + break; + } } else if (direction == AudioManager.ADJUST_LOWER) { - volume -= MASTER_VOLUME_INCREMENT; - if (volume < 0.0f) volume = 0.0f; + if (volume - testDelta >= testVolume) { + delta = -testDelta; + } else { + break; + } } - doSetMasterVolume(volume, flags); } +// Log.d(TAG, "adjustMasterVolume volume: " + volume + " delta: " + delta + " direction: " + direction); + setMasterVolume(volume + delta, flags); } /** @see AudioManager#setStreamVolume(int, int, int) */ @@ -805,6 +814,11 @@ public class AudioService extends IAudioService.Stub { } public void setMasterVolume(int volume, int flags) { + if (volume < 0) { + volume = 0; + } else if (volume > MAX_MASTER_VOLUME) { + volume = MAX_MASTER_VOLUME; + } doSetMasterVolume((float)volume / MAX_MASTER_VOLUME, flags); }