From 6012f913f0772cf0b73f379778efc671ce72c557 Mon Sep 17 00:00:00 2001 From: jiabin Date: Fri, 2 Nov 2018 17:06:30 -0700 Subject: [PATCH] Querying capability of haptic playback. Bug: 111454766 Test: Manually test Change-Id: Ib200d6b8f02354a01cf599a96fb1a9062dcd3050 --- media/libaudioclient/AudioSystem.cpp | 7 +++++++ media/libaudioclient/IAudioPolicyService.cpp | 19 +++++++++++++++++++ .../include/media/AudioSystem.h | 2 ++ .../include/media/IAudioPolicyService.h | 2 ++ services/audiopolicy/AudioPolicyInterface.h | 2 ++ .../managerdefault/AudioPolicyManager.cpp | 17 +++++++++++++++++ .../managerdefault/AudioPolicyManager.h | 2 ++ .../service/AudioPolicyInterfaceImpl.cpp | 11 +++++++++++ .../audiopolicy/service/AudioPolicyService.h | 2 ++ 9 files changed, 64 insertions(+) diff --git a/media/libaudioclient/AudioSystem.cpp b/media/libaudioclient/AudioSystem.cpp index ec36ed7dc8..78f3cae5ec 100644 --- a/media/libaudioclient/AudioSystem.cpp +++ b/media/libaudioclient/AudioSystem.cpp @@ -1315,6 +1315,13 @@ status_t AudioSystem::setA11yServicesUids(const std::vector& uids) return aps->setA11yServicesUids(uids); } +bool AudioSystem::isHapticPlaybackSupported() +{ + const sp& aps = AudioSystem::get_audio_policy_service(); + if (aps == 0) return false; + return aps->isHapticPlaybackSupported(); +} + // --------------------------------------------------------------------------- diff --git a/media/libaudioclient/IAudioPolicyService.cpp b/media/libaudioclient/IAudioPolicyService.cpp index a406658a16..555ac87a58 100644 --- a/media/libaudioclient/IAudioPolicyService.cpp +++ b/media/libaudioclient/IAudioPolicyService.cpp @@ -88,6 +88,7 @@ enum { REMOVE_SOURCE_DEFAULT_EFFECT, SET_ASSISTANT_UID, SET_A11Y_SERVICES_UIDS, + IS_HAPTIC_PLAYBACK_SUPPORTED, }; #define MAX_ITEMS_PER_LIST 1024 @@ -970,6 +971,17 @@ public: return static_cast (reply.readInt32()); } + virtual bool isHapticPlaybackSupported() + { + Parcel data, reply; + data.writeInterfaceToken(IAudioPolicyService::getInterfaceDescriptor()); + status_t status = remote()->transact(IS_HAPTIC_PLAYBACK_SUPPORTED, data, &reply); + if (status != NO_ERROR) { + return false; + } + return reply.readBool(); + } + }; IMPLEMENT_META_INTERFACE(AudioPolicyService, "android.media.IAudioPolicyService"); @@ -1777,6 +1789,13 @@ status_t BnAudioPolicyService::onTransact( return NO_ERROR; } + case IS_HAPTIC_PLAYBACK_SUPPORTED: { + CHECK_INTERFACE(IAudioPolicyService, data, reply); + bool isSupported = isHapticPlaybackSupported(); + reply->writeBool(isSupported); + return NO_ERROR; + } + default: return BBinder::onTransact(code, data, reply, flags); } diff --git a/media/libaudioclient/include/media/AudioSystem.h b/media/libaudioclient/include/media/AudioSystem.h index 76a79c9536..a04b494909 100644 --- a/media/libaudioclient/include/media/AudioSystem.h +++ b/media/libaudioclient/include/media/AudioSystem.h @@ -346,6 +346,8 @@ public: static status_t setAssistantUid(uid_t uid); static status_t setA11yServicesUids(const std::vector& uids); + static bool isHapticPlaybackSupported(); + // ---------------------------------------------------------------------------- class AudioPortCallback : public RefBase diff --git a/media/libaudioclient/include/media/IAudioPolicyService.h b/media/libaudioclient/include/media/IAudioPolicyService.h index a246df68ea..b74d25be27 100644 --- a/media/libaudioclient/include/media/IAudioPolicyService.h +++ b/media/libaudioclient/include/media/IAudioPolicyService.h @@ -182,6 +182,8 @@ public: virtual status_t setAssistantUid(uid_t uid) = 0; virtual status_t setA11yServicesUids(const std::vector& uids) = 0; + + virtual bool isHapticPlaybackSupported() = 0; }; diff --git a/services/audiopolicy/AudioPolicyInterface.h b/services/audiopolicy/AudioPolicyInterface.h index 3c3a82b38f..7c7fe854fa 100644 --- a/services/audiopolicy/AudioPolicyInterface.h +++ b/services/audiopolicy/AudioPolicyInterface.h @@ -242,6 +242,8 @@ public: bool reported) = 0; virtual status_t setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled) = 0; + virtual bool isHapticPlaybackSupported() = 0; + virtual void setAppState(uid_t uid, app_state_t state); }; diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp index 6ec6a767dd..6a5a646c66 100644 --- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp +++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp @@ -3736,6 +3736,23 @@ void AudioPolicyManager::setAppState(uid_t uid, app_state_t state) } } +bool AudioPolicyManager::isHapticPlaybackSupported() +{ + for (const auto& hwModule : mHwModules) { + const OutputProfileCollection &outputProfiles = hwModule->getOutputProfiles(); + for (const auto &outProfile : outputProfiles) { + struct audio_port audioPort; + outProfile->toAudioPort(&audioPort); + for (size_t i = 0; i < audioPort.num_channel_masks; i++) { + if (audioPort.channel_masks[i] & AUDIO_CHANNEL_HAPTIC_ALL) { + return true; + } + } + } + } + return false; +} + status_t AudioPolicyManager::disconnectAudioSource(const sp& sourceDesc) { ALOGV("%s port Id %d", __FUNCTION__, sourceDesc->portId()); diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.h b/services/audiopolicy/managerdefault/AudioPolicyManager.h index 0436b1d0f8..c85ecf68a3 100644 --- a/services/audiopolicy/managerdefault/AudioPolicyManager.h +++ b/services/audiopolicy/managerdefault/AudioPolicyManager.h @@ -244,6 +244,8 @@ public: virtual void setAppState(uid_t uid, app_state_t state); + virtual bool isHapticPlaybackSupported(); + protected: // A constructor that allows more fine-grained control over initialization process, // used in automatic tests. diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp index 59c8f10075..cf7243110d 100644 --- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp +++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp @@ -1149,4 +1149,15 @@ status_t AudioPolicyService::setA11yServicesUids(const std::vector& uids) return NO_ERROR; } +bool AudioPolicyService::isHapticPlaybackSupported() +{ + if (mAudioPolicyManager == NULL) { + ALOGW("%s, mAudioPolicyManager == NULL", __func__); + return false; + } + Mutex::Autolock _l(mLock); + AutoCallerClear acc; + return mAudioPolicyManager->isHapticPlaybackSupported(); +} + } // namespace android diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h index ec32511387..7638c0ca54 100644 --- a/services/audiopolicy/service/AudioPolicyService.h +++ b/services/audiopolicy/service/AudioPolicyService.h @@ -217,6 +217,8 @@ public: virtual status_t setAssistantUid(uid_t uid); virtual status_t setA11yServicesUids(const std::vector& uids); + virtual bool isHapticPlaybackSupported(); + status_t doStopOutput(audio_port_handle_t portId); void doReleaseOutput(audio_port_handle_t portId);