From f5f3e6894713fc0052c69d8f7d7b5b714a860ac7 Mon Sep 17 00:00:00 2001 From: Jean-Michel Trivi Date: Wed, 29 Jul 2020 15:45:48 -0700 Subject: [PATCH] AudioService: enable reusing an AudioPolicy Enable registering/unregistering an AudioPolicy, and then registering it again later. Doing so was failing before as when a policy was re-registered, its mix count didn't restart at 0 on the client side, causing the mix to have an invalid registration string not in sync with the policy configuration on the server side. Bug: 161491896 Test: atest AudioHostTest#testAudioPolicyReuse Change-Id: I51fc41c46817791de4ce3a4f9d36c38d9466602e --- media/java/android/media/AudioManager.java | 4 ++-- media/java/android/media/AudioRecord.java | 5 +++++ media/java/android/media/audiopolicy/AudioPolicy.java | 11 +++++++++++ .../android/media/audiopolicy/AudioPolicyConfig.java | 6 +++++- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java index 3ac71b2cff1d1..928fb62e07f04 100755 --- a/media/java/android/media/AudioManager.java +++ b/media/java/android/media/AudioManager.java @@ -3801,7 +3801,7 @@ public class AudioManager { final IAudioService service = getService(); try { service.unregisterAudioPolicyAsync(policy.cb()); - policy.setRegistration(null); + policy.reset(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -3823,7 +3823,7 @@ public class AudioManager { try { policy.invalidateCaptorsAndInjectors(); service.unregisterAudioPolicy(policy.cb()); - policy.setRegistration(null); + policy.reset(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java index 4d26b8d3f7af9..c9cdbb0ed2771 100644 --- a/media/java/android/media/AudioRecord.java +++ b/media/java/android/media/AudioRecord.java @@ -487,6 +487,11 @@ public class AudioRecord implements AudioRouting, MicrophoneDirection, } } + /** @hide */ + public AudioAttributes getAudioAttributes() { + return mAudioAttributes; + } + /** * Builder class for {@link AudioRecord} objects. * Use this class to configure and create an AudioRecord instance. By setting the diff --git a/media/java/android/media/audiopolicy/AudioPolicy.java b/media/java/android/media/audiopolicy/AudioPolicy.java index d3e9c7e91056b..8a17465c53b3c 100644 --- a/media/java/android/media/audiopolicy/AudioPolicy.java +++ b/media/java/android/media/audiopolicy/AudioPolicy.java @@ -553,6 +553,12 @@ public class AudioPolicy { } } + /** @hide */ + public void reset() { + setRegistration(null); + mConfig.reset(); + } + public void setRegistration(String regId) { synchronized (mLock) { mRegistrationId = regId; @@ -566,6 +572,11 @@ public class AudioPolicy { sendMsg(MSG_POLICY_STATUS_CHANGE); } + /**@hide*/ + public String getRegistration() { + return mRegistrationId; + } + private boolean policyReadyToUse() { synchronized (mLock) { if (mStatus != POLICY_STATUS_REGISTERED) { diff --git a/media/java/android/media/audiopolicy/AudioPolicyConfig.java b/media/java/android/media/audiopolicy/AudioPolicyConfig.java index 91b9bb3f64c0b..561a8847feed5 100644 --- a/media/java/android/media/audiopolicy/AudioPolicyConfig.java +++ b/media/java/android/media/audiopolicy/AudioPolicyConfig.java @@ -162,7 +162,7 @@ public class AudioPolicyConfig implements Parcelable { public String toLogFriendlyString () { String textDump = new String("android.media.audiopolicy.AudioPolicyConfig:\n"); - textDump += mMixes.size() + " AudioMix: "+ mRegistrationId + "\n"; + textDump += mMixes.size() + " AudioMix, reg:" + mRegistrationId + "\n"; for(AudioMix mix : mMixes) { // write mix route flags textDump += "* route flags=0x" + Integer.toHexString(mix.getRouteFlags()) + "\n"; @@ -220,6 +220,10 @@ public class AudioPolicyConfig implements Parcelable { return textDump; } + protected void reset() { + mMixCounter = 0; + } + protected void setRegistration(String regId) { final boolean currentRegNull = (mRegistrationId == null) || mRegistrationId.isEmpty(); final boolean newRegNull = (regId == null) || regId.isEmpty();