xref: /aosp_15_r20/frameworks/av/media/libaudiohal/impl/ConversionHelperAidl.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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()), &parameterIds)));
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, &parameters)));
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, &parameters)));
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