1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2023 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker *
4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker *
8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker *
10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker */
16*ec779b8eSAndroid Build Coastguard Worker
17*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "ConversionHelperAidl"
18*ec779b8eSAndroid Build Coastguard Worker
19*ec779b8eSAndroid Build Coastguard Worker #include <memory>
20*ec779b8eSAndroid Build Coastguard Worker
21*ec779b8eSAndroid Build Coastguard Worker #include <media/AidlConversionUtil.h>
22*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h>
23*ec779b8eSAndroid Build Coastguard Worker
24*ec779b8eSAndroid Build Coastguard Worker #include "ConversionHelperAidl.h"
25*ec779b8eSAndroid Build Coastguard Worker
26*ec779b8eSAndroid Build Coastguard Worker using aidl::android::aidl_utils::statusTFromBinderStatus;
27*ec779b8eSAndroid Build Coastguard Worker using aidl::android::hardware::audio::core::VendorParameter;
28*ec779b8eSAndroid Build Coastguard Worker using aidl::android::media::audio::IHalAdapterVendorExtension;
29*ec779b8eSAndroid Build Coastguard Worker
30*ec779b8eSAndroid Build Coastguard Worker namespace android {
31*ec779b8eSAndroid Build Coastguard Worker
parseAndGetVendorParameters(std::shared_ptr<IHalAdapterVendorExtension> vendorExt,const VendorParametersRecipient & recipient,const AudioParameter & parameterKeys,String8 * values)32*ec779b8eSAndroid Build Coastguard Worker status_t parseAndGetVendorParameters(
33*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<IHalAdapterVendorExtension> vendorExt,
34*ec779b8eSAndroid Build Coastguard Worker const VendorParametersRecipient& recipient,
35*ec779b8eSAndroid Build Coastguard Worker const AudioParameter& parameterKeys,
36*ec779b8eSAndroid Build Coastguard Worker String8* values) {
37*ec779b8eSAndroid Build Coastguard Worker using ParameterScope = IHalAdapterVendorExtension::ParameterScope;
38*ec779b8eSAndroid Build Coastguard Worker if (parameterKeys.size() == 0) return OK;
39*ec779b8eSAndroid Build Coastguard Worker const String8 rawKeys = parameterKeys.keysToString();
40*ec779b8eSAndroid Build Coastguard Worker
41*ec779b8eSAndroid Build Coastguard Worker std::vector<std::string> parameterIds;
42*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(vendorExt->parseVendorParameterIds(
43*ec779b8eSAndroid Build Coastguard Worker ParameterScope(recipient.index()),
44*ec779b8eSAndroid Build Coastguard Worker std::string(rawKeys.c_str()), ¶meterIds)));
45*ec779b8eSAndroid Build Coastguard Worker if (parameterIds.empty()) return OK;
46*ec779b8eSAndroid Build Coastguard Worker
47*ec779b8eSAndroid Build Coastguard Worker std::vector<VendorParameter> parameters;
48*ec779b8eSAndroid Build Coastguard Worker if (recipient.index() == static_cast<int>(ParameterScope::MODULE)) {
49*ec779b8eSAndroid Build Coastguard Worker auto module = std::get<static_cast<int>(ParameterScope::MODULE)>(recipient);
50*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(module->getVendorParameters(
51*ec779b8eSAndroid Build Coastguard Worker parameterIds, ¶meters)));
52*ec779b8eSAndroid Build Coastguard Worker } else if (recipient.index() == static_cast<int>(ParameterScope::STREAM)) {
53*ec779b8eSAndroid Build Coastguard Worker auto stream = std::get<static_cast<int>(ParameterScope::STREAM)>(recipient);
54*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(stream->getVendorParameters(
55*ec779b8eSAndroid Build Coastguard Worker parameterIds, ¶meters)));
56*ec779b8eSAndroid Build Coastguard Worker } else {
57*ec779b8eSAndroid Build Coastguard Worker LOG_ALWAYS_FATAL("%s: unexpected recipient variant index: %zu",
58*ec779b8eSAndroid Build Coastguard Worker __func__, recipient.index());
59*ec779b8eSAndroid Build Coastguard Worker }
60*ec779b8eSAndroid Build Coastguard Worker if (!parameters.empty()) {
61*ec779b8eSAndroid Build Coastguard Worker std::string vendorParameters;
62*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(vendorExt->processVendorParameters(
63*ec779b8eSAndroid Build Coastguard Worker ParameterScope(recipient.index()),
64*ec779b8eSAndroid Build Coastguard Worker parameters, &vendorParameters)));
65*ec779b8eSAndroid Build Coastguard Worker // Re-parse the vendor-provided string to ensure that it is correct.
66*ec779b8eSAndroid Build Coastguard Worker AudioParameter reparse(String8(vendorParameters.c_str()));
67*ec779b8eSAndroid Build Coastguard Worker if (reparse.size() != 0) {
68*ec779b8eSAndroid Build Coastguard Worker if (values->length() > 0) {
69*ec779b8eSAndroid Build Coastguard Worker values->append(";");
70*ec779b8eSAndroid Build Coastguard Worker }
71*ec779b8eSAndroid Build Coastguard Worker values->append(reparse.toString().c_str());
72*ec779b8eSAndroid Build Coastguard Worker }
73*ec779b8eSAndroid Build Coastguard Worker }
74*ec779b8eSAndroid Build Coastguard Worker return OK;
75*ec779b8eSAndroid Build Coastguard Worker }
76*ec779b8eSAndroid Build Coastguard Worker
parseAndSetVendorParameters(std::shared_ptr<IHalAdapterVendorExtension> vendorExt,const VendorParametersRecipient & recipient,const AudioParameter & parameters)77*ec779b8eSAndroid Build Coastguard Worker status_t parseAndSetVendorParameters(
78*ec779b8eSAndroid Build Coastguard Worker std::shared_ptr<IHalAdapterVendorExtension> vendorExt,
79*ec779b8eSAndroid Build Coastguard Worker const VendorParametersRecipient& recipient,
80*ec779b8eSAndroid Build Coastguard Worker const AudioParameter& parameters) {
81*ec779b8eSAndroid Build Coastguard Worker using ParameterScope = IHalAdapterVendorExtension::ParameterScope;
82*ec779b8eSAndroid Build Coastguard Worker if (parameters.size() == 0) return OK;
83*ec779b8eSAndroid Build Coastguard Worker const String8 rawKeysAndValues = parameters.toString();
84*ec779b8eSAndroid Build Coastguard Worker
85*ec779b8eSAndroid Build Coastguard Worker std::vector<VendorParameter> syncParameters, asyncParameters;
86*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(vendorExt->parseVendorParameters(
87*ec779b8eSAndroid Build Coastguard Worker ParameterScope(recipient.index()),
88*ec779b8eSAndroid Build Coastguard Worker std::string(rawKeysAndValues.c_str()),
89*ec779b8eSAndroid Build Coastguard Worker &syncParameters, &asyncParameters)));
90*ec779b8eSAndroid Build Coastguard Worker if (recipient.index() == static_cast<int>(ParameterScope::MODULE)) {
91*ec779b8eSAndroid Build Coastguard Worker auto module = std::get<static_cast<int>(ParameterScope::MODULE)>(recipient);
92*ec779b8eSAndroid Build Coastguard Worker if (!syncParameters.empty()) {
93*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(module->setVendorParameters(
94*ec779b8eSAndroid Build Coastguard Worker syncParameters, false /*async*/)));
95*ec779b8eSAndroid Build Coastguard Worker }
96*ec779b8eSAndroid Build Coastguard Worker if (!asyncParameters.empty()) {
97*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(module->setVendorParameters(
98*ec779b8eSAndroid Build Coastguard Worker asyncParameters, true /*async*/)));
99*ec779b8eSAndroid Build Coastguard Worker }
100*ec779b8eSAndroid Build Coastguard Worker } else if (recipient.index() == static_cast<int>(ParameterScope::STREAM)) {
101*ec779b8eSAndroid Build Coastguard Worker auto stream = std::get<static_cast<int>(ParameterScope::STREAM)>(recipient);
102*ec779b8eSAndroid Build Coastguard Worker if (!syncParameters.empty()) {
103*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(stream->setVendorParameters(
104*ec779b8eSAndroid Build Coastguard Worker syncParameters, false /*async*/)));
105*ec779b8eSAndroid Build Coastguard Worker }
106*ec779b8eSAndroid Build Coastguard Worker if (!asyncParameters.empty()) {
107*ec779b8eSAndroid Build Coastguard Worker RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(stream->setVendorParameters(
108*ec779b8eSAndroid Build Coastguard Worker asyncParameters, true /*async*/)));
109*ec779b8eSAndroid Build Coastguard Worker }
110*ec779b8eSAndroid Build Coastguard Worker } else {
111*ec779b8eSAndroid Build Coastguard Worker LOG_ALWAYS_FATAL("%s: unexpected recipient variant index: %zu",
112*ec779b8eSAndroid Build Coastguard Worker __func__, recipient.index());
113*ec779b8eSAndroid Build Coastguard Worker }
114*ec779b8eSAndroid Build Coastguard Worker return OK;
115*ec779b8eSAndroid Build Coastguard Worker }
116*ec779b8eSAndroid Build Coastguard Worker
117*ec779b8eSAndroid Build Coastguard Worker } // namespace android
118