| /* |
| * Copyright (C) 2008 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #ifndef ANDROID_HARDWARE_SOUNDTRIGGER_HAL_SERVICE_H |
| #define ANDROID_HARDWARE_SOUNDTRIGGER_HAL_SERVICE_H |
| |
| #include <utils/Vector.h> |
| //#include <binder/AppOpsManager.h> |
| #include <binder/MemoryDealer.h> |
| #include <binder/BinderService.h> |
| #include <binder/IAppOpsCallback.h> |
| #include <soundtrigger/ISoundTriggerHwService.h> |
| #include <soundtrigger/ISoundTrigger.h> |
| #include <soundtrigger/ISoundTriggerClient.h> |
| #include <system/sound_trigger.h> |
| #include <hardware/sound_trigger.h> |
| |
| namespace android { |
| |
| class MemoryHeapBase; |
| |
| class SoundTriggerHwService : |
| public BinderService<SoundTriggerHwService>, |
| public BnSoundTriggerHwService |
| { |
| friend class BinderService<SoundTriggerHwService>; |
| public: |
| class Module; |
| |
| static char const* getServiceName() { return "media.sound_trigger_hw"; } |
| |
| SoundTriggerHwService(); |
| virtual ~SoundTriggerHwService(); |
| |
| // ISoundTriggerHwService |
| virtual status_t listModules(struct sound_trigger_module_descriptor *modules, |
| uint32_t *numModules); |
| |
| virtual status_t attach(const sound_trigger_module_handle_t handle, |
| const sp<ISoundTriggerClient>& client, |
| sp<ISoundTrigger>& module); |
| |
| virtual status_t setCaptureState(bool active); |
| |
| virtual status_t onTransact(uint32_t code, const Parcel& data, |
| Parcel* reply, uint32_t flags); |
| |
| virtual status_t dump(int fd, const Vector<String16>& args); |
| |
| class Model : public RefBase { |
| public: |
| |
| enum { |
| STATE_IDLE, |
| STATE_ACTIVE |
| }; |
| |
| Model(sound_model_handle_t handle, audio_session_t session, audio_io_handle_t ioHandle, |
| audio_devices_t device, sound_trigger_sound_model_type_t type); |
| ~Model() {} |
| |
| sound_model_handle_t mHandle; |
| int mState; |
| audio_session_t mCaptureSession; |
| audio_io_handle_t mCaptureIOHandle; |
| audio_devices_t mCaptureDevice; |
| sound_trigger_sound_model_type_t mType; |
| struct sound_trigger_recognition_config mConfig; |
| }; |
| |
| class CallbackEvent : public RefBase { |
| public: |
| typedef enum { |
| TYPE_RECOGNITION, |
| TYPE_SOUNDMODEL, |
| TYPE_SERVICE_STATE, |
| } event_type; |
| CallbackEvent(event_type type, sp<IMemory> memory, wp<Module> module); |
| |
| virtual ~CallbackEvent(); |
| |
| event_type mType; |
| sp<IMemory> mMemory; |
| wp<Module> mModule; |
| }; |
| |
| class Module : public virtual RefBase, |
| public BnSoundTrigger, |
| public IBinder::DeathRecipient { |
| public: |
| |
| Module(const sp<SoundTriggerHwService>& service, |
| sound_trigger_hw_device* hwDevice, |
| sound_trigger_module_descriptor descriptor, |
| const sp<ISoundTriggerClient>& client); |
| |
| virtual ~Module(); |
| |
| virtual void detach(); |
| |
| virtual status_t loadSoundModel(const sp<IMemory>& modelMemory, |
| sound_model_handle_t *handle); |
| |
| virtual status_t unloadSoundModel(sound_model_handle_t handle); |
| |
| virtual status_t startRecognition(sound_model_handle_t handle, |
| const sp<IMemory>& dataMemory); |
| virtual status_t stopRecognition(sound_model_handle_t handle); |
| |
| virtual status_t dump(int fd, const Vector<String16>& args); |
| |
| |
| sound_trigger_hw_device *hwDevice() const { return mHwDevice; } |
| struct sound_trigger_module_descriptor descriptor() { return mDescriptor; } |
| void setClient(sp<ISoundTriggerClient> client) { mClient = client; } |
| void clearClient() { mClient.clear(); } |
| sp<ISoundTriggerClient> client() const { return mClient; } |
| wp<SoundTriggerHwService> service() const { return mService; } |
| |
| void onCallbackEvent(const sp<CallbackEvent>& event); |
| |
| sp<Model> getModel(sound_model_handle_t handle); |
| |
| void setCaptureState_l(bool active); |
| |
| // IBinder::DeathRecipient implementation |
| virtual void binderDied(const wp<IBinder> &who); |
| |
| private: |
| |
| status_t unloadSoundModel_l(sound_model_handle_t handle); |
| |
| |
| Mutex mLock; |
| wp<SoundTriggerHwService> mService; |
| struct sound_trigger_hw_device* mHwDevice; |
| struct sound_trigger_module_descriptor mDescriptor; |
| sp<ISoundTriggerClient> mClient; |
| DefaultKeyedVector< sound_model_handle_t, sp<Model> > mModels; |
| sound_trigger_service_state_t mServiceState; |
| }; // class Module |
| |
| class CallbackThread : public Thread { |
| public: |
| |
| CallbackThread(const wp<SoundTriggerHwService>& service); |
| |
| virtual ~CallbackThread(); |
| |
| // Thread virtuals |
| virtual bool threadLoop(); |
| |
| // RefBase |
| virtual void onFirstRef(); |
| |
| void exit(); |
| void sendCallbackEvent(const sp<CallbackEvent>& event); |
| |
| private: |
| wp<SoundTriggerHwService> mService; |
| Condition mCallbackCond; |
| Mutex mCallbackLock; |
| Vector< sp<CallbackEvent> > mEventQueue; |
| }; |
| |
| void detachModule(sp<Module> module); |
| |
| static void recognitionCallback(struct sound_trigger_recognition_event *event, void *cookie); |
| sp<IMemory> prepareRecognitionEvent_l(struct sound_trigger_recognition_event *event); |
| void sendRecognitionEvent(struct sound_trigger_recognition_event *event, Module *module); |
| |
| static void soundModelCallback(struct sound_trigger_model_event *event, void *cookie); |
| sp<IMemory> prepareSoundModelEvent_l(struct sound_trigger_model_event *event); |
| void sendSoundModelEvent(struct sound_trigger_model_event *event, Module *module); |
| |
| sp<IMemory> prepareServiceStateEvent_l(sound_trigger_service_state_t state); |
| void sendServiceStateEvent_l(sound_trigger_service_state_t state, Module *module); |
| |
| void sendCallbackEvent_l(const sp<CallbackEvent>& event); |
| void onCallbackEvent(const sp<CallbackEvent>& event); |
| |
| private: |
| |
| virtual void onFirstRef(); |
| |
| Mutex mServiceLock; |
| volatile int32_t mNextUniqueId; |
| DefaultKeyedVector< sound_trigger_module_handle_t, sp<Module> > mModules; |
| sp<CallbackThread> mCallbackThread; |
| sp<MemoryDealer> mMemoryDealer; |
| bool mCaptureState; |
| }; |
| |
| } // namespace android |
| |
| #endif // ANDROID_HARDWARE_SOUNDTRIGGER_HAL_SERVICE_H |