Loading api/system-current.txt +2 −0 Original line number Diff line number Diff line Loading @@ -2649,8 +2649,10 @@ package android.media.audiopolicy { } public class AudioPolicy { method public int attachMixes(java.util.List<android.media.audiopolicy.AudioMix>); method public android.media.AudioRecord createAudioRecordSink(android.media.audiopolicy.AudioMix) throws java.lang.IllegalArgumentException; method public android.media.AudioTrack createAudioTrackSource(android.media.audiopolicy.AudioMix) throws java.lang.IllegalArgumentException; method public int detachMixes(java.util.List<android.media.audiopolicy.AudioMix>); method public int getFocusDuckingBehavior(); method public int getStatus(); method public int setFocusDuckingBehavior(int) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException; Loading media/java/android/media/IAudioService.aidl +4 −0 Original line number Diff line number Diff line Loading @@ -181,6 +181,10 @@ interface IAudioService { oneway void unregisterAudioPolicyAsync(in IAudioPolicyCallback pcb); int addMixForPolicy(in AudioPolicyConfig policyConfig, in IAudioPolicyCallback pcb); int removeMixForPolicy(in AudioPolicyConfig policyConfig, in IAudioPolicyCallback pcb); int setFocusPropertiesForPolicy(int duckingBehavior, in IAudioPolicyCallback pcb); void setVolumePolicy(in VolumePolicy policy); Loading media/java/android/media/audiopolicy/AudioMix.java +13 −0 Original line number Diff line number Diff line Loading @@ -161,6 +161,19 @@ public class AudioMix { return mDeviceAddress; } /** @hide */ @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; final AudioMix that = (AudioMix) o; return (this.mRouteFlags == that.mRouteFlags) && (this.mRule == that.mRule) && (this.mMixType == that.mMixType) && (this.mFormat == that.mFormat); } /** @hide */ @Override public int hashCode() { Loading media/java/android/media/audiopolicy/AudioMixingRule.java +20 −0 Original line number Diff line number Diff line Loading @@ -135,11 +135,31 @@ public class AudioMixingRule { } } private static boolean areCriteriaEquivalent(ArrayList<AudioMixMatchCriterion> cr1, ArrayList<AudioMixMatchCriterion> cr2) { if (cr1 == null || cr2 == null) return false; if (cr1 == cr2) return true; if (cr1.size() != cr2.size()) return false; //TODO iterate over rules to check they contain the same criterion return (cr1.hashCode() == cr2.hashCode()); } private final int mTargetMixType; int getTargetMixType() { return mTargetMixType; } private final ArrayList<AudioMixMatchCriterion> mCriteria; ArrayList<AudioMixMatchCriterion> getCriteria() { return mCriteria; } /** @hide */ @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; final AudioMixingRule that = (AudioMixingRule) o; return (this.mTargetMixType == that.mTargetMixType) && (areCriteriaEquivalent(this.mCriteria, that.mCriteria)); } @Override public int hashCode() { return Objects.hash(mTargetMixType, mCriteria); Loading media/java/android/media/audiopolicy/AudioPolicy.java +84 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import android.util.Slog; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.List; /** * @hide Loading Loading @@ -256,6 +257,89 @@ public class AudioPolicy { } } /** * @hide * Update the current configuration of the set of audio mixes by adding new ones, while * keeping the policy registered. * This method can only be called on a registered policy. * @param mixes the list of {@link AudioMix} to add * @return {@link AudioManager#SUCCESS} if the change was successful, {@link AudioManager#ERROR} * otherwise. */ @SystemApi public int attachMixes(@NonNull List<AudioMix> mixes) { if (mixes == null) { throw new IllegalArgumentException("Illegal null list of AudioMix"); } synchronized (mLock) { if (mStatus != POLICY_STATUS_REGISTERED) { throw new IllegalStateException("Cannot alter unregistered AudioPolicy"); } final ArrayList<AudioMix> zeMixes = new ArrayList<AudioMix>(mixes.size()); for (AudioMix mix : mixes) { if (mix == null) { throw new IllegalArgumentException("Illegal null AudioMix in attachMixes"); } else { zeMixes.add(mix); } } final AudioPolicyConfig cfg = new AudioPolicyConfig(zeMixes); IAudioService service = getService(); try { final int status = service.addMixForPolicy(cfg, this.cb()); if (status == AudioManager.SUCCESS) { mConfig.add(zeMixes); } return status; } catch (RemoteException e) { Log.e(TAG, "Dead object in attachMixes", e); return AudioManager.ERROR; } } } /** * @hide * Update the current configuration of the set of audio mixes by removing some, while * keeping the policy registered. * This method can only be called on a registered policy. * @param mixes the list of {@link AudioMix} to remove * @return {@link AudioManager#SUCCESS} if the change was successful, {@link AudioManager#ERROR} * otherwise. */ @SystemApi public int detachMixes(@NonNull List<AudioMix> mixes) { if (mixes == null) { throw new IllegalArgumentException("Illegal null list of AudioMix"); } synchronized (mLock) { if (mStatus != POLICY_STATUS_REGISTERED) { throw new IllegalStateException("Cannot alter unregistered AudioPolicy"); } final ArrayList<AudioMix> zeMixes = new ArrayList<AudioMix>(mixes.size()); for (AudioMix mix : mixes) { if (mix == null) { throw new IllegalArgumentException("Illegal null AudioMix in detachMixes"); // TODO also check mix is currently contained in list of mixes } else { zeMixes.add(mix); } } final AudioPolicyConfig cfg = new AudioPolicyConfig(zeMixes); IAudioService service = getService(); try { final int status = service.removeMixForPolicy(cfg, this.cb()); if (status == AudioManager.SUCCESS) { mConfig.remove(zeMixes); } return status; } catch (RemoteException e) { Log.e(TAG, "Dead object in detachMixes", e); return AudioManager.ERROR; } } } public void setRegistration(String regId) { synchronized (mLock) { mRegistrationId = regId; Loading Loading
api/system-current.txt +2 −0 Original line number Diff line number Diff line Loading @@ -2649,8 +2649,10 @@ package android.media.audiopolicy { } public class AudioPolicy { method public int attachMixes(java.util.List<android.media.audiopolicy.AudioMix>); method public android.media.AudioRecord createAudioRecordSink(android.media.audiopolicy.AudioMix) throws java.lang.IllegalArgumentException; method public android.media.AudioTrack createAudioTrackSource(android.media.audiopolicy.AudioMix) throws java.lang.IllegalArgumentException; method public int detachMixes(java.util.List<android.media.audiopolicy.AudioMix>); method public int getFocusDuckingBehavior(); method public int getStatus(); method public int setFocusDuckingBehavior(int) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException; Loading
media/java/android/media/IAudioService.aidl +4 −0 Original line number Diff line number Diff line Loading @@ -181,6 +181,10 @@ interface IAudioService { oneway void unregisterAudioPolicyAsync(in IAudioPolicyCallback pcb); int addMixForPolicy(in AudioPolicyConfig policyConfig, in IAudioPolicyCallback pcb); int removeMixForPolicy(in AudioPolicyConfig policyConfig, in IAudioPolicyCallback pcb); int setFocusPropertiesForPolicy(int duckingBehavior, in IAudioPolicyCallback pcb); void setVolumePolicy(in VolumePolicy policy); Loading
media/java/android/media/audiopolicy/AudioMix.java +13 −0 Original line number Diff line number Diff line Loading @@ -161,6 +161,19 @@ public class AudioMix { return mDeviceAddress; } /** @hide */ @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; final AudioMix that = (AudioMix) o; return (this.mRouteFlags == that.mRouteFlags) && (this.mRule == that.mRule) && (this.mMixType == that.mMixType) && (this.mFormat == that.mFormat); } /** @hide */ @Override public int hashCode() { Loading
media/java/android/media/audiopolicy/AudioMixingRule.java +20 −0 Original line number Diff line number Diff line Loading @@ -135,11 +135,31 @@ public class AudioMixingRule { } } private static boolean areCriteriaEquivalent(ArrayList<AudioMixMatchCriterion> cr1, ArrayList<AudioMixMatchCriterion> cr2) { if (cr1 == null || cr2 == null) return false; if (cr1 == cr2) return true; if (cr1.size() != cr2.size()) return false; //TODO iterate over rules to check they contain the same criterion return (cr1.hashCode() == cr2.hashCode()); } private final int mTargetMixType; int getTargetMixType() { return mTargetMixType; } private final ArrayList<AudioMixMatchCriterion> mCriteria; ArrayList<AudioMixMatchCriterion> getCriteria() { return mCriteria; } /** @hide */ @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; final AudioMixingRule that = (AudioMixingRule) o; return (this.mTargetMixType == that.mTargetMixType) && (areCriteriaEquivalent(this.mCriteria, that.mCriteria)); } @Override public int hashCode() { return Objects.hash(mTargetMixType, mCriteria); Loading
media/java/android/media/audiopolicy/AudioPolicy.java +84 −0 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import android.util.Slog; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.List; /** * @hide Loading Loading @@ -256,6 +257,89 @@ public class AudioPolicy { } } /** * @hide * Update the current configuration of the set of audio mixes by adding new ones, while * keeping the policy registered. * This method can only be called on a registered policy. * @param mixes the list of {@link AudioMix} to add * @return {@link AudioManager#SUCCESS} if the change was successful, {@link AudioManager#ERROR} * otherwise. */ @SystemApi public int attachMixes(@NonNull List<AudioMix> mixes) { if (mixes == null) { throw new IllegalArgumentException("Illegal null list of AudioMix"); } synchronized (mLock) { if (mStatus != POLICY_STATUS_REGISTERED) { throw new IllegalStateException("Cannot alter unregistered AudioPolicy"); } final ArrayList<AudioMix> zeMixes = new ArrayList<AudioMix>(mixes.size()); for (AudioMix mix : mixes) { if (mix == null) { throw new IllegalArgumentException("Illegal null AudioMix in attachMixes"); } else { zeMixes.add(mix); } } final AudioPolicyConfig cfg = new AudioPolicyConfig(zeMixes); IAudioService service = getService(); try { final int status = service.addMixForPolicy(cfg, this.cb()); if (status == AudioManager.SUCCESS) { mConfig.add(zeMixes); } return status; } catch (RemoteException e) { Log.e(TAG, "Dead object in attachMixes", e); return AudioManager.ERROR; } } } /** * @hide * Update the current configuration of the set of audio mixes by removing some, while * keeping the policy registered. * This method can only be called on a registered policy. * @param mixes the list of {@link AudioMix} to remove * @return {@link AudioManager#SUCCESS} if the change was successful, {@link AudioManager#ERROR} * otherwise. */ @SystemApi public int detachMixes(@NonNull List<AudioMix> mixes) { if (mixes == null) { throw new IllegalArgumentException("Illegal null list of AudioMix"); } synchronized (mLock) { if (mStatus != POLICY_STATUS_REGISTERED) { throw new IllegalStateException("Cannot alter unregistered AudioPolicy"); } final ArrayList<AudioMix> zeMixes = new ArrayList<AudioMix>(mixes.size()); for (AudioMix mix : mixes) { if (mix == null) { throw new IllegalArgumentException("Illegal null AudioMix in detachMixes"); // TODO also check mix is currently contained in list of mixes } else { zeMixes.add(mix); } } final AudioPolicyConfig cfg = new AudioPolicyConfig(zeMixes); IAudioService service = getService(); try { final int status = service.removeMixForPolicy(cfg, this.cb()); if (status == AudioManager.SUCCESS) { mConfig.remove(zeMixes); } return status; } catch (RemoteException e) { Log.e(TAG, "Dead object in detachMixes", e); return AudioManager.ERROR; } } } public void setRegistration(String regId) { synchronized (mLock) { mRegistrationId = regId; Loading