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

Commit 963dbcc0 authored by Eric Laurent's avatar Eric Laurent Committed by Android Build Coastguard Worker
Browse files

audio policy: refactor audio source client descriptor

Make the SourceClientDescriptor carry the information that it
is used for call TX ot TX patch instead of relying on the comparison
with mCallRxSourceClient and mCallTxSourceClient.

Flag: EXEMPT mechanical refactoring
Bug: 292492229
Test: make
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:ccbd787b3eab93e8cf8ac7698ab007db4f65eb32)
Merged-In: I60f07bab8092046df717eb934846534c7c97dc37
Change-Id: I60f07bab8092046df717eb934846534c7c97dc37
parent a9938d66
Loading
Loading
Loading
Loading
+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)
{
}

+19 −9
Original line number Diff line number Diff line
@@ -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*/);
    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,15 @@ 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*/);
}

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)
{
    ALOGV("%s", __FUNCTION__);
    *portId = AUDIO_PORT_HANDLE_NONE;
@@ -5798,7 +5808,7 @@ 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);
    if (status == NO_ERROR) {
@@ -7178,7 +7188,7 @@ 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()) {
                && !sourceDesc->isCallRx() && !sourceDesc->isInternal()) {
            connectAudioSource(sourceDesc);
        }
    }
@@ -7285,7 +7295,7 @@ void AudioPolicyManager::checkOutputForAttributes(const audio_attributes_t &attr
                }
            }
            sp<SourceClientDescriptor> source = getSourceForAttributesOnOutput(srcOut, attr);
            if (source != nullptr && !isCallRxAudioSource(source) && !source->isInternal()) {
            if (source != nullptr && !source->isCallRx() && !source->isInternal()) {
                connectAudioSource(source);
            }
        }
@@ -8455,7 +8465,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);
        }
    }
+7 −10
Original line number Diff line number Diff line
@@ -345,8 +345,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);
                                          uid_t uid);
        virtual status_t stopAudioSource(audio_port_handle_t portId);

        virtual status_t setMasterMono(bool mono);
@@ -705,14 +704,6 @@ protected:
        void updateCallAndOutputRouting(bool forceVolumeReeval = true, uint32_t delayMs = 0,
                bool skipDelays = false);

        bool isCallRxAudioSource(const sp<SourceClientDescriptor> &source) {
            return mCallRxSourceClient != nullptr && source == mCallRxSourceClient;
        }

        bool isCallTxAudioSource(const sp<SourceClientDescriptor> &source) {
            return mCallTxSourceClient != nullptr && source == mCallTxSourceClient;
        }

        void connectTelephonyRxAudioSource();

        void disconnectTelephonyAudioSource(sp<SourceClientDescriptor> &clientDesc);
@@ -976,6 +967,12 @@ protected:
        void checkLeBroadcastRoutes(bool wasUnicastActive,
                sp<SwAudioOutputDescriptor> ignoredOutput, uint32_t delayMs);

        status_t startAudioSourceInternal(const struct audio_port_config *source,
                                          const audio_attributes_t *attributes,
                                          audio_port_handle_t *portId,
                                          uid_t uid,
                                          bool internal,
                                          bool isCallRx);
        const uid_t mUidCached;                         // AID_AUDIOSERVER
        sp<const AudioPolicyConfig> mConfig;
        EngineInstance mEngine;                         // Audio Policy Engine instance