Set the piid for the MediaPlayer AudioTrack
This enables the mapping between piid and portId in the AudioService.
The mapping is used for the playback mute notifications.
Test: dumpsys audio & atest android.media.audio.cts.AudioPlaybackConfigurationTest
Bug: 235521198
Change-Id: I60f0b154f7464fe6012e546c0a30e65220482181
diff --git a/media/libmedia/include/media/mediaplayer.h b/media/libmedia/include/media/mediaplayer.h
index de4c7db..b45dae5 100644
--- a/media/libmedia/include/media/mediaplayer.h
+++ b/media/libmedia/include/media/mediaplayer.h
@@ -195,7 +195,8 @@
INVOKE_ID_SELECT_TRACK = 4,
INVOKE_ID_UNSELECT_TRACK = 5,
INVOKE_ID_SET_VIDEO_SCALING_MODE = 6,
- INVOKE_ID_GET_SELECTED_TRACK = 7
+ INVOKE_ID_GET_SELECTED_TRACK = 7,
+ INVOKE_ID_SET_PLAYER_IID = 8,
};
// ----------------------------------------------------------------------------
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index 8e19d02..f3cbdb0 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -1805,7 +1805,8 @@
MediaPlayerService::AudioOutput::AudioOutput(audio_session_t sessionId,
const AttributionSourceState& attributionSource, const audio_attributes_t* attr,
const sp<AudioSystem::AudioDeviceCallback>& deviceCallback)
- : mCallback(NULL),
+ : mCachedPlayerIId(PLAYER_PIID_INVALID),
+ mCallback(NULL),
mCallbackCookie(NULL),
mCallbackData(NULL),
mStreamType(AUDIO_STREAM_MUSIC),
@@ -2314,6 +2315,10 @@
return t->applyVolumeShaper(shaper.mConfiguration, operationToEnd);
});
+ if (mCachedPlayerIId != PLAYER_PIID_INVALID) {
+ t->setPlayerIId(mCachedPlayerIId);
+ }
+
mSampleRateHz = sampleRate;
mFlags = flags;
mMsecsPerFrame = 1E3f / (mPlaybackRate.mSpeed * sampleRate);
@@ -2366,6 +2371,17 @@
return NO_INIT;
}
+void MediaPlayerService::AudioOutput::setPlayerIId(int32_t playerIId)
+{
+ ALOGV("setPlayerIId(%d)", playerIId);
+ Mutex::Autolock lock(mLock);
+ mCachedPlayerIId = playerIId;
+
+ if (mTrack != nullptr) {
+ mTrack->setPlayerIId(mCachedPlayerIId);
+ }
+}
+
void MediaPlayerService::AudioOutput::setNextOutput(const sp<AudioOutput>& nextOutput) {
Mutex::Autolock lock(mLock);
mNextOutput = nextOutput;
diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h
index 86be3fe..52c2f79 100644
--- a/media/libmediaplayerservice/MediaPlayerService.h
+++ b/media/libmediaplayerservice/MediaPlayerService.h
@@ -113,6 +113,8 @@
bool doNotReconnect = false,
uint32_t suggestedFrameCount = 0);
+ virtual void setPlayerIId(int32_t playerIId);
+
virtual status_t start();
virtual ssize_t write(const void* buffer, size_t size, bool blocking = true);
virtual void stop();
@@ -160,6 +162,7 @@
sp<AudioTrack> mTrack;
sp<AudioTrack> mRecycledTrack;
sp<AudioOutput> mNextOutput;
+ int mCachedPlayerIId;
AudioCallback mCallback;
void * mCallbackCookie;
sp<CallbackData> mCallbackData;
diff --git a/media/libmediaplayerservice/include/MediaPlayerInterface.h b/media/libmediaplayerservice/include/MediaPlayerInterface.h
index 1cbd8a0..fb20aab 100644
--- a/media/libmediaplayerservice/include/MediaPlayerInterface.h
+++ b/media/libmediaplayerservice/include/MediaPlayerInterface.h
@@ -123,6 +123,8 @@
bool doNotReconnect = false,
uint32_t suggestedFrameCount = 0) = 0;
+ virtual void setPlayerIId(int32_t playerIId) = 0;
+
virtual status_t start() = 0;
/* Input parameter |size| is in byte units stored in |buffer|.
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
index 2a50fc2..ceea2f4 100644
--- a/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
+++ b/media/libmediaplayerservice/nuplayer/NuPlayerDriver.cpp
@@ -26,6 +26,7 @@
#include "NuPlayer.h"
#include "NuPlayerSource.h"
+#include <audiomanager/AudioManager.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/ALooper.h>
#include <media/stagefright/foundation/AUtils.h>
@@ -85,6 +86,7 @@
mMediaClock(new MediaClock),
mPlayer(new NuPlayer(pid, mMediaClock)),
mPlayerFlags(0),
+ mCachedPlayerIId(PLAYER_PIID_INVALID),
mMetricsItem(NULL),
mClientUid(-1),
mAtEOS(false),
@@ -804,6 +806,16 @@
return mPlayer->getSelectedTrack(type, reply);
}
+ case INVOKE_ID_SET_PLAYER_IID:
+ {
+ Mutex::Autolock autoLock(mAudioSinkLock);
+ mCachedPlayerIId = request.readInt32();
+ if (mAudioSink != nullptr) {
+ mAudioSink->setPlayerIId(mCachedPlayerIId);
+ }
+ return OK;
+ }
+
default:
{
return INVALID_OPERATION;
@@ -812,8 +824,12 @@
}
void NuPlayerDriver::setAudioSink(const sp<AudioSink> &audioSink) {
+ Mutex::Autolock autoLock(mAudioSinkLock);
mPlayer->setAudioSink(audioSink);
mAudioSink = audioSink;
+ if (mCachedPlayerIId != PLAYER_PIID_INVALID) {
+ mAudioSink->setPlayerIId(mCachedPlayerIId);
+ }
}
status_t NuPlayerDriver::setParameter(
@@ -1027,6 +1043,7 @@
if (mState != STATE_RESET_IN_PROGRESS) {
if (mAutoLoop) {
audio_stream_type_t streamType = AUDIO_STREAM_MUSIC;
+ Mutex::Autolock autoLock(mAudioSinkLock);
if (mAudioSink != NULL) {
streamType = mAudioSink->getAudioStreamType();
}
@@ -1037,6 +1054,7 @@
}
if (mLooping || mAutoLoop) {
mPlayer->seekToAsync(0);
+ Mutex::Autolock autoLock(mAudioSinkLock);
if (mAudioSink != NULL) {
// The renderer has stopped the sink at the end in order to play out
// the last little bit of audio. If we're looping, we need to restart it.
diff --git a/media/libmediaplayerservice/nuplayer/include/nuplayer/NuPlayerDriver.h b/media/libmediaplayerservice/nuplayer/include/nuplayer/NuPlayerDriver.h
index 55a0fad..138cd6f 100644
--- a/media/libmediaplayerservice/nuplayer/include/nuplayer/NuPlayerDriver.h
+++ b/media/libmediaplayerservice/nuplayer/include/nuplayer/NuPlayerDriver.h
@@ -140,9 +140,12 @@
sp<ALooper> mLooper;
const sp<MediaClock> mMediaClock;
const sp<NuPlayer> mPlayer;
- sp<AudioSink> mAudioSink;
uint32_t mPlayerFlags;
+ mutable Mutex mAudioSinkLock;
+ sp<AudioSink> mAudioSink GUARDED_BY(mAudioSinkLock);
+ int32_t mCachedPlayerIId GUARDED_BY(mAudioSinkLock);
+
mediametrics::Item *mMetricsItem;
mutable Mutex mMetricsLock;
uid_t mClientUid;