blob: fe5d4ca2afb8df45aa8611e88752cdd599ea4477 [file] [log] [blame]
shubang23aa3ac2020-09-07 18:56:28 -07001/**
Hongguangeae68392021-07-27 20:56:23 -07002 * Copyright (c) 2021, The Android Open Source Project
shubang23aa3ac2020-09-07 18:56:28 -07003 *
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
Hongguangeae68392021-07-27 20:56:23 -070017//#define LOG_NDEBUG 0
shubang23aa3ac2020-09-07 18:56:28 -070018#define LOG_TAG "TunerService"
19
Hongguangeae68392021-07-27 20:56:23 -070020#include "TunerService.h"
21
22#include <aidl/android/hardware/tv/tuner/IDemux.h>
23#include <aidl/android/hardware/tv/tuner/IDescrambler.h>
24#include <aidl/android/hardware/tv/tuner/IFrontend.h>
25#include <aidl/android/hardware/tv/tuner/ILnb.h>
26#include <aidl/android/hardware/tv/tuner/Result.h>
shubang23aa3ac2020-09-07 18:56:28 -070027#include <android/binder_manager.h>
28#include <utils/Log.h>
Hongguangeae68392021-07-27 20:56:23 -070029
shubangae56a2e2021-01-21 07:29:55 -080030#include "TunerDemux.h"
Amy Zhangb2989b52021-02-05 12:27:25 -080031#include "TunerDescrambler.h"
Hongguangeae68392021-07-27 20:56:23 -070032#include "TunerFrontend.h"
Hongguang093c5f32021-08-09 19:46:34 -070033#include "TunerHelper.h"
Hongguangeae68392021-07-27 20:56:23 -070034#include "TunerLnb.h"
shubang23aa3ac2020-09-07 18:56:28 -070035
Hongguangeae68392021-07-27 20:56:23 -070036using ::aidl::android::hardware::tv::tuner::IDemux;
37using ::aidl::android::hardware::tv::tuner::IDescrambler;
38using ::aidl::android::hardware::tv::tuner::IFrontend;
39using ::aidl::android::hardware::tv::tuner::Result;
Hongguangeae68392021-07-27 20:56:23 -070040using ::android::sp;
shubang23aa3ac2020-09-07 18:56:28 -070041
Hongguangeae68392021-07-27 20:56:23 -070042namespace aidl {
shubang23aa3ac2020-09-07 18:56:28 -070043namespace android {
Hongguangeae68392021-07-27 20:56:23 -070044namespace media {
45namespace tv {
46namespace tuner {
shubang23aa3ac2020-09-07 18:56:28 -070047
Amy Zhangfb1b4962021-02-18 19:34:52 -080048TunerService::TunerService() {
Hongguang093c5f32021-08-09 19:46:34 -070049 if (!TunerHelper::checkTunerFeature()) {
50 ALOGD("Device doesn't have tuner hardware.");
Amy Zhangc5eb8272021-03-01 16:19:39 -080051 return;
52 }
53
Amy Zhangfb1b4962021-02-18 19:34:52 -080054 updateTunerResources();
55}
56
shubang23aa3ac2020-09-07 18:56:28 -070057TunerService::~TunerService() {}
58
Amy Zhangb1baabb2021-02-08 19:54:28 -080059binder_status_t TunerService::instantiate() {
Amy Zhanga046eee2021-01-12 14:44:58 -080060 shared_ptr<TunerService> service =
shubang23aa3ac2020-09-07 18:56:28 -070061 ::ndk::SharedRefBase::make<TunerService>();
Amy Zhangb1baabb2021-02-08 19:54:28 -080062 return AServiceManager_addService(service->asBinder().get(), getServiceName());
shubang6d266262020-10-09 00:15:04 -070063}
64
Amy Zhang5af84142021-02-04 18:36:54 -080065bool TunerService::hasITuner() {
Hongguangeae68392021-07-27 20:56:23 -070066 ALOGV("hasITuner");
shubang6d266262020-10-09 00:15:04 -070067 if (mTuner != nullptr) {
68 return true;
69 }
Hongguangeae68392021-07-27 20:56:23 -070070 const string statsServiceName = string() + ITuner::descriptor + "/default";
71 if (AServiceManager_isDeclared(statsServiceName.c_str())) {
72 ::ndk::SpAIBinder binder(AServiceManager_waitForService(statsServiceName.c_str()));
73 mTuner = ITuner::fromBinder(binder);
74 } else {
75 mTuner = nullptr;
76 ALOGE("Failed to get Tuner HAL Service");
shubang6d266262020-10-09 00:15:04 -070077 return false;
Amy Zhang0f04c452020-10-30 13:36:44 -070078 }
Hongguangeae68392021-07-27 20:56:23 -070079
80 mTunerVersion = TUNER_HAL_VERSION_2_0;
81 // TODO: Enable this after Tuner HAL is frozen.
82 // if (mTuner->getInterfaceVersion(&mTunerVersion).isOk()) {
83 // // Tuner AIDL HAL version 1 will be Tuner HAL 2.0
84 // mTunerVersion = (mTunerVersion + 1) << 16;
85 //}
86
shubang6d266262020-10-09 00:15:04 -070087 return true;
88}
89
Hongguangeae68392021-07-27 20:56:23 -070090::ndk::ScopedAStatus TunerService::openDemux(int32_t /* in_demuxHandle */,
91 shared_ptr<ITunerDemux>* _aidl_return) {
92 ALOGV("openDemux");
Amy Zhang5af84142021-02-04 18:36:54 -080093 if (!hasITuner()) {
Hongguangeae68392021-07-27 20:56:23 -070094 return ::ndk::ScopedAStatus::fromServiceSpecificError(
95 static_cast<int32_t>(Result::UNAVAILABLE));
shubang6d266262020-10-09 00:15:04 -070096 }
Hongguangeae68392021-07-27 20:56:23 -070097 vector<int32_t> id;
98 shared_ptr<IDemux> demux;
99 auto status = mTuner->openDemux(&id, &demux);
100 if (status.isOk()) {
101 *_aidl_return = ::ndk::SharedRefBase::make<TunerDemux>(demux, id[0]);
shubang6d266262020-10-09 00:15:04 -0700102 }
103
Hongguangeae68392021-07-27 20:56:23 -0700104 return status;
Amy Zhang07428dc2021-02-04 15:58:02 -0800105}
106
Hongguangeae68392021-07-27 20:56:23 -0700107::ndk::ScopedAStatus TunerService::getDemuxCaps(DemuxCapabilities* _aidl_return) {
108 ALOGV("getDemuxCaps");
Amy Zhang5af84142021-02-04 18:36:54 -0800109 if (!hasITuner()) {
Hongguangeae68392021-07-27 20:56:23 -0700110 return ::ndk::ScopedAStatus::fromServiceSpecificError(
111 static_cast<int32_t>(Result::UNAVAILABLE));
Amy Zhang07428dc2021-02-04 15:58:02 -0800112 }
113
Hongguangeae68392021-07-27 20:56:23 -0700114 return mTuner->getDemuxCaps(_aidl_return);
shubang6d266262020-10-09 00:15:04 -0700115}
116
Hongguangeae68392021-07-27 20:56:23 -0700117::ndk::ScopedAStatus TunerService::getFrontendIds(vector<int32_t>* ids) {
Amy Zhang5af84142021-02-04 18:36:54 -0800118 if (!hasITuner()) {
Hongguangeae68392021-07-27 20:56:23 -0700119 return ::ndk::ScopedAStatus::fromServiceSpecificError(
120 static_cast<int32_t>(Result::UNAVAILABLE));
shubang23aa3ac2020-09-07 18:56:28 -0700121 }
shubang23aa3ac2020-09-07 18:56:28 -0700122
Hongguangeae68392021-07-27 20:56:23 -0700123 return mTuner->getFrontendIds(ids);
shubang23aa3ac2020-09-07 18:56:28 -0700124}
125
Hongguangeae68392021-07-27 20:56:23 -0700126::ndk::ScopedAStatus TunerService::getFrontendInfo(int32_t id, FrontendInfo* _aidl_return) {
Amy Zhang5af84142021-02-04 18:36:54 -0800127 if (!hasITuner()) {
Amy Zhang0f04c452020-10-30 13:36:44 -0700128 ALOGE("ITuner service is not init.");
129 return ::ndk::ScopedAStatus::fromServiceSpecificError(
130 static_cast<int32_t>(Result::UNAVAILABLE));
Amy Zhang70de35a2020-10-12 20:13:16 -0700131 }
132
Hongguangeae68392021-07-27 20:56:23 -0700133 return mTuner->getFrontendInfo(id, _aidl_return);
Amy Zhang0f04c452020-10-30 13:36:44 -0700134}
135
Hongguangeae68392021-07-27 20:56:23 -0700136::ndk::ScopedAStatus TunerService::openFrontend(int32_t frontendHandle,
137 shared_ptr<ITunerFrontend>* _aidl_return) {
138 if (!hasITuner()) {
139 ALOGE("ITuner service is not init.");
Amy Zhang5af84142021-02-04 18:36:54 -0800140 return ::ndk::ScopedAStatus::fromServiceSpecificError(
141 static_cast<int32_t>(Result::UNAVAILABLE));
142 }
143
Hongguang093c5f32021-08-09 19:46:34 -0700144 int id = TunerHelper::getResourceIdFromHandle(frontendHandle, FRONTEND);
Hongguangeae68392021-07-27 20:56:23 -0700145 shared_ptr<IFrontend> frontend;
146 auto status = mTuner->openFrontendById(id, &frontend);
147 if (status.isOk()) {
148 *_aidl_return = ::ndk::SharedRefBase::make<TunerFrontend>(frontend, id);
Amy Zhanga046eee2021-01-12 14:44:58 -0800149 }
Hongguangeae68392021-07-27 20:56:23 -0700150
151 return status;
Amy Zhanga046eee2021-01-12 14:44:58 -0800152}
153
Hongguangeae68392021-07-27 20:56:23 -0700154::ndk::ScopedAStatus TunerService::openLnb(int lnbHandle, shared_ptr<ITunerLnb>* _aidl_return) {
Amy Zhang5af84142021-02-04 18:36:54 -0800155 if (!hasITuner()) {
Amy Zhangce2cb402021-01-21 12:50:47 -0800156 ALOGD("get ITuner failed");
Hongguangeae68392021-07-27 20:56:23 -0700157 return ::ndk::ScopedAStatus::fromServiceSpecificError(
158 static_cast<int32_t>(Result::UNAVAILABLE));
Amy Zhanga046eee2021-01-12 14:44:58 -0800159 }
160
Hongguangeae68392021-07-27 20:56:23 -0700161 shared_ptr<ILnb> lnb;
Hongguang093c5f32021-08-09 19:46:34 -0700162 int id = TunerHelper::getResourceIdFromHandle(lnbHandle, LNB);
Hongguangeae68392021-07-27 20:56:23 -0700163 auto status = mTuner->openLnbById(id, &lnb);
164 if (status.isOk()) {
165 *_aidl_return = ::ndk::SharedRefBase::make<TunerLnb>(lnb, id);
Amy Zhanga046eee2021-01-12 14:44:58 -0800166 }
167
Hongguangeae68392021-07-27 20:56:23 -0700168 return status;
Amy Zhanga046eee2021-01-12 14:44:58 -0800169}
170
Hongguangeae68392021-07-27 20:56:23 -0700171::ndk::ScopedAStatus TunerService::openLnbByName(const string& lnbName,
172 shared_ptr<ITunerLnb>* _aidl_return) {
Amy Zhang5af84142021-02-04 18:36:54 -0800173 if (!hasITuner()) {
Amy Zhangce2cb402021-01-21 12:50:47 -0800174 ALOGE("get ITuner failed");
Hongguangeae68392021-07-27 20:56:23 -0700175 return ::ndk::ScopedAStatus::fromServiceSpecificError(
176 static_cast<int32_t>(Result::UNAVAILABLE));
Amy Zhanga046eee2021-01-12 14:44:58 -0800177 }
178
Hongguangeae68392021-07-27 20:56:23 -0700179 vector<int32_t> id;
180 shared_ptr<ILnb> lnb;
181 auto status = mTuner->openLnbByName(lnbName, &id, &lnb);
182 if (status.isOk()) {
183 *_aidl_return = ::ndk::SharedRefBase::make<TunerLnb>(lnb, id[0]);
Amy Zhanga046eee2021-01-12 14:44:58 -0800184 }
185
Hongguangeae68392021-07-27 20:56:23 -0700186 return ::ndk::ScopedAStatus::ok();
Amy Zhang70de35a2020-10-12 20:13:16 -0700187}
188
Hongguangeae68392021-07-27 20:56:23 -0700189::ndk::ScopedAStatus TunerService::openDescrambler(int32_t /*descramblerHandle*/,
190 shared_ptr<ITunerDescrambler>* _aidl_return) {
Amy Zhang5af84142021-02-04 18:36:54 -0800191 if (!hasITuner()) {
Amy Zhangb2989b52021-02-05 12:27:25 -0800192 ALOGD("get ITuner failed");
Hongguangeae68392021-07-27 20:56:23 -0700193 return ::ndk::ScopedAStatus::fromServiceSpecificError(
194 static_cast<int32_t>(Result::UNAVAILABLE));
Amy Zhangb2989b52021-02-05 12:27:25 -0800195 }
196
Hongguangeae68392021-07-27 20:56:23 -0700197 shared_ptr<IDescrambler> descrambler;
Hongguang093c5f32021-08-09 19:46:34 -0700198 // int id = TunerHelper::getResourceIdFromHandle(descramblerHandle, DESCRAMBLER);
Hongguangeae68392021-07-27 20:56:23 -0700199 auto status = mTuner->openDescrambler(&descrambler);
200 if (status.isOk()) {
201 *_aidl_return = ::ndk::SharedRefBase::make<TunerDescrambler>(descrambler);
Amy Zhangb2989b52021-02-05 12:27:25 -0800202 }
203
Hongguangeae68392021-07-27 20:56:23 -0700204 return status;
Amy Zhangb2989b52021-02-05 12:27:25 -0800205}
206
Hongguangeae68392021-07-27 20:56:23 -0700207::ndk::ScopedAStatus TunerService::getTunerHalVersion(int* _aidl_return) {
Amy Zhangb1baabb2021-02-08 19:54:28 -0800208 hasITuner();
209 *_aidl_return = mTunerVersion;
Hongguangeae68392021-07-27 20:56:23 -0700210 return ::ndk::ScopedAStatus::ok();
Amy Zhangb1baabb2021-02-08 19:54:28 -0800211}
212
Hongguang093c5f32021-08-09 19:46:34 -0700213void TunerService::updateTunerResources() {
214 if (!hasITuner()) {
215 ALOGE("Failed to updateTunerResources");
Amy Zhangce2cb402021-01-21 12:50:47 -0800216 return;
217 }
Hongguangeae68392021-07-27 20:56:23 -0700218
Hongguang093c5f32021-08-09 19:46:34 -0700219 TunerHelper::updateTunerResources(getTRMFrontendInfos(), getTRMLnbHandles());
220}
221
222vector<TunerFrontendInfo> TunerService::getTRMFrontendInfos() {
Amy Zhangce2cb402021-01-21 12:50:47 -0800223 vector<TunerFrontendInfo> infos;
Hongguang093c5f32021-08-09 19:46:34 -0700224 vector<int32_t> ids;
225 auto status = mTuner->getFrontendIds(&ids);
226 if (!status.isOk()) {
227 return infos;
228 }
229
Amy Zhangce2cb402021-01-21 12:50:47 -0800230 for (int i = 0; i < ids.size(); i++) {
231 FrontendInfo frontendInfo;
Hongguangeae68392021-07-27 20:56:23 -0700232 auto res = mTuner->getFrontendInfo(ids[i], &frontendInfo);
233 if (!res.isOk()) {
Amy Zhangce2cb402021-01-21 12:50:47 -0800234 continue;
235 }
236 TunerFrontendInfo tunerFrontendInfo{
Hongguang093c5f32021-08-09 19:46:34 -0700237 .handle = TunerHelper::getResourceHandleFromId((int)ids[i], FRONTEND),
Hongguangeae68392021-07-27 20:56:23 -0700238 .type = static_cast<int>(frontendInfo.type),
239 .exclusiveGroupId = frontendInfo.exclusiveGroupId,
Amy Zhangce2cb402021-01-21 12:50:47 -0800240 };
241 infos.push_back(tunerFrontendInfo);
242 }
Hongguang093c5f32021-08-09 19:46:34 -0700243
244 return infos;
Amy Zhangce2cb402021-01-21 12:50:47 -0800245}
246
Hongguang093c5f32021-08-09 19:46:34 -0700247vector<int32_t> TunerService::getTRMLnbHandles() {
Hongguangeae68392021-07-27 20:56:23 -0700248 vector<int32_t> lnbHandles;
249 if (mTuner != nullptr) {
250 vector<int32_t> lnbIds;
251 auto res = mTuner->getLnbIds(&lnbIds);
252 if (res.isOk()) {
Amy Zhangce2cb402021-01-21 12:50:47 -0800253 for (int i = 0; i < lnbIds.size(); i++) {
Hongguang093c5f32021-08-09 19:46:34 -0700254 lnbHandles.push_back(TunerHelper::getResourceHandleFromId(lnbIds[i], LNB));
Amy Zhangce2cb402021-01-21 12:50:47 -0800255 }
256 }
257 }
258
259 return lnbHandles;
260}
261
Hongguangeae68392021-07-27 20:56:23 -0700262} // namespace tuner
263} // namespace tv
264} // namespace media
265} // namespace android
266} // namespace aidl