diff options
author | Eric Laurent <elaurent@google.com> | 2015-06-26 09:39:24 -0700 |
---|---|---|
committer | Eric Laurent <elaurent@google.com> | 2015-06-26 12:38:13 -0700 |
commit | e8726fea8a53bf3474aa3c6deaf2f6c1f565e694 (patch) | |
tree | d72b6ffcc7e33c178e3cac7c108b102041451cb6 /services/audiopolicy/service | |
parent | ed8505836c0b2fba0ab4be0c1eff31d4f241bc1d (diff) | |
download | frameworks_av-e8726fea8a53bf3474aa3c6deaf2f6c1f565e694.zip frameworks_av-e8726fea8a53bf3474aa3c6deaf2f6c1f565e694.tar.gz frameworks_av-e8726fea8a53bf3474aa3c6deaf2f6c1f565e694.tar.bz2 |
reduce number of binder calls from mediaserver
Reduce the number of audio port, audio patch and
IO config changed binder calls from mediaserver to
client processes:
- Do not call IO config changed callback if selected
device is the same as previously selected one on a given
audio flinger playback or capture thread.
- Do not call the audio port or audo patch list update
callback on a client if this client as no listener registered.
Bug: 22045560.
Change-Id: If780e105404de79b7cb5c80c27b793ceb6b1c423
Diffstat (limited to 'services/audiopolicy/service')
-rw-r--r-- | services/audiopolicy/service/AudioPolicyService.cpp | 24 | ||||
-rw-r--r-- | services/audiopolicy/service/AudioPolicyService.h | 4 |
2 files changed, 25 insertions, 3 deletions
diff --git a/services/audiopolicy/service/AudioPolicyService.cpp b/services/audiopolicy/service/AudioPolicyService.cpp index c5f4fb7..fbe4f18 100644 --- a/services/audiopolicy/service/AudioPolicyService.cpp +++ b/services/audiopolicy/service/AudioPolicyService.cpp @@ -166,6 +166,17 @@ void AudioPolicyService::registerClient(const sp<IAudioPolicyServiceClient>& cli } } +void AudioPolicyService::setAudioPortCallbacksEnabled(bool enabled) +{ + Mutex::Autolock _l(mNotificationClientsLock); + + uid_t uid = IPCThreadState::self()->getCallingUid(); + if (mNotificationClients.indexOfKey(uid) < 0) { + return; + } + mNotificationClients.valueFor(uid)->setAudioPortCallbacksEnabled(enabled); +} + // removeNotificationClient() is called when the client process dies. void AudioPolicyService::removeNotificationClient(uid_t uid) { @@ -246,7 +257,8 @@ status_t AudioPolicyService::clientSetAudioPortConfig(const struct audio_port_co AudioPolicyService::NotificationClient::NotificationClient(const sp<AudioPolicyService>& service, const sp<IAudioPolicyServiceClient>& client, uid_t uid) - : mService(service), mUid(uid), mAudioPolicyServiceClient(client) + : mService(service), mUid(uid), mAudioPolicyServiceClient(client), + mAudioPortCallbacksEnabled(false) { } @@ -265,14 +277,14 @@ void AudioPolicyService::NotificationClient::binderDied(const wp<IBinder>& who _ void AudioPolicyService::NotificationClient::onAudioPortListUpdate() { - if (mAudioPolicyServiceClient != 0) { + if (mAudioPolicyServiceClient != 0 && mAudioPortCallbacksEnabled) { mAudioPolicyServiceClient->onAudioPortListUpdate(); } } void AudioPolicyService::NotificationClient::onAudioPatchListUpdate() { - if (mAudioPolicyServiceClient != 0) { + if (mAudioPolicyServiceClient != 0 && mAudioPortCallbacksEnabled) { mAudioPolicyServiceClient->onAudioPatchListUpdate(); } } @@ -285,6 +297,12 @@ void AudioPolicyService::NotificationClient::onDynamicPolicyMixStateUpdate( } } +void AudioPolicyService::NotificationClient::setAudioPortCallbacksEnabled(bool enabled) +{ + mAudioPortCallbacksEnabled = enabled; +} + + void AudioPolicyService::binderDied(const wp<IBinder>& who) { ALOGW("binderDied() %p, calling pid %d", who.unsafe_get(), IPCThreadState::self()->getCallingPid()); diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h index eb50cdd..a0d5aa2 100644 --- a/services/audiopolicy/service/AudioPolicyService.h +++ b/services/audiopolicy/service/AudioPolicyService.h @@ -185,6 +185,8 @@ public: virtual void registerClient(const sp<IAudioPolicyServiceClient>& client); + virtual void setAudioPortCallbacksEnabled(bool enabled); + virtual status_t acquireSoundTriggerSession(audio_session_t *session, audio_io_handle_t *ioHandle, audio_devices_t *device); @@ -507,6 +509,7 @@ private: void onAudioPortListUpdate(); void onAudioPatchListUpdate(); void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state); + void setAudioPortCallbacksEnabled(bool enabled); // IBinder::DeathRecipient virtual void binderDied(const wp<IBinder>& who); @@ -518,6 +521,7 @@ private: const wp<AudioPolicyService> mService; const uid_t mUid; const sp<IAudioPolicyServiceClient> mAudioPolicyServiceClient; + bool mAudioPortCallbacksEnabled; }; // Internal dump utilities. |