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

Commit fcf980e5 authored by Mikhail Naganov's avatar Mikhail Naganov
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
Change-Id: I8d4bcbf6ccf2ba05436e68e3ba94567fc7610eb7
parent 8f28f8b8
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()) {