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