summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorEric Laurent <elaurent@google.com>2015-06-26 09:39:24 -0700
committerEric Laurent <elaurent@google.com>2015-06-26 12:38:13 -0700
commite8726fea8a53bf3474aa3c6deaf2f6c1f565e694 (patch)
treed72b6ffcc7e33c178e3cac7c108b102041451cb6 /media
parented8505836c0b2fba0ab4be0c1eff31d4f241bc1d (diff)
downloadframeworks_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 'media')
-rw-r--r--media/libmedia/AudioSystem.cpp24
-rw-r--r--media/libmedia/IAudioPolicyService.cpp17
2 files changed, 32 insertions, 9 deletions
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<AudioPortCallback>& 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<AudioPortCallback>& 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<AudioPortCallback>& 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<AudioPortCallback>& 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();
}
diff --git a/media/libmedia/IAudioPolicyService.cpp b/media/libmedia/IAudioPolicyService.cpp
index fd18f17..3348441 100644
--- a/media/libmedia/IAudioPolicyService.cpp
+++ b/media/libmedia/IAudioPolicyService.cpp
@@ -72,7 +72,8 @@ enum {
GET_PHONE_STATE,
REGISTER_POLICY_MIXES,
START_AUDIO_SOURCE,
- STOP_AUDIO_SOURCE
+ STOP_AUDIO_SOURCE,
+ SET_AUDIO_PORT_CALLBACK_ENABLED,
};
#define MAX_ITEMS_PER_LIST 1024
@@ -646,6 +647,14 @@ public:
remote()->transact(REGISTER_CLIENT, data, &reply);
}
+ virtual void setAudioPortCallbacksEnabled(bool enabled)
+ {
+ Parcel data, reply;
+ data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor());
+ data.writeInt32(enabled ? 1 : 0);
+ remote()->transact(SET_AUDIO_PORT_CALLBACK_ENABLED, data, &reply);
+ }
+
virtual status_t acquireSoundTriggerSession(audio_session_t *session,
audio_io_handle_t *ioHandle,
audio_devices_t *device)
@@ -1219,6 +1228,12 @@ status_t BnAudioPolicyService::onTransact(
return NO_ERROR;
} break;
+ case SET_AUDIO_PORT_CALLBACK_ENABLED: {
+ CHECK_INTERFACE(IAudioPolicyService, data, reply);
+ setAudioPortCallbacksEnabled(data.readInt32() == 1);
+ return NO_ERROR;
+ } break;
+
case ACQUIRE_SOUNDTRIGGER_SESSION: {
CHECK_INTERFACE(IAudioPolicyService, data, reply);
sp<IAudioPolicyServiceClient> client = interface_cast<IAudioPolicyServiceClient>(