diff options
author | Mike Lockwood <lockwood@android.com> | 2011-10-20 12:54:05 -0400 |
---|---|---|
committer | Mike Lockwood <lockwood@google.com> | 2012-02-10 09:01:28 -0800 |
commit | cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762 (patch) | |
tree | e62c37fec71b48b9ecb7fedaca997d9b7214a447 /media | |
parent | c62242a55a5cfb82f69c7db5208e90667da7ec56 (diff) | |
download | frameworks_base-cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762.zip frameworks_base-cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762.tar.gz frameworks_base-cbdb49dc5e1b993a0bc5c68dbfb9486bfa0cd762.tar.bz2 |
Simple master volume support
Still needs integration with Settings (for persistence) and VolumePanel UI.
Change-Id: I9eca92c4b1ef2df2564411006a35753ab9618dce
Signed-off-by: Mike Lockwood <lockwood@android.com>
Diffstat (limited to 'media')
-rw-r--r-- | media/java/android/media/AudioManager.java | 75 | ||||
-rw-r--r-- | media/java/android/media/AudioService.java | 20 | ||||
-rw-r--r-- | media/java/android/media/AudioSystem.java | 4 | ||||
-rw-r--r-- | media/java/android/media/IAudioService.aidl | 6 |
4 files changed, 84 insertions, 21 deletions
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 78eb89f..d131176 100644 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -48,6 +48,7 @@ public class AudioManager { private final Context mContext; private long mVolumeKeyUpTime; private int mVolumeControlStream = -1; + private final boolean mUseMasterVolume; private static String TAG = "AudioManager"; /** @@ -354,6 +355,8 @@ public class AudioManager { */ public AudioManager(Context context) { mContext = context; + mUseMasterVolume = mContext.getResources().getBoolean( + com.android.internal.R.bool.config_useMasterVolume); } private static IAudioService getService() @@ -382,8 +385,12 @@ public class AudioManager { * The user has hit another key during the delay (e.g., 300ms) * since the last volume key up, so cancel any sounds. */ - adjustSuggestedStreamVolume(AudioManager.ADJUST_SAME, + if (mUseMasterVolume) { + adjustMasterVolume(ADJUST_SAME); + } else { + adjustSuggestedStreamVolume(ADJUST_SAME, stream, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE); + } } } @@ -399,16 +406,23 @@ public class AudioManager { * responsive to the user. */ int flags = FLAG_SHOW_UI | FLAG_VIBRATE; - if (mVolumeControlStream != -1) { - stream = mVolumeControlStream; - flags |= FLAG_FORCE_STREAM; + if (mUseMasterVolume) { + adjustMasterVolume( + keyCode == KeyEvent.KEYCODE_VOLUME_UP + ? ADJUST_RAISE + : ADJUST_LOWER); + } else { + if (mVolumeControlStream != -1) { + stream = mVolumeControlStream; + flags |= FLAG_FORCE_STREAM; + } + adjustSuggestedStreamVolume( + keyCode == KeyEvent.KEYCODE_VOLUME_UP + ? ADJUST_RAISE + : ADJUST_LOWER, + stream, + flags); } - adjustSuggestedStreamVolume( - keyCode == KeyEvent.KEYCODE_VOLUME_UP - ? ADJUST_RAISE - : ADJUST_LOWER, - stream, - flags); break; case KeyEvent.KEYCODE_VOLUME_MUTE: // TODO: Actually handle MUTE. @@ -427,15 +441,21 @@ public class AudioManager { * Play a sound. This is done on key up since we don't want the * sound to play when a user holds down volume down to mute. */ - int flags = FLAG_PLAY_SOUND; - if (mVolumeControlStream != -1) { - stream = mVolumeControlStream; - flags |= FLAG_FORCE_STREAM; + if (mUseMasterVolume) { + if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { + adjustMasterVolume(ADJUST_SAME); + } + } else { + int flags = FLAG_PLAY_SOUND; + if (mVolumeControlStream != -1) { + stream = mVolumeControlStream; + flags |= FLAG_FORCE_STREAM; + } + adjustSuggestedStreamVolume( + ADJUST_SAME, + stream, + flags); } - adjustSuggestedStreamVolume( - ADJUST_SAME, - stream, - flags); mVolumeKeyUpTime = SystemClock.uptimeMillis(); break; @@ -518,7 +538,24 @@ public class AudioManager { try { service.adjustSuggestedStreamVolume(direction, suggestedStreamType, flags); } catch (RemoteException e) { - Log.e(TAG, "Dead object in adjustVolume", e); + Log.e(TAG, "Dead object in adjustSuggestedStreamVolume", e); + } + } + + /** + * Adjusts the master volume for the device's audio amplifier. + * <p> + * + * @param direction The direction to adjust the volume. One of + * {@link #ADJUST_LOWER}, {@link #ADJUST_RAISE}, or + * {@link #ADJUST_SAME}. + */ + private void adjustMasterVolume(int direction) { + IAudioService service = getService(); + try { + service.adjustMasterVolume(direction); + } catch (RemoteException e) { + Log.e(TAG, "Dead object in adjustMasterVolume", e); } } diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index 13e3982..be409b2 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -136,6 +136,9 @@ 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; @@ -602,6 +605,23 @@ public class AudioService extends IAudioService.Stub { sendVolumeUpdate(streamType, oldIndex, index, flags); } + /** @see AudioManager#adjustMasterVolume(int) */ + public void adjustMasterVolume(int direction) { + ensureValidDirection(direction); + + float volume = AudioSystem.getMasterVolume(); + if (volume >= 0.0) { + if (direction == AudioManager.ADJUST_RAISE) { + volume += MASTER_VOLUME_INCREMENT; + if (volume > 1.0f) volume = 1.0f; + } else if (direction == AudioManager.ADJUST_LOWER) { + volume -= MASTER_VOLUME_INCREMENT; + if (volume < 0.0f) volume = 0.0f; + } + AudioSystem.setMasterVolume(volume); + } + } + /** @see AudioManager#setStreamVolume(int, int, int) */ public void setStreamVolume(int streamType, int index, int flags) { ensureValidStreamType(streamType); diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java index 3080497..d354cdb 100644 --- a/media/java/android/media/AudioSystem.java +++ b/media/java/android/media/AudioSystem.java @@ -318,5 +318,9 @@ public class AudioSystem public static native int initStreamVolume(int stream, int indexMin, int indexMax); public static native int setStreamVolumeIndex(int stream, int index, int device); public static native int getStreamVolumeIndex(int stream, int device); + public static native int setMasterVolume(float value); + public static native float getMasterVolume(); + public static native int setMasterMute(boolean mute); + public static native boolean getMasterMute(); public static native int getDevicesForStream(int stream); } diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl index 5294d36..fd15c69 100644 --- a/media/java/android/media/IAudioService.aidl +++ b/media/java/android/media/IAudioService.aidl @@ -30,9 +30,11 @@ interface IAudioService { void adjustVolume(int direction, int flags); void adjustSuggestedStreamVolume(int direction, int suggestedStreamType, int flags); - + void adjustStreamVolume(int streamType, int direction, int flags); - + + void adjustMasterVolume(int direction); + void setStreamVolume(int streamType, int index, int flags); void setStreamSolo(int streamType, boolean state, IBinder cb); |