From e8726fea8a53bf3474aa3c6deaf2f6c1f565e694 Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Fri, 26 Jun 2015 09:39:24 -0700 Subject: 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 --- media/libmedia/AudioSystem.cpp | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) (limited to 'media/libmedia/AudioSystem.cpp') diff --git a/media/libmedia/AudioSystem.cpp b/media/libmedia/AudioSystem.cpp index 6c2c226..f13bcf3 100644 --- a/media/libmedia/AudioSystem.cpp +++ b/media/libmedia/AudioSystem.cpp @@ -1043,7 +1043,11 @@ status_t AudioSystem::addAudioPortCallback(const sp& callback if (gAudioPolicyServiceClient == 0) { return NO_INIT; } - return gAudioPolicyServiceClient->addAudioPortCallback(callback); + int ret = gAudioPolicyServiceClient->addAudioPortCallback(callback); + if (ret == 1) { + aps->setAudioPortCallbacksEnabled(true); + } + return (ret < 0) ? INVALID_OPERATION : NO_ERROR; } /*static*/ @@ -1056,7 +1060,11 @@ status_t AudioSystem::removeAudioPortCallback(const sp& callb if (gAudioPolicyServiceClient == 0) { return NO_INIT; } - return gAudioPolicyServiceClient->removeAudioPortCallback(callback); + int ret = gAudioPolicyServiceClient->removeAudioPortCallback(callback); + if (ret == 0) { + aps->setAudioPortCallbacksEnabled(false); + } + return (ret < 0) ? INVALID_OPERATION : NO_ERROR; } status_t AudioSystem::addAudioDeviceCallback( @@ -1138,20 +1146,20 @@ status_t AudioSystem::stopAudioSource(audio_io_handle_t handle) // --------------------------------------------------------------------------- -status_t AudioSystem::AudioPolicyServiceClient::addAudioPortCallback( +int AudioSystem::AudioPolicyServiceClient::addAudioPortCallback( const sp& callback) { Mutex::Autolock _l(mLock); for (size_t i = 0; i < mAudioPortCallbacks.size(); i++) { if (mAudioPortCallbacks[i] == callback) { - return INVALID_OPERATION; + return -1; } } mAudioPortCallbacks.add(callback); - return NO_ERROR; + return mAudioPortCallbacks.size(); } -status_t AudioSystem::AudioPolicyServiceClient::removeAudioPortCallback( +int AudioSystem::AudioPolicyServiceClient::removeAudioPortCallback( const sp& callback) { Mutex::Autolock _l(mLock); @@ -1162,10 +1170,10 @@ status_t AudioSystem::AudioPolicyServiceClient::removeAudioPortCallback( } } if (i == mAudioPortCallbacks.size()) { - return INVALID_OPERATION; + return -1; } mAudioPortCallbacks.removeAt(i); - return NO_ERROR; + return mAudioPortCallbacks.size(); } -- cgit v1.1