Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 960f0f33 authored by Eric Laurent's avatar Eric Laurent Committed by android-build-merger
Browse files

Merge "Soundtrigger service: fix cross deadlock with audio policy service"...

Merge "Soundtrigger service: fix cross deadlock with audio policy service" into nyc-dev am: dbda8a95 am: 7f0263ba am: 31ac3bd1
am: 830bbb25

Change-Id: Ibd1f49311e7315b67d361c1ac48bbb436e4cf1d7
parents 32d62af8 830bbb25
Loading
Loading
Loading
Loading
+57 −37
Original line number Original line Diff line number Diff line
@@ -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++) {
@@ -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);
    }
    }
@@ -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;
}
}


@@ -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;
@@ -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,
+0 −3
Original line number Original line Diff line number Diff line
@@ -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;