AudioPolicyManager volume init on invalid min/max
Detect situations where min/max volumes are invalid
in AudioPolicyManager::checkAndSetVolume and return
an error. On error, call back into AudioService
to request the volume ranges to be reinitialized.
Bug: 206966260
Test: upcoming AudioService test
Change-Id: Ie63d9b9e3faad0a3e897f2807ece383632860adb
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index f08d4ad..334f267 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -2115,11 +2115,15 @@
// apply volume rules for current stream and device if necessary
auto &curves = getVolumeCurves(client->attributes());
- checkAndSetVolume(curves, client->volumeSource(),
+ if (NO_ERROR != checkAndSetVolume(curves, client->volumeSource(),
curves.getVolumeIndex(outputDesc->devices().types()),
outputDesc,
outputDesc->devices().types(), 0 /*delay*/,
- outputDesc->useHwGain() /*force*/);
+ outputDesc->useHwGain() /*force*/)) {
+ // request AudioService to reinitialize the volume curves asynchronously
+ ALOGE("checkAndSetVolume failed, requesting volume range init");
+ mpClientInterface->onVolumeRangeInitRequest();
+ };
// update the outputs if starting an output with a stream that can affect notification
// routing
@@ -7244,6 +7248,11 @@
deviceTypes = outputDesc->devices().types();
}
+ if (curves.getVolumeIndexMin() < 0 || curves.getVolumeIndexMax() < 0) {
+ ALOGE("invalid volume index range");
+ return BAD_VALUE;
+ }
+
float volumeDb = computeVolume(curves, volumeSource, index, deviceTypes);
if (outputDesc->isFixedVolume(deviceTypes) ||
// Force VoIP volume to max for bluetooth SCO device except if muted