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