summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoboErik <epastern@google.com>2014-07-21 12:44:53 -0700
committerErik Pasternak <roboerik@android.com>2014-07-23 17:08:32 +0000
commit9db9bf7034d7dcdf596dc22d521b18975d0dd2b9 (patch)
tree88461341ecfda61929f03868fc775fe62bcd9b28
parent4bd39ec448bfc050428b375a366a25e8afeeaec9 (diff)
downloadframeworks_base-9db9bf7034d7dcdf596dc22d521b18975d0dd2b9.zip
frameworks_base-9db9bf7034d7dcdf596dc22d521b18975d0dd2b9.tar.gz
frameworks_base-9db9bf7034d7dcdf596dc22d521b18975d0dd2b9.tar.bz2
Switch Session APIs over to AudioAttributes
The session apis were using audioStream in several places. This updates them to use AudioAttributes instead. bug:16403289 Change-Id: Ic4da9ca5fbea2536e80c71503bd9a9bf7f346997
-rw-r--r--api/current.txt4
-rw-r--r--media/java/android/media/AudioAttributes.aidl18
-rw-r--r--media/java/android/media/MediaRouter.java4
-rw-r--r--media/java/android/media/session/ISession.aidl4
-rw-r--r--media/java/android/media/session/MediaController.java32
-rw-r--r--media/java/android/media/session/MediaSession.java30
-rw-r--r--media/java/android/media/session/ParcelableVolumeInfo.java12
-rw-r--r--services/core/java/com/android/server/media/MediaSessionRecord.java67
8 files changed, 103 insertions, 68 deletions
diff --git a/api/current.txt b/api/current.txt
index 75664a5..a49e0f7 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -16596,7 +16596,7 @@ package android.media.session {
}
public static final class MediaController.VolumeInfo {
- method public int getAudioStream();
+ method public android.media.AudioAttributes getAudioAttributes();
method public int getCurrentVolume();
method public int getMaxVolume();
method public int getVolumeControl();
@@ -16621,7 +16621,7 @@ package android.media.session {
method public void setMediaRouter(android.media.routing.MediaRouter);
method public void setMetadata(android.media.MediaMetadata);
method public void setPlaybackState(android.media.session.PlaybackState);
- method public void setPlaybackToLocal(int);
+ method public void setPlaybackToLocal(android.media.AudioAttributes);
method public void setPlaybackToRemote(android.media.VolumeProvider);
field public static final int FLAG_HANDLES_MEDIA_BUTTONS = 1; // 0x1
field public static final int FLAG_HANDLES_TRANSPORT_CONTROLS = 2; // 0x2
diff --git a/media/java/android/media/AudioAttributes.aidl b/media/java/android/media/AudioAttributes.aidl
new file mode 100644
index 0000000..04587f9
--- /dev/null
+++ b/media/java/android/media/AudioAttributes.aidl
@@ -0,0 +1,18 @@
+/* Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+
+package android.media;
+
+parcelable AudioAttributes;
diff --git a/media/java/android/media/MediaRouter.java b/media/java/android/media/MediaRouter.java
index 7d1de24..7cda961 100644
--- a/media/java/android/media/MediaRouter.java
+++ b/media/java/android/media/MediaRouter.java
@@ -2220,7 +2220,9 @@ public class MediaRouter {
}
} else {
// We only know how to handle local and remote, fall back to local if not remote.
- session.setPlaybackToLocal(mPlaybackStream);
+ AudioAttributes.Builder bob = new AudioAttributes.Builder();
+ bob.setLegacyStreamType(mPlaybackStream);
+ session.setPlaybackToLocal(bob.build());
mSvp = null;
}
}
diff --git a/media/java/android/media/session/ISession.aidl b/media/java/android/media/session/ISession.aidl
index a92350b..d87a69e 100644
--- a/media/java/android/media/session/ISession.aidl
+++ b/media/java/android/media/session/ISession.aidl
@@ -16,6 +16,7 @@
package android.media.session;
import android.content.ComponentName;
+import android.media.AudioAttributes;
import android.media.MediaMetadata;
import android.media.routing.IMediaRouter;
import android.media.session.ISessionController;
@@ -42,6 +43,7 @@ interface ISession {
void setRatingType(int type);
// These commands relate to volume handling
- void configureVolumeHandling(int type, int arg1, int arg2);
+ void setPlaybackToLocal(in AudioAttributes attributes);
+ void setPlaybackToRemote(int control, int max);
void setCurrentVolume(int currentVolume);
}
diff --git a/media/java/android/media/session/MediaController.java b/media/java/android/media/session/MediaController.java
index 7fedd82..171f4c9 100644
--- a/media/java/android/media/session/MediaController.java
+++ b/media/java/android/media/session/MediaController.java
@@ -18,6 +18,7 @@ package android.media.session;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.MediaMetadata;
import android.media.Rating;
@@ -206,7 +207,7 @@ public final class MediaController {
public @Nullable VolumeInfo getVolumeInfo() {
try {
ParcelableVolumeInfo result = mSessionBinder.getVolumeAttributes();
- return new VolumeInfo(result.volumeType, result.audioStream, result.controlType,
+ return new VolumeInfo(result.volumeType, result.audioAttrs, result.controlType,
result.maxVolume, result.currentVolume);
} catch (RemoteException e) {
@@ -216,8 +217,8 @@ public final class MediaController {
}
/**
- * Set the volume of the stream or output this session is playing on. The
- * command will be ignored if it does not support
+ * Set the volume of the output this session is playing on. The command will
+ * be ignored if it does not support
* {@link VolumeProvider#VOLUME_CONTROL_ABSOLUTE}. The flags in
* {@link AudioManager} may be used to affect the handling.
*
@@ -234,8 +235,8 @@ public final class MediaController {
}
/**
- * Adjust the volume of the stream or output this session is playing on. The
- * direction must be one of {@link AudioManager#ADJUST_LOWER},
+ * Adjust the volume of the output this session is playing on. The direction
+ * must be one of {@link AudioManager#ADJUST_LOWER},
* {@link AudioManager#ADJUST_RAISE}, or {@link AudioManager#ADJUST_SAME}.
* The command will be ignored if the session does not support
* {@link VolumeProvider#VOLUME_CONTROL_RELATIVE} or
@@ -570,17 +571,17 @@ public final class MediaController {
*/
public static final class VolumeInfo {
private final int mVolumeType;
- private final int mAudioStream;
private final int mVolumeControl;
private final int mMaxVolume;
private final int mCurrentVolume;
+ private final AudioAttributes mAudioAttrs;
/**
* @hide
*/
- public VolumeInfo(int type, int stream, int control, int max, int current) {
+ public VolumeInfo(int type, AudioAttributes attrs, int control, int max, int current) {
mVolumeType = type;
- mAudioStream = stream;
+ mAudioAttrs = attrs;
mVolumeControl = control;
mMaxVolume = max;
mCurrentVolume = current;
@@ -600,14 +601,15 @@ public final class MediaController {
}
/**
- * Get the stream this is currently controlling volume on. When the volume
- * type is {@link MediaSession#PLAYBACK_TYPE_REMOTE} this value does not
- * have meaning and should be ignored.
+ * Get the audio attributes for this session. The attributes will affect
+ * volume handling for the session. When the volume type is
+ * {@link MediaSession#PLAYBACK_TYPE_REMOTE} these may be ignored by the
+ * remote volume handler.
*
- * @return The stream this session is playing on.
+ * @return The attributes for this session.
*/
- public int getAudioStream() {
- return mAudioStream;
+ public AudioAttributes getAudioAttributes() {
+ return mAudioAttrs;
}
/**
@@ -679,7 +681,7 @@ public final class MediaController {
public void onVolumeInfoChanged(ParcelableVolumeInfo pvi) {
MediaController controller = mController.get();
if (controller != null) {
- VolumeInfo info = new VolumeInfo(pvi.volumeType, pvi.audioStream, pvi.controlType,
+ VolumeInfo info = new VolumeInfo(pvi.volumeType, pvi.audioAttrs, pvi.controlType,
pvi.maxVolume, pvi.currentVolume);
controller.postMessage(MSG_UPDATE_VOLUME, info, null);
}
diff --git a/media/java/android/media/session/MediaSession.java b/media/java/android/media/session/MediaSession.java
index 086cd23..6662303 100644
--- a/media/java/android/media/session/MediaSession.java
+++ b/media/java/android/media/session/MediaSession.java
@@ -22,6 +22,7 @@ import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.MediaMetadata;
import android.media.Rating;
@@ -268,18 +269,22 @@ public final class MediaSession {
}
/**
- * Set the stream this session is playing on. This will affect the system's
- * volume handling for this session. If {@link #setPlaybackToRemote} was
- * previously called it will stop receiving volume commands and the system
- * will begin sending volume changes to the appropriate stream.
+ * Set the attributes for this session's audio. This will affect the
+ * system's volume handling for this session. If
+ * {@link #setPlaybackToRemote} was previously called it will stop receiving
+ * volume commands and the system will begin sending volume changes to the
+ * appropriate stream.
* <p>
- * By default sessions are on {@link AudioManager#STREAM_MUSIC}.
+ * By default sessions use attributes for media.
*
- * @param stream The {@link AudioManager} stream this session is playing on.
+ * @param attributes The {@link AudioAttributes} for this session's audio.
*/
- public void setPlaybackToLocal(int stream) {
+ public void setPlaybackToLocal(AudioAttributes attributes) {
+ if (attributes == null) {
+ throw new IllegalArgumentException("Attributes cannot be null for local playback.");
+ }
try {
- mBinder.configureVolumeHandling(PLAYBACK_TYPE_LOCAL, stream, 0);
+ mBinder.setPlaybackToLocal(attributes);
} catch (RemoteException e) {
Log.wtf(TAG, "Failure in setPlaybackToLocal.", e);
}
@@ -288,9 +293,10 @@ public final class MediaSession {
/**
* Configure this session to use remote volume handling. This must be called
* to receive volume button events, otherwise the system will adjust the
- * current stream volume for this session. If {@link #setPlaybackToLocal}
- * was previously called that stream will stop receiving volume changes for
- * this session.
+ * appropriate stream volume for this session. If
+ * {@link #setPlaybackToLocal} was previously called the system will stop
+ * handling volume changes for this session and pass them to the volume
+ * provider instead.
*
* @param volumeProvider The provider that will handle volume changes. May
* not be null.
@@ -308,7 +314,7 @@ public final class MediaSession {
});
try {
- mBinder.configureVolumeHandling(PLAYBACK_TYPE_REMOTE, volumeProvider.getVolumeControl(),
+ mBinder.setPlaybackToRemote(volumeProvider.getVolumeControl(),
volumeProvider.getMaxVolume());
} catch (RemoteException e) {
Log.wtf(TAG, "Failure in setPlaybackToRemote.", e);
diff --git a/media/java/android/media/session/ParcelableVolumeInfo.java b/media/java/android/media/session/ParcelableVolumeInfo.java
index 166ccd3..e71b539 100644
--- a/media/java/android/media/session/ParcelableVolumeInfo.java
+++ b/media/java/android/media/session/ParcelableVolumeInfo.java
@@ -15,6 +15,7 @@
package android.media.session;
+import android.media.AudioAttributes;
import android.os.Parcel;
import android.os.Parcelable;
@@ -26,15 +27,16 @@ import android.os.Parcelable;
*/
public class ParcelableVolumeInfo implements Parcelable {
public int volumeType;
- public int audioStream;
+ public AudioAttributes audioAttrs;
public int controlType;
public int maxVolume;
public int currentVolume;
- public ParcelableVolumeInfo(int volumeType, int audioStream, int controlType, int maxVolume,
+ public ParcelableVolumeInfo(int volumeType, AudioAttributes audioAttrs, int controlType,
+ int maxVolume,
int currentVolume) {
this.volumeType = volumeType;
- this.audioStream = audioStream;
+ this.audioAttrs = audioAttrs;
this.controlType = controlType;
this.maxVolume = maxVolume;
this.currentVolume = currentVolume;
@@ -42,10 +44,10 @@ public class ParcelableVolumeInfo implements Parcelable {
public ParcelableVolumeInfo(Parcel from) {
volumeType = from.readInt();
- audioStream = from.readInt();
controlType = from.readInt();
maxVolume = from.readInt();
currentVolume = from.readInt();
+ audioAttrs = AudioAttributes.CREATOR.createFromParcel(from);
}
@Override
@@ -56,10 +58,10 @@ public class ParcelableVolumeInfo implements Parcelable {
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(volumeType);
- dest.writeInt(audioStream);
dest.writeInt(controlType);
dest.writeInt(maxVolume);
dest.writeInt(currentVolume);
+ audioAttrs.writeToParcel(dest, flags);
}
diff --git a/services/core/java/com/android/server/media/MediaSessionRecord.java b/services/core/java/com/android/server/media/MediaSessionRecord.java
index ede3dab..4304b59 100644
--- a/services/core/java/com/android/server/media/MediaSessionRecord.java
+++ b/services/core/java/com/android/server/media/MediaSessionRecord.java
@@ -31,6 +31,7 @@ import android.media.session.MediaSession;
import android.media.session.MediaSessionInfo;
import android.media.session.PlaybackState;
import android.media.session.ParcelableVolumeInfo;
+import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.MediaMetadata;
import android.media.Rating;
@@ -105,9 +106,9 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
// End TransportPerformer fields
// Volume handling fields
+ private AudioAttributes mAudioAttrs;
private AudioManager mAudioManager;
private int mVolumeType = MediaSession.PLAYBACK_TYPE_LOCAL;
- private int mAudioStream = AudioManager.STREAM_MUSIC;
private int mVolumeControlType = VolumeProvider.VOLUME_CONTROL_ABSOLUTE;
private int mMaxVolume = 0;
private int mCurrentVolume = 0;
@@ -131,6 +132,7 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
mService = service;
mHandler = new MessageHandler(handler.getLooper());
mAudioManager = (AudioManager) service.getContext().getSystemService(Context.AUDIO_SERVICE);
+ mAudioAttrs = new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_MEDIA).build();
}
/**
@@ -219,7 +221,8 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
direction = -1;
}
if (mVolumeType == MediaSession.PLAYBACK_TYPE_LOCAL) {
- mAudioManager.adjustStreamVolume(mAudioStream, direction, flags);
+ int stream = AudioAttributes.toLegacyStreamType(mAudioAttrs);
+ mAudioManager.adjustStreamVolume(stream, direction, flags);
} else {
if (mVolumeControlType == VolumeProvider.VOLUME_CONTROL_FIXED) {
// Nothing to do, the volume cannot be changed
@@ -245,7 +248,8 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
public void setVolumeTo(int value, int flags) {
if (mVolumeType == MediaSession.PLAYBACK_TYPE_LOCAL) {
- mAudioManager.setStreamVolume(mAudioStream, value, flags);
+ int stream = AudioAttributes.toLegacyStreamType(mAudioAttrs);
+ mAudioManager.setStreamVolume(stream, value, flags);
} else {
if (mVolumeControlType != VolumeProvider.VOLUME_CONTROL_ABSOLUTE) {
// Nothing to do. The volume can't be set directly.
@@ -315,8 +319,8 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
*
* @return The audio stream the session is using.
*/
- public int getAudioStream() {
- return mAudioStream;
+ public AudioAttributes getAudioAttributes() {
+ return mAudioAttrs;
}
/**
@@ -613,36 +617,34 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
}
@Override
- public void configureVolumeHandling(int type, int arg1, int arg2) throws RemoteException {
- boolean typeChanged = type != mVolumeType;
- switch(type) {
- case MediaSession.PLAYBACK_TYPE_LOCAL:
- mVolumeType = type;
- int audioStream = arg1;
- if (isValidStream(audioStream)) {
- mAudioStream = audioStream;
- } else {
- Log.e(TAG, "Cannot set stream to " + audioStream + ". Using music stream");
- mAudioStream = AudioManager.STREAM_MUSIC;
- }
- break;
- case MediaSession.PLAYBACK_TYPE_REMOTE:
- mVolumeType = type;
- mVolumeControlType = arg1;
- mMaxVolume = arg2;
- break;
- default:
- throw new IllegalArgumentException("Volume handling type " + type
- + " not recognized.");
+ public void setPlaybackToLocal(AudioAttributes attributes) {
+ boolean typeChanged;
+ synchronized (mLock) {
+ typeChanged = mVolumeType == MediaSession.PLAYBACK_TYPE_REMOTE;
+ mVolumeType = MediaSession.PLAYBACK_TYPE_LOCAL;
+ if (attributes != null) {
+ mAudioAttrs = attributes;
+ } else {
+ Log.e(TAG, "Received null audio attributes, using existing attributes");
+ }
}
if (typeChanged) {
mService.onSessionPlaybackTypeChanged(MediaSessionRecord.this);
}
}
- private boolean isValidStream(int stream) {
- return stream >= AudioManager.STREAM_VOICE_CALL
- && stream <= AudioManager.STREAM_NOTIFICATION;
+ @Override
+ public void setPlaybackToRemote(int control, int max) {
+ boolean typeChanged;
+ synchronized (mLock) {
+ typeChanged = mVolumeType == MediaSession.PLAYBACK_TYPE_LOCAL;
+ mVolumeType = MediaSession.PLAYBACK_TYPE_REMOTE;
+ mVolumeControlType = control;
+ mMaxVolume = max;
+ }
+ if (typeChanged) {
+ mService.onSessionPlaybackTypeChanged(MediaSessionRecord.this);
+ }
}
}
@@ -822,11 +824,12 @@ public class MediaSessionRecord implements IBinder.DeathRecipient {
current = mOptimisticVolume != -1 ? mOptimisticVolume
: mCurrentVolume;
} else {
+ int stream = AudioAttributes.toLegacyStreamType(mAudioAttrs);
type = VolumeProvider.VOLUME_CONTROL_ABSOLUTE;
- max = mAudioManager.getStreamMaxVolume(mAudioStream);
- current = mAudioManager.getStreamVolume(mAudioStream);
+ max = mAudioManager.getStreamMaxVolume(stream);
+ current = mAudioManager.getStreamVolume(stream);
}
- return new ParcelableVolumeInfo(mVolumeType, mAudioStream, type, max, current);
+ return new ParcelableVolumeInfo(mVolumeType, mAudioAttrs, type, max, current);
}
}