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: Francois Gaffie <francois.gaffie@renault.com>
Change-Id: I00aa8c17bffca21a128086fbbbeafffc26521a3b
Merged-In: I239145d8bc50237ff902026594423c6d1fa04ad4
This commit is contained in:
committed by
Eric Laurent
parent
06a2db194f
commit
6677621887
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user