diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java index 05be10068c943..668af85af0a98 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java +++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java @@ -416,8 +416,9 @@ import com.android.internal.annotations.GuardedBy; mAudioService.checkMusicActive(deviceType, caller); } - /*package*/ void checkVolumeCecOnHdmiConnection(int state, String caller) { - mAudioService.checkVolumeCecOnHdmiConnection(state, caller); + /*package*/ void checkVolumeCecOnHdmiConnection( + @AudioService.ConnectionState int state, String caller) { + mAudioService.postCheckVolumeCecOnHdmiConnection(state, caller); } /*package*/ boolean hasAudioFocusUsers() { diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java index f9dbdd5b13dbb..3948bd8585381 100644 --- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java +++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java @@ -363,8 +363,8 @@ public final class AudioDeviceInventory { "onSetWiredDeviceConnectionState state DISCONNECTED"); } - if (!handleDeviceConnection(wdcs.mState == 1, wdcs.mType, wdcs.mAddress, - wdcs.mName)) { + if (!handleDeviceConnection(wdcs.mState == AudioService.CONNECTION_STATE_CONNECTED, + wdcs.mType, wdcs.mAddress, wdcs.mName)) { // change of connection state failed, bailout return; } @@ -375,7 +375,9 @@ public final class AudioDeviceInventory { } mDeviceBroker.checkMusicActive(wdcs.mType, wdcs.mCaller); } - mDeviceBroker.checkVolumeCecOnHdmiConnection(wdcs.mState, wdcs.mCaller); + if (wdcs.mType == AudioSystem.DEVICE_OUT_HDMI) { + mDeviceBroker.checkVolumeCecOnHdmiConnection(wdcs.mState, wdcs.mCaller); + } sendDeviceConnectionIntent(wdcs.mType, wdcs.mState, wdcs.mAddress, wdcs.mName); updateAudioRoutes(wdcs.mType, wdcs.mState); } diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index d3af8f0745d7c..6af6d8861c1a4 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -260,6 +260,7 @@ public class AudioService extends IAudioService.Stub private static final int MSG_UPDATE_RINGER_MODE = 25; private static final int MSG_SET_DEVICE_STREAM_VOLUME = 26; private static final int MSG_OBSERVE_DEVICES_FOR_ALL_STREAMS = 27; + private static final int MSG_HDMI_VOLUME_CHECK = 28; // start of messages handled under wakelock // these messages can only be queued, i.e. sent with queueMsgUnderWakeLock(), // and not with sendMsg(..., ..., SENDMSG_QUEUE, ...) @@ -1060,11 +1061,19 @@ public class AudioService extends IAudioService.Stub } } + /** * Called from AudioDeviceBroker when DEVICE_OUT_HDMI is connected or disconnected. */ - /*package*/ void checkVolumeCecOnHdmiConnection(int state, String caller) { - if (state != 0) { + /*package*/ void postCheckVolumeCecOnHdmiConnection( + @AudioService.ConnectionState int state, String caller) { + sendMsg(mAudioHandler, MSG_HDMI_VOLUME_CHECK, SENDMSG_REPLACE, + state /*arg1*/, 0 /*arg2 ignored*/, caller /*obj*/, 0 /*delay*/); + } + + private void onCheckVolumeCecOnHdmiConnection( + @AudioService.ConnectionState int state, String caller) { + if (state == AudioService.CONNECTION_STATE_CONNECTED) { // DEVICE_OUT_HDMI is now connected if ((AudioSystem.DEVICE_OUT_HDMI & mSafeMediaVolumeDevices) != 0) { sendMsg(mAudioHandler, @@ -1077,7 +1086,7 @@ public class AudioService extends IAudioService.Stub } if (isPlatformTelevision()) { - checkAllFixedVolumeDevices(); + checkAddAllFixedVolumeDevices(AudioSystem.DEVICE_OUT_HDMI, caller); synchronized (mHdmiClientLock) { if (mHdmiManager != null && mHdmiPlaybackClient != null) { mHdmiCecSink = false; @@ -1098,6 +1107,21 @@ public class AudioService extends IAudioService.Stub } } + private void checkAddAllFixedVolumeDevices(int device, String caller) { + final int numStreamTypes = AudioSystem.getNumStreamTypes(); + for (int streamType = 0; streamType < numStreamTypes; streamType++) { + if (!mStreamStates[streamType].hasIndexForDevice(device)) { + // set the default value, if device is affected by a full/fix/abs volume rule, it + // will taken into account in checkFixedVolumeDevices() + mStreamStates[streamType].setIndex( + mStreamStates[mStreamVolumeAlias[streamType]] + .getIndex(AudioSystem.DEVICE_OUT_DEFAULT), + device, caller); + } + mStreamStates[streamType].checkFixedVolumeDevices(); + } + } + private void checkAllFixedVolumeDevices() { int numStreamTypes = AudioSystem.getNumStreamTypes(); @@ -5329,6 +5353,9 @@ public class AudioService extends IAudioService.Stub case MSG_OBSERVE_DEVICES_FOR_ALL_STREAMS: onObserveDevicesForAllStreams(); break; + + case MSG_HDMI_VOLUME_CHECK: + onCheckVolumeCecOnHdmiConnection(msg.arg1, (String) msg.obj); } } } @@ -6004,7 +6031,8 @@ public class AudioService extends IAudioService.Stub // HDMI output mFullVolumeDevices &= ~AudioSystem.DEVICE_OUT_HDMI; } - checkAllFixedVolumeDevices(); + checkAddAllFixedVolumeDevices(AudioSystem.DEVICE_OUT_HDMI, + "HdmiPlaybackClient.DisplayStatusCallback"); } } }