VolumeShaper: Initial implementation
The VolumeShaper is used to apply a volume
envelope to an AudioTrack or a MediaPlayer.
Test: CTS
Bug: 30920125
Bug: 31015569
Change-Id: I42e2f13bd6879299dc780e60d143c2d465483a44
diff --git a/services/audioflinger/Tracks.cpp b/services/audioflinger/Tracks.cpp
index f2dd884..b772b5e 100644
--- a/services/audioflinger/Tracks.cpp
+++ b/services/audioflinger/Tracks.cpp
@@ -312,6 +312,16 @@
return mTrack->setParameters(keyValuePairs);
}
+VolumeShaper::Status AudioFlinger::TrackHandle::applyVolumeShaper(
+ const sp<VolumeShaper::Configuration>& configuration,
+ const sp<VolumeShaper::Operation>& operation) {
+ return mTrack->applyVolumeShaper(configuration, operation);
+}
+
+sp<VolumeShaper::State> AudioFlinger::TrackHandle::getVolumeShaperState(int id) {
+ return mTrack->getVolumeShaperState(id);
+}
+
status_t AudioFlinger::TrackHandle::getTimestamp(AudioTimestamp& timestamp)
{
return mTrack->getTimestamp(timestamp);
@@ -362,6 +372,7 @@
mAuxEffectId(0), mHasVolumeController(false),
mPresentationCompleteFrames(0),
mFrameMap(16 /* sink-frame-to-track-frame map memory */),
+ mVolumeHandler(new VolumeHandler(sampleRate)),
// mSinkTimestamp
mFastIndex(-1),
mCachedVolume(1.0),
@@ -874,6 +885,24 @@
}
}
+VolumeShaper::Status AudioFlinger::PlaybackThread::Track::applyVolumeShaper(
+ const sp<VolumeShaper::Configuration>& configuration,
+ const sp<VolumeShaper::Operation>& operation)
+{
+ // Note: We don't check if Thread exists.
+
+ // mVolumeHandler is thread-safe.
+ return mVolumeHandler->applyVolumeShaper(configuration, operation);
+}
+
+sp<VolumeShaper::State> AudioFlinger::PlaybackThread::Track::getVolumeShaperState(int id)
+{
+ // Note: We don't check if Thread exists.
+
+ // mVolumeHandler is thread safe.
+ return mVolumeHandler->getVolumeShaperState(id);
+}
+
status_t AudioFlinger::PlaybackThread::Track::getTimestamp(AudioTimestamp& timestamp)
{
if (!isOffloaded() && !isDirect()) {