1 /*
2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "effectFactory-impl/EffectFactory.h"
18 
19 #include <android-base/logging.h>
20 #include <android/binder_manager.h>
21 #include <android/binder_process.h>
22 #include <system/audio_config.h>
23 
24 #ifdef __ANDROID_APEX__
25 #include <android/apexsupport.h>
26 #endif
27 
28 /** Default name of effect configuration file. */
29 static const char* kDefaultConfigName = "audio_effects_config.xml";
30 
config_file_path()31 static inline std::string config_file_path() {
32     if constexpr (__ANDROID_VENDOR_API__ >= 202404) {
33         AApexInfo *apexInfo;
34         if (AApexInfo_create(&apexInfo) == AAPEXINFO_OK) {
35             std::string apexName(AApexInfo_getName(apexInfo));
36             AApexInfo_destroy(apexInfo);
37             std::string candidatePath("/apex/");
38             candidatePath.append(apexName).append("/etc/").append(kDefaultConfigName);
39             LOG(DEBUG) << __func__ << " effect lib path " << candidatePath;
40             if (access(candidatePath.c_str(), R_OK) == 0) {
41                 return std::move(candidatePath);
42             }
43         }
44     } else {
45         LOG(DEBUG) << __func__ << " libapexsupport is not supported";
46     }
47     LOG(DEBUG) << __func__ << ": Unable to resolve config file path in APEX";
48     return android::audio_find_readable_configuration_file(kDefaultConfigName);
49 }
50 
main()51 int main() {
52     // This is a debug implementation, always enable debug logging.
53     android::base::SetMinimumLogSeverity(::android::base::DEBUG);
54     ABinderProcess_setThreadPoolMaxThreadCount(0);
55 
56     auto configFile = config_file_path();
57     if (configFile == "") {
58         LOG(ERROR) << __func__ << ": config file " << kDefaultConfigName << " not found!";
59         return EXIT_FAILURE;
60     }
61     LOG(DEBUG) << __func__ << ": start factory with configFile:" << configFile;
62     auto effectFactory =
63             ndk::SharedRefBase::make<aidl::android::hardware::audio::effect::Factory>(configFile);
64 
65     std::string serviceName = std::string() + effectFactory->descriptor + "/default";
66     binder_status_t status =
67             AServiceManager_addService(effectFactory->asBinder().get(), serviceName.c_str());
68     CHECK_EQ(STATUS_OK, status);
69 
70     LOG(DEBUG) << __func__ << ": effectFactory: " << serviceName << " start";
71     ABinderProcess_joinThreadPool();
72     return EXIT_FAILURE;  // should not reach
73 }
74