summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--media/java/android/media/AudioAttributes.java17
-rw-r--r--media/java/android/media/IAudioService.aidl2
-rw-r--r--media/java/android/media/PlayerBase.java1
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java4
-rw-r--r--services/core/java/com/android/server/audio/PlaybackActivityMonitor.java29
5 files changed, 49 insertions, 4 deletions
diff --git a/media/java/android/media/AudioAttributes.java b/media/java/android/media/AudioAttributes.java
index f4039889aded..3b9a5de00707 100644
--- a/media/java/android/media/AudioAttributes.java
+++ b/media/java/android/media/AudioAttributes.java
@@ -842,8 +842,8 @@ public final class AudioAttributes implements Parcelable {
@Override
public String toString () {
return new String("AudioAttributes:"
- + " usage=" + mUsage
- + " content=" + mContentType
+ + " usage=" + usageToString()
+ + " content=" + contentTypeToString()
+ " flags=0x" + Integer.toHexString(mFlags).toUpperCase()
+ " tags=" + mFormattedTags
+ " bundle=" + (mBundle == null ? "null" : mBundle.toString()));
@@ -894,6 +894,19 @@ public final class AudioAttributes implements Parcelable {
}
}
+ /** @hide */
+ public String contentTypeToString() {
+ switch(mContentType) {
+ case CONTENT_TYPE_UNKNOWN:
+ return new String("CONTENT_TYPE_UNKNOWN");
+ case CONTENT_TYPE_SPEECH: return new String("CONTENT_TYPE_SPEECH");
+ case CONTENT_TYPE_MUSIC: return new String("CONTENT_TYPE_MUSIC");
+ case CONTENT_TYPE_MOVIE: return new String("CONTENT_TYPE_MOVIE");
+ case CONTENT_TYPE_SONIFICATION: return new String("CONTENT_TYPE_SONIFICATION");
+ default: return new String("unknown content type " + mContentType);
+ }
+ }
+
private static int usageForStreamType(int streamType) {
switch(streamType) {
case AudioSystem.STREAM_VOICE_CALL:
diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl
index 9c138e30e929..bb6ae9863d31 100644
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -201,5 +201,7 @@ interface IAudioService {
int dispatchFocusChange(in AudioFocusInfo afi, in int focusChange,
in IAudioPolicyCallback pcb);
+ oneway void playerHasOpPlayAudio(in int piid, in boolean hasOpPlayAudio);
+
// WARNING: read warning at top of file, it is recommended to add new methods at the end
}
diff --git a/media/java/android/media/PlayerBase.java b/media/java/android/media/PlayerBase.java
index 9bd93aa31abf..4808d7a5aa6a 100644
--- a/media/java/android/media/PlayerBase.java
+++ b/media/java/android/media/PlayerBase.java
@@ -276,6 +276,7 @@ public abstract class PlayerBase {
// volume used by the player
try {
if (oldHasAppOpsPlayAudio != mHasAppOpsPlayAudio) {
+ getService().playerHasOpPlayAudio(mPlayerIId, mHasAppOpsPlayAudio);
if (mHasAppOpsPlayAudio) {
if (DEBUG_APP_OPS) {
Log.v(TAG, "updateAppOpsPlayAudio: unmuting player, vol=" + mLeftVolume
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index f88f779b1676..faf4729ead35 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -6973,6 +6973,10 @@ public class AudioService extends IAudioService.Stub
mPlaybackMonitor.playerEvent(piid, event, Binder.getCallingUid());
}
+ public void playerHasOpPlayAudio(int piid, boolean hasOpPlayAudio) {
+ mPlaybackMonitor.playerHasOpPlayAudio(piid, hasOpPlayAudio, Binder.getCallingUid());
+ }
+
public void releasePlayer(int piid) {
mPlaybackMonitor.releasePlayer(piid, Binder.getCallingUid());
}
diff --git a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
index c075cdceb685..3e5eed320ccd 100644
--- a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
+++ b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java
@@ -214,6 +214,11 @@ public final class PlaybackActivityMonitor
}
}
+ public void playerHasOpPlayAudio(int piid, boolean hasOpPlayAudio, int binderUid) {
+ // no check on UID yet because this is only for logging at the moment
+ mEventLogger.log(new PlayerOpPlayAudioEvent(piid, hasOpPlayAudio, binderUid));
+ }
+
public void releasePlayer(int piid, int binderUid) {
if (DEBUG) { Log.v(TAG, "releasePlayer() for piid=" + piid); }
synchronized(mPlayerLock) {
@@ -702,8 +707,28 @@ public final class PlaybackActivityMonitor
@Override
public String eventToString() {
- return new String("player piid:" + mPlayerIId + " state:"
- + AudioPlaybackConfiguration.toLogFriendlyPlayerState(mState));
+ return new StringBuilder("player piid:").append(mPlayerIId).append(" state:")
+ .append(AudioPlaybackConfiguration.toLogFriendlyPlayerState(mState)).toString();
+ }
+ }
+
+ private final static class PlayerOpPlayAudioEvent extends AudioEventLogger.Event {
+ // only keeping the player interface ID as it uniquely identifies the player in the event
+ final int mPlayerIId;
+ final boolean mHasOp;
+ final int mUid;
+
+ PlayerOpPlayAudioEvent(int piid, boolean hasOp, int uid) {
+ mPlayerIId = piid;
+ mHasOp = hasOp;
+ mUid = uid;
+ }
+
+ @Override
+ public String eventToString() {
+ return new StringBuilder("player piid:").append(mPlayerIId)
+ .append(" has OP_PLAY_AUDIO:").append(mHasOp)
+ .append(" in uid:").append(mUid).toString();
}
}