diff options
| -rw-r--r-- | services/core/java/com/android/server/audio/AudioService.java | 83 |
1 files 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 6b26ba21f6e5..d6315ff62b3b 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)); } } |