summaryrefslogtreecommitdiffstats
path: root/services/core/java
diff options
context:
space:
mode:
authorJean-Michel Trivi <jmtrivi@google.com>2015-04-30 17:26:29 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2015-04-30 17:26:29 +0000
commite36846cbf1d1d2f349289ed4764875c3ee9087be (patch)
tree79e74c283c1831c7471b58508cfd36209e11fa48 /services/core/java
parent662f9df99e2f1fdda79da7eda43a13c52ff5b5d0 (diff)
parentc8efc4490df6fb58bf333540cf746c68070345f5 (diff)
downloadframeworks_base-e36846cbf1d1d2f349289ed4764875c3ee9087be.zip
frameworks_base-e36846cbf1d1d2f349289ed4764875c3ee9087be.tar.gz
frameworks_base-e36846cbf1d1d2f349289ed4764875c3ee9087be.tar.bz2
am c8efc449: am 3d42d238: am f764d219: Merge "AudioService receives callback for dynamic policy mix state changes" into mnc-dev
* commit 'c8efc4490df6fb58bf333540cf746c68070345f5': AudioService receives callback for dynamic policy mix state changes
Diffstat (limited to 'services/core/java')
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java53
1 files changed, 46 insertions, 7 deletions
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index eb28ed0..06fba34 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -65,6 +65,7 @@ import android.media.SoundPool;
import android.media.VolumePolicy;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
+import android.media.audiopolicy.AudioMix;
import android.media.audiopolicy.AudioPolicy;
import android.media.audiopolicy.AudioPolicyConfig;
import android.media.audiopolicy.IAudioPolicyCallback;
@@ -206,6 +207,7 @@ public class AudioService extends IAudioService.Stub {
private static final int MSG_PERSIST_MUSIC_ACTIVE_MS = 22;
private static final int MSG_PERSIST_MICROPHONE_MUTE = 23;
private static final int MSG_UNMUTE_STREAM = 24;
+ private static final int MSG_DYN_POLICY_MIX_STATE_UPDATE = 25;
// start of messages handled under wakelock
// these messages can only be queued, i.e. sent with queueMsgUnderWakeLock(),
// and not with sendMsg(..., ..., SENDMSG_QUEUE, ...)
@@ -4337,6 +4339,9 @@ public class AudioService extends IAudioService.Stub {
case MSG_UNMUTE_STREAM:
onUnmuteStream(msg.arg1, msg.arg2);
break;
+ case MSG_DYN_POLICY_MIX_STATE_UPDATE:
+ onDynPolicyMixStateUpdate((String) msg.obj, msg.arg1);
+ break;
}
}
}
@@ -5758,6 +5763,8 @@ public class AudioService extends IAudioService.Stub {
//==========================================================================================
public String registerAudioPolicy(AudioPolicyConfig policyConfig, IAudioPolicyCallback pcb,
boolean hasFocusListener) {
+ AudioSystem.setDynamicPolicyCallback(mDynPolicyCallback);
+
if (DEBUG_AP) Log.d(TAG, "registerAudioPolicy for " + pcb.asBinder()
+ " with config:" + policyConfig);
String regId = null;
@@ -5853,6 +5860,39 @@ public class AudioService extends IAudioService.Stub {
}
//======================
+ // Audio policy callback from AudioSystem
+ //======================
+ private final AudioSystem.DynamicPolicyCallback mDynPolicyCallback =
+ new AudioSystem.DynamicPolicyCallback() {
+ public void onDynamicPolicyMixStateUpdate(String regId, int state) {
+ if (!TextUtils.isEmpty(regId)) {
+ sendMsg(mAudioHandler, MSG_DYN_POLICY_MIX_STATE_UPDATE, SENDMSG_QUEUE,
+ state /*arg1*/, 0 /*arg2 ignored*/, regId /*obj*/, 0 /*delay*/);
+ }
+ }
+ };
+
+ private void onDynPolicyMixStateUpdate(String regId, int state) {
+ if (DEBUG_AP) Log.d(TAG, "onDynamicPolicyMixStateUpdate("+ regId + ", " + state +")");
+ synchronized (mAudioPolicies) {
+ for (AudioPolicyProxy policy : mAudioPolicies.values()) {
+ for (AudioMix mix : policy.getMixes()) {
+ if (mix.getRegistration().equals(regId)) {
+ try {
+ policy.mPolicyCallback.notifyMixStateUpdate(regId, state);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Can't call notifyMixStateUpdate() on IAudioPolicyCallback "
+ + policy.mPolicyCallback.asBinder(), e);
+ }
+ return;
+ }
+ }
+ }
+ }
+
+ }
+
+ //======================
// Audio policy proxy
//======================
/**
@@ -5861,8 +5901,7 @@ public class AudioService extends IAudioService.Stub {
*/
public class AudioPolicyProxy extends AudioPolicyConfig implements IBinder.DeathRecipient {
private static final String TAG = "AudioPolicyProxy";
- AudioPolicyConfig mConfig;
- IAudioPolicyCallback mPolicyToken;
+ IAudioPolicyCallback mPolicyCallback;
boolean mHasFocusListener;
/**
* Audio focus ducking behavior for an audio policy.
@@ -5877,19 +5916,19 @@ public class AudioService extends IAudioService.Stub {
boolean hasFocusListener) {
super(config);
setRegistration(new String(config.hashCode() + ":ap:" + mAudioPolicyCounter++));
- mPolicyToken = token;
+ mPolicyCallback = token;
mHasFocusListener = hasFocusListener;
if (mHasFocusListener) {
- mMediaFocusControl.addFocusFollower(mPolicyToken);
+ mMediaFocusControl.addFocusFollower(mPolicyCallback);
}
connectMixes();
}
public void binderDied() {
synchronized (mAudioPolicies) {
- Log.i(TAG, "audio policy " + mPolicyToken + " died");
+ Log.i(TAG, "audio policy " + mPolicyCallback + " died");
release();
- mAudioPolicies.remove(mPolicyToken.asBinder());
+ mAudioPolicies.remove(mPolicyCallback.asBinder());
}
}
@@ -5902,7 +5941,7 @@ public class AudioService extends IAudioService.Stub {
mMediaFocusControl.setDuckingInExtPolicyAvailable(false);
}
if (mHasFocusListener) {
- mMediaFocusControl.removeFocusFollower(mPolicyToken);
+ mMediaFocusControl.removeFocusFollower(mPolicyCallback);
}
AudioSystem.registerPolicyMixes(mMixes, false);
}