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>
297a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent#include "SoundTriggerHalInterface.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;
42e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George    class ModuleClient;
43b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
44b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    static char const* getServiceName() { return "media.sound_trigger_hw"; }
45b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
46b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent                        SoundTriggerHwService();
47b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    virtual             ~SoundTriggerHwService();
48b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
49b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    // ISoundTriggerHwService
50b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    virtual status_t listModules(struct sound_trigger_module_descriptor *modules,
51b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent                                 uint32_t *numModules);
52b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
53b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    virtual status_t attach(const sound_trigger_module_handle_t handle,
54b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent                            const sp<ISoundTriggerClient>& client,
55b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent                            sp<ISoundTrigger>& module);
56b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
57df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    virtual status_t setCaptureState(bool active);
58df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
59b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    virtual status_t    onTransact(uint32_t code, const Parcel& data,
60b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent                                   Parcel* reply, uint32_t flags);
61b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
62b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    virtual status_t    dump(int fd, const Vector<String16>& args);
63b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
64b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    class Model : public RefBase {
65b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent     public:
66b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
67b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        enum {
68b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent            STATE_IDLE,
69b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent            STATE_ACTIVE
70b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        };
71b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
72df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        Model(sound_model_handle_t handle, audio_session_t session, audio_io_handle_t ioHandle,
73e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George              audio_devices_t device, sound_trigger_sound_model_type_t type,
74e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George              sp<ModuleClient>& moduleClient);
75b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        ~Model() {}
76b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
77b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        sound_model_handle_t    mHandle;
78b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        int                     mState;
79b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        audio_session_t         mCaptureSession;
80df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        audio_io_handle_t       mCaptureIOHandle;
81df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        audio_devices_t         mCaptureDevice;
82df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        sound_trigger_sound_model_type_t mType;
83df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        struct sound_trigger_recognition_config mConfig;
84e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George        sp<ModuleClient>        mModuleClient;
85df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    };
86df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
87df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    class CallbackEvent : public RefBase {
88df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    public:
89df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        typedef enum {
90df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            TYPE_RECOGNITION,
91df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            TYPE_SOUNDMODEL,
92df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent            TYPE_SERVICE_STATE,
93df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        } event_type;
94e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George        CallbackEvent(event_type type, sp<IMemory> memory);
95df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
96df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        virtual             ~CallbackEvent();
97df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
98e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George        void setModule(wp<Module> module) { mModule = module; }
99e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George        void setModuleClient(wp<ModuleClient> moduleClient) { mModuleClient = moduleClient; }
100e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George
101df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        event_type mType;
102df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        sp<IMemory> mMemory;
103df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        wp<Module> mModule;
104e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George        wp<ModuleClient> mModuleClient;
105b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    };
106b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
107e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George    class Module : public RefBase {
108b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    public:
109b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
110b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent       Module(const sp<SoundTriggerHwService>& service,
1117a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent              const sp<SoundTriggerHalInterface>& halInterface,
112e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George              sound_trigger_module_descriptor descriptor);
113b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
114b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent       virtual ~Module();
115b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
116b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent       virtual status_t loadSoundModel(const sp<IMemory>& modelMemory,
117e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George                                       sp<ModuleClient> moduleClient,
118b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent                                       sound_model_handle_t *handle);
119b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
120b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent       virtual status_t unloadSoundModel(sound_model_handle_t handle);
121b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
122b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent       virtual status_t startRecognition(sound_model_handle_t handle,
123b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent                                         const sp<IMemory>& dataMemory);
124b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent       virtual status_t stopRecognition(sound_model_handle_t handle);
125b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
126e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George       sp<SoundTriggerHalInterface> halInterface() const { return mHalInterface; }
127b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent       struct sound_trigger_module_descriptor descriptor() { return mDescriptor; }
128df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent       wp<SoundTriggerHwService> service() const { return mService; }
129e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George       bool isConcurrentCaptureAllowed() const { return mDescriptor.properties.concurrent_capture; }
130b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
131b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent       sp<Model> getModel(sound_model_handle_t handle);
132b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
133df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent       void setCaptureState_l(bool active);
134df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
135e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George       sp<ModuleClient> addClient(const sp<ISoundTriggerClient>& client);
136b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
137e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George       void detach(const sp<ModuleClient>& moduleClient);
138e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George
139e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George       void onCallbackEvent(const sp<CallbackEvent>& event);
140df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
141e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George    private:
14202eb47cf18793effe9fc7ab34e1b0fe9ea6635bcEric Laurent
143b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        Mutex                                  mLock;
144b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        wp<SoundTriggerHwService>              mService;
1457a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent        sp<SoundTriggerHalInterface>           mHalInterface;
146b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        struct sound_trigger_module_descriptor mDescriptor;
147e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George        Vector< sp<ModuleClient> >             mModuleClients;
148b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        DefaultKeyedVector< sound_model_handle_t, sp<Model> >     mModels;
149df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        sound_trigger_service_state_t          mServiceState;
150b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    }; // class Module
151b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
152e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George    class ModuleClient : public virtual RefBase,
153e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George                         public BnSoundTrigger,
154e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George                         public IBinder::DeathRecipient {
155e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George    public:
156e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George
157e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George       ModuleClient(const sp<Module>& module,
158e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George              const sp<ISoundTriggerClient>& client);
159e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George
160e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George       virtual ~ModuleClient();
161e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George
162e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George       virtual void detach();
163e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George
164e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George       virtual status_t loadSoundModel(const sp<IMemory>& modelMemory,
165e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George                                       sound_model_handle_t *handle);
166e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George
167e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George       virtual status_t unloadSoundModel(sound_model_handle_t handle);
168e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George
169e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George       virtual status_t startRecognition(sound_model_handle_t handle,
170e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George                                         const sp<IMemory>& dataMemory);
171e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George       virtual status_t stopRecognition(sound_model_handle_t handle);
172e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George
173e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George       virtual status_t dump(int fd, const Vector<String16>& args);
174e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George
175e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George       virtual void onFirstRef();
176e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George
177e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George       // IBinder::DeathRecipient implementation
178e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George       virtual void        binderDied(const wp<IBinder> &who);
179e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George
180e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George       void onCallbackEvent(const sp<CallbackEvent>& event);
181e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George
182e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George       void setCaptureState_l(bool active);
183e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George
184e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George       sp<ISoundTriggerClient> client() const { return mClient; }
185e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George
186e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George    private:
187e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George
188e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George        mutable Mutex               mLock;
189e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George        wp<Module>                  mModule;
190e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George        sp<ISoundTriggerClient>     mClient;
191e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George    }; // class ModuleClient
192e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George
193b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    class CallbackThread : public Thread {
194b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    public:
195b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
19685f8a73d29ae4aa4ed7a6445a88ded802077a58bChih-Hung Hsieh        explicit CallbackThread(const wp<SoundTriggerHwService>& service);
197b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
198b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        virtual             ~CallbackThread();
199b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
200b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        // Thread virtuals
201b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        virtual bool        threadLoop();
202b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
203b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        // RefBase
204b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        virtual void        onFirstRef();
205b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
206b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent                void        exit();
207df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                void        sendCallbackEvent(const sp<CallbackEvent>& event);
208b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
209b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    private:
210b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        wp<SoundTriggerHwService>   mService;
211b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        Condition                   mCallbackCond;
212b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent        Mutex                       mCallbackLock;
213df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent        Vector< sp<CallbackEvent> > mEventQueue;
214b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    };
215b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
216b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    static void recognitionCallback(struct sound_trigger_recognition_event *event, void *cookie);
217df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent           sp<IMemory> prepareRecognitionEvent_l(struct sound_trigger_recognition_event *event);
218df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent           void sendRecognitionEvent(struct sound_trigger_recognition_event *event, Module *module);
219b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
220b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    static void soundModelCallback(struct sound_trigger_model_event *event, void *cookie);
221df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent           sp<IMemory> prepareSoundModelEvent_l(struct sound_trigger_model_event *event);
222df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent           void sendSoundModelEvent(struct sound_trigger_model_event *event, Module *module);
223df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
224df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent           sp<IMemory> prepareServiceStateEvent_l(sound_trigger_service_state_t state);
225df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent           void sendServiceStateEvent_l(sound_trigger_service_state_t state, Module *module);
226e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George           void sendServiceStateEvent_l(sound_trigger_service_state_t state,
227e52c500c096fce010c99e92c4fc3ef51832e67c6Haynes Mathew George                                        ModuleClient *moduleClient);
228df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
229df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent           void sendCallbackEvent_l(const sp<CallbackEvent>& event);
230df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent           void onCallbackEvent(const sp<CallbackEvent>& event);
231b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
232b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurentprivate:
233b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
234b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    virtual void onFirstRef();
235b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
236b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    Mutex               mServiceLock;
237b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    volatile int32_t    mNextUniqueId;
238b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    DefaultKeyedVector< sound_trigger_module_handle_t, sp<Module> >     mModules;
239b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    sp<CallbackThread>  mCallbackThread;
240df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    sp<MemoryDealer>    mMemoryDealer;
241df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    bool                mCaptureState;
242b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent};
243b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
244b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent} // namespace android
245b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
246b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent#endif // ANDROID_HARDWARE_SOUNDTRIGGER_HAL_SERVICE_H
247