Fix VolumeShaper unducking for OpenSLES playback
Native PlayerBase::applyVolumeShaper was never called (silent failure)
due to an undeclared nullable InterpolatorConfig parcelable
which was sent as null.
Test: see bug for repro details
Bug: 185372526
Change-Id: Id18664978605602f287e15de0c920ffc83a9aada
diff --git a/aidl/android/media/VolumeShaperConfiguration.aidl b/aidl/android/media/VolumeShaperConfiguration.aidl
index 6361851..824c169 100644
--- a/aidl/android/media/VolumeShaperConfiguration.aidl
+++ b/aidl/android/media/VolumeShaperConfiguration.aidl
@@ -29,5 +29,5 @@
/** Bitmask, indexed by VolumeShaperConfigurationOptionFlag. */
int optionFlags;
double durationMs;
- InterpolatorConfig interpolatorConfig;
+ @nullable InterpolatorConfig interpolatorConfig; // null if type == ID
}
diff --git a/include/media/VolumeShaper.h b/include/media/VolumeShaper.h
index f8ead2f..5271e10 100644
--- a/include/media/VolumeShaper.h
+++ b/include/media/VolumeShaper.h
@@ -302,7 +302,8 @@
if (mType != TYPE_ID) {
parcelable->optionFlags = getOptionFlagsAsAidl();
parcelable->durationMs = getDurationMs();
- Interpolator<S, T>::writeToConfig(&parcelable->interpolatorConfig);
+ parcelable->interpolatorConfig.emplace(); // create value in std::optional
+ Interpolator<S, T>::writeToConfig(&*parcelable->interpolatorConfig);
}
}
@@ -319,8 +320,10 @@
? NO_ERROR
: setOptionFlagsFromAidl(parcelable.optionFlags)
?: setDurationMs(parcelable.durationMs)
- ?: Interpolator<S, T>::readFromConfig(parcelable.interpolatorConfig)
- ?: checkCurve();
+ ?: !parcelable.interpolatorConfig // check std::optional for value
+ ? BAD_VALUE // must be nonnull.
+ : Interpolator<S, T>::readFromConfig(*parcelable.interpolatorConfig)
+ ?: checkCurve();
}
// Returns a string for debug printing.