blob: 0703700a2ddfaae38c69704e3993379185c30c58 [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>
27#include <aidl/android/media/tv/tunerresourcemanager/TunerFrontendInfo.h>
shubang23aa3ac2020-09-07 18:56:28 -070028#include <android/binder_manager.h>
Amy Zhangc5eb8272021-03-01 16:19:39 -080029#include <android/content/pm/IPackageManagerNative.h>
30#include <binder/IServiceManager.h>
shubang23aa3ac2020-09-07 18:56:28 -070031#include <utils/Log.h>
Hongguangeae68392021-07-27 20:56:23 -070032
shubangae56a2e2021-01-21 07:29:55 -080033#include "TunerDemux.h"
Amy Zhangb2989b52021-02-05 12:27:25 -080034#include "TunerDescrambler.h"
Hongguangeae68392021-07-27 20:56:23 -070035#include "TunerFrontend.h"
36#include "TunerLnb.h"
shubang23aa3ac2020-09-07 18:56:28 -070037
Hongguangeae68392021-07-27 20:56:23 -070038using ::aidl::android::hardware::tv::tuner::IDemux;
39using ::aidl::android::hardware::tv::tuner::IDescrambler;
40using ::aidl::android::hardware::tv::tuner::IFrontend;
41using ::aidl::android::hardware::tv::tuner::Result;
42using ::aidl::android::media::tv::tunerresourcemanager::TunerFrontendInfo;
43using ::android::defaultServiceManager;
44using ::android::IBinder;
45using ::android::interface_cast;
46using ::android::IServiceManager;
47using ::android::sp;
48using ::android::String16;
49using ::android::binder::Status;
50using ::android::content::pm::IPackageManagerNative;
shubang23aa3ac2020-09-07 18:56:28 -070051
Hongguangeae68392021-07-27 20:56:23 -070052namespace aidl {
shubang23aa3ac2020-09-07 18:56:28 -070053namespace android {
Hongguangeae68392021-07-27 20:56:23 -070054namespace media {
55namespace tv {
56namespace tuner {
shubang23aa3ac2020-09-07 18:56:28 -070057
Amy Zhangfb1b4962021-02-18 19:34:52 -080058TunerService::TunerService() {
Amy Zhangc5eb8272021-03-01 16:19:39 -080059 sp<IServiceManager> serviceMgr = defaultServiceManager();
Hongguangeae68392021-07-27 20:56:23 -070060 sp<IPackageManagerNative> packageMgr;
Amy Zhangc5eb8272021-03-01 16:19:39 -080061 if (serviceMgr.get() == nullptr) {
62 ALOGE("%s: Cannot find service manager", __func__);
63 return;
64 } else {
65 sp<IBinder> binder = serviceMgr->waitForService(String16("package_native"));
Hongguangeae68392021-07-27 20:56:23 -070066 packageMgr = interface_cast<IPackageManagerNative>(binder);
Amy Zhangc5eb8272021-03-01 16:19:39 -080067 }
68
Amy Zhangc5eb8272021-03-01 16:19:39 -080069 if (packageMgr != nullptr) {
Hongguangeae68392021-07-27 20:56:23 -070070 bool hasFeature = false;
71 Status status = packageMgr->hasSystemFeature(FEATURE_TUNER, 0, &hasFeature);
Amy Zhangc5eb8272021-03-01 16:19:39 -080072 if (!status.isOk()) {
Hongguangeae68392021-07-27 20:56:23 -070073 ALOGE("%s: hasSystemFeature failed: %s", __func__, status.exceptionMessage().c_str());
Amy Zhangc5eb8272021-03-01 16:19:39 -080074 return;
75 }
76 if (!hasFeature) {
77 ALOGD("Current device does not support tuner feaure.");
78 return;
79 }
80 } else {
81 ALOGD("%s: Cannot find package manager.", __func__);
82 return;
83 }
84
Amy Zhangfb1b4962021-02-18 19:34:52 -080085 ::ndk::SpAIBinder binder(AServiceManager_waitForService("tv_tuner_resource_mgr"));
86 mTunerResourceManager = ITunerResourceManager::fromBinder(binder);
87 updateTunerResources();
88}
89
shubang23aa3ac2020-09-07 18:56:28 -070090TunerService::~TunerService() {}
91
Amy Zhangb1baabb2021-02-08 19:54:28 -080092binder_status_t TunerService::instantiate() {
Amy Zhanga046eee2021-01-12 14:44:58 -080093 shared_ptr<TunerService> service =
shubang23aa3ac2020-09-07 18:56:28 -070094 ::ndk::SharedRefBase::make<TunerService>();
Amy Zhangb1baabb2021-02-08 19:54:28 -080095 return AServiceManager_addService(service->asBinder().get(), getServiceName());
shubang6d266262020-10-09 00:15:04 -070096}
97
Amy Zhang5af84142021-02-04 18:36:54 -080098bool TunerService::hasITuner() {
Hongguangeae68392021-07-27 20:56:23 -070099 ALOGV("hasITuner");
shubang6d266262020-10-09 00:15:04 -0700100 if (mTuner != nullptr) {
101 return true;
102 }
Hongguangeae68392021-07-27 20:56:23 -0700103 const string statsServiceName = string() + ITuner::descriptor + "/default";
104 if (AServiceManager_isDeclared(statsServiceName.c_str())) {
105 ::ndk::SpAIBinder binder(AServiceManager_waitForService(statsServiceName.c_str()));
106 mTuner = ITuner::fromBinder(binder);
107 } else {
108 mTuner = nullptr;
109 ALOGE("Failed to get Tuner HAL Service");
shubang6d266262020-10-09 00:15:04 -0700110 return false;
Amy Zhang0f04c452020-10-30 13:36:44 -0700111 }
Hongguangeae68392021-07-27 20:56:23 -0700112
113 mTunerVersion = TUNER_HAL_VERSION_2_0;
114 // TODO: Enable this after Tuner HAL is frozen.
115 // if (mTuner->getInterfaceVersion(&mTunerVersion).isOk()) {
116 // // Tuner AIDL HAL version 1 will be Tuner HAL 2.0
117 // mTunerVersion = (mTunerVersion + 1) << 16;
118 //}
119
shubang6d266262020-10-09 00:15:04 -0700120 return true;
121}
122
Hongguangeae68392021-07-27 20:56:23 -0700123::ndk::ScopedAStatus TunerService::openDemux(int32_t /* in_demuxHandle */,
124 shared_ptr<ITunerDemux>* _aidl_return) {
125 ALOGV("openDemux");
Amy Zhang5af84142021-02-04 18:36:54 -0800126 if (!hasITuner()) {
Hongguangeae68392021-07-27 20:56:23 -0700127 return ::ndk::ScopedAStatus::fromServiceSpecificError(
128 static_cast<int32_t>(Result::UNAVAILABLE));
shubang6d266262020-10-09 00:15:04 -0700129 }
Hongguangeae68392021-07-27 20:56:23 -0700130 vector<int32_t> id;
131 shared_ptr<IDemux> demux;
132 auto status = mTuner->openDemux(&id, &demux);
133 if (status.isOk()) {
134 *_aidl_return = ::ndk::SharedRefBase::make<TunerDemux>(demux, id[0]);
shubang6d266262020-10-09 00:15:04 -0700135 }
136
Hongguangeae68392021-07-27 20:56:23 -0700137 return status;
Amy Zhang07428dc2021-02-04 15:58:02 -0800138}
139
Hongguangeae68392021-07-27 20:56:23 -0700140::ndk::ScopedAStatus TunerService::getDemuxCaps(DemuxCapabilities* _aidl_return) {
141 ALOGV("getDemuxCaps");
Amy Zhang5af84142021-02-04 18:36:54 -0800142 if (!hasITuner()) {
Hongguangeae68392021-07-27 20:56:23 -0700143 return ::ndk::ScopedAStatus::fromServiceSpecificError(
144 static_cast<int32_t>(Result::UNAVAILABLE));
Amy Zhang07428dc2021-02-04 15:58:02 -0800145 }
146
Hongguangeae68392021-07-27 20:56:23 -0700147 return mTuner->getDemuxCaps(_aidl_return);
shubang6d266262020-10-09 00:15:04 -0700148}
149
Hongguangeae68392021-07-27 20:56:23 -0700150::ndk::ScopedAStatus TunerService::getFrontendIds(vector<int32_t>* ids) {
Amy Zhang5af84142021-02-04 18:36:54 -0800151 if (!hasITuner()) {
Hongguangeae68392021-07-27 20:56:23 -0700152 return ::ndk::ScopedAStatus::fromServiceSpecificError(
153 static_cast<int32_t>(Result::UNAVAILABLE));
shubang23aa3ac2020-09-07 18:56:28 -0700154 }
shubang23aa3ac2020-09-07 18:56:28 -0700155
Hongguangeae68392021-07-27 20:56:23 -0700156 return mTuner->getFrontendIds(ids);
shubang23aa3ac2020-09-07 18:56:28 -0700157}
158
Hongguangeae68392021-07-27 20:56:23 -0700159::ndk::ScopedAStatus TunerService::getFrontendInfo(int32_t id, FrontendInfo* _aidl_return) {
Amy Zhang5af84142021-02-04 18:36:54 -0800160 if (!hasITuner()) {
Amy Zhang0f04c452020-10-30 13:36:44 -0700161 ALOGE("ITuner service is not init.");
162 return ::ndk::ScopedAStatus::fromServiceSpecificError(
163 static_cast<int32_t>(Result::UNAVAILABLE));
Amy Zhang70de35a2020-10-12 20:13:16 -0700164 }
165
Hongguangeae68392021-07-27 20:56:23 -0700166 return mTuner->getFrontendInfo(id, _aidl_return);
Amy Zhang0f04c452020-10-30 13:36:44 -0700167}
168
Hongguangeae68392021-07-27 20:56:23 -0700169::ndk::ScopedAStatus TunerService::openFrontend(int32_t frontendHandle,
170 shared_ptr<ITunerFrontend>* _aidl_return) {
171 if (!hasITuner()) {
172 ALOGE("ITuner service is not init.");
Amy Zhang5af84142021-02-04 18:36:54 -0800173 return ::ndk::ScopedAStatus::fromServiceSpecificError(
174 static_cast<int32_t>(Result::UNAVAILABLE));
175 }
176
Amy Zhanga046eee2021-01-12 14:44:58 -0800177 int id = getResourceIdFromHandle(frontendHandle, FRONTEND);
Hongguangeae68392021-07-27 20:56:23 -0700178 shared_ptr<IFrontend> frontend;
179 auto status = mTuner->openFrontendById(id, &frontend);
180 if (status.isOk()) {
181 *_aidl_return = ::ndk::SharedRefBase::make<TunerFrontend>(frontend, id);
Amy Zhanga046eee2021-01-12 14:44:58 -0800182 }
Hongguangeae68392021-07-27 20:56:23 -0700183
184 return status;
Amy Zhanga046eee2021-01-12 14:44:58 -0800185}
186
Hongguangeae68392021-07-27 20:56:23 -0700187::ndk::ScopedAStatus TunerService::openLnb(int lnbHandle, shared_ptr<ITunerLnb>* _aidl_return) {
Amy Zhang5af84142021-02-04 18:36:54 -0800188 if (!hasITuner()) {
Amy Zhangce2cb402021-01-21 12:50:47 -0800189 ALOGD("get ITuner failed");
Hongguangeae68392021-07-27 20:56:23 -0700190 return ::ndk::ScopedAStatus::fromServiceSpecificError(
191 static_cast<int32_t>(Result::UNAVAILABLE));
Amy Zhanga046eee2021-01-12 14:44:58 -0800192 }
193
Hongguangeae68392021-07-27 20:56:23 -0700194 shared_ptr<ILnb> lnb;
Amy Zhanga046eee2021-01-12 14:44:58 -0800195 int id = getResourceIdFromHandle(lnbHandle, LNB);
Hongguangeae68392021-07-27 20:56:23 -0700196 auto status = mTuner->openLnbById(id, &lnb);
197 if (status.isOk()) {
198 *_aidl_return = ::ndk::SharedRefBase::make<TunerLnb>(lnb, id);
Amy Zhanga046eee2021-01-12 14:44:58 -0800199 }
200
Hongguangeae68392021-07-27 20:56:23 -0700201 return status;
Amy Zhanga046eee2021-01-12 14:44:58 -0800202}
203
Hongguangeae68392021-07-27 20:56:23 -0700204::ndk::ScopedAStatus TunerService::openLnbByName(const string& lnbName,
205 shared_ptr<ITunerLnb>* _aidl_return) {
Amy Zhang5af84142021-02-04 18:36:54 -0800206 if (!hasITuner()) {
Amy Zhangce2cb402021-01-21 12:50:47 -0800207 ALOGE("get ITuner failed");
Hongguangeae68392021-07-27 20:56:23 -0700208 return ::ndk::ScopedAStatus::fromServiceSpecificError(
209 static_cast<int32_t>(Result::UNAVAILABLE));
Amy Zhanga046eee2021-01-12 14:44:58 -0800210 }
211
Hongguangeae68392021-07-27 20:56:23 -0700212 vector<int32_t> id;
213 shared_ptr<ILnb> lnb;
214 auto status = mTuner->openLnbByName(lnbName, &id, &lnb);
215 if (status.isOk()) {
216 *_aidl_return = ::ndk::SharedRefBase::make<TunerLnb>(lnb, id[0]);
Amy Zhanga046eee2021-01-12 14:44:58 -0800217 }
218
Hongguangeae68392021-07-27 20:56:23 -0700219 return ::ndk::ScopedAStatus::ok();
Amy Zhang70de35a2020-10-12 20:13:16 -0700220}
221
Hongguangeae68392021-07-27 20:56:23 -0700222::ndk::ScopedAStatus TunerService::openDescrambler(int32_t /*descramblerHandle*/,
223 shared_ptr<ITunerDescrambler>* _aidl_return) {
Amy Zhang5af84142021-02-04 18:36:54 -0800224 if (!hasITuner()) {
Amy Zhangb2989b52021-02-05 12:27:25 -0800225 ALOGD("get ITuner failed");
Hongguangeae68392021-07-27 20:56:23 -0700226 return ::ndk::ScopedAStatus::fromServiceSpecificError(
227 static_cast<int32_t>(Result::UNAVAILABLE));
Amy Zhangb2989b52021-02-05 12:27:25 -0800228 }
229
Hongguangeae68392021-07-27 20:56:23 -0700230 shared_ptr<IDescrambler> descrambler;
231 // int id = getResourceIdFromHandle(descramblerHandle, DESCRAMBLER);
232 auto status = mTuner->openDescrambler(&descrambler);
233 if (status.isOk()) {
234 *_aidl_return = ::ndk::SharedRefBase::make<TunerDescrambler>(descrambler);
Amy Zhangb2989b52021-02-05 12:27:25 -0800235 }
236
Hongguangeae68392021-07-27 20:56:23 -0700237 return status;
Amy Zhangb2989b52021-02-05 12:27:25 -0800238}
239
Amy Zhangfb1b4962021-02-18 19:34:52 -0800240void TunerService::updateTunerResources() {
Hongguangeae68392021-07-27 20:56:23 -0700241 if (!hasITuner() || mTunerResourceManager == nullptr) {
Amy Zhangfb1b4962021-02-18 19:34:52 -0800242 ALOGE("Failed to updateTunerResources");
243 return;
Amy Zhangce2cb402021-01-21 12:50:47 -0800244 }
245
Amy Zhangce2cb402021-01-21 12:50:47 -0800246 updateFrontendResources();
247 updateLnbResources();
248 // TODO: update Demux, Descrambler.
Amy Zhangce2cb402021-01-21 12:50:47 -0800249}
250
Hongguangeae68392021-07-27 20:56:23 -0700251::ndk::ScopedAStatus TunerService::getTunerHalVersion(int* _aidl_return) {
Amy Zhangb1baabb2021-02-08 19:54:28 -0800252 hasITuner();
253 *_aidl_return = mTunerVersion;
Hongguangeae68392021-07-27 20:56:23 -0700254 return ::ndk::ScopedAStatus::ok();
Amy Zhangb1baabb2021-02-08 19:54:28 -0800255}
256
Amy Zhangce2cb402021-01-21 12:50:47 -0800257void TunerService::updateFrontendResources() {
Hongguangeae68392021-07-27 20:56:23 -0700258 vector<int32_t> ids;
259 auto status = mTuner->getFrontendIds(&ids);
260 if (!status.isOk()) {
Amy Zhangce2cb402021-01-21 12:50:47 -0800261 return;
262 }
Hongguangeae68392021-07-27 20:56:23 -0700263
Amy Zhangce2cb402021-01-21 12:50:47 -0800264 vector<TunerFrontendInfo> infos;
265 for (int i = 0; i < ids.size(); i++) {
266 FrontendInfo frontendInfo;
Hongguangeae68392021-07-27 20:56:23 -0700267 auto res = mTuner->getFrontendInfo(ids[i], &frontendInfo);
268 if (!res.isOk()) {
Amy Zhangce2cb402021-01-21 12:50:47 -0800269 continue;
270 }
271 TunerFrontendInfo tunerFrontendInfo{
Hongguangeae68392021-07-27 20:56:23 -0700272 .handle = getResourceHandleFromId((int)ids[i], FRONTEND),
273 .type = static_cast<int>(frontendInfo.type),
274 .exclusiveGroupId = frontendInfo.exclusiveGroupId,
Amy Zhangce2cb402021-01-21 12:50:47 -0800275 };
276 infos.push_back(tunerFrontendInfo);
277 }
278 mTunerResourceManager->setFrontendInfoList(infos);
279}
280
281void TunerService::updateLnbResources() {
Hongguangeae68392021-07-27 20:56:23 -0700282 vector<int32_t> handles = getLnbHandles();
Amy Zhangce2cb402021-01-21 12:50:47 -0800283 if (handles.size() == 0) {
284 return;
285 }
286 mTunerResourceManager->setLnbInfoList(handles);
287}
288
Hongguangeae68392021-07-27 20:56:23 -0700289vector<int32_t> TunerService::getLnbHandles() {
290 vector<int32_t> lnbHandles;
291 if (mTuner != nullptr) {
292 vector<int32_t> lnbIds;
293 auto res = mTuner->getLnbIds(&lnbIds);
294 if (res.isOk()) {
Amy Zhangce2cb402021-01-21 12:50:47 -0800295 for (int i = 0; i < lnbIds.size(); i++) {
Hongguangeae68392021-07-27 20:56:23 -0700296 lnbHandles.push_back(getResourceHandleFromId(lnbIds[i], LNB));
Amy Zhangce2cb402021-01-21 12:50:47 -0800297 }
298 }
299 }
300
301 return lnbHandles;
302}
303
Hongguangeae68392021-07-27 20:56:23 -0700304} // namespace tuner
305} // namespace tv
306} // namespace media
307} // namespace android
308} // namespace aidl