audiopolicy: fix wrong volume db value for voice call stream
When apply mute for voice stream, vol index 0 is set, while
voice stream minimum vol index is 1. This will cause negative
vol index is calculated and maximum db value is set.
Ensure vol index is valide to calculate.
Also add range check in rescaleVolumeIndex().
Bug: 123063166
Test: make
CRs-Fixed: 2056642
Change-Id: I89ee64d0914a971194a72b4de483d88b5029d80e
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index cc151e7..0ea3d72 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -2290,6 +2290,10 @@
int indexMax)
{
ALOGV("initStreamVolume() stream %d, min %d, max %d", stream , indexMin, indexMax);
+ if (indexMin < 0 || indexMax < 0) {
+ ALOGE("%s for stream %d: invalid min %d or max %d", __func__, stream , indexMin, indexMax);
+ return;
+ }
mVolumeCurves->initStreamVolume(stream, indexMin, indexMax);
// initialize other private stream volumes which follow this one
@@ -5624,6 +5628,15 @@
float minDst = (float)mVolumeCurves->getVolumeIndexMin(dstStream);
float maxDst = (float)mVolumeCurves->getVolumeIndexMax(dstStream);
+ // preserve mute request or correct range
+ if (srcIndex < minSrc) {
+ if (srcIndex == 0) {
+ return 0;
+ }
+ srcIndex = minSrc;
+ } else if (srcIndex > maxSrc) {
+ srcIndex = maxSrc;
+ }
return (int)(minDst + ((srcIndex - minSrc) * (maxDst - minDst)) / (maxSrc - minSrc));
}