1b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent/*
2b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent * Copyright (C) 2008 The Android Open Source Project
3b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent *
4b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent * Licensed under the Apache License, Version 2.0 (the "License");
5b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent * you may not use this file except in compliance with the License.
6b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent * You may obtain a copy of the License at
7b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent *
8b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent *      http://www.apache.org/licenses/LICENSE-2.0
9b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent *
10b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent * Unless required by applicable law or agreed to in writing, software
11b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent * distributed under the License is distributed on an "AS IS" BASIS,
12b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent * See the License for the specific language governing permissions and
14b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent * limitations under the License.
15b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent */
16b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
17b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent#ifndef ANDROID_HARDWARE_SOUNDTRIGGER_HAL_SERVICE_H
18b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent#define ANDROID_HARDWARE_SOUNDTRIGGER_HAL_SERVICE_H
19b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
20b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent#include <utils/Vector.h>
21b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent//#include <binder/AppOpsManager.h>
22b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent#include <binder/MemoryDealer.h>
23b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent#include <binder/BinderService.h>
24b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent#include <binder/IAppOpsCallback.h>
25b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent#include <soundtrigger/ISoundTriggerHwService.h>
26b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent#include <soundtrigger/ISoundTrigger.h>
27b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent#include <soundtrigger/ISoundTriggerClient.h>
28b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent#include <system/sound_trigger.h>
29b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent#include <hardware/sound_trigger.h>
30b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
31b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurentnamespace android {
32b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
33b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurentclass MemoryHeapBase;
34b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
35b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurentclass SoundTriggerHwService :
36b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    public BinderService<SoundTriggerHwService>,
37b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    public BnSoundTriggerHwService
38b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent{
39b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    friend class BinderService<SoundTriggerHwService>;
40b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurentpublic:
41b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    class Module;
42b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
43b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    static char const* getServiceName() { return "media.sound_trigger_hw"; }
44b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
45b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent                        SoundTriggerHwService();
46b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    virtual             ~SoundTriggerHwService();
47b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
48b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    // ISoundTriggerHwService
49b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    virtual status_t listModules(struct sound_trigger_module_descriptor *modules,
50b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent                                 uint32_t *numModules);
51b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
52b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    virtual status_t attach(const sound_trigger_module_handle_t handle,
53b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent                            const sp<ISoundTriggerClient>& client,
54b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent                            sp<ISoundTrigger>& module);
55b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
56df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    virtual status_t setCaptureState(bool active);
57df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
58b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    virtual status_t    onTransact(uint32_t code, const Parcel& data,
59b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent                                   Parcel* reply, uint32_t flags);
60b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
61b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    virtual status_t    dump(int fd, const Vector<String16>& args);
62b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
63b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    class Model : public RefBase {
64b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent     public:
65b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
66b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        enum {
67b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent            STATE_IDLE,
68b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent            STATE_ACTIVE
69b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        };
70b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
71df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        Model(sound_model_handle_t handle, audio_session_t session, audio_io_handle_t ioHandle,
72df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent              audio_devices_t device, sound_trigger_sound_model_type_t type);
73b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        ~Model() {}
74b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
75b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        sound_model_handle_t    mHandle;
76b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        int                     mState;
77b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        audio_session_t         mCaptureSession;
78df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        audio_io_handle_t       mCaptureIOHandle;
79df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        audio_devices_t         mCaptureDevice;
80df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        sound_trigger_sound_model_type_t mType;
81df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        struct sound_trigger_recognition_config mConfig;
82df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    };
83df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
84df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    class CallbackEvent : public RefBase {
85df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    public:
86df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        typedef enum {
87df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            TYPE_RECOGNITION,
88df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            TYPE_SOUNDMODEL,
89df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            TYPE_SERVICE_STATE,
90df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        } event_type;
91df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        CallbackEvent(event_type type, sp<IMemory> memory, wp<Module> module);
92df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
93df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        virtual             ~CallbackEvent();
94df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
95df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        event_type mType;
96df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        sp<IMemory> mMemory;
97df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        wp<Module> mModule;
98b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    };
99b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
100b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    class Module : public virtual RefBase,
101b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent                   public BnSoundTrigger,
102b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent                   public IBinder::DeathRecipient     {
103b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    public:
104b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
105b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent       Module(const sp<SoundTriggerHwService>& service,
106b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent              sound_trigger_hw_device* hwDevice,
107b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent              sound_trigger_module_descriptor descriptor,
108b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent              const sp<ISoundTriggerClient>& client);
109b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
110b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent       virtual ~Module();
111b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
112b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent       virtual void detach();
113b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
114b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent       virtual status_t loadSoundModel(const sp<IMemory>& modelMemory,
115b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent                                       sound_model_handle_t *handle);
116b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
117b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent       virtual status_t unloadSoundModel(sound_model_handle_t handle);
118b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
119b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent       virtual status_t startRecognition(sound_model_handle_t handle,
120b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent                                         const sp<IMemory>& dataMemory);
121b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent       virtual status_t stopRecognition(sound_model_handle_t handle);
122b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
123b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent       virtual status_t dump(int fd, const Vector<String16>& args);
124b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
125b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
126b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent       sound_trigger_hw_device *hwDevice() const { return mHwDevice; }
127b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent       struct sound_trigger_module_descriptor descriptor() { return mDescriptor; }
128b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent       void setClient(sp<ISoundTriggerClient> client) { mClient = client; }
129b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent       void clearClient() { mClient.clear(); }
130df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent       sp<ISoundTriggerClient> client() const { return mClient; }
131df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent       wp<SoundTriggerHwService> service() const { return mService; }
132b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
133df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent       void onCallbackEvent(const sp<CallbackEvent>& event);
134b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
135b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent       sp<Model> getModel(sound_model_handle_t handle);
136b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
137df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent       void setCaptureState_l(bool active);
138df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
139b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent       // IBinder::DeathRecipient implementation
140b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent       virtual void        binderDied(const wp<IBinder> &who);
141b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
142b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    private:
143df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
14402eb47cf18793effe9fc7ab34e1b0fe9ea6635bcEric Laurent       status_t unloadSoundModel_l(sound_model_handle_t handle);
14502eb47cf18793effe9fc7ab34e1b0fe9ea6635bcEric Laurent
14602eb47cf18793effe9fc7ab34e1b0fe9ea6635bcEric Laurent
147b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        Mutex                                  mLock;
148b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        wp<SoundTriggerHwService>              mService;
149b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        struct sound_trigger_hw_device*        mHwDevice;
150b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        struct sound_trigger_module_descriptor mDescriptor;
151b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        sp<ISoundTriggerClient>                mClient;
152b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        DefaultKeyedVector< sound_model_handle_t, sp<Model> >     mModels;
153df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        sound_trigger_service_state_t          mServiceState;
154b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    }; // class Module
155b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
156b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    class CallbackThread : public Thread {
157b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    public:
158b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
159b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        CallbackThread(const wp<SoundTriggerHwService>& service);
160b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
161b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        virtual             ~CallbackThread();
162b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
163b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        // Thread virtuals
164b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        virtual bool        threadLoop();
165b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
166b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        // RefBase
167b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        virtual void        onFirstRef();
168b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
169b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent                void        exit();
170df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                void        sendCallbackEvent(const sp<CallbackEvent>& event);
171b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
172b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    private:
173b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        wp<SoundTriggerHwService>   mService;
174b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        Condition                   mCallbackCond;
175b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        Mutex                       mCallbackLock;
176df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        Vector< sp<CallbackEvent> > mEventQueue;
177b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    };
178b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
179df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent           void detachModule(sp<Module> module);
180b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
181b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    static void recognitionCallback(struct sound_trigger_recognition_event *event, void *cookie);
182df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent           sp<IMemory> prepareRecognitionEvent_l(struct sound_trigger_recognition_event *event);
183df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent           void sendRecognitionEvent(struct sound_trigger_recognition_event *event, Module *module);
184b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
185b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    static void soundModelCallback(struct sound_trigger_model_event *event, void *cookie);
186df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent           sp<IMemory> prepareSoundModelEvent_l(struct sound_trigger_model_event *event);
187df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent           void sendSoundModelEvent(struct sound_trigger_model_event *event, Module *module);
188df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
189df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent           sp<IMemory> prepareServiceStateEvent_l(sound_trigger_service_state_t state);
190df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent           void sendServiceStateEvent_l(sound_trigger_service_state_t state, Module *module);
191df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
192df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent           void sendCallbackEvent_l(const sp<CallbackEvent>& event);
193df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent           void onCallbackEvent(const sp<CallbackEvent>& event);
194b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
195b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurentprivate:
196b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
197b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    virtual void onFirstRef();
198b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
199b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    Mutex               mServiceLock;
200b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    volatile int32_t    mNextUniqueId;
201b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    DefaultKeyedVector< sound_trigger_module_handle_t, sp<Module> >     mModules;
202b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    sp<CallbackThread>  mCallbackThread;
203df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    sp<MemoryDealer>    mMemoryDealer;
204df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    bool                mCaptureState;
205b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent};
206b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
207b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent} // namespace android
208b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
209b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent#endif // ANDROID_HARDWARE_SOUNDTRIGGER_HAL_SERVICE_H
210