diff options
Diffstat (limited to 'soundtrigger/2.0/default/SoundTriggerHalImpl.cpp')
-rw-r--r-- | soundtrigger/2.0/default/SoundTriggerHalImpl.cpp | 160 |
1 files changed, 70 insertions, 90 deletions
diff --git a/soundtrigger/2.0/default/SoundTriggerHalImpl.cpp b/soundtrigger/2.0/default/SoundTriggerHalImpl.cpp index bbd97f1aa8..612772cc63 100644 --- a/soundtrigger/2.0/default/SoundTriggerHalImpl.cpp +++ b/soundtrigger/2.0/default/SoundTriggerHalImpl.cpp @@ -39,17 +39,13 @@ void SoundTriggerHalImpl::soundModelCallback(struct sound_trigger_model_event* h ALOGW("soundModelCallback called on stale client"); return; } - if (halEvent->model != client->mHalHandle) { + if (halEvent->model != client->getHalHandle()) { ALOGW("soundModelCallback call with wrong handle %d on client with handle %d", - (int)halEvent->model, (int)client->mHalHandle); + (int)halEvent->model, (int)client->getHalHandle()); return; } - ISoundTriggerHwCallback::ModelEvent event; - convertSoundModelEventFromHal(&event, halEvent); - event.model = client->mId; - - client->mCallback->soundModelCallback(event, client->mCookie); + client->soundModelCallback(halEvent); } // static @@ -66,20 +62,10 @@ void SoundTriggerHalImpl::recognitionCallback(struct sound_trigger_recognition_e return; } - ISoundTriggerHwCallback::RecognitionEvent* event = convertRecognitionEventFromHal(halEvent); - event->model = client->mId; - if (halEvent->type == SOUND_MODEL_TYPE_KEYPHRASE) { - client->mCallback->phraseRecognitionCallback( - *(reinterpret_cast<ISoundTriggerHwCallback::PhraseRecognitionEvent*>(event)), - client->mCookie); - } else { - client->mCallback->recognitionCallback(*event, client->mCookie); - } - delete event; + client->recognitionCallback(halEvent); } -// Methods from ::android::hardware::soundtrigger::V2_0::ISoundTriggerHw follow. -Return<void> SoundTriggerHalImpl::getProperties(getProperties_cb _hidl_cb) { +Return<void> SoundTriggerHalImpl::getProperties(ISoundTriggerHw::getProperties_cb _hidl_cb) { ALOGV("getProperties() mHwDevice %p", mHwDevice); int ret; struct sound_trigger_properties halProperties; @@ -103,13 +89,9 @@ exit: } int SoundTriggerHalImpl::doLoadSoundModel(const ISoundTriggerHw::SoundModel& soundModel, - const sp<ISoundTriggerHwCallback>& callback, - ISoundTriggerHwCallback::CallbackCookie cookie, - uint32_t* modelId) { + sp<SoundModelClient> client) { int32_t ret = 0; struct sound_trigger_sound_model* halSoundModel; - *modelId = 0; - sp<SoundModelClient> client; ALOGV("doLoadSoundModel() data size %zu", soundModel.data.size()); @@ -124,19 +106,9 @@ int SoundTriggerHalImpl::doLoadSoundModel(const ISoundTriggerHw::SoundModel& sou goto exit; } - { - AutoMutex lock(mLock); - do { - *modelId = nextUniqueId(); - } while (mClients.valueFor(*modelId) != 0 && *modelId != 0); - } - LOG_ALWAYS_FATAL_IF(*modelId == 0, "wrap around in sound model IDs, num loaded models %zu", - mClients.size()); - - client = new SoundModelClient(*modelId, callback, cookie); - + sound_model_handle_t halHandle; ret = mHwDevice->load_sound_model(mHwDevice, halSoundModel, soundModelCallback, client.get(), - &client->mHalHandle); + &halHandle); free(halSoundModel); @@ -144,9 +116,10 @@ int SoundTriggerHalImpl::doLoadSoundModel(const ISoundTriggerHw::SoundModel& sou goto exit; } + client->setHalHandle(halHandle); { AutoMutex lock(mLock); - mClients.add(*modelId, client); + mClients.add(client->getId(), client); } exit: @@ -156,11 +129,9 @@ exit: Return<void> SoundTriggerHalImpl::loadSoundModel(const ISoundTriggerHw::SoundModel& soundModel, const sp<ISoundTriggerHwCallback>& callback, ISoundTriggerHwCallback::CallbackCookie cookie, - loadSoundModel_cb _hidl_cb) { - uint32_t modelId = 0; - int32_t ret = doLoadSoundModel(soundModel, callback, cookie, &modelId); - - _hidl_cb(ret, modelId); + ISoundTriggerHw::loadSoundModel_cb _hidl_cb) { + sp<SoundModelClient> client = new SoundModelClient_2_0(nextUniqueModelId(), cookie, callback); + _hidl_cb(doLoadSoundModel(soundModel, client), client->getId()); return Void(); } @@ -168,11 +139,9 @@ Return<void> SoundTriggerHalImpl::loadPhraseSoundModel( const ISoundTriggerHw::PhraseSoundModel& soundModel, const sp<ISoundTriggerHwCallback>& callback, ISoundTriggerHwCallback::CallbackCookie cookie, ISoundTriggerHw::loadPhraseSoundModel_cb _hidl_cb) { - uint32_t modelId = 0; - int32_t ret = doLoadSoundModel((const ISoundTriggerHw::SoundModel&)soundModel, callback, cookie, - &modelId); - - _hidl_cb(ret, modelId); + sp<SoundModelClient> client = new SoundModelClient_2_0(nextUniqueModelId(), cookie, callback); + _hidl_cb(doLoadSoundModel((const ISoundTriggerHw::SoundModel&)soundModel, client), + client->getId()); return Void(); } @@ -194,7 +163,7 @@ Return<int32_t> SoundTriggerHalImpl::unloadSoundModel(SoundModelHandle modelHand } } - ret = mHwDevice->unload_sound_model(mHwDevice, client->mHalHandle); + ret = mHwDevice->unload_sound_model(mHwDevice, client->getHalHandle()); mClients.removeItem(modelHandle); @@ -203,9 +172,7 @@ exit: } Return<int32_t> SoundTriggerHalImpl::startRecognition( - SoundModelHandle modelHandle, const ISoundTriggerHw::RecognitionConfig& config, - const sp<ISoundTriggerHwCallback>& callback __unused, - ISoundTriggerHwCallback::CallbackCookie cookie __unused) { + SoundModelHandle modelHandle, const ISoundTriggerHw::RecognitionConfig& config) { int32_t ret; sp<SoundModelClient> client; struct sound_trigger_recognition_config* halConfig; @@ -230,7 +197,7 @@ Return<int32_t> SoundTriggerHalImpl::startRecognition( ret = -EINVAL; goto exit; } - ret = mHwDevice->start_recognition(mHwDevice, client->mHalHandle, halConfig, + ret = mHwDevice->start_recognition(mHwDevice, client->getHalHandle(), halConfig, recognitionCallback, client.get()); free(halConfig); @@ -256,7 +223,7 @@ Return<int32_t> SoundTriggerHalImpl::stopRecognition(SoundModelHandle modelHandl } } - ret = mHwDevice->stop_recognition(mHwDevice, client->mHalHandle); + ret = mHwDevice->stop_recognition(mHwDevice, client->getHalHandle()); exit: return ret; @@ -316,9 +283,18 @@ SoundTriggerHalImpl::~SoundTriggerHalImpl() { } } -uint32_t SoundTriggerHalImpl::nextUniqueId() { - return (uint32_t)atomic_fetch_add_explicit(&mNextModelId, (uint_fast32_t)1, - memory_order_acq_rel); +uint32_t SoundTriggerHalImpl::nextUniqueModelId() { + uint32_t modelId = 0; + { + AutoMutex lock(mLock); + do { + modelId = + atomic_fetch_add_explicit(&mNextModelId, (uint_fast32_t)1, memory_order_acq_rel); + } while (mClients.valueFor(modelId) != 0 && modelId != 0); + } + LOG_ALWAYS_FATAL_IF(modelId == 0, "wrap around in sound model IDs, num loaded models %zu", + mClients.size()); + return modelId; } void SoundTriggerHalImpl::convertUuidFromHal(Uuid* uuid, const sound_trigger_uuid_t* halUuid) { @@ -464,31 +440,20 @@ void SoundTriggerHalImpl::convertSoundModelEventFromHal( } // static -ISoundTriggerHwCallback::RecognitionEvent* SoundTriggerHalImpl::convertRecognitionEventFromHal( - const struct sound_trigger_recognition_event* halEvent) { - ISoundTriggerHwCallback::RecognitionEvent* event; - - if (halEvent->type == SOUND_MODEL_TYPE_KEYPHRASE) { - const struct sound_trigger_phrase_recognition_event* halPhraseEvent = - reinterpret_cast<const struct sound_trigger_phrase_recognition_event*>(halEvent); - ISoundTriggerHwCallback::PhraseRecognitionEvent* phraseEvent = - new ISoundTriggerHwCallback::PhraseRecognitionEvent(); - - PhraseRecognitionExtra* phraseExtras = - new PhraseRecognitionExtra[halPhraseEvent->num_phrases]; - for (unsigned int i = 0; i < halPhraseEvent->num_phrases; i++) { - convertPhraseRecognitionExtraFromHal(&phraseExtras[i], - &halPhraseEvent->phrase_extras[i]); - } - phraseEvent->phraseExtras.setToExternal(phraseExtras, halPhraseEvent->num_phrases); - // FIXME: transfer buffer ownership. should have a method for that in hidl_vec - phraseEvent->phraseExtras.resize(halPhraseEvent->num_phrases); - delete[] phraseExtras; - event = reinterpret_cast<ISoundTriggerHwCallback::RecognitionEvent*>(phraseEvent); - } else { - event = new ISoundTriggerHwCallback::RecognitionEvent(); +void SoundTriggerHalImpl::convertPhaseRecognitionEventFromHal( + ISoundTriggerHwCallback::PhraseRecognitionEvent* event, + const struct sound_trigger_phrase_recognition_event* halEvent) { + event->phraseExtras.resize(halEvent->num_phrases); + for (unsigned int i = 0; i < halEvent->num_phrases; i++) { + convertPhraseRecognitionExtraFromHal(&event->phraseExtras[i], &halEvent->phrase_extras[i]); } + convertRecognitionEventFromHal(&event->common, &halEvent->common); +} +// static +void SoundTriggerHalImpl::convertRecognitionEventFromHal( + ISoundTriggerHwCallback::RecognitionEvent* event, + const struct sound_trigger_recognition_event* halEvent) { event->status = static_cast<ISoundTriggerHwCallback::RecognitionStatus>(halEvent->status); event->type = static_cast<SoundModelType>(halEvent->type); // event->model to be remapped by called @@ -504,8 +469,6 @@ ISoundTriggerHwCallback::RecognitionEvent* SoundTriggerHalImpl::convertRecogniti event->data.setToExternal( const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(halEvent)) + halEvent->data_offset, halEvent->data_size); - - return event; } // static @@ -515,20 +478,37 @@ void SoundTriggerHalImpl::convertPhraseRecognitionExtraFromHal( extra->recognitionModes = halExtra->recognition_modes; extra->confidenceLevel = halExtra->confidence_level; - ConfidenceLevel* levels = new ConfidenceLevel[halExtra->num_levels]; + extra->levels.resize(halExtra->num_levels); for (unsigned int i = 0; i < halExtra->num_levels; i++) { - levels[i].userId = halExtra->levels[i].user_id; - levels[i].levelPercent = halExtra->levels[i].level; + extra->levels[i].userId = halExtra->levels[i].user_id; + extra->levels[i].levelPercent = halExtra->levels[i].level; + } +} + +void SoundTriggerHalImpl::SoundModelClient_2_0::recognitionCallback( + struct sound_trigger_recognition_event* halEvent) { + if (halEvent->type == SOUND_MODEL_TYPE_KEYPHRASE) { + ISoundTriggerHwCallback::PhraseRecognitionEvent event; + convertPhaseRecognitionEventFromHal( + &event, reinterpret_cast<sound_trigger_phrase_recognition_event*>(halEvent)); + event.common.model = mId; + mCallback->phraseRecognitionCallback(event, mCookie); + } else { + ISoundTriggerHwCallback::RecognitionEvent event; + convertRecognitionEventFromHal(&event, halEvent); + event.model = mId; + mCallback->recognitionCallback(event, mCookie); } - extra->levels.setToExternal(levels, halExtra->num_levels); - // FIXME: transfer buffer ownership. should have a method for that in hidl_vec - extra->levels.resize(halExtra->num_levels); - delete[] levels; } -ISoundTriggerHw* HIDL_FETCH_ISoundTriggerHw(const char* /* name */) { - return new SoundTriggerHalImpl(); +void SoundTriggerHalImpl::SoundModelClient_2_0::soundModelCallback( + struct sound_trigger_model_event* halEvent) { + ISoundTriggerHwCallback::ModelEvent event; + convertSoundModelEventFromHal(&event, halEvent); + event.model = mId; + mCallback->soundModelCallback(event, mCookie); } + } // namespace implementation } // namespace V2_0 } // namespace soundtrigger |