diff --git a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp index d446e9667b8dcfe5c8854fc3ad29a76b8a5149b1..6630d06f6dc4182fbefdea255d8e38b4bf5f830c 100644 --- a/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp +++ b/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp @@ -25,6 +25,8 @@ #include #include #include +#include +#include #include #include #include @@ -333,11 +335,8 @@ status_t PolicySerializer::deserializeCollection(const xmlNode *cur, Trait::collectionTag); return status; } - } else if (mIgnoreVendorExtensions && std::get(maybeElement) == NO_INIT) { - // Skip a vendor extension element. - } else { - return BAD_VALUE; } + // Ignore elements that failed to parse, e.g. routes with invalid sinks } } if (!xmlStrcmp(cur->name, reinterpret_cast(Trait::tag))) { @@ -678,6 +677,7 @@ std::variant PolicySerializer::deserialize PolicySerializer::deserializetype(); + if (type == AUDIO_DEVICE_OUT_BLUETOOTH_A2DP + || type == AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES + || type == AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER) { + ALOGE("Erasing A2DP device port %s", port->getTagName().c_str()); + iter = devicePorts.erase(iter); + } else { + iter++; + } + } + } module->setDeclaredDevices(devicePorts); RouteTraits::Collection routes; @@ -890,6 +909,30 @@ status_t PolicySerializer::deserialize(const char *configFile, AudioPolicyConfig if (status != NO_ERROR) { return status; } + + // Remove modules called bluetooth, bluetooth_qti or a2dp, and inject our own + if (property_get_bool("persist.bluetooth.system_audio_hal.enabled", false)) { + for (auto it = modules.begin(); it != modules.end(); it++) { + const char *name = (*it)->getName(); + if (strcmp(name, "a2dp") == 0 || + strcmp(name, "a2dpsink") == 0 || + strcmp(name, "bluetooth") == 0 || + strcmp(name, "bluetooth_qti") == 0) { + + ALOGE("Removed module %s\n", name); + it = modules.erase(it); + } + if (it == modules.end()) break; + } + const char* a2dpFileName = "/system/etc/sysbta_audio_policy_configuration.xml"; + if (version == "7.0") + a2dpFileName = "/system/etc/sysbta_audio_policy_configuration_7_0.xml"; + auto doc = make_xmlUnique(xmlParseFile(a2dpFileName)); + xmlNodePtr root = xmlDocGetRootElement(doc.get()); + auto maybeA2dpModule = deserialize(root, config); + modules.add(std::get<1>(maybeA2dpModule)); + } + config->setHwModules(modules); // Global Configuration