From fcf980e586d9b0f5ad09ba9098cd2c77911526b4 Mon Sep 17 00:00:00 2001 From: Mikhail Naganov Date: Thu, 7 Sep 2023 16:30:11 -0700 Subject: [PATCH] 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 --- audio/aidl/default/Module.cpp | 37 +++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/audio/aidl/default/Module.cpp b/audio/aidl/default/Module.cpp index f81095e02c..b7761bf244 100644 --- a/audio/aidl/default/Module.cpp +++ b/audio/aidl/default/Module.cpp @@ -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(); 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,19 +485,23 @@ ndk::ScopedAStatus Module::connectExternalDevice(const AudioPort& in_templateIdA } } - if (!mDebug.simulateDeviceConnections) { - RETURN_STATUS_IF_ERROR(populateConnectedDevicePort(&connectedPort)); - } else { - auto& connectedProfiles = getConfig().connectedProfiles; - if (auto connectedProfilesIt = connectedProfiles.find(templateId); - connectedProfilesIt != connectedProfiles.end()) { - connectedPort.profiles = connectedProfilesIt->second; - } - } if (connectedPort.profiles.empty()) { - LOG(ERROR) << "Profiles of a connected port still empty after connecting external device " - << connectedPort.toString(); - return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_STATE); + if (!mDebug.simulateDeviceConnections) { + RETURN_STATUS_IF_ERROR(populateConnectedDevicePort(&connectedPort)); + } else { + auto& connectedProfiles = getConfig().connectedProfiles; + if (auto connectedProfilesIt = connectedProfiles.find(templateId); + connectedProfilesIt != connectedProfiles.end()) { + connectedPort.profiles = connectedProfilesIt->second; + } + } + if (connectedPort.profiles.empty()) { + 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) {