summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/audio/AudioService.java83
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));
}
}