Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 66776218 authored by Francois Gaffie's avatar Francois Gaffie Committed by Eric Laurent
Browse files

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: default avatarFrancois Gaffie <francois.gaffie@renault.com>

Change-Id: I00aa8c17bffca21a128086fbbbeafffc26521a3b
Merged-In: I239145d8bc50237ff902026594423c6d1fa04ad4
parent 06a2db19
Loading
Loading
Loading
Loading
+61 −22
Original line number Diff line number Diff line
@@ -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() {
        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;
            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);
                        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;
            }
            if (DEBUG_VOL) {
                Log.v(TAG, "persistVolumeGroup: storing index " + getIndex(device) + " for group "
                    + mAudioVolumeGroup.name() + " and device "
                    + AudioSystem.getOutputDeviceName(device));
                        + 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) {
                        if (DEBUG_VOL) {
                            Log.e(TAG, "readSettings: No index stored for group "
                                + mAudioVolumeGroup.name() + ", device " + name);
                                    + mAudioVolumeGroup.name() + ", device " + name
                                    + ", User=" + ActivityManager.getCurrentUser());
                        }
                        continue;
                    }
                    if (DEBUG_VOL) {
                        Log.v(TAG, "readSettings: found stored index " + getValidIndex(index)
                             + " for group " + mAudioVolumeGroup.name() + ", device: " + name);
                                 + " for group " + mAudioVolumeGroup.name() + ", device: " + name
                                 + ", User=" + ActivityManager.getCurrentUser());
                    }
                    mIndexMap.put(device, getValidIndex(index));
                }
            }