127ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent/* 227ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent * Copyright (C) 2016 The Android Open Source Project 327ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent * 427ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent * Licensed under the Apache License, Version 2.0 (the "License"); 527ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent * you may not use this file except in compliance with the License. 627ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent * You may obtain a copy of the License at 727ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent * 827ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent * http://www.apache.org/licenses/LICENSE-2.0 927ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent * 1027ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent * Unless required by applicable law or agreed to in writing, software 1127ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent * distributed under the License is distributed on an "AS IS" BASIS, 1227ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1327ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent * See the License for the specific language governing permissions and 1427ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent * limitations under the License. 1527ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent */ 1627ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent 1727ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent#ifndef ANDROID_HARDWARE_SOUNDTRIGGER_V2_0_IMPLEMENTATION_H 1827ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent#define ANDROID_HARDWARE_SOUNDTRIGGER_V2_0_IMPLEMENTATION_H 1927ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent 2027ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent#include <android/hardware/soundtrigger/2.0/ISoundTriggerHw.h> 2127ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent#include <android/hardware/soundtrigger/2.0/ISoundTriggerHwCallback.h> 220bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov#include <hardware/sound_trigger.h> 2327ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent#include <hidl/Status.h> 24efc683588e423718c71220afbe6a176b6eca5a51Mathias Agopian#include <stdatomic.h> 2527ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent#include <system/sound_trigger.h> 260bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov#include <utils/KeyedVector.h> 270bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov#include <utils/threads.h> 2827ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent 2927ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurentnamespace android { 3027ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurentnamespace hardware { 3127ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurentnamespace soundtrigger { 3227ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurentnamespace V2_0 { 3327ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurentnamespace implementation { 3427ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent 3527ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurentusing ::android::hardware::audio::common::V2_0::Uuid; 3627ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurentusing ::android::hardware::soundtrigger::V2_0::ISoundTriggerHwCallback; 3727ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent 38dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganovclass SoundTriggerHalImpl : public RefBase { 390bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov public: 400bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov SoundTriggerHalImpl(); 41dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov ISoundTriggerHw* getInterface() { return new TrampolineSoundTriggerHw_2_0(this); } 420bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov 43dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov protected: 44dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov class SoundModelClient : public RefBase { 45dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov public: 46dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov SoundModelClient(uint32_t id, ISoundTriggerHwCallback::CallbackCookie cookie) 47dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov : mId(id), mCookie(cookie) {} 48dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov virtual ~SoundModelClient() {} 49dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov 50dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov uint32_t getId() const { return mId; } 51dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov sound_model_handle_t getHalHandle() const { return mHalHandle; } 52dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov void setHalHandle(sound_model_handle_t handle) { mHalHandle = handle; } 53dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov 54dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov virtual void recognitionCallback(struct sound_trigger_recognition_event* halEvent) = 0; 55dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov virtual void soundModelCallback(struct sound_trigger_model_event* halEvent) = 0; 56dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov 57dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov protected: 58dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov const uint32_t mId; 59dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov sound_model_handle_t mHalHandle; 60dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov ISoundTriggerHwCallback::CallbackCookie mCookie; 61dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov }; 62dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov 63dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov static void convertPhaseRecognitionEventFromHal( 64dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov ISoundTriggerHwCallback::PhraseRecognitionEvent* event, 65dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov const struct sound_trigger_phrase_recognition_event* halEvent); 66dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov static void convertRecognitionEventFromHal( 67dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov ISoundTriggerHwCallback::RecognitionEvent* event, 68dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov const struct sound_trigger_recognition_event* halEvent); 69dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov static void convertSoundModelEventFromHal(ISoundTriggerHwCallback::ModelEvent* event, 70dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov const struct sound_trigger_model_event* halEvent); 71dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov 72dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov virtual ~SoundTriggerHalImpl(); 73dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov 74dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov Return<void> getProperties(ISoundTriggerHw::getProperties_cb _hidl_cb); 750bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov Return<void> loadSoundModel(const ISoundTriggerHw::SoundModel& soundModel, 760bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov const sp<ISoundTriggerHwCallback>& callback, 770bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov ISoundTriggerHwCallback::CallbackCookie cookie, 78dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov ISoundTriggerHw::loadSoundModel_cb _hidl_cb); 790bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov Return<void> loadPhraseSoundModel(const ISoundTriggerHw::PhraseSoundModel& soundModel, 8027ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent const sp<ISoundTriggerHwCallback>& callback, 810bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov ISoundTriggerHwCallback::CallbackCookie cookie, 82dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov ISoundTriggerHw::loadPhraseSoundModel_cb _hidl_cb); 83dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov Return<int32_t> unloadSoundModel(SoundModelHandle modelHandle); 840bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov Return<int32_t> startRecognition(SoundModelHandle modelHandle, 85dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov const ISoundTriggerHw::RecognitionConfig& config); 86dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov Return<int32_t> stopRecognition(SoundModelHandle modelHandle); 87dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov Return<int32_t> stopAllRecognitions(); 880bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov 89dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov uint32_t nextUniqueModelId(); 90dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov int doLoadSoundModel(const ISoundTriggerHw::SoundModel& soundModel, 91dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov sp<SoundModelClient> client); 920bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov 93dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov // RefBase 94dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov void onFirstRef() override; 950bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov 960bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov private: 97dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov struct TrampolineSoundTriggerHw_2_0 : public ISoundTriggerHw { 98dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov explicit TrampolineSoundTriggerHw_2_0(sp<SoundTriggerHalImpl> impl) : mImpl(impl) {} 99dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov 100dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov // Methods from ::android::hardware::soundtrigger::V2_0::ISoundTriggerHw follow. 101dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov Return<void> getProperties(getProperties_cb _hidl_cb) override { 102dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov return mImpl->getProperties(_hidl_cb); 103dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov } 104dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov Return<void> loadSoundModel(const ISoundTriggerHw::SoundModel& soundModel, 105dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov const sp<ISoundTriggerHwCallback>& callback, 106dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov ISoundTriggerHwCallback::CallbackCookie cookie, 107dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov loadSoundModel_cb _hidl_cb) override { 108dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov return mImpl->loadSoundModel(soundModel, callback, cookie, _hidl_cb); 109dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov } 110dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov Return<void> loadPhraseSoundModel(const ISoundTriggerHw::PhraseSoundModel& soundModel, 111dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov const sp<ISoundTriggerHwCallback>& callback, 112dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov ISoundTriggerHwCallback::CallbackCookie cookie, 113dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov loadPhraseSoundModel_cb _hidl_cb) override { 114dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov return mImpl->loadPhraseSoundModel(soundModel, callback, cookie, _hidl_cb); 115dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov } 116dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov Return<int32_t> unloadSoundModel(SoundModelHandle modelHandle) override { 117dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov return mImpl->unloadSoundModel(modelHandle); 118dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov } 119dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov Return<int32_t> startRecognition( 120dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov SoundModelHandle modelHandle, const ISoundTriggerHw::RecognitionConfig& config, 121dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov const sp<ISoundTriggerHwCallback>& /*callback*/, 122dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov ISoundTriggerHwCallback::CallbackCookie /*cookie*/) override { 123dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov return mImpl->startRecognition(modelHandle, config); 124dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov } 125dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov Return<int32_t> stopRecognition(SoundModelHandle modelHandle) override { 126dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov return mImpl->stopRecognition(modelHandle); 127dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov } 128dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov Return<int32_t> stopAllRecognitions() override { return mImpl->stopAllRecognitions(); } 129dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov 130dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov private: 131dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov sp<SoundTriggerHalImpl> mImpl; 132dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov }; 133dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov 134dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov class SoundModelClient_2_0 : public SoundModelClient { 1350bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov public: 136dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov SoundModelClient_2_0(uint32_t id, ISoundTriggerHwCallback::CallbackCookie cookie, 137dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov sp<ISoundTriggerHwCallback> callback) 138dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov : SoundModelClient(id, cookie), mCallback(callback) {} 1390bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov 140dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov void recognitionCallback(struct sound_trigger_recognition_event* halEvent) override; 141dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov void soundModelCallback(struct sound_trigger_model_event* halEvent) override; 142dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov 143dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov private: 1440bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov sp<ISoundTriggerHwCallback> mCallback; 1450bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov }; 1460bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov 1470bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov void convertUuidFromHal(Uuid* uuid, const sound_trigger_uuid_t* halUuid); 1480bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov void convertUuidToHal(sound_trigger_uuid_t* halUuid, const Uuid* uuid); 1490bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov void convertPropertiesFromHal(ISoundTriggerHw::Properties* properties, 1500bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov const struct sound_trigger_properties* halProperties); 1510bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov void convertTriggerPhraseToHal(struct sound_trigger_phrase* halTriggerPhrase, 1520bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov const ISoundTriggerHw::Phrase* triggerPhrase); 1530bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov // returned HAL sound model must be freed by caller 1540bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov struct sound_trigger_sound_model* convertSoundModelToHal( 1550bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov const ISoundTriggerHw::SoundModel* soundModel); 1560bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov void convertPhraseRecognitionExtraToHal(struct sound_trigger_phrase_recognition_extra* halExtra, 1570bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov const PhraseRecognitionExtra* extra); 1580bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov // returned recognition config must be freed by caller 1590bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov struct sound_trigger_recognition_config* convertRecognitionConfigToHal( 1600bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov const ISoundTriggerHw::RecognitionConfig* config); 1610bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov 1620bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov static void convertPhraseRecognitionExtraFromHal( 1630bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov PhraseRecognitionExtra* extra, 1640bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov const struct sound_trigger_phrase_recognition_extra* halExtra); 1650bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov 166dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov static void soundModelCallback(struct sound_trigger_model_event* halEvent, void* cookie); 167dfdc3bbccdeb48a747b073a0825d1aa6277e9c1fMikhail Naganov static void recognitionCallback(struct sound_trigger_recognition_event* halEvent, void* cookie); 1680bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov 1690bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov const char* mModuleName; 1700bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov struct sound_trigger_hw_device* mHwDevice; 1710bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov volatile atomic_uint_fast32_t mNextModelId; 1720bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov DefaultKeyedVector<int32_t, sp<SoundModelClient> > mClients; 1730bbc4aa61fa5a199a7546db28270f472aec4030bMikhail Naganov Mutex mLock; 17427ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent}; 17527ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent 17627ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent} // namespace implementation 17727ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent} // namespace V2_0 17827ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent} // namespace soundtrigger 17927ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent} // namespace hardware 18027ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent} // namespace android 18127ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent 18227ef4d872d9f6bbbc62d03b807cae694a3c6e2e8Eric Laurent#endif // ANDROID_HARDWARE_SOUNDTRIGGER_V2_0_IMPLEMENTATION_H 183