From baac183f3808d7b68f184647a97bd381620415fe Mon Sep 17 00:00:00 2001 From: Eric Laurent Date: Mon, 1 Dec 2014 17:52:59 -0800 Subject: audio policy: binder calls for dynamic audio policy mixes Add binder calls to register and unregister dynamic mixes to AudioPolicyManager. Bug: 16009464. Change-Id: I4ef38166d0cfc88c984970969380d0cd6eb083ac --- include/media/AudioSystem.h | 3 ++ include/media/IAudioPolicyService.h | 3 ++ media/libmedia/AudioSystem.cpp | 6 +++ media/libmedia/IAudioPolicyService.cpp | 54 +++++++++++++++++++++- services/audiopolicy/AudioPolicyInterface.h | 4 ++ services/audiopolicy/AudioPolicyInterfaceImpl.cpp | 16 +++++++ .../audiopolicy/AudioPolicyInterfaceImplLegacy.cpp | 8 +++- services/audiopolicy/AudioPolicyService.h | 3 ++ 8 files changed, 95 insertions(+), 2 deletions(-) diff --git a/include/media/AudioSystem.h b/include/media/AudioSystem.h index bf1fc1c..843a354 100644 --- a/include/media/AudioSystem.h +++ b/include/media/AudioSystem.h @@ -18,6 +18,7 @@ #define ANDROID_AUDIOSYSTEM_H_ #include +#include #include #include #include @@ -324,6 +325,8 @@ public: static audio_mode_t getPhoneState(); + static status_t registerPolicyMixes(Vector mixes, bool registration); + // ---------------------------------------------------------------------------- class AudioPortCallback : public RefBase diff --git a/include/media/IAudioPolicyService.h b/include/media/IAudioPolicyService.h index 3e4b873..c98c475 100644 --- a/include/media/IAudioPolicyService.h +++ b/include/media/IAudioPolicyService.h @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -150,6 +151,8 @@ public: virtual status_t releaseSoundTriggerSession(audio_session_t session) = 0; virtual audio_mode_t getPhoneState() = 0; + + virtual status_t registerPolicyMixes(Vector mixes, bool registration) = 0; }; diff --git a/media/libmedia/AudioSystem.cpp b/media/libmedia/AudioSystem.cpp index 96f1ade..9cae21c 100644 --- a/media/libmedia/AudioSystem.cpp +++ b/media/libmedia/AudioSystem.cpp @@ -958,6 +958,12 @@ audio_mode_t AudioSystem::getPhoneState() return aps->getPhoneState(); } +status_t AudioSystem::registerPolicyMixes(Vector mixes, bool registration) +{ + const sp& aps = AudioSystem::get_audio_policy_service(); + if (aps == 0) return PERMISSION_DENIED; + return aps->registerPolicyMixes(mixes, registration); +} // --------------------------------------------------------------------------- diff --git a/media/libmedia/IAudioPolicyService.cpp b/media/libmedia/IAudioPolicyService.cpp index 5873a30..70551c4 100644 --- a/media/libmedia/IAudioPolicyService.cpp +++ b/media/libmedia/IAudioPolicyService.cpp @@ -69,7 +69,8 @@ enum { GET_OUTPUT_FOR_ATTR, ACQUIRE_SOUNDTRIGGER_SESSION, RELEASE_SOUNDTRIGGER_SESSION, - GET_PHONE_STATE + GET_PHONE_STATE, + REGISTER_POLICY_MIXES, }; class BpAudioPolicyService : public BpInterface @@ -675,6 +676,38 @@ public: } return (audio_mode_t)reply.readInt32(); } + + virtual status_t registerPolicyMixes(Vector mixes, bool registration) + { + Parcel data, reply; + data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); + data.writeInt32(registration ? 1 : 0); + size_t size = mixes.size(); + if (size > MAX_MIXES_PER_POLICY) { + size = MAX_MIXES_PER_POLICY; + } + size_t sizePosition = data.dataPosition(); + data.writeInt32(size); + size_t finalSize = size; + for (size_t i = 0; i < size; i++) { + size_t position = data.dataPosition(); + if (mixes[i].writeToParcel(&data) != NO_ERROR) { + data.setDataPosition(position); + finalSize--; + } + } + if (size != finalSize) { + size_t position = data.dataPosition(); + data.setDataPosition(sizePosition); + data.writeInt32(finalSize); + data.setDataPosition(position); + } + status_t status = remote()->transact(REGISTER_POLICY_MIXES, data, &reply); + if (status == NO_ERROR) { + status = (status_t)reply.readInt32(); + } + return status; + } }; IMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService"); @@ -1147,6 +1180,25 @@ status_t BnAudioPolicyService::onTransact( return NO_ERROR; } break; + case REGISTER_POLICY_MIXES: { + CHECK_INTERFACE(IAudioPolicyService, data, reply); + bool registration = data.readInt32() == 1; + Vector mixes; + size_t size = (size_t)data.readInt32(); + if (size > MAX_MIXES_PER_POLICY) { + size = MAX_MIXES_PER_POLICY; + } + for (size_t i = 0; i < size; i++) { + AudioMix mix; + if (mix.readFromParcel((Parcel*)&data) == NO_ERROR) { + mixes.add(mix); + } + } + status_t status = registerPolicyMixes(mixes, registration); + reply->writeInt32(status); + return NO_ERROR; + } break; + default: return BBinder::onTransact(code, data, reply, flags); } diff --git a/services/audiopolicy/AudioPolicyInterface.h b/services/audiopolicy/AudioPolicyInterface.h index 5bcbca8..2826cad 100644 --- a/services/audiopolicy/AudioPolicyInterface.h +++ b/services/audiopolicy/AudioPolicyInterface.h @@ -18,6 +18,7 @@ #define ANDROID_AUDIOPOLICY_INTERFACE_H #include +#include #include #include @@ -201,6 +202,9 @@ public: audio_devices_t *device) = 0; virtual status_t releaseSoundTriggerSession(audio_session_t session) = 0; + + virtual status_t registerPolicyMixes(Vector mixes) = 0; + virtual status_t unregisterPolicyMixes(Vector mixes) = 0; }; diff --git a/services/audiopolicy/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/AudioPolicyInterfaceImpl.cpp index abb1b21..d3c9013 100644 --- a/services/audiopolicy/AudioPolicyInterfaceImpl.cpp +++ b/services/audiopolicy/AudioPolicyInterfaceImpl.cpp @@ -614,4 +614,20 @@ status_t AudioPolicyService::releaseSoundTriggerSession(audio_session_t session) return mAudioPolicyManager->releaseSoundTriggerSession(session); } +status_t AudioPolicyService::registerPolicyMixes(Vector mixes, bool registration) +{ + Mutex::Autolock _l(mLock); + if(!modifyAudioRoutingAllowed()) { + return PERMISSION_DENIED; + } + if (mAudioPolicyManager == NULL) { + return NO_INIT; + } + if (registration) { + return mAudioPolicyManager->registerPolicyMixes(mixes); + } else { + return mAudioPolicyManager->unregisterPolicyMixes(mixes); + } +} + }; // namespace android diff --git a/services/audiopolicy/AudioPolicyInterfaceImplLegacy.cpp b/services/audiopolicy/AudioPolicyInterfaceImplLegacy.cpp index 4e42b25..4bc3c7f 100644 --- a/services/audiopolicy/AudioPolicyInterfaceImplLegacy.cpp +++ b/services/audiopolicy/AudioPolicyInterfaceImplLegacy.cpp @@ -555,7 +555,7 @@ status_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config * status_t AudioPolicyService::getOutputForAttr(const audio_attributes_t *attr, audio_io_handle_t *output, - audio_session_t session, + audio_session_t session __unused, audio_stream_type_t *stream, uint32_t samplingRate, audio_format_t format, @@ -590,4 +590,10 @@ status_t AudioPolicyService::releaseSoundTriggerSession(audio_session_t session return INVALID_OPERATION; } +status_t AudioPolicyService::registerPolicyMixes(Vector mixes __unused, + bool registration __unused) +{ + return INVALID_OPERATION; +} + }; // namespace android diff --git a/services/audiopolicy/AudioPolicyService.h b/services/audiopolicy/AudioPolicyService.h index da17728..09375cf 100644 --- a/services/audiopolicy/AudioPolicyService.h +++ b/services/audiopolicy/AudioPolicyService.h @@ -30,6 +30,7 @@ #include #include #include +#include #include #include "AudioPolicyEffects.h" #include "AudioPolicyManager.h" @@ -185,6 +186,8 @@ public: virtual audio_mode_t getPhoneState(); + virtual status_t registerPolicyMixes(Vector mixes, bool registration); + status_t doStopOutput(audio_io_handle_t output, audio_stream_type_t stream, audio_session_t session); -- cgit v1.1