Loading services/core/java/com/android/server/audio/AudioDeviceBroker.java +256 −247 File changed.Preview size limit exceeded, changes collapsed. Show changes services/core/java/com/android/server/audio/AudioService.java +35 −35 Original line number Diff line number Diff line Loading @@ -469,11 +469,12 @@ public class AudioService extends IAudioService.Stub // List of binder death handlers for setMode() client processes. // The last process to have called setMode() is at the top of the list. private final ArrayList<SetModeDeathHandler> mSetModeDeathHandlers = // package-private so it can be accessed in AudioDeviceBroker.getSetModeDeathHandlers //TODO candidate to be moved to separate class that handles synchronization @GuardedBy("mDeviceBroker.mSetModeLock") /*package*/ final ArrayList<SetModeDeathHandler> mSetModeDeathHandlers = new ArrayList<SetModeDeathHandler>(); private volatile int mCurrentModeOwnerPid = 0; // true if boot sequence has been completed private boolean mSystemReady; // true if Intent.ACTION_USER_SWITCHED has ever been received Loading Loading @@ -3149,9 +3150,14 @@ public class AudioService extends IAudioService.Stub * @return 0 if nobody owns the mode */ /*package*/ int getModeOwnerPid() { return mCurrentModeOwnerPid; int modeOwnerPid = 0; try { modeOwnerPid = mSetModeDeathHandlers.get(0).getPid(); } catch (Exception e) { // nothing to do, modeOwnerPid is not modified } return modeOwnerPid; } private class SetModeDeathHandler implements IBinder.DeathRecipient { private IBinder mCb; // To be notified of client's death Loading @@ -3166,7 +3172,7 @@ public class AudioService extends IAudioService.Stub public void binderDied() { int oldModeOwnerPid = 0; int newModeOwnerPid = 0; synchronized (mSetModeDeathHandlers) { synchronized (mDeviceBroker.mSetModeLock) { Log.w(TAG, "setMode() client died"); if (!mSetModeDeathHandlers.isEmpty()) { oldModeOwnerPid = mSetModeDeathHandlers.get(0).getPid(); Loading @@ -3177,15 +3183,11 @@ public class AudioService extends IAudioService.Stub } else { newModeOwnerPid = setModeInt(AudioSystem.MODE_NORMAL, mCb, mPid, TAG); } if (newModeOwnerPid != oldModeOwnerPid) { mCurrentModeOwnerPid = newModeOwnerPid; // when entering RINGTONE, IN_CALL or IN_COMMUNICATION mode, clear all SCO // connections not started by the application changing the mode when pid changes if (newModeOwnerPid != 0) { mDeviceBroker.postDisconnectBluetoothSco(newModeOwnerPid); } } // when entering RINGTONE, IN_CALL or IN_COMMUNICATION mode, clear all // SCO connections not started by the application changing the mode when pid changes if ((newModeOwnerPid != oldModeOwnerPid) && (newModeOwnerPid != 0)) { mDeviceBroker.postDisconnectBluetoothSco(newModeOwnerPid); } } Loading @@ -3208,15 +3210,13 @@ public class AudioService extends IAudioService.Stub /** @see AudioManager#setMode(int) */ public void setMode(int mode, IBinder cb, String callingPackage) { if (DEBUG_MODE) { Log.v(TAG, "setMode(mode=" + mode + ", callingPackage=" + callingPackage + ")"); } if (DEBUG_MODE) { Log.v(TAG, "setMode(mode=" + mode + ", callingPackage=" + callingPackage + ")"); } if (!checkAudioSettingsPermission("setMode()")) { return; } if ((mode == AudioSystem.MODE_IN_CALL) && (mContext.checkCallingOrSelfPermission( if ( (mode == AudioSystem.MODE_IN_CALL) && (mContext.checkCallingOrSelfPermission( android.Manifest.permission.MODIFY_PHONE_STATE) != PackageManager.PERMISSION_GRANTED)) { Log.w(TAG, "MODIFY_PHONE_STATE Permission Denial: setMode(MODE_IN_CALL) from pid=" Loading @@ -3230,7 +3230,7 @@ public class AudioService extends IAudioService.Stub int oldModeOwnerPid = 0; int newModeOwnerPid = 0; synchronized (mSetModeDeathHandlers) { synchronized (mDeviceBroker.mSetModeLock) { if (!mSetModeDeathHandlers.isEmpty()) { oldModeOwnerPid = mSetModeDeathHandlers.get(0).getPid(); } Loading @@ -3238,21 +3238,17 @@ public class AudioService extends IAudioService.Stub mode = mMode; } newModeOwnerPid = setModeInt(mode, cb, Binder.getCallingPid(), callingPackage); if (newModeOwnerPid != oldModeOwnerPid) { mCurrentModeOwnerPid = newModeOwnerPid; } // when entering RINGTONE, IN_CALL or IN_COMMUNICATION mode, clear all // SCO connections not started by the application changing the mode when pid changes if (newModeOwnerPid != 0) { if ((newModeOwnerPid != oldModeOwnerPid) && (newModeOwnerPid != 0)) { mDeviceBroker.postDisconnectBluetoothSco(newModeOwnerPid); } } } } // setModeInt() returns a valid PID if the audio mode was successfully set to // any mode other than NORMAL. @GuardedBy("mSetModeDeathHandlers") @GuardedBy("mDeviceBroker.mSetModeLock") private int setModeInt(int mode, IBinder cb, int pid, String caller) { if (DEBUG_MODE) { Log.v(TAG, "setModeInt(mode=" + mode + ", pid=" + pid + ", caller=" + caller + ")"); } Loading Loading @@ -3591,8 +3587,10 @@ public class AudioService extends IAudioService.Stub !mSystemReady) { return; } synchronized (mDeviceBroker.mSetModeLock) { mDeviceBroker.startBluetoothScoForClient_Sync(cb, scoAudioMode, eventSource); } } /** @see AudioManager#stopBluetoothSco() */ public void stopBluetoothSco(IBinder cb){ Loading @@ -3603,8 +3601,10 @@ public class AudioService extends IAudioService.Stub final String eventSource = new StringBuilder("stopBluetoothSco()") .append(") from u/pid:").append(Binder.getCallingUid()).append("/") .append(Binder.getCallingPid()).toString(); synchronized (mDeviceBroker.mSetModeLock) { mDeviceBroker.stopBluetoothScoForClient_Sync(cb, eventSource); } } /*package*/ ContentResolver getContentResolver() { Loading Loading @@ -4352,7 +4352,7 @@ public class AudioService extends IAudioService.Stub // NOTE: Locking order for synchronized objects related to volume or ringer mode management: // 1 mScoclient OR mSafeMediaVolumeState // 2 mSetModeDeathHandlers // 2 mSetModeLock // 3 mSettingsLock // 4 VolumeStreamState.class private class VolumeStreamState { Loading services/core/java/com/android/server/audio/BtHelper.java +30 −0 Original line number Diff line number Diff line Loading @@ -171,6 +171,8 @@ public class BtHelper { //---------------------------------------------------------------------- // Interface for AudioDeviceBroker // @GuardedBy("AudioDeviceBroker.mSetModeLock") @GuardedBy("AudioDeviceBroker.mDeviceStateLock") /*package*/ synchronized void onSystemReady() { mScoConnectionState = android.media.AudioManager.SCO_AUDIO_STATE_ERROR; resetBluetoothSco(); Loading Loading @@ -243,6 +245,8 @@ public class BtHelper { return mapBluetoothCodecToAudioFormat(btCodecConfig.getCodecType()); } // @GuardedBy("AudioDeviceBroker.mSetModeLock") @GuardedBy("AudioDeviceBroker.mDeviceStateLock") /*package*/ synchronized void receiveBtEvent(Intent intent) { final String action = intent.getAction(); if (action.equals(BluetoothHeadset.ACTION_ACTIVE_DEVICE_CHANGED)) { Loading Loading @@ -329,6 +333,8 @@ public class BtHelper { * * @param exceptPid pid whose SCO connections through {@link AudioManager} should be kept */ // @GuardedBy("AudioDeviceBroker.mSetModeLock") @GuardedBy("AudioDeviceBroker.mDeviceStateLock") /*package*/ synchronized void disconnectBluetoothSco(int exceptPid) { checkScoAudioState(); if (mScoAudioState == SCO_STATE_ACTIVE_EXTERNAL) { Loading @@ -337,6 +343,8 @@ public class BtHelper { clearAllScoClients(exceptPid, true); } // @GuardedBy("AudioDeviceBroker.mSetModeLock") @GuardedBy("AudioDeviceBroker.mDeviceStateLock") /*package*/ synchronized void startBluetoothScoForClient(IBinder cb, int scoAudioMode, @NonNull String eventSource) { ScoClient client = getScoClient(cb, true); Loading @@ -356,6 +364,8 @@ public class BtHelper { Binder.restoreCallingIdentity(ident); } // @GuardedBy("AudioDeviceBroker.mSetModeLock") @GuardedBy("AudioDeviceBroker.mDeviceStateLock") /*package*/ synchronized void stopBluetoothScoForClient(IBinder cb, @NonNull String eventSource) { ScoClient client = getScoClient(cb, false); Loading Loading @@ -413,6 +423,8 @@ public class BtHelper { mDeviceBroker.postDisconnectHearingAid(); } // @GuardedBy("AudioDeviceBroker.mSetModeLock") @GuardedBy("AudioDeviceBroker.mDeviceStateLock") /*package*/ synchronized void resetBluetoothSco() { clearAllScoClients(0, false); mScoAudioState = SCO_STATE_INACTIVE; Loading @@ -421,6 +433,8 @@ public class BtHelper { mDeviceBroker.setBluetoothScoOn(false, "resetBluetoothSco"); } // @GuardedBy("AudioDeviceBroker.mSetModeLock") @GuardedBy("AudioDeviceBroker.mDeviceStateLock") /*package*/ synchronized void disconnectHeadset() { setBtScoActiveDevice(null); mBluetoothHeadset = null; Loading Loading @@ -466,6 +480,8 @@ public class BtHelper { /*eventSource*/ "mBluetoothProfileServiceListener"); } // @GuardedBy("AudioDeviceBroker.mSetModeLock") @GuardedBy("AudioDeviceBroker.mDeviceStateLock") /*package*/ synchronized void onHeadsetProfileConnected(BluetoothHeadset headset) { // Discard timeout message mDeviceBroker.handleCancelFailureToConnectToBtHeadsetService(); Loading Loading @@ -552,6 +568,8 @@ public class BtHelper { return result; } // @GuardedBy("AudioDeviceBroker.mSetModeLock") //@GuardedBy("AudioDeviceBroker.mDeviceStateLock") @GuardedBy("BtHelper.this") private void setBtScoActiveDevice(BluetoothDevice btDevice) { Log.i(TAG, "setBtScoActiveDevice: " + mBluetoothHeadsetDevice + " -> " + btDevice); Loading Loading @@ -634,6 +652,8 @@ public class BtHelper { }; //---------------------------------------------------------------------- // @GuardedBy("AudioDeviceBroker.mSetModeLock") @GuardedBy("AudioDeviceBroker.mDeviceStateLock") /*package*/ synchronized void scoClientDied(Object obj) { final ScoClient client = (ScoClient) obj; Log.w(TAG, "SCO client died"); Loading Loading @@ -664,6 +684,8 @@ public class BtHelper { mDeviceBroker.postScoClientDied(this); } // @GuardedBy("AudioDeviceBroker.mSetModeLock") // @GuardedBy("AudioDeviceBroker.mDeviceStateLock") @GuardedBy("BtHelper.this") void incCount(int scoAudioMode) { if (!requestScoState(BluetoothHeadset.STATE_AUDIO_CONNECTED, scoAudioMode)) { Loading @@ -683,6 +705,8 @@ public class BtHelper { mStartcount++; } // @GuardedBy("AudioDeviceBroker.mSetModeLock") // @GuardedBy("AudioDeviceBroker.mDeviceStateLock") @GuardedBy("BtHelper.this") void decCount() { if (mStartcount == 0) { Loading @@ -702,6 +726,8 @@ public class BtHelper { } } // @GuardedBy("AudioDeviceBroker.mSetModeLock") // @GuardedBy("AudioDeviceBroker.mDeviceStateLock") @GuardedBy("BtHelper.this") void clearCount(boolean stopSco) { if (mStartcount != 0) { Loading Loading @@ -738,6 +764,8 @@ public class BtHelper { return count; } // @GuardedBy("AudioDeviceBroker.mSetModeLock") //@GuardedBy("AudioDeviceBroker.mDeviceStateLock") @GuardedBy("BtHelper.this") private boolean requestScoState(int state, int scoAudioMode) { checkScoAudioState(); Loading Loading @@ -931,6 +959,8 @@ public class BtHelper { return null; } // @GuardedBy("AudioDeviceBroker.mSetModeLock") //@GuardedBy("AudioDeviceBroker.mDeviceStateLock") @GuardedBy("BtHelper.this") private void clearAllScoClients(int exceptPid, boolean stopSco) { ScoClient savedClient = null; Loading services/tests/servicestests/src/com/android/server/audio/AudioDeviceBrokerTest.java +0 −16 Original line number Diff line number Diff line Loading @@ -126,22 +126,6 @@ public class AudioDeviceBrokerTest { doTestConnectionDisconnectionReconnection(AudioService.BECOMING_NOISY_DELAY_MS / 2); } /** * Verify connecting an A2DP sink will call into AudioService to unmute media */ @Test public void testA2dpConnectionUnmutesMedia() throws Exception { Log.i(TAG, "testA2dpConnectionUnmutesMedia"); Assert.assertNotNull("invalid null BT device", mFakeBtDevice); mAudioDeviceBroker.postBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(mFakeBtDevice, BluetoothProfile.STATE_CONNECTED, BluetoothProfile.A2DP, true, 1); Thread.sleep(MAX_MESSAGE_HANDLING_DELAY_MS); verify(mMockAudioService, times(1)).postAccessoryPlugMediaUnmute( ArgumentMatchers.eq(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP)); } private void doTestConnectionDisconnectionReconnection(int delayAfterDisconnection) throws Exception { when(mMockAudioService.getDeviceForStream(AudioManager.STREAM_MUSIC)) Loading Loading
services/core/java/com/android/server/audio/AudioDeviceBroker.java +256 −247 File changed.Preview size limit exceeded, changes collapsed. Show changes
services/core/java/com/android/server/audio/AudioService.java +35 −35 Original line number Diff line number Diff line Loading @@ -469,11 +469,12 @@ public class AudioService extends IAudioService.Stub // List of binder death handlers for setMode() client processes. // The last process to have called setMode() is at the top of the list. private final ArrayList<SetModeDeathHandler> mSetModeDeathHandlers = // package-private so it can be accessed in AudioDeviceBroker.getSetModeDeathHandlers //TODO candidate to be moved to separate class that handles synchronization @GuardedBy("mDeviceBroker.mSetModeLock") /*package*/ final ArrayList<SetModeDeathHandler> mSetModeDeathHandlers = new ArrayList<SetModeDeathHandler>(); private volatile int mCurrentModeOwnerPid = 0; // true if boot sequence has been completed private boolean mSystemReady; // true if Intent.ACTION_USER_SWITCHED has ever been received Loading Loading @@ -3149,9 +3150,14 @@ public class AudioService extends IAudioService.Stub * @return 0 if nobody owns the mode */ /*package*/ int getModeOwnerPid() { return mCurrentModeOwnerPid; int modeOwnerPid = 0; try { modeOwnerPid = mSetModeDeathHandlers.get(0).getPid(); } catch (Exception e) { // nothing to do, modeOwnerPid is not modified } return modeOwnerPid; } private class SetModeDeathHandler implements IBinder.DeathRecipient { private IBinder mCb; // To be notified of client's death Loading @@ -3166,7 +3172,7 @@ public class AudioService extends IAudioService.Stub public void binderDied() { int oldModeOwnerPid = 0; int newModeOwnerPid = 0; synchronized (mSetModeDeathHandlers) { synchronized (mDeviceBroker.mSetModeLock) { Log.w(TAG, "setMode() client died"); if (!mSetModeDeathHandlers.isEmpty()) { oldModeOwnerPid = mSetModeDeathHandlers.get(0).getPid(); Loading @@ -3177,15 +3183,11 @@ public class AudioService extends IAudioService.Stub } else { newModeOwnerPid = setModeInt(AudioSystem.MODE_NORMAL, mCb, mPid, TAG); } if (newModeOwnerPid != oldModeOwnerPid) { mCurrentModeOwnerPid = newModeOwnerPid; // when entering RINGTONE, IN_CALL or IN_COMMUNICATION mode, clear all SCO // connections not started by the application changing the mode when pid changes if (newModeOwnerPid != 0) { mDeviceBroker.postDisconnectBluetoothSco(newModeOwnerPid); } } // when entering RINGTONE, IN_CALL or IN_COMMUNICATION mode, clear all // SCO connections not started by the application changing the mode when pid changes if ((newModeOwnerPid != oldModeOwnerPid) && (newModeOwnerPid != 0)) { mDeviceBroker.postDisconnectBluetoothSco(newModeOwnerPid); } } Loading @@ -3208,15 +3210,13 @@ public class AudioService extends IAudioService.Stub /** @see AudioManager#setMode(int) */ public void setMode(int mode, IBinder cb, String callingPackage) { if (DEBUG_MODE) { Log.v(TAG, "setMode(mode=" + mode + ", callingPackage=" + callingPackage + ")"); } if (DEBUG_MODE) { Log.v(TAG, "setMode(mode=" + mode + ", callingPackage=" + callingPackage + ")"); } if (!checkAudioSettingsPermission("setMode()")) { return; } if ((mode == AudioSystem.MODE_IN_CALL) && (mContext.checkCallingOrSelfPermission( if ( (mode == AudioSystem.MODE_IN_CALL) && (mContext.checkCallingOrSelfPermission( android.Manifest.permission.MODIFY_PHONE_STATE) != PackageManager.PERMISSION_GRANTED)) { Log.w(TAG, "MODIFY_PHONE_STATE Permission Denial: setMode(MODE_IN_CALL) from pid=" Loading @@ -3230,7 +3230,7 @@ public class AudioService extends IAudioService.Stub int oldModeOwnerPid = 0; int newModeOwnerPid = 0; synchronized (mSetModeDeathHandlers) { synchronized (mDeviceBroker.mSetModeLock) { if (!mSetModeDeathHandlers.isEmpty()) { oldModeOwnerPid = mSetModeDeathHandlers.get(0).getPid(); } Loading @@ -3238,21 +3238,17 @@ public class AudioService extends IAudioService.Stub mode = mMode; } newModeOwnerPid = setModeInt(mode, cb, Binder.getCallingPid(), callingPackage); if (newModeOwnerPid != oldModeOwnerPid) { mCurrentModeOwnerPid = newModeOwnerPid; } // when entering RINGTONE, IN_CALL or IN_COMMUNICATION mode, clear all // SCO connections not started by the application changing the mode when pid changes if (newModeOwnerPid != 0) { if ((newModeOwnerPid != oldModeOwnerPid) && (newModeOwnerPid != 0)) { mDeviceBroker.postDisconnectBluetoothSco(newModeOwnerPid); } } } } // setModeInt() returns a valid PID if the audio mode was successfully set to // any mode other than NORMAL. @GuardedBy("mSetModeDeathHandlers") @GuardedBy("mDeviceBroker.mSetModeLock") private int setModeInt(int mode, IBinder cb, int pid, String caller) { if (DEBUG_MODE) { Log.v(TAG, "setModeInt(mode=" + mode + ", pid=" + pid + ", caller=" + caller + ")"); } Loading Loading @@ -3591,8 +3587,10 @@ public class AudioService extends IAudioService.Stub !mSystemReady) { return; } synchronized (mDeviceBroker.mSetModeLock) { mDeviceBroker.startBluetoothScoForClient_Sync(cb, scoAudioMode, eventSource); } } /** @see AudioManager#stopBluetoothSco() */ public void stopBluetoothSco(IBinder cb){ Loading @@ -3603,8 +3601,10 @@ public class AudioService extends IAudioService.Stub final String eventSource = new StringBuilder("stopBluetoothSco()") .append(") from u/pid:").append(Binder.getCallingUid()).append("/") .append(Binder.getCallingPid()).toString(); synchronized (mDeviceBroker.mSetModeLock) { mDeviceBroker.stopBluetoothScoForClient_Sync(cb, eventSource); } } /*package*/ ContentResolver getContentResolver() { Loading Loading @@ -4352,7 +4352,7 @@ public class AudioService extends IAudioService.Stub // NOTE: Locking order for synchronized objects related to volume or ringer mode management: // 1 mScoclient OR mSafeMediaVolumeState // 2 mSetModeDeathHandlers // 2 mSetModeLock // 3 mSettingsLock // 4 VolumeStreamState.class private class VolumeStreamState { Loading
services/core/java/com/android/server/audio/BtHelper.java +30 −0 Original line number Diff line number Diff line Loading @@ -171,6 +171,8 @@ public class BtHelper { //---------------------------------------------------------------------- // Interface for AudioDeviceBroker // @GuardedBy("AudioDeviceBroker.mSetModeLock") @GuardedBy("AudioDeviceBroker.mDeviceStateLock") /*package*/ synchronized void onSystemReady() { mScoConnectionState = android.media.AudioManager.SCO_AUDIO_STATE_ERROR; resetBluetoothSco(); Loading Loading @@ -243,6 +245,8 @@ public class BtHelper { return mapBluetoothCodecToAudioFormat(btCodecConfig.getCodecType()); } // @GuardedBy("AudioDeviceBroker.mSetModeLock") @GuardedBy("AudioDeviceBroker.mDeviceStateLock") /*package*/ synchronized void receiveBtEvent(Intent intent) { final String action = intent.getAction(); if (action.equals(BluetoothHeadset.ACTION_ACTIVE_DEVICE_CHANGED)) { Loading Loading @@ -329,6 +333,8 @@ public class BtHelper { * * @param exceptPid pid whose SCO connections through {@link AudioManager} should be kept */ // @GuardedBy("AudioDeviceBroker.mSetModeLock") @GuardedBy("AudioDeviceBroker.mDeviceStateLock") /*package*/ synchronized void disconnectBluetoothSco(int exceptPid) { checkScoAudioState(); if (mScoAudioState == SCO_STATE_ACTIVE_EXTERNAL) { Loading @@ -337,6 +343,8 @@ public class BtHelper { clearAllScoClients(exceptPid, true); } // @GuardedBy("AudioDeviceBroker.mSetModeLock") @GuardedBy("AudioDeviceBroker.mDeviceStateLock") /*package*/ synchronized void startBluetoothScoForClient(IBinder cb, int scoAudioMode, @NonNull String eventSource) { ScoClient client = getScoClient(cb, true); Loading @@ -356,6 +364,8 @@ public class BtHelper { Binder.restoreCallingIdentity(ident); } // @GuardedBy("AudioDeviceBroker.mSetModeLock") @GuardedBy("AudioDeviceBroker.mDeviceStateLock") /*package*/ synchronized void stopBluetoothScoForClient(IBinder cb, @NonNull String eventSource) { ScoClient client = getScoClient(cb, false); Loading Loading @@ -413,6 +423,8 @@ public class BtHelper { mDeviceBroker.postDisconnectHearingAid(); } // @GuardedBy("AudioDeviceBroker.mSetModeLock") @GuardedBy("AudioDeviceBroker.mDeviceStateLock") /*package*/ synchronized void resetBluetoothSco() { clearAllScoClients(0, false); mScoAudioState = SCO_STATE_INACTIVE; Loading @@ -421,6 +433,8 @@ public class BtHelper { mDeviceBroker.setBluetoothScoOn(false, "resetBluetoothSco"); } // @GuardedBy("AudioDeviceBroker.mSetModeLock") @GuardedBy("AudioDeviceBroker.mDeviceStateLock") /*package*/ synchronized void disconnectHeadset() { setBtScoActiveDevice(null); mBluetoothHeadset = null; Loading Loading @@ -466,6 +480,8 @@ public class BtHelper { /*eventSource*/ "mBluetoothProfileServiceListener"); } // @GuardedBy("AudioDeviceBroker.mSetModeLock") @GuardedBy("AudioDeviceBroker.mDeviceStateLock") /*package*/ synchronized void onHeadsetProfileConnected(BluetoothHeadset headset) { // Discard timeout message mDeviceBroker.handleCancelFailureToConnectToBtHeadsetService(); Loading Loading @@ -552,6 +568,8 @@ public class BtHelper { return result; } // @GuardedBy("AudioDeviceBroker.mSetModeLock") //@GuardedBy("AudioDeviceBroker.mDeviceStateLock") @GuardedBy("BtHelper.this") private void setBtScoActiveDevice(BluetoothDevice btDevice) { Log.i(TAG, "setBtScoActiveDevice: " + mBluetoothHeadsetDevice + " -> " + btDevice); Loading Loading @@ -634,6 +652,8 @@ public class BtHelper { }; //---------------------------------------------------------------------- // @GuardedBy("AudioDeviceBroker.mSetModeLock") @GuardedBy("AudioDeviceBroker.mDeviceStateLock") /*package*/ synchronized void scoClientDied(Object obj) { final ScoClient client = (ScoClient) obj; Log.w(TAG, "SCO client died"); Loading Loading @@ -664,6 +684,8 @@ public class BtHelper { mDeviceBroker.postScoClientDied(this); } // @GuardedBy("AudioDeviceBroker.mSetModeLock") // @GuardedBy("AudioDeviceBroker.mDeviceStateLock") @GuardedBy("BtHelper.this") void incCount(int scoAudioMode) { if (!requestScoState(BluetoothHeadset.STATE_AUDIO_CONNECTED, scoAudioMode)) { Loading @@ -683,6 +705,8 @@ public class BtHelper { mStartcount++; } // @GuardedBy("AudioDeviceBroker.mSetModeLock") // @GuardedBy("AudioDeviceBroker.mDeviceStateLock") @GuardedBy("BtHelper.this") void decCount() { if (mStartcount == 0) { Loading @@ -702,6 +726,8 @@ public class BtHelper { } } // @GuardedBy("AudioDeviceBroker.mSetModeLock") // @GuardedBy("AudioDeviceBroker.mDeviceStateLock") @GuardedBy("BtHelper.this") void clearCount(boolean stopSco) { if (mStartcount != 0) { Loading Loading @@ -738,6 +764,8 @@ public class BtHelper { return count; } // @GuardedBy("AudioDeviceBroker.mSetModeLock") //@GuardedBy("AudioDeviceBroker.mDeviceStateLock") @GuardedBy("BtHelper.this") private boolean requestScoState(int state, int scoAudioMode) { checkScoAudioState(); Loading Loading @@ -931,6 +959,8 @@ public class BtHelper { return null; } // @GuardedBy("AudioDeviceBroker.mSetModeLock") //@GuardedBy("AudioDeviceBroker.mDeviceStateLock") @GuardedBy("BtHelper.this") private void clearAllScoClients(int exceptPid, boolean stopSco) { ScoClient savedClient = null; Loading
services/tests/servicestests/src/com/android/server/audio/AudioDeviceBrokerTest.java +0 −16 Original line number Diff line number Diff line Loading @@ -126,22 +126,6 @@ public class AudioDeviceBrokerTest { doTestConnectionDisconnectionReconnection(AudioService.BECOMING_NOISY_DELAY_MS / 2); } /** * Verify connecting an A2DP sink will call into AudioService to unmute media */ @Test public void testA2dpConnectionUnmutesMedia() throws Exception { Log.i(TAG, "testA2dpConnectionUnmutesMedia"); Assert.assertNotNull("invalid null BT device", mFakeBtDevice); mAudioDeviceBroker.postBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(mFakeBtDevice, BluetoothProfile.STATE_CONNECTED, BluetoothProfile.A2DP, true, 1); Thread.sleep(MAX_MESSAGE_HANDLING_DELAY_MS); verify(mMockAudioService, times(1)).postAccessoryPlugMediaUnmute( ArgumentMatchers.eq(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP)); } private void doTestConnectionDisconnectionReconnection(int delayAfterDisconnection) throws Exception { when(mMockAudioService.getDeviceForStream(AudioManager.STREAM_MUSIC)) Loading