blob: 7f7d0cc833d1cce6e3dfae6b6c78122c5dbad0e8 [file] [log] [blame]
Eric Laurentb7a11d82014-04-18 17:40:41 -07001/*
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>
Eric Laurent7a544b42016-08-05 19:01:13 -070029#include "SoundTriggerHalInterface.h"
Eric Laurentb7a11d82014-04-18 17:40:41 -070030
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
Eric Laurentdf3dc7e2014-07-27 18:39:40 -070056 virtual status_t setCaptureState(bool active);
57
Eric Laurentb7a11d82014-04-18 17:40:41 -070058 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
Eric Laurentdf3dc7e2014-07-27 18:39:40 -070071 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);
Eric Laurentb7a11d82014-04-18 17:40:41 -070073 ~Model() {}
74
Eric Laurentb7a11d82014-04-18 17:40:41 -070075 sound_model_handle_t mHandle;
76 int mState;
Eric Laurentb7a11d82014-04-18 17:40:41 -070077 audio_session_t mCaptureSession;
Eric Laurentdf3dc7e2014-07-27 18:39:40 -070078 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;
Eric Laurentb7a11d82014-04-18 17:40:41 -070098 };
99
100 class Module : public virtual RefBase,
101 public BnSoundTrigger,
102 public IBinder::DeathRecipient {
103 public:
104
105 Module(const sp<SoundTriggerHwService>& service,
Eric Laurent7a544b42016-08-05 19:01:13 -0700106 const sp<SoundTriggerHalInterface>& halInterface,
Eric Laurentb7a11d82014-04-18 17:40:41 -0700107 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
Eric Laurentb7a11d82014-04-18 17:40:41 -0700126 struct sound_trigger_module_descriptor descriptor() { return mDescriptor; }
Chih-Hung Hsieh85f8a732016-08-09 14:10:03 -0700127 void setClient(const sp<ISoundTriggerClient>& client) { mClient = client; }
Eric Laurentb7a11d82014-04-18 17:40:41 -0700128 void clearClient() { mClient.clear(); }
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700129 sp<ISoundTriggerClient> client() const { return mClient; }
130 wp<SoundTriggerHwService> service() const { return mService; }
Eric Laurentb7a11d82014-04-18 17:40:41 -0700131
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700132 void onCallbackEvent(const sp<CallbackEvent>& event);
Eric Laurentb7a11d82014-04-18 17:40:41 -0700133
134 sp<Model> getModel(sound_model_handle_t handle);
135
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700136 void setCaptureState_l(bool active);
137
Eric Laurentb7a11d82014-04-18 17:40:41 -0700138 // IBinder::DeathRecipient implementation
139 virtual void binderDied(const wp<IBinder> &who);
140
141 private:
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700142
Eric Laurent02eb47c2014-11-20 10:10:20 -0800143 status_t unloadSoundModel_l(sound_model_handle_t handle);
144
145
Eric Laurentb7a11d82014-04-18 17:40:41 -0700146 Mutex mLock;
147 wp<SoundTriggerHwService> mService;
Eric Laurent7a544b42016-08-05 19:01:13 -0700148 sp<SoundTriggerHalInterface> mHalInterface;
Eric Laurentb7a11d82014-04-18 17:40:41 -0700149 struct sound_trigger_module_descriptor mDescriptor;
150 sp<ISoundTriggerClient> mClient;
151 DefaultKeyedVector< sound_model_handle_t, sp<Model> > mModels;
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700152 sound_trigger_service_state_t mServiceState;
Eric Laurentb7a11d82014-04-18 17:40:41 -0700153 }; // class Module
154
Eric Laurentb7a11d82014-04-18 17:40:41 -0700155 class CallbackThread : public Thread {
156 public:
157
Chih-Hung Hsieh85f8a732016-08-09 14:10:03 -0700158 explicit CallbackThread(const wp<SoundTriggerHwService>& service);
Eric Laurentb7a11d82014-04-18 17:40:41 -0700159
160 virtual ~CallbackThread();
161
162 // Thread virtuals
163 virtual bool threadLoop();
164
165 // RefBase
166 virtual void onFirstRef();
167
168 void exit();
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700169 void sendCallbackEvent(const sp<CallbackEvent>& event);
Eric Laurentb7a11d82014-04-18 17:40:41 -0700170
171 private:
172 wp<SoundTriggerHwService> mService;
173 Condition mCallbackCond;
174 Mutex mCallbackLock;
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700175 Vector< sp<CallbackEvent> > mEventQueue;
Eric Laurentb7a11d82014-04-18 17:40:41 -0700176 };
177
Chih-Hung Hsieh85f8a732016-08-09 14:10:03 -0700178 void detachModule(const sp<Module>& module);
Eric Laurentb7a11d82014-04-18 17:40:41 -0700179
180 static void recognitionCallback(struct sound_trigger_recognition_event *event, void *cookie);
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700181 sp<IMemory> prepareRecognitionEvent_l(struct sound_trigger_recognition_event *event);
182 void sendRecognitionEvent(struct sound_trigger_recognition_event *event, Module *module);
Eric Laurentb7a11d82014-04-18 17:40:41 -0700183
184 static void soundModelCallback(struct sound_trigger_model_event *event, void *cookie);
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700185 sp<IMemory> prepareSoundModelEvent_l(struct sound_trigger_model_event *event);
186 void sendSoundModelEvent(struct sound_trigger_model_event *event, Module *module);
187
188 sp<IMemory> prepareServiceStateEvent_l(sound_trigger_service_state_t state);
189 void sendServiceStateEvent_l(sound_trigger_service_state_t state, Module *module);
190
191 void sendCallbackEvent_l(const sp<CallbackEvent>& event);
192 void onCallbackEvent(const sp<CallbackEvent>& event);
Eric Laurentb7a11d82014-04-18 17:40:41 -0700193
194private:
195
196 virtual void onFirstRef();
197
198 Mutex mServiceLock;
199 volatile int32_t mNextUniqueId;
200 DefaultKeyedVector< sound_trigger_module_handle_t, sp<Module> > mModules;
201 sp<CallbackThread> mCallbackThread;
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700202 sp<MemoryDealer> mMemoryDealer;
203 bool mCaptureState;
Eric Laurentb7a11d82014-04-18 17:40:41 -0700204};
205
206} // namespace android
207
208#endif // ANDROID_HARDWARE_SOUNDTRIGGER_HAL_SERVICE_H