1*4d7e907cSAndroid Build Coastguard Worker /* 2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2016 The Android Open Source Project 3*4d7e907cSAndroid Build Coastguard Worker * 4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*4d7e907cSAndroid Build Coastguard Worker * 8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*4d7e907cSAndroid Build Coastguard Worker * 10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License. 15*4d7e907cSAndroid Build Coastguard Worker */ 16*4d7e907cSAndroid Build Coastguard Worker 17*4d7e907cSAndroid Build Coastguard Worker #ifndef ANDROID_HARDWARE_SOUNDTRIGGER_V2_0_IMPLEMENTATION_H 18*4d7e907cSAndroid Build Coastguard Worker #define ANDROID_HARDWARE_SOUNDTRIGGER_V2_0_IMPLEMENTATION_H 19*4d7e907cSAndroid Build Coastguard Worker 20*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/soundtrigger/2.0/ISoundTriggerHw.h> 21*4d7e907cSAndroid Build Coastguard Worker #include <android/hardware/soundtrigger/2.0/ISoundTriggerHwCallback.h> 22*4d7e907cSAndroid Build Coastguard Worker #include <hardware/sound_trigger.h> 23*4d7e907cSAndroid Build Coastguard Worker #include <hidl/Status.h> 24*4d7e907cSAndroid Build Coastguard Worker #include <stdatomic.h> 25*4d7e907cSAndroid Build Coastguard Worker #include <system/sound_trigger.h> 26*4d7e907cSAndroid Build Coastguard Worker #include <utils/KeyedVector.h> 27*4d7e907cSAndroid Build Coastguard Worker #include <utils/threads.h> 28*4d7e907cSAndroid Build Coastguard Worker 29*4d7e907cSAndroid Build Coastguard Worker namespace android { 30*4d7e907cSAndroid Build Coastguard Worker namespace hardware { 31*4d7e907cSAndroid Build Coastguard Worker namespace soundtrigger { 32*4d7e907cSAndroid Build Coastguard Worker namespace V2_0 { 33*4d7e907cSAndroid Build Coastguard Worker namespace implementation { 34*4d7e907cSAndroid Build Coastguard Worker 35*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::audio::common::V2_0::Uuid; 36*4d7e907cSAndroid Build Coastguard Worker using ::android::hardware::soundtrigger::V2_0::ISoundTriggerHwCallback; 37*4d7e907cSAndroid Build Coastguard Worker 38*4d7e907cSAndroid Build Coastguard Worker class SoundTriggerHalImpl : public RefBase { 39*4d7e907cSAndroid Build Coastguard Worker public: 40*4d7e907cSAndroid Build Coastguard Worker SoundTriggerHalImpl(); getInterface()41*4d7e907cSAndroid Build Coastguard Worker ISoundTriggerHw* getInterface() { return new TrampolineSoundTriggerHw_2_0(this); } 42*4d7e907cSAndroid Build Coastguard Worker 43*4d7e907cSAndroid Build Coastguard Worker protected: 44*4d7e907cSAndroid Build Coastguard Worker class SoundModelClient : public RefBase { 45*4d7e907cSAndroid Build Coastguard Worker public: SoundModelClient(uint32_t id,ISoundTriggerHwCallback::CallbackCookie cookie)46*4d7e907cSAndroid Build Coastguard Worker SoundModelClient(uint32_t id, ISoundTriggerHwCallback::CallbackCookie cookie) 47*4d7e907cSAndroid Build Coastguard Worker : mId(id), mCookie(cookie) {} ~SoundModelClient()48*4d7e907cSAndroid Build Coastguard Worker virtual ~SoundModelClient() {} 49*4d7e907cSAndroid Build Coastguard Worker getId()50*4d7e907cSAndroid Build Coastguard Worker uint32_t getId() const { return mId; } getHalHandle()51*4d7e907cSAndroid Build Coastguard Worker sound_model_handle_t getHalHandle() const { return mHalHandle; } setHalHandle(sound_model_handle_t handle)52*4d7e907cSAndroid Build Coastguard Worker void setHalHandle(sound_model_handle_t handle) { mHalHandle = handle; } 53*4d7e907cSAndroid Build Coastguard Worker 54*4d7e907cSAndroid Build Coastguard Worker virtual void recognitionCallback(struct sound_trigger_recognition_event* halEvent) = 0; 55*4d7e907cSAndroid Build Coastguard Worker virtual void soundModelCallback(struct sound_trigger_model_event* halEvent) = 0; 56*4d7e907cSAndroid Build Coastguard Worker 57*4d7e907cSAndroid Build Coastguard Worker protected: 58*4d7e907cSAndroid Build Coastguard Worker const uint32_t mId; 59*4d7e907cSAndroid Build Coastguard Worker sound_model_handle_t mHalHandle; 60*4d7e907cSAndroid Build Coastguard Worker ISoundTriggerHwCallback::CallbackCookie mCookie; 61*4d7e907cSAndroid Build Coastguard Worker }; 62*4d7e907cSAndroid Build Coastguard Worker 63*4d7e907cSAndroid Build Coastguard Worker static void convertPhaseRecognitionEventFromHal( 64*4d7e907cSAndroid Build Coastguard Worker ISoundTriggerHwCallback::PhraseRecognitionEvent* event, 65*4d7e907cSAndroid Build Coastguard Worker const struct sound_trigger_phrase_recognition_event* halEvent); 66*4d7e907cSAndroid Build Coastguard Worker static void convertRecognitionEventFromHal( 67*4d7e907cSAndroid Build Coastguard Worker ISoundTriggerHwCallback::RecognitionEvent* event, 68*4d7e907cSAndroid Build Coastguard Worker const struct sound_trigger_recognition_event* halEvent); 69*4d7e907cSAndroid Build Coastguard Worker static void convertSoundModelEventFromHal(ISoundTriggerHwCallback::ModelEvent* event, 70*4d7e907cSAndroid Build Coastguard Worker const struct sound_trigger_model_event* halEvent); 71*4d7e907cSAndroid Build Coastguard Worker 72*4d7e907cSAndroid Build Coastguard Worker virtual ~SoundTriggerHalImpl(); 73*4d7e907cSAndroid Build Coastguard Worker 74*4d7e907cSAndroid Build Coastguard Worker Return<void> getProperties(ISoundTriggerHw::getProperties_cb _hidl_cb); 75*4d7e907cSAndroid Build Coastguard Worker Return<void> loadSoundModel(const ISoundTriggerHw::SoundModel& soundModel, 76*4d7e907cSAndroid Build Coastguard Worker const sp<ISoundTriggerHwCallback>& callback, 77*4d7e907cSAndroid Build Coastguard Worker ISoundTriggerHwCallback::CallbackCookie cookie, 78*4d7e907cSAndroid Build Coastguard Worker ISoundTriggerHw::loadSoundModel_cb _hidl_cb); 79*4d7e907cSAndroid Build Coastguard Worker Return<void> loadPhraseSoundModel(const ISoundTriggerHw::PhraseSoundModel& soundModel, 80*4d7e907cSAndroid Build Coastguard Worker const sp<ISoundTriggerHwCallback>& callback, 81*4d7e907cSAndroid Build Coastguard Worker ISoundTriggerHwCallback::CallbackCookie cookie, 82*4d7e907cSAndroid Build Coastguard Worker ISoundTriggerHw::loadPhraseSoundModel_cb _hidl_cb); 83*4d7e907cSAndroid Build Coastguard Worker Return<int32_t> unloadSoundModel(SoundModelHandle modelHandle); 84*4d7e907cSAndroid Build Coastguard Worker Return<int32_t> startRecognition(SoundModelHandle modelHandle, 85*4d7e907cSAndroid Build Coastguard Worker const ISoundTriggerHw::RecognitionConfig& config); 86*4d7e907cSAndroid Build Coastguard Worker Return<int32_t> stopRecognition(SoundModelHandle modelHandle); 87*4d7e907cSAndroid Build Coastguard Worker Return<int32_t> stopAllRecognitions(); 88*4d7e907cSAndroid Build Coastguard Worker 89*4d7e907cSAndroid Build Coastguard Worker uint32_t nextUniqueModelId(); 90*4d7e907cSAndroid Build Coastguard Worker int doLoadSoundModel(const ISoundTriggerHw::SoundModel& soundModel, 91*4d7e907cSAndroid Build Coastguard Worker sp<SoundModelClient> client); 92*4d7e907cSAndroid Build Coastguard Worker 93*4d7e907cSAndroid Build Coastguard Worker // RefBase 94*4d7e907cSAndroid Build Coastguard Worker void onFirstRef() override; 95*4d7e907cSAndroid Build Coastguard Worker 96*4d7e907cSAndroid Build Coastguard Worker private: 97*4d7e907cSAndroid Build Coastguard Worker struct TrampolineSoundTriggerHw_2_0 : public ISoundTriggerHw { TrampolineSoundTriggerHw_2_0TrampolineSoundTriggerHw_2_098*4d7e907cSAndroid Build Coastguard Worker explicit TrampolineSoundTriggerHw_2_0(sp<SoundTriggerHalImpl> impl) : mImpl(impl) {} 99*4d7e907cSAndroid Build Coastguard Worker 100*4d7e907cSAndroid Build Coastguard Worker // Methods from ::android::hardware::soundtrigger::V2_0::ISoundTriggerHw follow. getPropertiesTrampolineSoundTriggerHw_2_0101*4d7e907cSAndroid Build Coastguard Worker Return<void> getProperties(getProperties_cb _hidl_cb) override { 102*4d7e907cSAndroid Build Coastguard Worker return mImpl->getProperties(_hidl_cb); 103*4d7e907cSAndroid Build Coastguard Worker } loadSoundModelTrampolineSoundTriggerHw_2_0104*4d7e907cSAndroid Build Coastguard Worker Return<void> loadSoundModel(const ISoundTriggerHw::SoundModel& soundModel, 105*4d7e907cSAndroid Build Coastguard Worker const sp<ISoundTriggerHwCallback>& callback, 106*4d7e907cSAndroid Build Coastguard Worker ISoundTriggerHwCallback::CallbackCookie cookie, 107*4d7e907cSAndroid Build Coastguard Worker loadSoundModel_cb _hidl_cb) override { 108*4d7e907cSAndroid Build Coastguard Worker return mImpl->loadSoundModel(soundModel, callback, cookie, _hidl_cb); 109*4d7e907cSAndroid Build Coastguard Worker } loadPhraseSoundModelTrampolineSoundTriggerHw_2_0110*4d7e907cSAndroid Build Coastguard Worker Return<void> loadPhraseSoundModel(const ISoundTriggerHw::PhraseSoundModel& soundModel, 111*4d7e907cSAndroid Build Coastguard Worker const sp<ISoundTriggerHwCallback>& callback, 112*4d7e907cSAndroid Build Coastguard Worker ISoundTriggerHwCallback::CallbackCookie cookie, 113*4d7e907cSAndroid Build Coastguard Worker loadPhraseSoundModel_cb _hidl_cb) override { 114*4d7e907cSAndroid Build Coastguard Worker return mImpl->loadPhraseSoundModel(soundModel, callback, cookie, _hidl_cb); 115*4d7e907cSAndroid Build Coastguard Worker } unloadSoundModelTrampolineSoundTriggerHw_2_0116*4d7e907cSAndroid Build Coastguard Worker Return<int32_t> unloadSoundModel(SoundModelHandle modelHandle) override { 117*4d7e907cSAndroid Build Coastguard Worker return mImpl->unloadSoundModel(modelHandle); 118*4d7e907cSAndroid Build Coastguard Worker } startRecognitionTrampolineSoundTriggerHw_2_0119*4d7e907cSAndroid Build Coastguard Worker Return<int32_t> startRecognition( 120*4d7e907cSAndroid Build Coastguard Worker SoundModelHandle modelHandle, const ISoundTriggerHw::RecognitionConfig& config, 121*4d7e907cSAndroid Build Coastguard Worker const sp<ISoundTriggerHwCallback>& /*callback*/, 122*4d7e907cSAndroid Build Coastguard Worker ISoundTriggerHwCallback::CallbackCookie /*cookie*/) override { 123*4d7e907cSAndroid Build Coastguard Worker return mImpl->startRecognition(modelHandle, config); 124*4d7e907cSAndroid Build Coastguard Worker } stopRecognitionTrampolineSoundTriggerHw_2_0125*4d7e907cSAndroid Build Coastguard Worker Return<int32_t> stopRecognition(SoundModelHandle modelHandle) override { 126*4d7e907cSAndroid Build Coastguard Worker return mImpl->stopRecognition(modelHandle); 127*4d7e907cSAndroid Build Coastguard Worker } stopAllRecognitionsTrampolineSoundTriggerHw_2_0128*4d7e907cSAndroid Build Coastguard Worker Return<int32_t> stopAllRecognitions() override { return mImpl->stopAllRecognitions(); } 129*4d7e907cSAndroid Build Coastguard Worker 130*4d7e907cSAndroid Build Coastguard Worker private: 131*4d7e907cSAndroid Build Coastguard Worker sp<SoundTriggerHalImpl> mImpl; 132*4d7e907cSAndroid Build Coastguard Worker }; 133*4d7e907cSAndroid Build Coastguard Worker 134*4d7e907cSAndroid Build Coastguard Worker class SoundModelClient_2_0 : public SoundModelClient { 135*4d7e907cSAndroid Build Coastguard Worker public: SoundModelClient_2_0(uint32_t id,ISoundTriggerHwCallback::CallbackCookie cookie,sp<ISoundTriggerHwCallback> callback)136*4d7e907cSAndroid Build Coastguard Worker SoundModelClient_2_0(uint32_t id, ISoundTriggerHwCallback::CallbackCookie cookie, 137*4d7e907cSAndroid Build Coastguard Worker sp<ISoundTriggerHwCallback> callback) 138*4d7e907cSAndroid Build Coastguard Worker : SoundModelClient(id, cookie), mCallback(callback) {} 139*4d7e907cSAndroid Build Coastguard Worker 140*4d7e907cSAndroid Build Coastguard Worker void recognitionCallback(struct sound_trigger_recognition_event* halEvent) override; 141*4d7e907cSAndroid Build Coastguard Worker void soundModelCallback(struct sound_trigger_model_event* halEvent) override; 142*4d7e907cSAndroid Build Coastguard Worker 143*4d7e907cSAndroid Build Coastguard Worker private: 144*4d7e907cSAndroid Build Coastguard Worker sp<ISoundTriggerHwCallback> mCallback; 145*4d7e907cSAndroid Build Coastguard Worker }; 146*4d7e907cSAndroid Build Coastguard Worker 147*4d7e907cSAndroid Build Coastguard Worker void convertUuidFromHal(Uuid* uuid, const sound_trigger_uuid_t* halUuid); 148*4d7e907cSAndroid Build Coastguard Worker void convertUuidToHal(sound_trigger_uuid_t* halUuid, const Uuid* uuid); 149*4d7e907cSAndroid Build Coastguard Worker void convertPropertiesFromHal(ISoundTriggerHw::Properties* properties, 150*4d7e907cSAndroid Build Coastguard Worker const struct sound_trigger_properties* halProperties); 151*4d7e907cSAndroid Build Coastguard Worker void convertTriggerPhraseToHal(struct sound_trigger_phrase* halTriggerPhrase, 152*4d7e907cSAndroid Build Coastguard Worker const ISoundTriggerHw::Phrase* triggerPhrase); 153*4d7e907cSAndroid Build Coastguard Worker // returned HAL sound model must be freed by caller 154*4d7e907cSAndroid Build Coastguard Worker struct sound_trigger_sound_model* convertSoundModelToHal( 155*4d7e907cSAndroid Build Coastguard Worker const ISoundTriggerHw::SoundModel* soundModel); 156*4d7e907cSAndroid Build Coastguard Worker void convertPhraseRecognitionExtraToHal(struct sound_trigger_phrase_recognition_extra* halExtra, 157*4d7e907cSAndroid Build Coastguard Worker const PhraseRecognitionExtra* extra); 158*4d7e907cSAndroid Build Coastguard Worker // returned recognition config must be freed by caller 159*4d7e907cSAndroid Build Coastguard Worker struct sound_trigger_recognition_config* convertRecognitionConfigToHal( 160*4d7e907cSAndroid Build Coastguard Worker const ISoundTriggerHw::RecognitionConfig* config); 161*4d7e907cSAndroid Build Coastguard Worker 162*4d7e907cSAndroid Build Coastguard Worker static void convertPhraseRecognitionExtraFromHal( 163*4d7e907cSAndroid Build Coastguard Worker PhraseRecognitionExtra* extra, 164*4d7e907cSAndroid Build Coastguard Worker const struct sound_trigger_phrase_recognition_extra* halExtra); 165*4d7e907cSAndroid Build Coastguard Worker 166*4d7e907cSAndroid Build Coastguard Worker static void soundModelCallback(struct sound_trigger_model_event* halEvent, void* cookie); 167*4d7e907cSAndroid Build Coastguard Worker static void recognitionCallback(struct sound_trigger_recognition_event* halEvent, void* cookie); 168*4d7e907cSAndroid Build Coastguard Worker 169*4d7e907cSAndroid Build Coastguard Worker const char* mModuleName; 170*4d7e907cSAndroid Build Coastguard Worker struct sound_trigger_hw_device* mHwDevice; 171*4d7e907cSAndroid Build Coastguard Worker volatile atomic_uint_fast32_t mNextModelId; 172*4d7e907cSAndroid Build Coastguard Worker DefaultKeyedVector<int32_t, sp<SoundModelClient> > mClients; 173*4d7e907cSAndroid Build Coastguard Worker Mutex mLock; 174*4d7e907cSAndroid Build Coastguard Worker }; 175*4d7e907cSAndroid Build Coastguard Worker 176*4d7e907cSAndroid Build Coastguard Worker } // namespace implementation 177*4d7e907cSAndroid Build Coastguard Worker } // namespace V2_0 178*4d7e907cSAndroid Build Coastguard Worker } // namespace soundtrigger 179*4d7e907cSAndroid Build Coastguard Worker } // namespace hardware 180*4d7e907cSAndroid Build Coastguard Worker } // namespace android 181*4d7e907cSAndroid Build Coastguard Worker 182*4d7e907cSAndroid Build Coastguard Worker #endif // ANDROID_HARDWARE_SOUNDTRIGGER_V2_0_IMPLEMENTATION_H 183