summaryrefslogtreecommitdiffstats
path: root/media/java
diff options
context:
space:
mode:
authorJean-Michel Trivi <jmtrivi@google.com>2010-03-18 16:51:04 -0700
committerJean-Michel Trivi <jmtrivi@google.com>2010-03-18 18:28:27 -0700
commit078fd47e91d495175927d1a4a8b9aad039a7ba4e (patch)
tree1408fe17122a10ce04578610515c726c49dd1462 /media/java
parent84b446fad27f47eee34c26b9d396c31823a57860 (diff)
downloadframeworks_base-078fd47e91d495175927d1a4a8b9aad039a7ba4e.zip
frameworks_base-078fd47e91d495175927d1a4a8b9aad039a7ba4e.tar.gz
frameworks_base-078fd47e91d495175927d1a4a8b9aad039a7ba4e.tar.bz2
Support focus requests where ducking of the loser of audio focus
is acceptable for the new audio focus owner. Change-Id: I965483f12eeb717115a8f6992d8f1ab7fafa4e45
Diffstat (limited to 'media/java')
-rw-r--r--media/java/android/media/AudioManager.java57
-rw-r--r--media/java/android/media/AudioService.java16
2 files changed, 43 insertions, 30 deletions
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 47a9004..ad4dd09 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -1244,16 +1244,6 @@ public class AudioManager {
}
/**
- * Used to indicate a loss of audio focus of unknown duration.
- * @see OnAudioFocusChangeListener#onAudioFocusChanged(int)
- */
- public static final int AUDIOFOCUS_LOSS = -1;
- /**
- * Used to indicate a transient loss of audio focus.
- * @see OnAudioFocusChangeListener#onAudioFocusChanged(int)
- */
- public static final int AUDIOFOCUS_LOSS_TRANSIENT = -2;
- /**
* Used to indicate a gain of audio focus, or a request of audio focus, of unknown duration.
* @see OnAudioFocusChangeListener#onAudioFocusChanged(int)
* @see #requestAudioFocus(OnAudioFocusChangeListener, int, int)
@@ -1267,6 +1257,35 @@ public class AudioManager {
* @see #requestAudioFocus(OnAudioFocusChangeListener, int, int)
*/
public static final int AUDIOFOCUS_GAIN_TRANSIENT = 2;
+ /**
+ * @hide
+ * Used to indicate a temporary request of audio focus, anticipated to last a short
+ * amount of time, and where it is acceptable for other audio applications to duck.
+ * Examples of temporary changes are the playback of driving directions where playback of music
+ * in the background is acceptable.
+ * @see OnAudioFocusChangeListener#onAudioFocusChanged(int)
+ * @see #requestAudioFocus(OnAudioFocusChangeListener, int, int)
+ */
+ public static final int AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK = 3;
+ /**
+ * Used to indicate a loss of audio focus of unknown duration.
+ * @see OnAudioFocusChangeListener#onAudioFocusChanged(int)
+ */
+ public static final int AUDIOFOCUS_LOSS = -1 * AUDIOFOCUS_GAIN;
+ /**
+ * Used to indicate a transient loss of audio focus.
+ * @see OnAudioFocusChangeListener#onAudioFocusChanged(int)
+ */
+ public static final int AUDIOFOCUS_LOSS_TRANSIENT = -1 * AUDIOFOCUS_GAIN_TRANSIENT;
+ /**
+ * @hide
+ * Used to indicate a transient loss of audio focus where the loser of the audio focus can
+ * duck if it wants to continue playing, as the new focus owner doesn't require others
+ * to be silent.
+ * @see OnAudioFocusChangeListener#onAudioFocusChanged(int)
+ */
+ public static final int AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK =
+ -1 * AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK;
/**
* Interface definition for a callback to be invoked when the audio focus of the system is
@@ -1282,7 +1301,8 @@ public class AudioManager {
* behavior to adopt when losing focus. A music player could for instance elect to duck its
* music stream for transient focus losses, and pause otherwise.
* @param focusChange one of {@link AudioManager#AUDIOFOCUS_GAIN},
- * {@link AudioManager#AUDIOFOCUS_LOSS}, {@link AudioManager#AUDIOFOCUS_LOSS_TRANSIENT}.
+ * {@link AudioManager#AUDIOFOCUS_LOSS}, {@link AudioManager#AUDIOFOCUS_LOSS_TRANSIENT}
+ * and {@link AudioManager#AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK}.
*/
public void onAudioFocusChanged(int focusChange);
}
@@ -1308,14 +1328,7 @@ public class AudioManager {
*/
private FocusEventHandlerDelegate mAudioFocusEventHandlerDelegate =
new FocusEventHandlerDelegate();
- /**
- * Event id denotes a loss of focus
- */
- private static final int AUDIOFOCUS_EVENT_LOSS = 0;
- /**
- * Event id denotes a gain of focus
- */
- private static final int AUDIOFOCUS_EVENT_GAIN = 1;
+
/**
* Helper class to handle the forwarding of audio focus events to the appropriate listener
*/
@@ -1416,8 +1429,10 @@ public class AudioManager {
* @param streamType the main audio stream type affected by the focus request
* @param durationHint use {@link #AUDIOFOCUS_GAIN_TRANSIENT} to indicate this focus request
* is temporary, and focus will be abandonned shortly. Examples of transient requests are
- * for the playback of driving directions, or notifications sounds. Use
- * {@link #AUDIOFOCUS_GAIN} for a focus request of unknown duration such
+ * for the playback of driving directions, or notifications sounds.
+ * Use {@link #AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK} to indicate also that it's ok for
+ * the previous focus owner to keep playing if it ducks its audio output.
+ * Use {@link #AUDIOFOCUS_GAIN} for a focus request of unknown duration such
* as the playback of a song or a video.
* @return {@link #AUDIOFOCUS_REQUEST_FAILED} or {@link #AUDIOFOCUS_REQUEST_GRANTED}
*/
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index 75e51f9..1992c93 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -1822,7 +1822,7 @@ public class AudioService extends IAudioService.Stub {
public IAudioFocusDispatcher mFocusDispatcher = null;
public IBinder mSourceRef = null;
public String mClientId;
- public int mDurationHint;
+ public int mFocusChangeType;
public FocusStackEntry() {
}
@@ -1834,7 +1834,7 @@ public class AudioService extends IAudioService.Stub {
mFocusDispatcher = afl;
mSourceRef = source;
mClientId = id;
- mDurationHint = duration;
+ mFocusChangeType = duration;
}
}
@@ -1851,7 +1851,7 @@ public class AudioService extends IAudioService.Stub {
while(stackIterator.hasNext()) {
FocusStackEntry fse = stackIterator.next();
pw.println(" source:" + fse.mSourceRef + " -- client: " + fse.mClientId
- + " -- duration: " +fse.mDurationHint);
+ + " -- duration: " +fse.mFocusChangeType);
}
}
}
@@ -1953,7 +1953,7 @@ public class AudioService extends IAudioService.Stub {
/** @see AudioManager#requestAudioFocus(IAudioFocusDispatcher, int, int) */
- public int requestAudioFocus(int mainStreamType, int durationHint, IBinder cb,
+ public int requestAudioFocus(int mainStreamType, int focusChangeHint, IBinder cb,
IAudioFocusDispatcher fd, String clientId) {
Log.i(TAG, " AudioFocus requestAudioFocus() from " + clientId);
// the main stream type for the audio focus request is currently not used. It may
@@ -1970,7 +1970,7 @@ public class AudioService extends IAudioService.Stub {
synchronized(mFocusStack) {
if (!mFocusStack.empty() && mFocusStack.peek().mClientId.equals(clientId)) {
- mFocusStack.peek().mDurationHint = durationHint;
+ mFocusStack.peek().mFocusChangeType = focusChangeHint;
// if focus is already owned by this client, don't do anything
return AudioManager.AUDIOFOCUS_REQUEST_GRANTED;
}
@@ -1979,9 +1979,7 @@ public class AudioService extends IAudioService.Stub {
if (!mFocusStack.empty() && (mFocusStack.peek().mFocusDispatcher != null)) {
try {
mFocusStack.peek().mFocusDispatcher.dispatchAudioFocusChange(
- (durationHint == AudioManager.AUDIOFOCUS_GAIN) ?
- AudioManager.AUDIOFOCUS_LOSS :
- AudioManager.AUDIOFOCUS_LOSS_TRANSIENT,
+ -1 * focusChangeHint, // loss and gain codes are inverse of each other
mFocusStack.peek().mClientId);
} catch (RemoteException e) {
Log.e(TAG, " Failure to signal loss of focus due to "+ e);
@@ -1990,7 +1988,7 @@ public class AudioService extends IAudioService.Stub {
}
// push focus requester at the top of the audio focus stack
- mFocusStack.push(new FocusStackEntry(mainStreamType, durationHint, false, fd, cb,
+ mFocusStack.push(new FocusStackEntry(mainStreamType, focusChangeHint, false, fd, cb,
clientId));
}//synchronized(mFocusStack)