Merge "Merge cherrypicks of [19418348] into rvc-platform-release. am: dd4125beeb" into android11-gsi
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index 73c39f1..bcbd278 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -8887,6 +8887,12 @@
if (isOutput()) {
ret = AudioSystem::startOutput(portId);
} else {
+ {
+ // Add the track record before starting input so that the silent status for the
+ // client can be cached.
+ Mutex::Autolock _l(mLock);
+ setClientSilencedState_l(portId, false /*silenced*/);
+ }
ret = AudioSystem::startInput(portId);
}
@@ -8905,6 +8911,7 @@
} else {
mHalStream->stop();
}
+ eraseClientSilencedState_l(portId);
return PERMISSION_DENIED;
}
@@ -8913,6 +8920,9 @@
mChannelMask, mSessionId, isOutput(), client.clientUid,
client.clientPid, IPCThreadState::self()->getCallingPid(),
portId);
+ if (!isOutput()) {
+ track->setSilenced_l(isClientSilenced_l(portId));
+ }
if (isOutput()) {
// force volume update when a new track is added
@@ -8969,6 +8979,7 @@
}
mActiveTracks.remove(track);
+ eraseClientSilencedState_l(track->portId());
mLock.unlock();
if (isOutput()) {
@@ -9748,6 +9759,7 @@
broadcast_l();
}
}
+ setClientSilencedIfExists_l(portId, silenced);
}
void AudioFlinger::MmapCaptureThread::toAudioPortConfig(struct audio_port_config *config)
diff --git a/services/audioflinger/Threads.h b/services/audioflinger/Threads.h
index 6b33ad5..2c2d664 100644
--- a/services/audioflinger/Threads.h
+++ b/services/audioflinger/Threads.h
@@ -1843,6 +1843,26 @@
virtual void setRecordSilenced(audio_port_handle_t portId __unused,
bool silenced __unused) {}
+ void setClientSilencedState_l(audio_port_handle_t portId, bool silenced) {
+ mClientSilencedStates[portId] = silenced;
+ }
+
+ size_t eraseClientSilencedState_l(audio_port_handle_t portId) {
+ return mClientSilencedStates.erase(portId);
+ }
+
+ bool isClientSilenced_l(audio_port_handle_t portId) const {
+ const auto it = mClientSilencedStates.find(portId);
+ return it != mClientSilencedStates.end() ? it->second : false;
+ }
+
+ void setClientSilencedIfExists_l(audio_port_handle_t portId, bool silenced) {
+ const auto it = mClientSilencedStates.find(portId);
+ if (it != mClientSilencedStates.end()) {
+ it->second = silenced;
+ }
+ }
+
protected:
void dumpInternals_l(int fd, const Vector<String16>& args) override;
void dumpTracks_l(int fd, const Vector<String16>& args) override;
@@ -1862,6 +1882,7 @@
AudioHwDevice* const mAudioHwDev;
ActiveTracks<MmapTrack> mActiveTracks;
float mHalVolFloat;
+ std::map<audio_port_handle_t, bool> mClientSilencedStates;
int32_t mNoCallbackWarningCount;
static constexpr int32_t kMaxNoCallbackWarnings = 5;