Loading services/core/java/com/android/server/audio/AudioService.java +37 −55 Original line number Diff line number Diff line Loading @@ -95,6 +95,7 @@ import android.text.TextUtils; import android.util.Log; import android.util.MathUtils; import android.util.Slog; import android.util.SparseIntArray; import android.view.KeyEvent; import android.view.OrientationEventListener; import android.view.Surface; Loading @@ -118,7 +119,6 @@ import java.util.Map; import java.util.NoSuchElementException; import java.util.Objects; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; /** * The implementation of the volume manager service. Loading Loading @@ -1900,12 +1900,12 @@ public class AudioService extends IAudioService.Stub { if ((isPlatformVoice() || mHasVibrator) && mStreamVolumeAlias[streamType] == AudioSystem.STREAM_RING) { synchronized (VolumeStreamState.class) { Set set = mStreamStates[streamType].mIndex.entrySet(); Iterator i = set.iterator(); while (i.hasNext()) { Map.Entry entry = (Map.Entry)i.next(); if ((Integer)entry.getValue() == 0) { entry.setValue(10); SparseIntArray indexMap = mStreamStates[streamType].mIndexMap; for (int i = 0; i < indexMap.size(); i++) { int device = indexMap.keyAt(i); int value = indexMap.valueAt(i); if (value == 0) { indexMap.put(device, 10); } } // Persist volume for stream ring when it is changed here Loading Loading @@ -3489,8 +3489,7 @@ public class AudioService extends IAudioService.Stub { private boolean mIsMuted; private String mVolumeIndexSettingName; private int mIndexMax; private final ConcurrentHashMap<Integer, Integer> mIndex = new ConcurrentHashMap<Integer, Integer>(8, 0.75f, 4); private final SparseIntArray mIndexMap = new SparseIntArray(8); private final Intent mVolumeChanged; private VolumeStreamState(String settingName, int streamType) { Loading Loading @@ -3521,7 +3520,7 @@ public class AudioService extends IAudioService.Stub { // force maximum volume on all streams if fixed volume property // or master volume property is set if (mUseFixedVolume || mUseMasterVolume) { mIndex.put(AudioSystem.DEVICE_OUT_DEFAULT, mIndexMax); mIndexMap.put(AudioSystem.DEVICE_OUT_DEFAULT, mIndexMax); return; } // do not read system stream volume from settings: this stream is always aliased Loading @@ -3535,7 +3534,7 @@ public class AudioService extends IAudioService.Stub { index = mIndexMax; } } mIndex.put(AudioSystem.DEVICE_OUT_DEFAULT, index); mIndexMap.put(AudioSystem.DEVICE_OUT_DEFAULT, index); return; } Loading @@ -3560,7 +3559,7 @@ public class AudioService extends IAudioService.Stub { continue; } mIndex.put(device, getValidIndex(10 * index)); mIndexMap.put(device, getValidIndex(10 * index)); } } } Loading Loading @@ -3591,11 +3590,8 @@ public class AudioService extends IAudioService.Stub { } AudioSystem.setStreamVolumeIndex(mStreamType, index, AudioSystem.DEVICE_OUT_DEFAULT); // then apply device specific volumes Set set = mIndex.entrySet(); Iterator i = set.iterator(); while (i.hasNext()) { Map.Entry entry = (Map.Entry)i.next(); int device = ((Integer)entry.getKey()).intValue(); for (int i = 0; i < mIndexMap.size(); i++) { int device = mIndexMap.keyAt(i); if (device != AudioSystem.DEVICE_OUT_DEFAULT) { if (mIsMuted) { index = 0; Loading @@ -3605,7 +3601,7 @@ public class AudioService extends IAudioService.Stub { { index = (mIndexMax + 5)/10; } else { index = ((Integer)entry.getValue() + 5)/10; index = (mIndexMap.valueAt(i) + 5)/10; } AudioSystem.setStreamVolumeIndex(mStreamType, index, device); } Loading @@ -3629,7 +3625,7 @@ public class AudioService extends IAudioService.Stub { index = mIndexMax; } } mIndex.put(device, index); mIndexMap.put(device, index); changed = oldIndex != index; if (changed) { Loading Loading @@ -3664,12 +3660,12 @@ public class AudioService extends IAudioService.Stub { public int getIndex(int device) { synchronized (VolumeStreamState.class) { Integer index = mIndex.get(device); if (index == null) { int index = mIndexMap.get(device, -1); if (index == -1) { // there is always an entry for AudioSystem.DEVICE_OUT_DEFAULT index = mIndex.get(AudioSystem.DEVICE_OUT_DEFAULT); index = mIndexMap.get(AudioSystem.DEVICE_OUT_DEFAULT); } return index.intValue(); return index; } } Loading @@ -3684,19 +3680,14 @@ public class AudioService extends IAudioService.Stub { // some devices are present in this stream state but not in source stream state int index = srcStream.getIndex(AudioSystem.DEVICE_OUT_DEFAULT); index = rescaleIndex(index, srcStreamType, mStreamType); Set set = mIndex.entrySet(); Iterator i = set.iterator(); while (i.hasNext()) { Map.Entry entry = (Map.Entry)i.next(); entry.setValue(index); for (int i = 0; i < mIndexMap.size(); i++) { mIndexMap.put(mIndexMap.keyAt(i), index); } // Now apply actual volume for devices in source stream state set = srcStream.mIndex.entrySet(); i = set.iterator(); while (i.hasNext()) { Map.Entry entry = (Map.Entry)i.next(); int device = ((Integer)entry.getKey()).intValue(); index = ((Integer)entry.getValue()).intValue(); SparseIntArray srcMap = srcStream.mIndexMap; for (int i = 0; i < srcMap.size(); i++) { int device = srcMap.keyAt(i); index = srcMap.valueAt(i); index = rescaleIndex(index, srcStreamType, mStreamType); setIndex(index, device); Loading @@ -3706,11 +3697,8 @@ public class AudioService extends IAudioService.Stub { public void setAllIndexesToMax() { synchronized (VolumeStreamState.class) { Set set = mIndex.entrySet(); Iterator i = set.iterator(); while (i.hasNext()) { Map.Entry entry = (Map.Entry)i.next(); entry.setValue(mIndexMax); for (int i = 0; i < mIndexMap.size(); i++) { mIndexMap.put(mIndexMap.keyAt(i), mIndexMax); } } } Loading Loading @@ -3750,15 +3738,12 @@ public class AudioService extends IAudioService.Stub { synchronized (VolumeStreamState.class) { // ignore settings for fixed volume devices: volume should always be at max or 0 if (mStreamVolumeAlias[mStreamType] == AudioSystem.STREAM_MUSIC) { Set set = mIndex.entrySet(); Iterator i = set.iterator(); while (i.hasNext()) { Map.Entry entry = (Map.Entry)i.next(); int device = ((Integer)entry.getKey()).intValue(); int index = ((Integer)entry.getValue()).intValue(); for (int i = 0; i < mIndexMap.size(); i++) { int device = mIndexMap.keyAt(i); int index = mIndexMap.valueAt(i); if (((device & mFullVolumeDevices) != 0) || (((device & mFixedVolumeDevices) != 0) && index != 0)) { entry.setValue(mIndexMax); mIndexMap.put(device, mIndexMax); } applyDeviceVolume_syncVSS(device); } Loading @@ -3782,11 +3767,11 @@ public class AudioService extends IAudioService.Stub { pw.print(" Max: "); pw.println((mIndexMax + 5) / 10); pw.print(" Current: "); Set set = mIndex.entrySet(); Iterator i = set.iterator(); while (i.hasNext()) { Map.Entry entry = (Map.Entry)i.next(); final int device = (Integer) entry.getKey(); for (int i = 0; i < mIndexMap.size(); i++) { if (i > 0) { pw.print(", "); } final int device = mIndexMap.keyAt(i); pw.print(Integer.toHexString(device)); final String deviceName = device == AudioSystem.DEVICE_OUT_DEFAULT ? "default" : AudioSystem.getOutputDeviceName(device); Loading @@ -3796,11 +3781,8 @@ public class AudioService extends IAudioService.Stub { pw.print(")"); } pw.print(": "); final int index = (((Integer) entry.getValue()) + 5) / 10; final int index = (mIndexMap.valueAt(i) + 5) / 10; pw.print(index); if (i.hasNext()) { pw.print(", "); } } } } Loading Loading
services/core/java/com/android/server/audio/AudioService.java +37 −55 Original line number Diff line number Diff line Loading @@ -95,6 +95,7 @@ import android.text.TextUtils; import android.util.Log; import android.util.MathUtils; import android.util.Slog; import android.util.SparseIntArray; import android.view.KeyEvent; import android.view.OrientationEventListener; import android.view.Surface; Loading @@ -118,7 +119,6 @@ import java.util.Map; import java.util.NoSuchElementException; import java.util.Objects; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; /** * The implementation of the volume manager service. Loading Loading @@ -1900,12 +1900,12 @@ public class AudioService extends IAudioService.Stub { if ((isPlatformVoice() || mHasVibrator) && mStreamVolumeAlias[streamType] == AudioSystem.STREAM_RING) { synchronized (VolumeStreamState.class) { Set set = mStreamStates[streamType].mIndex.entrySet(); Iterator i = set.iterator(); while (i.hasNext()) { Map.Entry entry = (Map.Entry)i.next(); if ((Integer)entry.getValue() == 0) { entry.setValue(10); SparseIntArray indexMap = mStreamStates[streamType].mIndexMap; for (int i = 0; i < indexMap.size(); i++) { int device = indexMap.keyAt(i); int value = indexMap.valueAt(i); if (value == 0) { indexMap.put(device, 10); } } // Persist volume for stream ring when it is changed here Loading Loading @@ -3489,8 +3489,7 @@ public class AudioService extends IAudioService.Stub { private boolean mIsMuted; private String mVolumeIndexSettingName; private int mIndexMax; private final ConcurrentHashMap<Integer, Integer> mIndex = new ConcurrentHashMap<Integer, Integer>(8, 0.75f, 4); private final SparseIntArray mIndexMap = new SparseIntArray(8); private final Intent mVolumeChanged; private VolumeStreamState(String settingName, int streamType) { Loading Loading @@ -3521,7 +3520,7 @@ public class AudioService extends IAudioService.Stub { // force maximum volume on all streams if fixed volume property // or master volume property is set if (mUseFixedVolume || mUseMasterVolume) { mIndex.put(AudioSystem.DEVICE_OUT_DEFAULT, mIndexMax); mIndexMap.put(AudioSystem.DEVICE_OUT_DEFAULT, mIndexMax); return; } // do not read system stream volume from settings: this stream is always aliased Loading @@ -3535,7 +3534,7 @@ public class AudioService extends IAudioService.Stub { index = mIndexMax; } } mIndex.put(AudioSystem.DEVICE_OUT_DEFAULT, index); mIndexMap.put(AudioSystem.DEVICE_OUT_DEFAULT, index); return; } Loading @@ -3560,7 +3559,7 @@ public class AudioService extends IAudioService.Stub { continue; } mIndex.put(device, getValidIndex(10 * index)); mIndexMap.put(device, getValidIndex(10 * index)); } } } Loading Loading @@ -3591,11 +3590,8 @@ public class AudioService extends IAudioService.Stub { } AudioSystem.setStreamVolumeIndex(mStreamType, index, AudioSystem.DEVICE_OUT_DEFAULT); // then apply device specific volumes Set set = mIndex.entrySet(); Iterator i = set.iterator(); while (i.hasNext()) { Map.Entry entry = (Map.Entry)i.next(); int device = ((Integer)entry.getKey()).intValue(); for (int i = 0; i < mIndexMap.size(); i++) { int device = mIndexMap.keyAt(i); if (device != AudioSystem.DEVICE_OUT_DEFAULT) { if (mIsMuted) { index = 0; Loading @@ -3605,7 +3601,7 @@ public class AudioService extends IAudioService.Stub { { index = (mIndexMax + 5)/10; } else { index = ((Integer)entry.getValue() + 5)/10; index = (mIndexMap.valueAt(i) + 5)/10; } AudioSystem.setStreamVolumeIndex(mStreamType, index, device); } Loading @@ -3629,7 +3625,7 @@ public class AudioService extends IAudioService.Stub { index = mIndexMax; } } mIndex.put(device, index); mIndexMap.put(device, index); changed = oldIndex != index; if (changed) { Loading Loading @@ -3664,12 +3660,12 @@ public class AudioService extends IAudioService.Stub { public int getIndex(int device) { synchronized (VolumeStreamState.class) { Integer index = mIndex.get(device); if (index == null) { int index = mIndexMap.get(device, -1); if (index == -1) { // there is always an entry for AudioSystem.DEVICE_OUT_DEFAULT index = mIndex.get(AudioSystem.DEVICE_OUT_DEFAULT); index = mIndexMap.get(AudioSystem.DEVICE_OUT_DEFAULT); } return index.intValue(); return index; } } Loading @@ -3684,19 +3680,14 @@ public class AudioService extends IAudioService.Stub { // some devices are present in this stream state but not in source stream state int index = srcStream.getIndex(AudioSystem.DEVICE_OUT_DEFAULT); index = rescaleIndex(index, srcStreamType, mStreamType); Set set = mIndex.entrySet(); Iterator i = set.iterator(); while (i.hasNext()) { Map.Entry entry = (Map.Entry)i.next(); entry.setValue(index); for (int i = 0; i < mIndexMap.size(); i++) { mIndexMap.put(mIndexMap.keyAt(i), index); } // Now apply actual volume for devices in source stream state set = srcStream.mIndex.entrySet(); i = set.iterator(); while (i.hasNext()) { Map.Entry entry = (Map.Entry)i.next(); int device = ((Integer)entry.getKey()).intValue(); index = ((Integer)entry.getValue()).intValue(); SparseIntArray srcMap = srcStream.mIndexMap; for (int i = 0; i < srcMap.size(); i++) { int device = srcMap.keyAt(i); index = srcMap.valueAt(i); index = rescaleIndex(index, srcStreamType, mStreamType); setIndex(index, device); Loading @@ -3706,11 +3697,8 @@ public class AudioService extends IAudioService.Stub { public void setAllIndexesToMax() { synchronized (VolumeStreamState.class) { Set set = mIndex.entrySet(); Iterator i = set.iterator(); while (i.hasNext()) { Map.Entry entry = (Map.Entry)i.next(); entry.setValue(mIndexMax); for (int i = 0; i < mIndexMap.size(); i++) { mIndexMap.put(mIndexMap.keyAt(i), mIndexMax); } } } Loading Loading @@ -3750,15 +3738,12 @@ public class AudioService extends IAudioService.Stub { synchronized (VolumeStreamState.class) { // ignore settings for fixed volume devices: volume should always be at max or 0 if (mStreamVolumeAlias[mStreamType] == AudioSystem.STREAM_MUSIC) { Set set = mIndex.entrySet(); Iterator i = set.iterator(); while (i.hasNext()) { Map.Entry entry = (Map.Entry)i.next(); int device = ((Integer)entry.getKey()).intValue(); int index = ((Integer)entry.getValue()).intValue(); for (int i = 0; i < mIndexMap.size(); i++) { int device = mIndexMap.keyAt(i); int index = mIndexMap.valueAt(i); if (((device & mFullVolumeDevices) != 0) || (((device & mFixedVolumeDevices) != 0) && index != 0)) { entry.setValue(mIndexMax); mIndexMap.put(device, mIndexMax); } applyDeviceVolume_syncVSS(device); } Loading @@ -3782,11 +3767,11 @@ public class AudioService extends IAudioService.Stub { pw.print(" Max: "); pw.println((mIndexMax + 5) / 10); pw.print(" Current: "); Set set = mIndex.entrySet(); Iterator i = set.iterator(); while (i.hasNext()) { Map.Entry entry = (Map.Entry)i.next(); final int device = (Integer) entry.getKey(); for (int i = 0; i < mIndexMap.size(); i++) { if (i > 0) { pw.print(", "); } final int device = mIndexMap.keyAt(i); pw.print(Integer.toHexString(device)); final String deviceName = device == AudioSystem.DEVICE_OUT_DEFAULT ? "default" : AudioSystem.getOutputDeviceName(device); Loading @@ -3796,11 +3781,8 @@ public class AudioService extends IAudioService.Stub { pw.print(")"); } pw.print(": "); final int index = (((Integer) entry.getValue()) + 5) / 10; final int index = (mIndexMap.valueAt(i) + 5) / 10; pw.print(index); if (i.hasNext()) { pw.print(", "); } } } } Loading