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