Merge "AudioService: log focus changes and limit focus stack size" into oc-mr1-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
5bd051d981
@@ -49,9 +49,9 @@ public class AudioEventLogger {
|
||||
}
|
||||
|
||||
/**
|
||||
* Causes the string message for the event to appear in the verbose logcat.
|
||||
* Causes the string message for the event to appear in the logcat.
|
||||
* Here is an example of how to create a new event (a StringEvent), adding it to the logger
|
||||
* (an instance of AudioEventLogger) while also making it show in the verbose logcat:
|
||||
* (an instance of AudioEventLogger) while also making it show in the logcat:
|
||||
* <pre>
|
||||
* myLogger.log(
|
||||
* (new StringEvent("something for logcat and logger")).printLog(MyClass.TAG) );
|
||||
@@ -60,7 +60,7 @@ public class AudioEventLogger {
|
||||
* @return the same instance of the event
|
||||
*/
|
||||
public Event printLog(String tag) {
|
||||
Log.v(tag, eventToString());
|
||||
Log.i(tag, eventToString());
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
@@ -89,6 +89,9 @@ public class MediaFocusControl implements PlayerFocusEnforcer {
|
||||
pw.println("\nMediaFocusControl dump time: "
|
||||
+ DateFormat.getTimeInstance().format(new Date()));
|
||||
dumpFocusStack(pw);
|
||||
pw.println("\n");
|
||||
// log
|
||||
mEventLogger.dump(pw);
|
||||
}
|
||||
|
||||
//=================================================================
|
||||
@@ -119,6 +122,14 @@ public class MediaFocusControl implements PlayerFocusEnforcer {
|
||||
|
||||
private final static Object mAudioFocusLock = new Object();
|
||||
|
||||
/**
|
||||
* Arbitrary maximum size of audio focus stack to prevent apps OOM'ing this process.
|
||||
*/
|
||||
private static final int MAX_STACK_SIZE = 100;
|
||||
|
||||
private static final AudioEventLogger mEventLogger = new AudioEventLogger(50,
|
||||
"focus commands as seen by MediaFocusControl");
|
||||
|
||||
/**
|
||||
* Discard the current audio focus owner.
|
||||
* Notify top of audio focus stack that it lost focus (regardless of possibility to reassign
|
||||
@@ -643,11 +654,14 @@ public class MediaFocusControl implements PlayerFocusEnforcer {
|
||||
protected int requestAudioFocus(AudioAttributes aa, int focusChangeHint, IBinder cb,
|
||||
IAudioFocusDispatcher fd, String clientId, String callingPackageName, int flags,
|
||||
int sdk) {
|
||||
Log.i(TAG, " AudioFocus requestAudioFocus() from uid/pid " + Binder.getCallingUid()
|
||||
+ "/" + Binder.getCallingPid()
|
||||
+ " clientId=" + clientId
|
||||
+ " req=" + focusChangeHint
|
||||
+ " flags=0x" + Integer.toHexString(flags));
|
||||
mEventLogger.log((new AudioEventLogger.StringEvent(
|
||||
"requestAudioFocus() from uid/pid " + Binder.getCallingUid()
|
||||
+ "/" + Binder.getCallingPid()
|
||||
+ " clientId=" + clientId + " callingPack=" + callingPackageName
|
||||
+ " req=" + focusChangeHint
|
||||
+ " flags=0x" + Integer.toHexString(flags)
|
||||
+ " sdk=" + sdk))
|
||||
.printLog(TAG));
|
||||
// we need a valid binder callback for clients
|
||||
if (!cb.pingBinder()) {
|
||||
Log.e(TAG, " AudioFocus DOA client for requestAudioFocus(), aborting.");
|
||||
@@ -660,6 +674,11 @@ public class MediaFocusControl implements PlayerFocusEnforcer {
|
||||
}
|
||||
|
||||
synchronized(mAudioFocusLock) {
|
||||
if (mFocusStack.size() > MAX_STACK_SIZE) {
|
||||
Log.e(TAG, "Max AudioFocus stack size reached, failing requestAudioFocus()");
|
||||
return AudioManager.AUDIOFOCUS_REQUEST_FAILED;
|
||||
}
|
||||
|
||||
boolean enteringRingOrCall = !mRingOrCallActive
|
||||
& (AudioSystem.IN_VOICE_COMM_FOCUS_ID.compareTo(clientId) == 0);
|
||||
if (enteringRingOrCall) { mRingOrCallActive = true; }
|
||||
@@ -770,10 +789,12 @@ public class MediaFocusControl implements PlayerFocusEnforcer {
|
||||
* */
|
||||
protected int abandonAudioFocus(IAudioFocusDispatcher fl, String clientId, AudioAttributes aa,
|
||||
String callingPackageName) {
|
||||
// AudioAttributes are currently ignored, to be used for zones
|
||||
Log.i(TAG, " AudioFocus abandonAudioFocus() from uid/pid " + Binder.getCallingUid()
|
||||
+ "/" + Binder.getCallingPid()
|
||||
+ " clientId=" + clientId);
|
||||
// AudioAttributes are currently ignored, to be used for zones / a11y
|
||||
mEventLogger.log((new AudioEventLogger.StringEvent(
|
||||
"abandonAudioFocus() from uid/pid " + Binder.getCallingUid()
|
||||
+ "/" + Binder.getCallingPid()
|
||||
+ " clientId=" + clientId))
|
||||
.printLog(TAG));
|
||||
try {
|
||||
// this will take care of notifying the new focus owner if needed
|
||||
synchronized(mAudioFocusLock) {
|
||||
|
||||
Reference in New Issue
Block a user