VolumeShaper: Add AudioTrack restore
MediaPlayer VolumeShaper can now be set before start().
Test: CTS and Ducking
Bug: 31015569
Change-Id: Idf63c167e164161b200e2467fbeb9409b3097dbe
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index a8b6c66..f3fc924 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -1566,7 +1566,8 @@
mPid(pid),
mSendLevel(0.0),
mAuxEffectId(0),
- mFlags(AUDIO_OUTPUT_FLAG_NONE)
+ mFlags(AUDIO_OUTPUT_FLAG_NONE),
+ mVolumeHandler(new VolumeHandler())
{
ALOGV("AudioOutput(%d)", sessionId);
if (attr != NULL) {
@@ -2030,6 +2031,13 @@
ALOGV("setVolume");
t->setVolume(mLeftVolume, mRightVolume);
+ // Dispatch any queued VolumeShapers when the track was not open.
+ mVolumeHandler->forall([&t](const sp<VolumeShaper::Configuration> &configuration,
+ const sp<VolumeShaper::Operation> &operation) -> VolumeShaper::Status {
+ return t->applyVolumeShaper(configuration, operation);
+ });
+ mVolumeHandler->reset(); // After dispatching, clear VolumeShaper queue.
+
mSampleRateHz = sampleRate;
mFlags = flags;
mMsecsPerFrame = 1E3f / (mPlaybackRate.mSpeed * sampleRate);
@@ -2272,10 +2280,14 @@
{
Mutex::Autolock lock(mLock);
ALOGV("AudioOutput::applyVolumeShaper");
+
+ // We take ownership of the VolumeShaper if set before the track is created.
+ mVolumeHandler->setIdIfNecessary(configuration);
if (mTrack != 0) {
return mTrack->applyVolumeShaper(configuration, operation);
+ } else {
+ return mVolumeHandler->applyVolumeShaper(configuration, operation);
}
- return VolumeShaper::Status(INVALID_OPERATION);
}
sp<VolumeShaper::State> MediaPlayerService::AudioOutput::getVolumeShaperState(int id)
@@ -2283,8 +2295,9 @@
Mutex::Autolock lock(mLock);
if (mTrack != 0) {
return mTrack->getVolumeShaperState(id);
+ } else {
+ return mVolumeHandler->getVolumeShaperState(id);
}
- return nullptr;
}
// static
diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h
index dff7322..009fe73 100644
--- a/media/libmediaplayerservice/MediaPlayerService.h
+++ b/media/libmediaplayerservice/MediaPlayerService.h
@@ -165,6 +165,7 @@
float mSendLevel;
int mAuxEffectId;
audio_output_flags_t mFlags;
+ sp<VolumeHandler> mVolumeHandler;
mutable Mutex mLock;
// static variables below not protected by mutex