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/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index 2d4c475..cdae456 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -1147,6 +1147,42 @@
return OK;
}
+VolumeShaper::Status MediaPlayerService::Client::applyVolumeShaper(
+ const sp<VolumeShaper::Configuration>& configuration,
+ const sp<VolumeShaper::Operation>& operation) {
+ // for hardware output, call player instead
+ ALOGV("Client::applyVolumeShaper(%p)", this);
+ sp<MediaPlayerBase> p = getPlayer();
+ {
+ Mutex::Autolock l(mLock);
+ if (p != 0 && p->hardwareOutput()) {
+ // TODO: investigate internal implementation
+ return VolumeShaper::Status(INVALID_OPERATION);
+ }
+ if (mAudioOutput.get() != nullptr) {
+ return mAudioOutput->applyVolumeShaper(configuration, operation);
+ }
+ }
+ return VolumeShaper::Status(INVALID_OPERATION);
+}
+
+sp<VolumeShaper::State> MediaPlayerService::Client::getVolumeShaperState(int id) {
+ // for hardware output, call player instead
+ ALOGV("Client::getVolumeShaperState(%p)", this);
+ sp<MediaPlayerBase> p = getPlayer();
+ {
+ Mutex::Autolock l(mLock);
+ if (p != 0 && p->hardwareOutput()) {
+ // TODO: investigate internal implementation.
+ return nullptr;
+ }
+ if (mAudioOutput.get() != nullptr) {
+ return mAudioOutput->getVolumeShaperState(id);
+ }
+ }
+ return nullptr;
+}
+
status_t MediaPlayerService::Client::seekTo(int msec, MediaPlayerSeekMode mode)
{
ALOGV("[%d] seekTo(%d, %d)", mConnId, msec, mode);
@@ -2146,6 +2182,27 @@
return NO_ERROR;
}
+VolumeShaper::Status MediaPlayerService::AudioOutput::applyVolumeShaper(
+ const sp<VolumeShaper::Configuration>& configuration,
+ const sp<VolumeShaper::Operation>& operation)
+{
+ Mutex::Autolock lock(mLock);
+ ALOGV("AudioOutput::applyVolumeShaper");
+ if (mTrack != 0) {
+ return mTrack->applyVolumeShaper(configuration, operation);
+ }
+ return VolumeShaper::Status(INVALID_OPERATION);
+}
+
+sp<VolumeShaper::State> MediaPlayerService::AudioOutput::getVolumeShaperState(int id)
+{
+ Mutex::Autolock lock(mLock);
+ if (mTrack != 0) {
+ return mTrack->getVolumeShaperState(id);
+ }
+ return nullptr;
+}
+
// static
void MediaPlayerService::AudioOutput::CallbackWrapper(
int event, void *cookie, void *info) {
diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h
index 819973e..cbaf21c 100644
--- a/media/libmediaplayerservice/MediaPlayerService.h
+++ b/media/libmediaplayerservice/MediaPlayerService.h
@@ -129,6 +129,11 @@
virtual status_t setParameters(const String8& keyValuePairs);
virtual String8 getParameters(const String8& keys);
+ virtual VolumeShaper::Status applyVolumeShaper(
+ const sp<VolumeShaper::Configuration>& configuration,
+ const sp<VolumeShaper::Operation>& operation) override;
+ virtual sp<VolumeShaper::State> getVolumeShaperState(int id) override;
+
private:
static void setMinBufferCount();
static void CallbackWrapper(
@@ -323,6 +328,11 @@
virtual status_t getRetransmitEndpoint(struct sockaddr_in* endpoint);
virtual status_t setNextPlayer(const sp<IMediaPlayer>& player);
+ virtual VolumeShaper::Status applyVolumeShaper(
+ const sp<VolumeShaper::Configuration>& configuration,
+ const sp<VolumeShaper::Operation>& operation) override;
+ virtual sp<VolumeShaper::State> getVolumeShaperState(int id) override;
+
sp<MediaPlayerBase> createPlayer(player_type playerType);
virtual status_t setDataSource(