SoundTriggerHwService.h revision b7a11d83f749ad0200778c4815e907d011d4b5d3
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
31namespace android {
32
33class MemoryHeapBase;
34
35class SoundTriggerHwService :
36    public BinderService<SoundTriggerHwService>,
37    public BnSoundTriggerHwService
38{
39    friend class BinderService<SoundTriggerHwService>;
40public:
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    onTransact(uint32_t code, const Parcel& data,
57                                   Parcel* reply, uint32_t flags);
58
59    virtual status_t    dump(int fd, const Vector<String16>& args);
60
61    class Model : public RefBase {
62     public:
63
64        enum {
65            STATE_IDLE,
66            STATE_ACTIVE
67        };
68
69        Model(sound_model_handle_t handle);
70        ~Model() {}
71
72        sp<IMemory> allocateMemory(size_t size);
73        void deallocateMemory();
74
75        sound_model_handle_t    mHandle;
76        int                     mState;
77        audio_io_handle_t       mInputHandle;
78        audio_session_t         mCaptureSession;
79        sp<MemoryDealer>        mMemoryDealer;
80    };
81
82    class Module : public virtual RefBase,
83                   public BnSoundTrigger,
84                   public IBinder::DeathRecipient     {
85    public:
86
87       Module(const sp<SoundTriggerHwService>& service,
88              sound_trigger_hw_device* hwDevice,
89              sound_trigger_module_descriptor descriptor,
90              const sp<ISoundTriggerClient>& client);
91
92       virtual ~Module();
93
94       virtual void detach();
95
96       virtual status_t loadSoundModel(const sp<IMemory>& modelMemory,
97                                       sound_model_handle_t *handle);
98
99       virtual status_t unloadSoundModel(sound_model_handle_t handle);
100
101       virtual status_t startRecognition(sound_model_handle_t handle,
102                                         const sp<IMemory>& dataMemory);
103       virtual status_t stopRecognition(sound_model_handle_t handle);
104
105       virtual status_t dump(int fd, const Vector<String16>& args);
106
107
108       sound_trigger_hw_device *hwDevice() const { return mHwDevice; }
109       struct sound_trigger_module_descriptor descriptor() { return mDescriptor; }
110       void setClient(sp<ISoundTriggerClient> client) { mClient = client; }
111       void clearClient() { mClient.clear(); }
112       sp<ISoundTriggerClient> client() { return mClient; }
113
114       void sendRecognitionEvent(struct sound_trigger_recognition_event *event);
115       void onRecognitionEvent(sp<IMemory> eventMemory);
116
117       sp<Model> getModel(sound_model_handle_t handle);
118
119       // IBinder::DeathRecipient implementation
120       virtual void        binderDied(const wp<IBinder> &who);
121
122    private:
123        Mutex                                  mLock;
124        wp<SoundTriggerHwService>              mService;
125        struct sound_trigger_hw_device*        mHwDevice;
126        struct sound_trigger_module_descriptor mDescriptor;
127        sp<ISoundTriggerClient>                mClient;
128        DefaultKeyedVector< sound_model_handle_t, sp<Model> >     mModels;
129    }; // class Module
130
131    class RecognitionEvent : public RefBase {
132    public:
133
134        RecognitionEvent(sp<IMemory> eventMemory, wp<Module> module);
135
136        virtual             ~RecognitionEvent();
137
138        sp<IMemory> mEventMemory;
139        wp<Module> mModule;
140    };
141
142    class CallbackThread : public Thread {
143    public:
144
145        CallbackThread(const wp<SoundTriggerHwService>& service);
146
147        virtual             ~CallbackThread();
148
149        // Thread virtuals
150        virtual bool        threadLoop();
151
152        // RefBase
153        virtual void        onFirstRef();
154
155                void        exit();
156                void        sendRecognitionEvent(const sp<RecognitionEvent>& event);
157
158    private:
159        wp<SoundTriggerHwService>   mService;
160        Condition                   mCallbackCond;
161        Mutex                       mCallbackLock;
162        Vector< sp<RecognitionEvent> > mEventQueue;
163    };
164
165    void detachModule(sp<Module> module);
166
167    static void recognitionCallback(struct sound_trigger_recognition_event *event, void *cookie);
168    void sendRecognitionEvent(const sp<RecognitionEvent>& event);
169    void onRecognitionEvent(const sp<RecognitionEvent>& event);
170
171    static void soundModelCallback(struct sound_trigger_model_event *event, void *cookie);
172
173private:
174
175    virtual void onFirstRef();
176
177    Mutex               mServiceLock;
178    volatile int32_t    mNextUniqueId;
179    DefaultKeyedVector< sound_trigger_module_handle_t, sp<Module> >     mModules;
180    sp<CallbackThread>  mCallbackThread;
181};
182
183} // namespace android
184
185#endif // ANDROID_HARDWARE_SOUNDTRIGGER_HAL_SERVICE_H
186