/* * 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 //#include #include #include #include #include #include #include #include #include namespace android { class MemoryHeapBase; class SoundTriggerHwService : public BinderService, public BnSoundTriggerHwService { friend class BinderService; 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& client, sp& 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& 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 memory, wp module); virtual ~CallbackEvent(); event_type mType; sp mMemory; wp mModule; }; class Module : public virtual RefBase, public BnSoundTrigger, public IBinder::DeathRecipient { public: Module(const sp& service, sound_trigger_hw_device* hwDevice, sound_trigger_module_descriptor descriptor, const sp& client); virtual ~Module(); virtual void detach(); virtual status_t loadSoundModel(const sp& 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& dataMemory); virtual status_t stopRecognition(sound_model_handle_t handle); virtual status_t dump(int fd, const Vector& args); sound_trigger_hw_device *hwDevice() const { return mHwDevice; } struct sound_trigger_module_descriptor descriptor() { return mDescriptor; } void setClient(sp client) { mClient = client; } void clearClient() { mClient.clear(); } sp client() const { return mClient; } wp service() const { return mService; } void onCallbackEvent(const sp& event); sp getModel(sound_model_handle_t handle); void setCaptureState_l(bool active); // IBinder::DeathRecipient implementation virtual void binderDied(const wp &who); private: status_t unloadSoundModel_l(sound_model_handle_t handle); Mutex mLock; wp mService; struct sound_trigger_hw_device* mHwDevice; struct sound_trigger_module_descriptor mDescriptor; sp mClient; DefaultKeyedVector< sound_model_handle_t, sp > mModels; sound_trigger_service_state_t mServiceState; }; // class Module class CallbackThread : public Thread { public: CallbackThread(const wp& service); virtual ~CallbackThread(); // Thread virtuals virtual bool threadLoop(); // RefBase virtual void onFirstRef(); void exit(); void sendCallbackEvent(const sp& event); private: wp mService; Condition mCallbackCond; Mutex mCallbackLock; Vector< sp > mEventQueue; }; void detachModule(sp module); static void recognitionCallback(struct sound_trigger_recognition_event *event, void *cookie); sp 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 prepareSoundModelEvent_l(struct sound_trigger_model_event *event); void sendSoundModelEvent(struct sound_trigger_model_event *event, Module *module); sp prepareServiceStateEvent_l(sound_trigger_service_state_t state); void sendServiceStateEvent_l(sound_trigger_service_state_t state, Module *module); void sendCallbackEvent_l(const sp& event); void onCallbackEvent(const sp& event); private: virtual void onFirstRef(); Mutex mServiceLock; volatile int32_t mNextUniqueId; DefaultKeyedVector< sound_trigger_module_handle_t, sp > mModules; sp mCallbackThread; sp mMemoryDealer; bool mCaptureState; }; } // namespace android #endif // ANDROID_HARDWARE_SOUNDTRIGGER_HAL_SERVICE_H