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

Commit 7a225582 authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Merge cherrypicks of ['googleplex-android-review.googlesource.com/27950743',...

Merge cherrypicks of ['googleplex-android-review.googlesource.com/27950743', 'googleplex-android-review.googlesource.com/28129439', 'googleplex-android-review.googlesource.com/28218869'] into 24Q3-release.

Change-Id: I7b4455373d3e0bfee906bf29588ea514967fa9fa
parents a9938d66 5ba37006
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -673,6 +673,15 @@ c2_status_t GraphicsTracker::_allocate(const std::shared_ptr<BufferCache> &cache
            ALOGW("BQ might not be ready for dequeueBuffer()");
            return C2_BLOCKING;
        }
        bool cacheExpired = false;
        {
            std::unique_lock<std::mutex> l(mLock);
            cacheExpired = (mBufferCache.get() != cache.get());
        }
        if (cacheExpired) {
            ALOGW("a new BQ is configured. dequeueBuffer() error %d", (int)status);
            return C2_BLOCKING;
        }
        ALOGE("BQ in inconsistent status. dequeueBuffer() error %d", (int)status);
        return C2_CORRUPTED;
    }
+1 −2
Original line number Diff line number Diff line
@@ -294,8 +294,7 @@ public:
    virtual status_t startAudioSource(const struct audio_port_config *source,
                                      const audio_attributes_t *attributes,
                                      audio_port_handle_t *portId,
                                      uid_t uid,
                                      bool internal = false) = 0;
                                      uid_t uid) = 0;
    virtual status_t stopAudioSource(audio_port_handle_t portId) = 0;

    virtual status_t setMasterMono(bool mono) = 0;
+7 −1
Original line number Diff line number Diff line
@@ -63,6 +63,8 @@ public:
     * HW Audio Source.
     */
    virtual bool isInternal() const { return false; }
    virtual bool isCallRx() const { return false; }
    virtual bool isCallTx() const { return false; }
    audio_port_handle_t portId() const { return mPortId; }
    uid_t uid() const { return mUid; }
    audio_session_t session() const { return mSessionId; };
@@ -236,7 +238,7 @@ public:
                           const sp<DeviceDescriptor>& srcDevice,
                           audio_stream_type_t stream, product_strategy_t strategy,
                           VolumeSource volumeSource,
                           bool isInternal);
                           bool isInternal, bool isCallRx, bool isCallTx);

    ~SourceClientDescriptor() override = default;

@@ -263,6 +265,8 @@ public:
    wp<HwAudioOutputDescriptor> hwOutput() const { return mHwOutput; }
    void setHwOutput(const sp<HwAudioOutputDescriptor>& hwOutput);
    bool isInternal() const override { return mIsInternal; }
    bool isCallRx() const override { return mIsCallRx; }
    bool isCallTx() const override { return mIsCallTx; }

    using ClientDescriptor::dump;
    void dump(String8 *dst, int spaces) const override;
@@ -294,6 +298,8 @@ public:
     * requester to prevent rerouting SwOutput involved in raw patches.
     */
    bool mIsInternal = false;
    bool mIsCallRx = false;
    bool mIsCallTx = false;
};

class SourceClientCollection :
+4 −2
Original line number Diff line number Diff line
@@ -96,12 +96,14 @@ void RecordClientDescriptor::dump(String8 *dst, int spaces) const
SourceClientDescriptor::SourceClientDescriptor(audio_port_handle_t portId, uid_t uid,
         audio_attributes_t attributes, const struct audio_port_config &config,
         const sp<DeviceDescriptor>& srcDevice, audio_stream_type_t stream,
         product_strategy_t strategy, VolumeSource volumeSource, bool isInternal) :
         product_strategy_t strategy, VolumeSource volumeSource,
         bool isInternal, bool isCallRx, bool isCallTx) :
    TrackClientDescriptor::TrackClientDescriptor(portId, uid, AUDIO_SESSION_NONE, attributes,
        {config.sample_rate, config.channel_mask, config.format}, AUDIO_PORT_HANDLE_NONE,
        stream, strategy, volumeSource, AUDIO_OUTPUT_FLAG_NONE, false,
        {} /* Sources do not support secondary outputs*/, nullptr),
    mSrcDevice(srcDevice), mIsInternal(isInternal)
    mSrcDevice(srcDevice), mIsInternal(isInternal),
    mIsCallRx(isCallRx), mIsCallTx(isCallTx)
{
}

+28 −16
Original line number Diff line number Diff line
@@ -764,7 +764,7 @@ status_t AudioPolicyManager::updateCallRoutingInternal(
        }
        muteWaitMs = setOutputDevices(__func__, mPrimaryOutput, rxDevices, true, delayMs);
    } else { // create RX path audio patch
        connectTelephonyRxAudioSource();
        connectTelephonyRxAudioSource(delayMs);
        // If the TX device is on the primary HW module but RX device is
        // on other HW module, SinkMetaData of telephony input should handle it
        // assuming the device uses audio HAL V5.0 and above
@@ -799,7 +799,7 @@ bool AudioPolicyManager::isDeviceOfModule(
    return false;
}

void AudioPolicyManager::connectTelephonyRxAudioSource()
void AudioPolicyManager::connectTelephonyRxAudioSource(uint32_t delayMs)
{
    disconnectTelephonyAudioSource(mCallRxSourceClient);
    const struct audio_port_config source = {
@@ -809,7 +809,8 @@ void AudioPolicyManager::connectTelephonyRxAudioSource()
    const auto aa = mEngine->getAttributesForStreamType(AUDIO_STREAM_VOICE_CALL);

    audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE;
    status_t status = startAudioSource(&source, &aa, &portId, 0 /*uid*/, true /*internal*/);
    status_t status = startAudioSourceInternal(&source, &aa, &portId, 0 /*uid*/,
                                       true /*internal*/, true /*isCallRx*/, delayMs);
    ALOGE_IF(status != OK, "%s: failed to start audio source (%d)", __func__, status);
    mCallRxSourceClient = mAudioSources.valueFor(portId);
    ALOGE_IF(mCallRxSourceClient == nullptr,
@@ -846,7 +847,8 @@ void AudioPolicyManager::connectTelephonyTxAudioSource(
    srcDevice->toAudioPortConfig(&source);
    mCallTxSourceClient = new SourceClientDescriptor(
                callTxSourceClientPortId, mUidCached, aa, source, srcDevice, AUDIO_STREAM_PATCH,
                mCommunnicationStrategy, toVolumeSource(aa), true);
                mCommunnicationStrategy, toVolumeSource(aa), true,
                false /*isCallRx*/, true /*isCallTx*/);
    mCallTxSourceClient->setPreferredDeviceId(sinkDevice->getId());

    audio_patch_handle_t patchHandle = AUDIO_PATCH_HANDLE_NONE;
@@ -5095,7 +5097,7 @@ status_t AudioPolicyManager::createAudioPatch(const struct audio_patch *patch,
            new SourceClientDescriptor(
                portId, uid, attributes, *source, srcDevice, AUDIO_STREAM_PATCH,
                mEngine->getProductStrategyForAttributes(attributes), toVolumeSource(attributes),
                true);
                true, false /*isCallRx*/, false /*isCallTx*/);
    sourceDesc->setPreferredDeviceId(sinkDevice->getId());

    status_t status =
@@ -5427,7 +5429,7 @@ status_t AudioPolicyManager::createAudioPatchInternal(const struct audio_patch *
                        outputDesc->toAudioPortConfig(&srcMixPortConfig, nullptr);
                        // for volume control, we may need a valid stream
                        srcMixPortConfig.ext.mix.usecase.stream =
                            (!sourceDesc->isInternal() || isCallTxAudioSource(sourceDesc)) ?
                            (!sourceDesc->isInternal() || sourceDesc->isCallTx()) ?
                                    mEngine->getStreamTypeForAttributes(sourceDesc->attributes()) :
                                    AUDIO_STREAM_PATCH;
                        patchBuilder.addSource(srcMixPortConfig);
@@ -5765,7 +5767,16 @@ status_t AudioPolicyManager::acquireSoundTriggerSession(audio_session_t *session
status_t AudioPolicyManager::startAudioSource(const struct audio_port_config *source,
                                              const audio_attributes_t *attributes,
                                              audio_port_handle_t *portId,
                                              uid_t uid, bool internal)
                                              uid_t uid) {
    return startAudioSourceInternal(source, attributes, portId, uid,
                                    false /*internal*/, false /*isCallRx*/, 0 /*delayMs*/);
}

status_t AudioPolicyManager::startAudioSourceInternal(const struct audio_port_config *source,
                                              const audio_attributes_t *attributes,
                                              audio_port_handle_t *portId,
                                              uid_t uid, bool internal, bool isCallRx,
                                              uint32_t delayMs)
{
    ALOGV("%s", __FUNCTION__);
    *portId = AUDIO_PORT_HANDLE_NONE;
@@ -5798,16 +5809,17 @@ status_t AudioPolicyManager::startAudioSource(const struct audio_port_config *so
        new SourceClientDescriptor(*portId, uid, *attributes, *source, srcDevice,
                                   mEngine->getStreamTypeForAttributes(*attributes),
                                   mEngine->getProductStrategyForAttributes(*attributes),
                                   toVolumeSource(*attributes), internal);
                                   toVolumeSource(*attributes), internal, isCallRx, false);

    status_t status = connectAudioSource(sourceDesc);
    status_t status = connectAudioSource(sourceDesc, delayMs);
    if (status == NO_ERROR) {
        mAudioSources.add(*portId, sourceDesc);
    }
    return status;
}

status_t AudioPolicyManager::connectAudioSource(const sp<SourceClientDescriptor>& sourceDesc)
status_t AudioPolicyManager::connectAudioSource(const sp<SourceClientDescriptor>& sourceDesc,
                                                uint32_t delayMs)
{
    ALOGV("%s handle %d", __FUNCTION__, sourceDesc->portId());

@@ -5833,7 +5845,7 @@ status_t AudioPolicyManager::connectAudioSource(const sp<SourceClientDescriptor>
    audio_patch_handle_t handle = AUDIO_PATCH_HANDLE_NONE;

    return connectAudioSourceToSink(
                sourceDesc, sinkDevice, patchBuilder.patch(), handle, mUidCached, 0 /*delayMs*/);
                sourceDesc, sinkDevice, patchBuilder.patch(), handle, mUidCached, delayMs);
}

status_t AudioPolicyManager::stopAudioSource(audio_port_handle_t portId)
@@ -7178,8 +7190,8 @@ void AudioPolicyManager::checkAudioSourceForAttributes(const audio_attributes_t
        sp<SourceClientDescriptor> sourceDesc = mAudioSources.valueAt(i);
        if (sourceDesc != nullptr && followsSameRouting(attr, sourceDesc->attributes())
                && sourceDesc->getPatchHandle() == AUDIO_PATCH_HANDLE_NONE
                && !isCallRxAudioSource(sourceDesc) && !sourceDesc->isInternal()) {
            connectAudioSource(sourceDesc);
                && !sourceDesc->isCallRx() && !sourceDesc->isInternal()) {
            connectAudioSource(sourceDesc, 0 /*delayMs*/);
        }
    }
}
@@ -7285,8 +7297,8 @@ void AudioPolicyManager::checkOutputForAttributes(const audio_attributes_t &attr
                }
            }
            sp<SourceClientDescriptor> source = getSourceForAttributesOnOutput(srcOut, attr);
            if (source != nullptr && !isCallRxAudioSource(source) && !source->isInternal()) {
                connectAudioSource(source);
            if (source != nullptr && !source->isCallRx() && !source->isInternal()) {
                connectAudioSource(source, 0 /*delayMs*/);
            }
        }

@@ -8455,7 +8467,7 @@ void AudioPolicyManager::cleanUpForDevice(const sp<DeviceDescriptor>& deviceDesc
        sp<SourceClientDescriptor> sourceDesc = mAudioSources.valueAt(i);
        if (sourceDesc->isConnected() && (sourceDesc->srcDevice()->equals(deviceDesc) ||
                                          sourceDesc->sinkDevice()->equals(deviceDesc))
                && !isCallRxAudioSource(sourceDesc)) {
                && !sourceDesc->isCallRx()) {
            disconnectAudioSource(sourceDesc);
        }
    }
Loading