From 66776218878e0a945275e3cf268b941cbbc14173 Mon Sep 17 00:00:00 2001 From: Francois Gaffie Date: Fri, 20 Mar 2020 12:57:32 +0100 Subject: [PATCH] AudioService: default volume group is not restored Volume Group with associated stream type does not have their volume restore after restart / crash due even if correctly stored in Settings DB. A guard prevent to restore it. However, when using volume per attributes, Settings DB is used, so it is safe to restore volumes for all group. This CL fixes this issue by removing this guard. Test: set Music volume & reboot & dumpsys audio Ensure indexes matches Signed-off-by: Francois Gaffie Change-Id: I00aa8c17bffca21a128086fbbbeafffc26521a3b Merged-In: I239145d8bc50237ff902026594423c6d1fa04ad4 --- .../android/server/audio/AudioService.java | 83 ++++++++++++++----- 1 file changed, 61 insertions(+), 22 deletions(-) diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 6b26ba21f6e58..d6315ff62b3b6 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -1230,10 +1230,10 @@ public class AudioService extends IAudioService.Stub private void updateDefaultVolumes() { for (int stream = 0; stream < mStreamStates.length; stream++) { if (stream != mStreamVolumeAlias[stream]) { - AudioSystem.DEFAULT_STREAM_VOLUME[stream] = rescaleIndex( - AudioSystem.DEFAULT_STREAM_VOLUME[mStreamVolumeAlias[stream]], + AudioSystem.DEFAULT_STREAM_VOLUME[stream] = (rescaleIndex( + AudioSystem.DEFAULT_STREAM_VOLUME[mStreamVolumeAlias[stream]] * 10, mStreamVolumeAlias[stream], - stream); + stream) + 5) / 10; } } } @@ -4481,7 +4481,9 @@ public class AudioService extends IAudioService.Stub } catch (IllegalArgumentException e) { // Volume Groups without attributes are not controllable through set/get volume // using attributes. Do not append them. - Log.d(TAG, "volume group " + avg.name() + " for internal policy needs"); + if (DEBUG_VOL) { + Log.v(TAG, "volume group " + avg.name() + " for internal policy needs"); + } continue; } sVolumeGroupStates.append(avg.getId(), new VolumeGroupState(avg)); @@ -4502,7 +4504,9 @@ public class AudioService extends IAudioService.Stub } private void readVolumeGroupsSettings() { - Log.v(TAG, "readVolumeGroupsSettings"); + if (DEBUG_VOL) { + Log.v(TAG, "readVolumeGroupsSettings."); + } for (int i = 0; i < sVolumeGroupStates.size(); i++) { final VolumeGroupState vgs = sVolumeGroupStates.valueAt(i); vgs.readSettings(); @@ -4512,7 +4516,9 @@ public class AudioService extends IAudioService.Stub // Called upon crash of AudioServer private void restoreVolumeGroups() { - Log.v(TAG, "restoreVolumeGroups"); + if (DEBUG_VOL) { + Log.v(TAG, "restoreVolumeGroups"); + } for (int i = 0; i < sVolumeGroupStates.size(); i++) { final VolumeGroupState vgs = sVolumeGroupStates.valueAt(i); vgs.applyAllVolumes(); @@ -4548,7 +4554,9 @@ public class AudioService extends IAudioService.Stub private VolumeGroupState(AudioVolumeGroup avg) { mAudioVolumeGroup = avg; - Log.v(TAG, "VolumeGroupState for " + avg.toString()); + if (DEBUG_VOL) { + Log.v(TAG, "VolumeGroupState for " + avg.toString()); + } for (final AudioAttributes aa : avg.getAudioAttributes()) { if (!aa.equals(AudioProductStrategy.sDefaultAttributes)) { mAudioAttributes = aa; @@ -4643,11 +4651,19 @@ public class AudioService extends IAudioService.Stub return mIndexMin; } + private boolean isValidLegacyStreamType() { + return (mLegacyStreamType != AudioSystem.STREAM_DEFAULT) + && (mLegacyStreamType < mStreamStates.length); + } + public void applyAllVolumes() { synchronized (VolumeGroupState.class) { - if (mLegacyStreamType != AudioSystem.STREAM_DEFAULT) { - // No-op to avoid regression with stream based volume management - return; + int deviceForStream = AudioSystem.DEVICE_NONE; + int volumeIndexForStream = 0; + if (isValidLegacyStreamType()) { + // Prevent to apply settings twice when group is associated to public stream + deviceForStream = getDeviceForStream(mLegacyStreamType); + volumeIndexForStream = getStreamVolume(mLegacyStreamType); } // apply device specific volumes first int index; @@ -4655,16 +4671,30 @@ public class AudioService extends IAudioService.Stub final int device = mIndexMap.keyAt(i); if (device != AudioSystem.DEVICE_OUT_DEFAULT) { index = mIndexMap.valueAt(i); - Log.v(TAG, "applyAllVolumes: restore index " + index + " for group " - + mAudioVolumeGroup.name() + " and device " - + AudioSystem.getOutputDeviceName(device)); + if (device == deviceForStream && volumeIndexForStream == index) { + continue; + } + if (DEBUG_VOL) { + Log.v(TAG, "applyAllVolumes: restore index " + index + " for group " + + mAudioVolumeGroup.name() + " and device " + + AudioSystem.getOutputDeviceName(device)); + } setVolumeIndexInt(index, device, 0 /*flags*/); } } // apply default volume last: by convention , default device volume will be used index = getIndex(AudioSystem.DEVICE_OUT_DEFAULT); - Log.v(TAG, "applyAllVolumes: restore default device index " + index + " for group " - + mAudioVolumeGroup.name()); + if (DEBUG_VOL) { + Log.v(TAG, "applyAllVolumes: restore default device index " + index + + " for group " + mAudioVolumeGroup.name()); + } + if (isValidLegacyStreamType()) { + int defaultStreamIndex = (mStreamStates[mLegacyStreamType] + .getIndex(AudioSystem.DEVICE_OUT_DEFAULT) + 5) / 10; + if (defaultStreamIndex == index) { + return; + } + } setVolumeIndexInt(index, AudioSystem.DEVICE_OUT_DEFAULT, 0 /*flags*/); } } @@ -4673,9 +4703,12 @@ public class AudioService extends IAudioService.Stub if (mUseFixedVolume) { return; } - Log.v(TAG, "persistVolumeGroup: storing index " + getIndex(device) + " for group " - + mAudioVolumeGroup.name() + " and device " - + AudioSystem.getOutputDeviceName(device)); + if (DEBUG_VOL) { + Log.v(TAG, "persistVolumeGroup: storing index " + getIndex(device) + " for group " + + mAudioVolumeGroup.name() + + ", device " + AudioSystem.getOutputDeviceName(device) + + " and User=" + ActivityManager.getCurrentUser()); + } boolean success = Settings.System.putIntForUser(mContentResolver, getSettingNameForDevice(device), getIndex(device), @@ -4705,12 +4738,18 @@ public class AudioService extends IAudioService.Stub index = Settings.System.getIntForUser( mContentResolver, name, defaultIndex, UserHandle.USER_CURRENT); if (index == -1) { - Log.e(TAG, "readSettings: No index stored for group " - + mAudioVolumeGroup.name() + ", device " + name); + if (DEBUG_VOL) { + Log.e(TAG, "readSettings: No index stored for group " + + mAudioVolumeGroup.name() + ", device " + name + + ", User=" + ActivityManager.getCurrentUser()); + } continue; } - Log.v(TAG, "readSettings: found stored index " + getValidIndex(index) - + " for group " + mAudioVolumeGroup.name() + ", device: " + name); + if (DEBUG_VOL) { + Log.v(TAG, "readSettings: found stored index " + getValidIndex(index) + + " for group " + mAudioVolumeGroup.name() + ", device: " + name + + ", User=" + ActivityManager.getCurrentUser()); + } mIndexMap.put(device, getValidIndex(index)); } }