Loading services/soundtrigger/SoundTriggerHwService.cpp +57 −37 Original line number Original line Diff line number Diff line Loading @@ -505,6 +505,8 @@ void SoundTriggerHwService::Module::detach() { if (!captureHotwordAllowed()) { if (!captureHotwordAllowed()) { return; return; } } Vector<audio_session_t> releasedSessions; { { AutoMutex lock(mLock); AutoMutex lock(mLock); for (size_t i = 0; i < mModels.size(); i++) { for (size_t i = 0; i < mModels.size(); i++) { Loading @@ -514,9 +516,16 @@ void SoundTriggerHwService::Module::detach() { mHwDevice->stop_recognition(mHwDevice, model->mHandle); mHwDevice->stop_recognition(mHwDevice, model->mHandle); } } mHwDevice->unload_sound_model(mHwDevice, model->mHandle); mHwDevice->unload_sound_model(mHwDevice, model->mHandle); releasedSessions.add(model->mCaptureSession); } } mModels.clear(); mModels.clear(); } } for (size_t i = 0; i < releasedSessions.size(); i++) { // do not call AudioSystem methods with mLock held AudioSystem::releaseSoundTriggerSession(releasedSessions[i]); } if (mClient != 0) { if (mClient != 0) { IInterface::asBinder(mClient)->unlinkToDeath(this); IInterface::asBinder(mClient)->unlinkToDeath(this); } } Loading Loading @@ -558,33 +567,43 @@ status_t SoundTriggerHwService::Module::loadSoundModel(const sp<IMemory>& modelM return BAD_VALUE; return BAD_VALUE; } } audio_session_t session; audio_io_handle_t ioHandle; audio_devices_t device; // do not call AudioSystem methods with mLock held status_t status = AudioSystem::acquireSoundTriggerSession(&session, &ioHandle, &device); if (status != NO_ERROR) { return status; } { AutoMutex lock(mLock); AutoMutex lock(mLock); if (mModels.size() >= mDescriptor.properties.max_sound_models) { if (mModels.size() >= mDescriptor.properties.max_sound_models) { ALOGW("loadSoundModel(): Not loading, max number of models (%d) would be exceeded", ALOGW("loadSoundModel(): Not loading, max number of models (%d) would be exceeded", mDescriptor.properties.max_sound_models); mDescriptor.properties.max_sound_models); return INVALID_OPERATION; status = INVALID_OPERATION; goto exit; } } status_t status = mHwDevice->load_sound_model(mHwDevice, sound_model, status_t status = mHwDevice->load_sound_model(mHwDevice, sound_model, SoundTriggerHwService::soundModelCallback, SoundTriggerHwService::soundModelCallback, this, handle); this, handle); if (status != NO_ERROR) { if (status != NO_ERROR) { return status; goto exit; } audio_session_t session; audio_io_handle_t ioHandle; audio_devices_t device; status = AudioSystem::acquireSoundTriggerSession(&session, &ioHandle, &device); if (status != NO_ERROR) { return status; } } sp<Model> model = new Model(*handle, session, ioHandle, device, sound_model->type); sp<Model> model = new Model(*handle, session, ioHandle, device, sound_model->type); mModels.replaceValueFor(*handle, model); mModels.replaceValueFor(*handle, model); } exit: if (status != NO_ERROR) { // do not call AudioSystem methods with mLock held AudioSystem::releaseSoundTriggerSession(session); } return status; return status; } } Loading @@ -594,13 +613,11 @@ status_t SoundTriggerHwService::Module::unloadSoundModel(sound_model_handle_t ha if (!captureHotwordAllowed()) { if (!captureHotwordAllowed()) { return PERMISSION_DENIED; return PERMISSION_DENIED; } } status_t status; audio_session_t session; AutoMutex lock(mLock); return unloadSoundModel_l(handle); } status_t SoundTriggerHwService::Module::unloadSoundModel_l(sound_model_handle_t handle) { { AutoMutex lock(mLock); ssize_t index = mModels.indexOfKey(handle); ssize_t index = mModels.indexOfKey(handle); if (index < 0) { if (index < 0) { return BAD_VALUE; return BAD_VALUE; Loading @@ -611,8 +628,11 @@ status_t SoundTriggerHwService::Module::unloadSoundModel_l(sound_model_handle_t mHwDevice->stop_recognition(mHwDevice, model->mHandle); mHwDevice->stop_recognition(mHwDevice, model->mHandle); model->mState = Model::STATE_IDLE; model->mState = Model::STATE_IDLE; } } AudioSystem::releaseSoundTriggerSession(model->mCaptureSession); status = mHwDevice->unload_sound_model(mHwDevice, handle); return mHwDevice->unload_sound_model(mHwDevice, handle); session = model->mCaptureSession; } AudioSystem::releaseSoundTriggerSession(session); return status; } } status_t SoundTriggerHwService::Module::startRecognition(sound_model_handle_t handle, status_t SoundTriggerHwService::Module::startRecognition(sound_model_handle_t handle, Loading services/soundtrigger/SoundTriggerHwService.h +0 −3 Original line number Original line Diff line number Diff line Loading @@ -141,9 +141,6 @@ public: private: private: status_t unloadSoundModel_l(sound_model_handle_t handle); Mutex mLock; Mutex mLock; wp<SoundTriggerHwService> mService; wp<SoundTriggerHwService> mService; struct sound_trigger_hw_device* mHwDevice; struct sound_trigger_hw_device* mHwDevice; Loading Loading
services/soundtrigger/SoundTriggerHwService.cpp +57 −37 Original line number Original line Diff line number Diff line Loading @@ -505,6 +505,8 @@ void SoundTriggerHwService::Module::detach() { if (!captureHotwordAllowed()) { if (!captureHotwordAllowed()) { return; return; } } Vector<audio_session_t> releasedSessions; { { AutoMutex lock(mLock); AutoMutex lock(mLock); for (size_t i = 0; i < mModels.size(); i++) { for (size_t i = 0; i < mModels.size(); i++) { Loading @@ -514,9 +516,16 @@ void SoundTriggerHwService::Module::detach() { mHwDevice->stop_recognition(mHwDevice, model->mHandle); mHwDevice->stop_recognition(mHwDevice, model->mHandle); } } mHwDevice->unload_sound_model(mHwDevice, model->mHandle); mHwDevice->unload_sound_model(mHwDevice, model->mHandle); releasedSessions.add(model->mCaptureSession); } } mModels.clear(); mModels.clear(); } } for (size_t i = 0; i < releasedSessions.size(); i++) { // do not call AudioSystem methods with mLock held AudioSystem::releaseSoundTriggerSession(releasedSessions[i]); } if (mClient != 0) { if (mClient != 0) { IInterface::asBinder(mClient)->unlinkToDeath(this); IInterface::asBinder(mClient)->unlinkToDeath(this); } } Loading Loading @@ -558,33 +567,43 @@ status_t SoundTriggerHwService::Module::loadSoundModel(const sp<IMemory>& modelM return BAD_VALUE; return BAD_VALUE; } } audio_session_t session; audio_io_handle_t ioHandle; audio_devices_t device; // do not call AudioSystem methods with mLock held status_t status = AudioSystem::acquireSoundTriggerSession(&session, &ioHandle, &device); if (status != NO_ERROR) { return status; } { AutoMutex lock(mLock); AutoMutex lock(mLock); if (mModels.size() >= mDescriptor.properties.max_sound_models) { if (mModels.size() >= mDescriptor.properties.max_sound_models) { ALOGW("loadSoundModel(): Not loading, max number of models (%d) would be exceeded", ALOGW("loadSoundModel(): Not loading, max number of models (%d) would be exceeded", mDescriptor.properties.max_sound_models); mDescriptor.properties.max_sound_models); return INVALID_OPERATION; status = INVALID_OPERATION; goto exit; } } status_t status = mHwDevice->load_sound_model(mHwDevice, sound_model, status_t status = mHwDevice->load_sound_model(mHwDevice, sound_model, SoundTriggerHwService::soundModelCallback, SoundTriggerHwService::soundModelCallback, this, handle); this, handle); if (status != NO_ERROR) { if (status != NO_ERROR) { return status; goto exit; } audio_session_t session; audio_io_handle_t ioHandle; audio_devices_t device; status = AudioSystem::acquireSoundTriggerSession(&session, &ioHandle, &device); if (status != NO_ERROR) { return status; } } sp<Model> model = new Model(*handle, session, ioHandle, device, sound_model->type); sp<Model> model = new Model(*handle, session, ioHandle, device, sound_model->type); mModels.replaceValueFor(*handle, model); mModels.replaceValueFor(*handle, model); } exit: if (status != NO_ERROR) { // do not call AudioSystem methods with mLock held AudioSystem::releaseSoundTriggerSession(session); } return status; return status; } } Loading @@ -594,13 +613,11 @@ status_t SoundTriggerHwService::Module::unloadSoundModel(sound_model_handle_t ha if (!captureHotwordAllowed()) { if (!captureHotwordAllowed()) { return PERMISSION_DENIED; return PERMISSION_DENIED; } } status_t status; audio_session_t session; AutoMutex lock(mLock); return unloadSoundModel_l(handle); } status_t SoundTriggerHwService::Module::unloadSoundModel_l(sound_model_handle_t handle) { { AutoMutex lock(mLock); ssize_t index = mModels.indexOfKey(handle); ssize_t index = mModels.indexOfKey(handle); if (index < 0) { if (index < 0) { return BAD_VALUE; return BAD_VALUE; Loading @@ -611,8 +628,11 @@ status_t SoundTriggerHwService::Module::unloadSoundModel_l(sound_model_handle_t mHwDevice->stop_recognition(mHwDevice, model->mHandle); mHwDevice->stop_recognition(mHwDevice, model->mHandle); model->mState = Model::STATE_IDLE; model->mState = Model::STATE_IDLE; } } AudioSystem::releaseSoundTriggerSession(model->mCaptureSession); status = mHwDevice->unload_sound_model(mHwDevice, handle); return mHwDevice->unload_sound_model(mHwDevice, handle); session = model->mCaptureSession; } AudioSystem::releaseSoundTriggerSession(session); return status; } } status_t SoundTriggerHwService::Module::startRecognition(sound_model_handle_t handle, status_t SoundTriggerHwService::Module::startRecognition(sound_model_handle_t handle, Loading
services/soundtrigger/SoundTriggerHwService.h +0 −3 Original line number Original line Diff line number Diff line Loading @@ -141,9 +141,6 @@ public: private: private: status_t unloadSoundModel_l(sound_model_handle_t handle); Mutex mLock; Mutex mLock; wp<SoundTriggerHwService> mService; wp<SoundTriggerHwService> mService; struct sound_trigger_hw_device* mHwDevice; struct sound_trigger_hw_device* mHwDevice; Loading