Merge "AudioService: internal API for disabling audio playback for a UID" into oc-dr1-dev
am: 8f81919093
Change-Id: Ie83d16ac25f0bf3cea14822481c47a61c82126c6
This commit is contained in:
@@ -59,4 +59,15 @@ public abstract class AudioManagerInternal {
|
|||||||
|
|
||||||
int getRingerModeAffectedStreams(int streams);
|
int getRingerModeAffectedStreams(int streams);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disable or restore the ability to play audio for a given UID.
|
||||||
|
* When a UID isn't meant to be tracked anymore (e.g. client died), re-enable audio for this UID
|
||||||
|
* to prevent disabling audio for future UIDs that would reuse the same value.
|
||||||
|
* This operation is asynchronous.
|
||||||
|
* @param disable when true, prevents playback of audio streams from the given uid. If false,
|
||||||
|
* restores the ability to play, or no-op if playback hadn't been disabled before.
|
||||||
|
* @param uid the client UID whose ability to play will be affected.
|
||||||
|
*/
|
||||||
|
public abstract void disableAudioForUid(boolean disable, int uid);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -239,6 +239,7 @@ public class AudioService extends IAudioService.Stub
|
|||||||
private static final int MSG_SET_A2DP_SRC_CONNECTION_STATE = 101;
|
private static final int MSG_SET_A2DP_SRC_CONNECTION_STATE = 101;
|
||||||
private static final int MSG_SET_A2DP_SINK_CONNECTION_STATE = 102;
|
private static final int MSG_SET_A2DP_SINK_CONNECTION_STATE = 102;
|
||||||
private static final int MSG_A2DP_DEVICE_CONFIG_CHANGE = 103;
|
private static final int MSG_A2DP_DEVICE_CONFIG_CHANGE = 103;
|
||||||
|
private static final int MSG_DISABLE_AUDIO_FOR_UID = 104;
|
||||||
// end of messages handled under wakelock
|
// end of messages handled under wakelock
|
||||||
|
|
||||||
private static final int BTA2DP_DOCK_TIMEOUT_MILLIS = 8000;
|
private static final int BTA2DP_DOCK_TIMEOUT_MILLIS = 8000;
|
||||||
@@ -4871,6 +4872,12 @@ public class AudioService extends IAudioService.Stub
|
|||||||
mAudioEventWakeLock.release();
|
mAudioEventWakeLock.release();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MSG_DISABLE_AUDIO_FOR_UID:
|
||||||
|
mPlaybackMonitor.disableAudioForUid( msg.arg1 == 1 /* disable */,
|
||||||
|
msg.arg2 /* uid */);
|
||||||
|
mAudioEventWakeLock.release();
|
||||||
|
break;
|
||||||
|
|
||||||
case MSG_REPORT_NEW_ROUTES: {
|
case MSG_REPORT_NEW_ROUTES: {
|
||||||
int N = mRoutesObservers.beginBroadcast();
|
int N = mRoutesObservers.beginBroadcast();
|
||||||
if (N > 0) {
|
if (N > 0) {
|
||||||
@@ -6591,6 +6598,13 @@ public class AudioService extends IAudioService.Stub
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void disableAudioForUid(boolean disable, int uid) {
|
||||||
|
queueMsgUnderWakeLock(mAudioHandler, MSG_DISABLE_AUDIO_FOR_UID,
|
||||||
|
disable ? 1 : 0 /* arg1 */, uid /* arg2 */,
|
||||||
|
null /* obj */, 0 /* delay */);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//==========================================================================================
|
//==========================================================================================
|
||||||
|
|||||||
@@ -94,6 +94,43 @@ public final class PlaybackActivityMonitor
|
|||||||
AudioPlaybackConfiguration.sPlayerDeathMonitor = this;
|
AudioPlaybackConfiguration.sPlayerDeathMonitor = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//=================================================================
|
||||||
|
private final ArrayList<Integer> mBannedUids = new ArrayList<Integer>();
|
||||||
|
|
||||||
|
// see AudioManagerInternal.disableAudioForUid(boolean disable, int uid)
|
||||||
|
public void disableAudioForUid(boolean disable, int uid) {
|
||||||
|
synchronized(mPlayerLock) {
|
||||||
|
final int index = mBannedUids.indexOf(new Integer(uid));
|
||||||
|
if (index >= 0) {
|
||||||
|
if (!disable) {
|
||||||
|
mBannedUids.remove(index);
|
||||||
|
// nothing else to do, future playback requests from this uid are ok
|
||||||
|
} // no else to handle, uid already present, so disabling again is no-op
|
||||||
|
} else {
|
||||||
|
if (disable) {
|
||||||
|
for (AudioPlaybackConfiguration apc : mPlayers.values()) {
|
||||||
|
checkBanPlayer(apc, uid);
|
||||||
|
}
|
||||||
|
mBannedUids.add(new Integer(uid));
|
||||||
|
} // no else to handle, uid already not in list, so enabling again is no-op
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean checkBanPlayer(@NonNull AudioPlaybackConfiguration apc, int uid) {
|
||||||
|
final boolean toBan = (apc.getClientUid() == uid);
|
||||||
|
if (toBan) {
|
||||||
|
final int piid = apc.getPlayerInterfaceId();
|
||||||
|
try {
|
||||||
|
Log.v(TAG, "banning player " + piid + " uid:" + uid);
|
||||||
|
apc.getPlayerProxy().pause();
|
||||||
|
} catch (Exception e) {
|
||||||
|
Log.e(TAG, "error banning player " + piid + " uid:" + uid, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return toBan;
|
||||||
|
}
|
||||||
|
|
||||||
//=================================================================
|
//=================================================================
|
||||||
// Track players and their states
|
// Track players and their states
|
||||||
// methods playerAttributes, playerEvent, releasePlayer are all oneway calls
|
// methods playerAttributes, playerEvent, releasePlayer are all oneway calls
|
||||||
@@ -137,6 +174,14 @@ public final class PlaybackActivityMonitor
|
|||||||
if (apc == null) {
|
if (apc == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (event == AudioPlaybackConfiguration.PLAYER_STATE_STARTED) {
|
||||||
|
for (Integer uidInteger: mBannedUids) {
|
||||||
|
if (checkBanPlayer(apc, uidInteger.intValue())) {
|
||||||
|
// player was banned, do not update its state
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if (apc.getPlayerType() == AudioPlaybackConfiguration.PLAYER_TYPE_JAM_SOUNDPOOL) {
|
if (apc.getPlayerType() == AudioPlaybackConfiguration.PLAYER_TYPE_JAM_SOUNDPOOL) {
|
||||||
// FIXME SoundPool not ready for state reporting
|
// FIXME SoundPool not ready for state reporting
|
||||||
return;
|
return;
|
||||||
@@ -186,10 +231,17 @@ public final class PlaybackActivityMonitor
|
|||||||
pw.println("\n ducked players:");
|
pw.println("\n ducked players:");
|
||||||
mDuckingManager.dump(pw);
|
mDuckingManager.dump(pw);
|
||||||
// players muted due to the device ringing or being in a call
|
// players muted due to the device ringing or being in a call
|
||||||
pw.println("\n muted player piids:");
|
pw.print("\n muted player piids:");
|
||||||
for (int piid : mMutedPlayers) {
|
for (int piid : mMutedPlayers) {
|
||||||
pw.println(" " + piid);
|
pw.print(" " + piid);
|
||||||
}
|
}
|
||||||
|
pw.println();
|
||||||
|
// banned players:
|
||||||
|
pw.print("\n banned uids:");
|
||||||
|
for (int uid : mBannedUids) {
|
||||||
|
pw.print(" " + uid);
|
||||||
|
}
|
||||||
|
pw.println();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user