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

Commit 825a5ea3 authored by Eric Laurent's avatar Eric Laurent
Browse files

AudioService: fix mismatch in device volume index for alias streams

Fix VolumeStreamState.setIndex() to force device volume
index update on an alias stream when no specific device volume exists
on the VolumeStreamState of this alias stream.

This prevents asymetric behaviors of setDeviceVolume() and setAllVolumes()
causing some stream types to be muted and
not unmuted if no specific device volume index exist.

Test: make
Test: wipe device, setup wizard, place call and check nofication volume

Bug: 32626244
Change-Id: Idd170aa9f295b0a9533a589e1891a04c05ab2f2f
(cherry picked from commit 3fb608e4)
parent 987f4e53
Loading
Loading
Loading
Loading
+23 −15
Original line number Diff line number Diff line
@@ -4035,25 +4035,27 @@ public class AudioService extends IAudioService.Stub {
                mIndexMap.put(device, index);

                changed = oldIndex != index;
                if (changed) {
                    // Apply change to all streams using this one as alias
                    // if changing volume of current device, also change volume of current
                // Apply change to all streams using this one as alias if:
                // - the index actually changed OR
                // - there is no volume index stored for this device on alias stream.
                // If changing volume of current device, also change volume of current
                // device on aliased stream
                    boolean currentDevice = (device == getDeviceForStream(mStreamType));
                    int numStreamTypes = AudioSystem.getNumStreamTypes();
                final boolean currentDevice = (device == getDeviceForStream(mStreamType));
                final int numStreamTypes = AudioSystem.getNumStreamTypes();
                for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) {
                    final VolumeStreamState aliasStreamState = mStreamStates[streamType];
                    if (streamType != mStreamType &&
                                mStreamVolumeAlias[streamType] == mStreamType) {
                            int scaledIndex = rescaleIndex(index, mStreamType, streamType);
                            mStreamStates[streamType].setIndex(scaledIndex, device, caller);
                            mStreamVolumeAlias[streamType] == mStreamType &&
                            (changed || !aliasStreamState.hasIndexForDevice(device))) {
                        final int scaledIndex = rescaleIndex(index, mStreamType, streamType);
                        aliasStreamState.setIndex(scaledIndex, device, caller);
                        if (currentDevice) {
                                mStreamStates[streamType].setIndex(scaledIndex,
                            aliasStreamState.setIndex(scaledIndex,
                                    getDeviceForStream(streamType), caller);
                        }
                    }
                }
            }
            }
            if (changed) {
                oldIndex = (oldIndex + 5) / 10;
                index = (index + 5) / 10;
@@ -4086,6 +4088,12 @@ public class AudioService extends IAudioService.Stub {
            }
        }

        public boolean hasIndexForDevice(int device) {
            synchronized (VolumeStreamState.class) {
                return (mIndexMap.get(device, -1) != -1);
            }
        }

        public int getMaxIndex() {
            return mIndexMax;
        }