Home | History | Annotate | Download | only in soundtrigger
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef ANDROID_HARDWARE_SOUNDTRIGGER_HAL_SERVICE_H
     18 #define ANDROID_HARDWARE_SOUNDTRIGGER_HAL_SERVICE_H
     19 
     20 #include <utils/Vector.h>
     21 //#include <binder/AppOpsManager.h>
     22 #include <binder/MemoryDealer.h>
     23 #include <binder/BinderService.h>
     24 #include <binder/IAppOpsCallback.h>
     25 #include <soundtrigger/ISoundTriggerHwService.h>
     26 #include <soundtrigger/ISoundTrigger.h>
     27 #include <soundtrigger/ISoundTriggerClient.h>
     28 #include <system/sound_trigger.h>
     29 #include <hardware/sound_trigger.h>
     30 
     31 namespace android {
     32 
     33 class MemoryHeapBase;
     34 
     35 class SoundTriggerHwService :
     36     public BinderService<SoundTriggerHwService>,
     37     public BnSoundTriggerHwService
     38 {
     39     friend class BinderService<SoundTriggerHwService>;
     40 public:
     41     class Module;
     42 
     43     static char const* getServiceName() { return "media.sound_trigger_hw"; }
     44 
     45                         SoundTriggerHwService();
     46     virtual             ~SoundTriggerHwService();
     47 
     48     // ISoundTriggerHwService
     49     virtual status_t listModules(struct sound_trigger_module_descriptor *modules,
     50                                  uint32_t *numModules);
     51 
     52     virtual status_t attach(const sound_trigger_module_handle_t handle,
     53                             const sp<ISoundTriggerClient>& client,
     54                             sp<ISoundTrigger>& module);
     55 
     56     virtual status_t setCaptureState(bool active);
     57 
     58     virtual status_t    onTransact(uint32_t code, const Parcel& data,
     59                                    Parcel* reply, uint32_t flags);
     60 
     61     virtual status_t    dump(int fd, const Vector<String16>& args);
     62 
     63     class Model : public RefBase {
     64      public:
     65 
     66         enum {
     67             STATE_IDLE,
     68             STATE_ACTIVE
     69         };
     70 
     71         Model(sound_model_handle_t handle, audio_session_t session, audio_io_handle_t ioHandle,
     72               audio_devices_t device, sound_trigger_sound_model_type_t type);
     73         ~Model() {}
     74 
     75         sound_model_handle_t    mHandle;
     76         int                     mState;
     77         audio_session_t         mCaptureSession;
     78         audio_io_handle_t       mCaptureIOHandle;
     79         audio_devices_t         mCaptureDevice;
     80         sound_trigger_sound_model_type_t mType;
     81         struct sound_trigger_recognition_config mConfig;
     82     };
     83 
     84     class CallbackEvent : public RefBase {
     85     public:
     86         typedef enum {
     87             TYPE_RECOGNITION,
     88             TYPE_SOUNDMODEL,
     89             TYPE_SERVICE_STATE,
     90         } event_type;
     91         CallbackEvent(event_type type, sp<IMemory> memory, wp<Module> module);
     92 
     93         virtual             ~CallbackEvent();
     94 
     95         event_type mType;
     96         sp<IMemory> mMemory;
     97         wp<Module> mModule;
     98     };
     99 
    100     class Module : public virtual RefBase,
    101                    public BnSoundTrigger,
    102                    public IBinder::DeathRecipient     {
    103     public:
    104 
    105        Module(const sp<SoundTriggerHwService>& service,
    106               sound_trigger_hw_device* hwDevice,
    107               sound_trigger_module_descriptor descriptor,
    108               const sp<ISoundTriggerClient>& client);
    109 
    110        virtual ~Module();
    111 
    112        virtual void detach();
    113 
    114        virtual status_t loadSoundModel(const sp<IMemory>& modelMemory,
    115                                        sound_model_handle_t *handle);
    116 
    117        virtual status_t unloadSoundModel(sound_model_handle_t handle);
    118 
    119        virtual status_t startRecognition(sound_model_handle_t handle,
    120                                          const sp<IMemory>& dataMemory);
    121        virtual status_t stopRecognition(sound_model_handle_t handle);
    122 
    123        virtual status_t dump(int fd, const Vector<String16>& args);
    124 
    125 
    126        sound_trigger_hw_device *hwDevice() const { return mHwDevice; }
    127        struct sound_trigger_module_descriptor descriptor() { return mDescriptor; }
    128        void setClient(sp<ISoundTriggerClient> client) { mClient = client; }
    129        void clearClient() { mClient.clear(); }
    130        sp<ISoundTriggerClient> client() const { return mClient; }
    131        wp<SoundTriggerHwService> service() const { return mService; }
    132 
    133        void onCallbackEvent(const sp<CallbackEvent>& event);
    134 
    135        sp<Model> getModel(sound_model_handle_t handle);
    136 
    137        void setCaptureState_l(bool active);
    138 
    139        // IBinder::DeathRecipient implementation
    140        virtual void        binderDied(const wp<IBinder> &who);
    141 
    142     private:
    143 
    144        status_t unloadSoundModel_l(sound_model_handle_t handle);
    145 
    146 
    147         Mutex                                  mLock;
    148         wp<SoundTriggerHwService>              mService;
    149         struct sound_trigger_hw_device*        mHwDevice;
    150         struct sound_trigger_module_descriptor mDescriptor;
    151         sp<ISoundTriggerClient>                mClient;
    152         DefaultKeyedVector< sound_model_handle_t, sp<Model> >     mModels;
    153         sound_trigger_service_state_t          mServiceState;
    154     }; // class Module
    155 
    156     class CallbackThread : public Thread {
    157     public:
    158 
    159         CallbackThread(const wp<SoundTriggerHwService>& service);
    160 
    161         virtual             ~CallbackThread();
    162 
    163         // Thread virtuals
    164         virtual bool        threadLoop();
    165 
    166         // RefBase
    167         virtual void        onFirstRef();
    168 
    169                 void        exit();
    170                 void        sendCallbackEvent(const sp<CallbackEvent>& event);
    171 
    172     private:
    173         wp<SoundTriggerHwService>   mService;
    174         Condition                   mCallbackCond;
    175         Mutex                       mCallbackLock;
    176         Vector< sp<CallbackEvent> > mEventQueue;
    177     };
    178 
    179            void detachModule(sp<Module> module);
    180 
    181     static void recognitionCallback(struct sound_trigger_recognition_event *event, void *cookie);
    182            sp<IMemory> prepareRecognitionEvent_l(struct sound_trigger_recognition_event *event);
    183            void sendRecognitionEvent(struct sound_trigger_recognition_event *event, Module *module);
    184 
    185     static void soundModelCallback(struct sound_trigger_model_event *event, void *cookie);
    186            sp<IMemory> prepareSoundModelEvent_l(struct sound_trigger_model_event *event);
    187            void sendSoundModelEvent(struct sound_trigger_model_event *event, Module *module);
    188 
    189            sp<IMemory> prepareServiceStateEvent_l(sound_trigger_service_state_t state);
    190            void sendServiceStateEvent_l(sound_trigger_service_state_t state, Module *module);
    191 
    192            void sendCallbackEvent_l(const sp<CallbackEvent>& event);
    193            void onCallbackEvent(const sp<CallbackEvent>& event);
    194 
    195 private:
    196 
    197     virtual void onFirstRef();
    198 
    199     Mutex               mServiceLock;
    200     volatile int32_t    mNextUniqueId;
    201     DefaultKeyedVector< sound_trigger_module_handle_t, sp<Module> >     mModules;
    202     sp<CallbackThread>  mCallbackThread;
    203     sp<MemoryDealer>    mMemoryDealer;
    204     bool                mCaptureState;
    205 };
    206 
    207 } // namespace android
    208 
    209 #endif // ANDROID_HARDWARE_SOUNDTRIGGER_HAL_SERVICE_H
    210