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

Commit 132e839c authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge changes I3e3cbc53,I2a1828d9

* changes:
  Spatializer: enforce only one client registered
  audio policy service: fix spatializer locking scheme
parents a3541090 b57604f5
Loading
Loading
Loading
Loading
+14 −18
Original line number Diff line number Diff line
@@ -516,9 +516,8 @@ void AudioPolicyService::onCheckSpatializer_l()

void AudioPolicyService::doOnCheckSpatializer()
{
    Mutex::Autolock _l(mLock);

    ALOGI("%s mSpatializer %p level %d", __func__, mSpatializer.get(), (int)mSpatializer->getLevel());
    ALOGV("%s mSpatializer %p level %d",
        __func__, mSpatializer.get(), (int)mSpatializer->getLevel());

    if (mSpatializer != nullptr) {
        // Note: mSpatializer != nullptr =>  mAudioPolicyManager != nullptr
@@ -527,6 +526,8 @@ void AudioPolicyService::doOnCheckSpatializer()
            audio_io_handle_t newOutput;
            const audio_attributes_t attr = attributes_initializer(AUDIO_USAGE_MEDIA);
            audio_config_base_t config = mSpatializer->getAudioInConfig();

            Mutex::Autolock _l(mLock);
            status_t status =
                    mAudioPolicyManager->getSpatializerOutput(&config, &attr, &newOutput);
            ALOGV("%s currentOutput %d newOutput %d channel_mask %#x",
@@ -538,21 +539,19 @@ void AudioPolicyService::doOnCheckSpatializer()
            mLock.unlock();
            // It is OK to call detachOutput() is none is already attached.
            mSpatializer->detachOutput();
            if (status != NO_ERROR || newOutput == AUDIO_IO_HANDLE_NONE) {
                mLock.lock();
                return;
            }
            if (status == NO_ERROR && newOutput != AUDIO_IO_HANDLE_NONE) {
                status = mSpatializer->attachOutput(newOutput, numActiveTracks);
            }
            mLock.lock();
            if (status != NO_ERROR) {
                mAudioPolicyManager->releaseSpatializerOutput(newOutput);
            }
        } else if (mSpatializer->getLevel() == media::SpatializationLevel::NONE
                               && mSpatializer->getOutput() != AUDIO_IO_HANDLE_NONE) {
            mLock.unlock();
            audio_io_handle_t output = mSpatializer->detachOutput();
            mLock.lock();

            if (output != AUDIO_IO_HANDLE_NONE) {
                Mutex::Autolock _l(mLock);
                mAudioPolicyManager->releaseSpatializerOutput(output);
            }
        }
@@ -581,19 +580,16 @@ void AudioPolicyService::onUpdateActiveSpatializerTracks_l() {

void AudioPolicyService::doOnUpdateActiveSpatializerTracks()
{
    sp<Spatializer> spatializer;
    size_t activeClients;
    {
        Mutex::Autolock _l(mLock);
    if (mSpatializer == nullptr) {
        return;
    }
        spatializer = mSpatializer;
        activeClients = countActiveClientsOnOutput_l(mSpatializer->getOutput());
    }
    if (spatializer != nullptr) {
        spatializer->updateActiveTracks(activeClients);
    audio_io_handle_t output = mSpatializer->getOutput();
    size_t activeClients;
    {
        Mutex::Autolock _l(mLock);
        activeClients = countActiveClientsOnOutput_l(output);
    }
    mSpatializer->updateActiveTracks(activeClients);
}

status_t AudioPolicyService::clientCreateAudioPatch(const struct audio_patch *patch,
+1 −0
Original line number Diff line number Diff line
@@ -1060,6 +1060,7 @@ private:

    CaptureStateNotifier mCaptureStateNotifier;

    // created in onFirstRef() and never cleared: does not need to be guarded by mLock
    sp<Spatializer> mSpatializer;

    void *mLibraryHandle = nullptr;
+11 −0
Original line number Diff line number Diff line
@@ -373,6 +373,17 @@ status_t Spatializer::registerCallback(
        return BAD_VALUE;
    }

    if (mSpatializerCallback != nullptr) {
        if (IInterface::asBinder(callback) == IInterface::asBinder(mSpatializerCallback)) {
            ALOGW("%s: Registering callback %p again",
                __func__, mSpatializerCallback.get());
            return NO_ERROR;
        }
        ALOGE("%s: Already one client registered with callback %p",
            __func__, mSpatializerCallback.get());
        return INVALID_OPERATION;
    }

    sp<IBinder> binder = IInterface::asBinder(callback);
    status_t status = binder->linkToDeath(this);
    if (status == NO_ERROR) {