Loading services/audiopolicy/AudioPolicyInterface.h +1 −2 Original line number Diff line number Diff line Loading @@ -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; Loading services/audiopolicy/common/managerdefinitions/include/ClientDescriptor.h +7 −1 Original line number Diff line number Diff line Loading @@ -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; }; Loading Loading @@ -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; Loading @@ -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; Loading Loading @@ -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 : Loading services/audiopolicy/common/managerdefinitions/src/ClientDescriptor.cpp +4 −2 Original line number Diff line number Diff line Loading @@ -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) { } Loading services/audiopolicy/managerdefault/AudioPolicyManager.cpp +19 −9 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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; Loading Loading @@ -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 = Loading Loading @@ -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); Loading Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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); } } Loading Loading @@ -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); } } Loading Loading @@ -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); } } Loading services/audiopolicy/managerdefault/AudioPolicyManager.h +7 −10 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); Loading Loading @@ -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 Loading Loading
services/audiopolicy/AudioPolicyInterface.h +1 −2 Original line number Diff line number Diff line Loading @@ -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; Loading
services/audiopolicy/common/managerdefinitions/include/ClientDescriptor.h +7 −1 Original line number Diff line number Diff line Loading @@ -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; }; Loading Loading @@ -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; Loading @@ -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; Loading Loading @@ -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 : Loading
services/audiopolicy/common/managerdefinitions/src/ClientDescriptor.cpp +4 −2 Original line number Diff line number Diff line Loading @@ -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) { } Loading
services/audiopolicy/managerdefault/AudioPolicyManager.cpp +19 −9 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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; Loading Loading @@ -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 = Loading Loading @@ -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); Loading Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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); } } Loading Loading @@ -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); } } Loading Loading @@ -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); } } Loading
services/audiopolicy/managerdefault/AudioPolicyManager.h +7 −10 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); Loading Loading @@ -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 Loading