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

Commit 2dc89802 authored by Mikhail Naganov's avatar Mikhail Naganov Committed by Cherrypicker Worker
Browse files

audio: Properly support external device port with static configs

External device ports might not have dynamic profiles, for example,
ports for BT devices. Properly handle this case in the default
implementation.

Bug: 264712385
Test: atest VtsHalAudioCoreTargetTest
Test: atest audiosystem_tests
(cherry picked from https://android-review.googlesource.com/q/commit:fcf980e586d9b0f5ad09ba9098cd2c77911526b4)
Merged-In: I8d4bcbf6ccf2ba05436e68e3ba94567fc7610eb7
Change-Id: I8d4bcbf6ccf2ba05436e68e3ba94567fc7610eb7
parent 9a443647
Loading
Loading
Loading
Loading
+20 −17
Original line number Diff line number Diff line
@@ -454,16 +454,15 @@ ndk::ScopedAStatus Module::connectExternalDevice(const AudioPort& in_templateIdA
            LOG(ERROR) << __func__ << ": port id " << templateId << " is not a device port";
            return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
        }
        if (!templateIt->profiles.empty()) {
            LOG(ERROR) << __func__ << ": port id " << templateId
                       << " does not have dynamic profiles";
            return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
        }
        auto& templateDevicePort = templateIt->ext.get<AudioPortExt::Tag::device>();
        if (templateDevicePort.device.type.connection.empty()) {
            LOG(ERROR) << __func__ << ": port id " << templateId << " is permanently attached";
            return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
        }
        if (mConnectedDevicePorts.find(templateId) != mConnectedDevicePorts.end()) {
            LOG(ERROR) << __func__ << ": port id " << templateId << " is a connected device port";
            return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);
        }
        // Postpone id allocation until we ensure that there are no client errors.
        connectedPort = *templateIt;
        connectedPort.extraAudioDescriptors = in_templateIdAndAdditionalData.extraAudioDescriptors;
@@ -486,6 +485,7 @@ ndk::ScopedAStatus Module::connectExternalDevice(const AudioPort& in_templateIdA
        }
    }

    if (connectedPort.profiles.empty()) {
        if (!mDebug.simulateDeviceConnections) {
            RETURN_STATUS_IF_ERROR(populateConnectedDevicePort(&connectedPort));
        } else {
@@ -496,10 +496,13 @@ ndk::ScopedAStatus Module::connectExternalDevice(const AudioPort& in_templateIdA
            }
        }
        if (connectedPort.profiles.empty()) {
        LOG(ERROR) << "Profiles of a connected port still empty after connecting external device "
            LOG(ERROR) << __func__
                       << ": profiles of a connected port still empty after connecting external "
                          "device "
                       << connectedPort.toString();
            return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE);
        }
    }

    for (auto profile : connectedPort.profiles) {
        if (profile.channelMasks.empty()) {