blob: e5bcf1fdaa49870ebcecd809cf979a4461e57e11 [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>
Hongguang34a479e2021-10-04 16:14:47 -070028#include <binder/IPCThreadState.h>
29#include <binder/PermissionCache.h>
Hongguang5eef5142022-08-09 20:26:42 -070030#include <cutils/properties.h>
shubang23aa3ac2020-09-07 18:56:28 -070031#include <utils/Log.h>
Hongguangeae68392021-07-27 20:56:23 -070032
Hongguang34a479e2021-10-04 16:14:47 -070033#include <string>
34
shubangae56a2e2021-01-21 07:29:55 -080035#include "TunerDemux.h"
Amy Zhangb2989b52021-02-05 12:27:25 -080036#include "TunerDescrambler.h"
Hongguangeae68392021-07-27 20:56:23 -070037#include "TunerFrontend.h"
Hongguang093c5f32021-08-09 19:46:34 -070038#include "TunerHelper.h"
Hongguangeae68392021-07-27 20:56:23 -070039#include "TunerLnb.h"
shubang23aa3ac2020-09-07 18:56:28 -070040
Hongguangeae68392021-07-27 20:56:23 -070041using ::aidl::android::hardware::tv::tuner::IDemux;
42using ::aidl::android::hardware::tv::tuner::IDescrambler;
43using ::aidl::android::hardware::tv::tuner::IFrontend;
44using ::aidl::android::hardware::tv::tuner::Result;
Hongguang34a479e2021-10-04 16:14:47 -070045using ::android::IPCThreadState;
46using ::android::PermissionCache;
Hongguangeae68392021-07-27 20:56:23 -070047using ::android::sp;
shubang23aa3ac2020-09-07 18:56:28 -070048
Hongguangeae68392021-07-27 20:56:23 -070049namespace aidl {
shubang23aa3ac2020-09-07 18:56:28 -070050namespace android {
Hongguangeae68392021-07-27 20:56:23 -070051namespace media {
52namespace tv {
53namespace tuner {
shubang23aa3ac2020-09-07 18:56:28 -070054
Amy Zhangfb1b4962021-02-18 19:34:52 -080055TunerService::TunerService() {
Hongguang5eef5142022-08-09 20:26:42 -070056 const string statsServiceName = string() + ITuner::descriptor + "/default";
57 ::ndk::SpAIBinder binder(AServiceManager_waitForService(statsServiceName.c_str()));
58 mTuner = ITuner::fromBinder(binder);
59 ALOGE_IF(mTuner == nullptr, "Failed to get Tuner HAL Service");
60
61 mTunerVersion = TUNER_HAL_VERSION_2_0;
62 if (mTuner->getInterfaceVersion(&mTunerVersion).isOk()) {
63 // Tuner AIDL HAL version 1 will be Tuner HAL 2.0
64 mTunerVersion = (mTunerVersion + 1) << 16;
Amy Zhangc5eb8272021-03-01 16:19:39 -080065 }
66
Hongguang5eef5142022-08-09 20:26:42 -070067 // Register the tuner resources to TRM.
Amy Zhangfb1b4962021-02-18 19:34:52 -080068 updateTunerResources();
69}
70
Hongguang5eef5142022-08-09 20:26:42 -070071TunerService::~TunerService() {
72 mTuner = nullptr;
73}
shubang23aa3ac2020-09-07 18:56:28 -070074
Amy Zhangb1baabb2021-02-08 19:54:28 -080075binder_status_t TunerService::instantiate() {
Hongguang5eef5142022-08-09 20:26:42 -070076 shared_ptr<TunerService> tunerService = ::ndk::SharedRefBase::make<TunerService>();
77 bool lazyHal = property_get_bool("ro.tuner.lazyhal", false);
78 if (lazyHal) {
79 return AServiceManager_registerLazyService(tunerService->asBinder().get(),
80 getServiceName());
shubang6d266262020-10-09 00:15:04 -070081 }
Hongguang5eef5142022-08-09 20:26:42 -070082 return AServiceManager_addService(tunerService->asBinder().get(), getServiceName());
shubang6d266262020-10-09 00:15:04 -070083}
84
Kensuke Miyagia5154b32022-11-07 15:08:05 -080085::ndk::ScopedAStatus TunerService::openDemux(int32_t in_demuxHandle,
Hongguangeae68392021-07-27 20:56:23 -070086 shared_ptr<ITunerDemux>* _aidl_return) {
87 ALOGV("openDemux");
Hongguangeae68392021-07-27 20:56:23 -070088 shared_ptr<IDemux> demux;
Kensuke Miyagia5154b32022-11-07 15:08:05 -080089 bool fallBackToOpenDemux = false;
90 vector<int32_t> ids;
91
92 if (mTunerVersion <= TUNER_HAL_VERSION_2_0) {
93 fallBackToOpenDemux = true;
94 } else {
95 mTuner->getDemuxIds(&ids);
96 if (ids.size() == 0) {
97 fallBackToOpenDemux = true;
98 }
shubang6d266262020-10-09 00:15:04 -070099 }
100
Kensuke Miyagia5154b32022-11-07 15:08:05 -0800101 if (fallBackToOpenDemux) {
102 auto status = mTuner->openDemux(&ids, &demux);
103 return ::ndk::ScopedAStatus::fromServiceSpecificError(
104 static_cast<int32_t>(Result::UNAVAILABLE));
105 } else {
106 int id = TunerHelper::getResourceIdFromHandle(in_demuxHandle, DEMUX);
107 auto status = mTuner->openDemuxById(id, &demux);
108 if (status.isOk()) {
109 *_aidl_return =
110 ::ndk::SharedRefBase::make<TunerDemux>(demux, id, this->ref<TunerService>());
111 }
112 return status;
113 }
114}
115
116::ndk::ScopedAStatus TunerService::getDemuxInfo(int32_t in_demuxHandle, DemuxInfo* _aidl_return) {
117 if (mTunerVersion <= TUNER_HAL_VERSION_2_0) {
118 return ::ndk::ScopedAStatus::fromServiceSpecificError(
119 static_cast<int32_t>(Result::UNAVAILABLE));
120 }
121 int id = TunerHelper::getResourceIdFromHandle(in_demuxHandle, DEMUX);
122 return mTuner->getDemuxInfo(id, _aidl_return);
123}
124
125::ndk::ScopedAStatus TunerService::getDemuxInfoList(vector<DemuxInfo>* _aidl_return) {
126 if (mTunerVersion <= TUNER_HAL_VERSION_2_0) {
127 return ::ndk::ScopedAStatus::fromServiceSpecificError(
128 static_cast<int32_t>(Result::UNAVAILABLE));
129 }
130 vector<DemuxInfo> demuxInfoList;
131 vector<int32_t> ids;
132 auto status = mTuner->getDemuxIds(&ids);
133 if (!status.isOk()) {
134 return ::ndk::ScopedAStatus::fromServiceSpecificError(
135 static_cast<int32_t>(Result::UNAVAILABLE));
136 }
137
138 for (int i = 0; i < ids.size(); i++) {
139 DemuxInfo demuxInfo;
140 auto res = mTuner->getDemuxInfo(ids[i], &demuxInfo);
141 if (!res.isOk()) {
142 continue;
143 }
144 demuxInfoList.push_back(demuxInfo);
145 }
146
147 if (demuxInfoList.size() > 0) {
148 *_aidl_return = demuxInfoList;
149 return ::ndk::ScopedAStatus::ok();
150 } else {
151 return ::ndk::ScopedAStatus::fromServiceSpecificError(
152 static_cast<int32_t>(Result::UNAVAILABLE));
153 }
Amy Zhang07428dc2021-02-04 15:58:02 -0800154}
155
Hongguangeae68392021-07-27 20:56:23 -0700156::ndk::ScopedAStatus TunerService::getDemuxCaps(DemuxCapabilities* _aidl_return) {
157 ALOGV("getDemuxCaps");
Hongguangeae68392021-07-27 20:56:23 -0700158 return mTuner->getDemuxCaps(_aidl_return);
shubang6d266262020-10-09 00:15:04 -0700159}
160
Hongguangeae68392021-07-27 20:56:23 -0700161::ndk::ScopedAStatus TunerService::getFrontendIds(vector<int32_t>* ids) {
Hongguangeae68392021-07-27 20:56:23 -0700162 return mTuner->getFrontendIds(ids);
shubang23aa3ac2020-09-07 18:56:28 -0700163}
164
Hongguangeae68392021-07-27 20:56:23 -0700165::ndk::ScopedAStatus TunerService::getFrontendInfo(int32_t id, FrontendInfo* _aidl_return) {
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) {
Hongguang093c5f32021-08-09 19:46:34 -0700171 int id = TunerHelper::getResourceIdFromHandle(frontendHandle, FRONTEND);
Hongguangeae68392021-07-27 20:56:23 -0700172 shared_ptr<IFrontend> frontend;
173 auto status = mTuner->openFrontendById(id, &frontend);
174 if (status.isOk()) {
175 *_aidl_return = ::ndk::SharedRefBase::make<TunerFrontend>(frontend, id);
Amy Zhanga046eee2021-01-12 14:44:58 -0800176 }
Hongguangeae68392021-07-27 20:56:23 -0700177
178 return status;
Amy Zhanga046eee2021-01-12 14:44:58 -0800179}
180
Hongguangeae68392021-07-27 20:56:23 -0700181::ndk::ScopedAStatus TunerService::openLnb(int lnbHandle, shared_ptr<ITunerLnb>* _aidl_return) {
Hongguangeae68392021-07-27 20:56:23 -0700182 shared_ptr<ILnb> lnb;
Hongguang093c5f32021-08-09 19:46:34 -0700183 int id = TunerHelper::getResourceIdFromHandle(lnbHandle, LNB);
Hongguangeae68392021-07-27 20:56:23 -0700184 auto status = mTuner->openLnbById(id, &lnb);
185 if (status.isOk()) {
186 *_aidl_return = ::ndk::SharedRefBase::make<TunerLnb>(lnb, id);
Amy Zhanga046eee2021-01-12 14:44:58 -0800187 }
188
Hongguangeae68392021-07-27 20:56:23 -0700189 return status;
Amy Zhanga046eee2021-01-12 14:44:58 -0800190}
191
Hongguangeae68392021-07-27 20:56:23 -0700192::ndk::ScopedAStatus TunerService::openLnbByName(const string& lnbName,
193 shared_ptr<ITunerLnb>* _aidl_return) {
Hongguangeae68392021-07-27 20:56:23 -0700194 vector<int32_t> id;
195 shared_ptr<ILnb> lnb;
196 auto status = mTuner->openLnbByName(lnbName, &id, &lnb);
197 if (status.isOk()) {
198 *_aidl_return = ::ndk::SharedRefBase::make<TunerLnb>(lnb, id[0]);
Amy Zhanga046eee2021-01-12 14:44:58 -0800199 }
200
Hongguangeae68392021-07-27 20:56:23 -0700201 return ::ndk::ScopedAStatus::ok();
Amy Zhang70de35a2020-10-12 20:13:16 -0700202}
203
Hongguangeae68392021-07-27 20:56:23 -0700204::ndk::ScopedAStatus TunerService::openDescrambler(int32_t /*descramblerHandle*/,
205 shared_ptr<ITunerDescrambler>* _aidl_return) {
Hongguangeae68392021-07-27 20:56:23 -0700206 shared_ptr<IDescrambler> descrambler;
Hongguang093c5f32021-08-09 19:46:34 -0700207 // int id = TunerHelper::getResourceIdFromHandle(descramblerHandle, DESCRAMBLER);
Hongguangeae68392021-07-27 20:56:23 -0700208 auto status = mTuner->openDescrambler(&descrambler);
209 if (status.isOk()) {
210 *_aidl_return = ::ndk::SharedRefBase::make<TunerDescrambler>(descrambler);
Amy Zhangb2989b52021-02-05 12:27:25 -0800211 }
212
Hongguangeae68392021-07-27 20:56:23 -0700213 return status;
Amy Zhangb2989b52021-02-05 12:27:25 -0800214}
215
Hongguangeae68392021-07-27 20:56:23 -0700216::ndk::ScopedAStatus TunerService::getTunerHalVersion(int* _aidl_return) {
Amy Zhangb1baabb2021-02-08 19:54:28 -0800217 *_aidl_return = mTunerVersion;
Hongguangeae68392021-07-27 20:56:23 -0700218 return ::ndk::ScopedAStatus::ok();
Amy Zhangb1baabb2021-02-08 19:54:28 -0800219}
220
Hongguang34a479e2021-10-04 16:14:47 -0700221::ndk::ScopedAStatus TunerService::openSharedFilter(const string& in_filterToken,
222 const shared_ptr<ITunerFilterCallback>& in_cb,
223 shared_ptr<ITunerFilter>* _aidl_return) {
Hongguang34a479e2021-10-04 16:14:47 -0700224 if (!PermissionCache::checkCallingPermission(sSharedFilterPermission)) {
225 ALOGE("Request requires android.permission.ACCESS_TV_SHARED_FILTER");
226 return ::ndk::ScopedAStatus::fromServiceSpecificError(
227 static_cast<int32_t>(Result::UNAVAILABLE));
228 }
229
230 Mutex::Autolock _l(mSharedFiltersLock);
231 if (mSharedFilters.find(in_filterToken) == mSharedFilters.end()) {
232 *_aidl_return = nullptr;
233 ALOGD("fail to find %s", in_filterToken.c_str());
234 return ::ndk::ScopedAStatus::fromServiceSpecificError(
235 static_cast<int32_t>(Result::INVALID_STATE));
236 }
237
238 shared_ptr<TunerFilter> filter = mSharedFilters.at(in_filterToken);
239 IPCThreadState* ipc = IPCThreadState::self();
240 const int pid = ipc->getCallingPid();
241 if (!filter->isSharedFilterAllowed(pid)) {
242 *_aidl_return = nullptr;
243 ALOGD("shared filter %s is opened in the same process", in_filterToken.c_str());
244 return ::ndk::ScopedAStatus::fromServiceSpecificError(
245 static_cast<int32_t>(Result::INVALID_STATE));
246 }
247
248 filter->attachSharedFilterCallback(in_cb);
249
250 *_aidl_return = filter;
251 return ::ndk::ScopedAStatus::ok();
252}
253
Ray China9cb8652022-11-01 11:50:46 +0800254::ndk::ScopedAStatus TunerService::isLnaSupported(bool* _aidl_return) {
255 ALOGV("isLnaSupported");
256 return mTuner->isLnaSupported(_aidl_return);
257}
258
Hongguangd8ccaae2021-12-13 18:07:10 -0800259::ndk::ScopedAStatus TunerService::setLna(bool bEnable) {
Hongguangd8ccaae2021-12-13 18:07:10 -0800260 return mTuner->setLna(bEnable);
261}
262
Hongguang9fc18a92021-12-22 15:15:04 -0800263::ndk::ScopedAStatus TunerService::setMaxNumberOfFrontends(FrontendType in_frontendType,
264 int32_t in_maxNumber) {
Hongguang9fc18a92021-12-22 15:15:04 -0800265 return mTuner->setMaxNumberOfFrontends(in_frontendType, in_maxNumber);
266}
267
268::ndk::ScopedAStatus TunerService::getMaxNumberOfFrontends(FrontendType in_frontendType,
269 int32_t* _aidl_return) {
Hongguang9fc18a92021-12-22 15:15:04 -0800270 return mTuner->getMaxNumberOfFrontends(in_frontendType, _aidl_return);
271}
272
Hongguang34a479e2021-10-04 16:14:47 -0700273string TunerService::addFilterToShared(const shared_ptr<TunerFilter>& sharedFilter) {
274 Mutex::Autolock _l(mSharedFiltersLock);
275
276 // Use sharedFilter address as token.
277 string token = to_string(reinterpret_cast<std::uintptr_t>(sharedFilter.get()));
278 mSharedFilters[token] = sharedFilter;
279 return token;
280}
281
282void TunerService::removeSharedFilter(const shared_ptr<TunerFilter>& sharedFilter) {
283 Mutex::Autolock _l(mSharedFiltersLock);
284
285 // Use sharedFilter address as token.
286 mSharedFilters.erase(to_string(reinterpret_cast<std::uintptr_t>(sharedFilter.get())));
287}
288
Hongguang093c5f32021-08-09 19:46:34 -0700289void TunerService::updateTunerResources() {
Kensuke Miyagia5154b32022-11-07 15:08:05 -0800290 TunerHelper::updateTunerResources(getTRMFrontendInfos(),
291 getTRMDemuxInfos(),
292 getTRMLnbHandles());
Hongguang093c5f32021-08-09 19:46:34 -0700293}
294
295vector<TunerFrontendInfo> TunerService::getTRMFrontendInfos() {
Amy Zhangce2cb402021-01-21 12:50:47 -0800296 vector<TunerFrontendInfo> infos;
Hongguang093c5f32021-08-09 19:46:34 -0700297 vector<int32_t> ids;
298 auto status = mTuner->getFrontendIds(&ids);
299 if (!status.isOk()) {
300 return infos;
301 }
302
Amy Zhangce2cb402021-01-21 12:50:47 -0800303 for (int i = 0; i < ids.size(); i++) {
304 FrontendInfo frontendInfo;
Hongguangeae68392021-07-27 20:56:23 -0700305 auto res = mTuner->getFrontendInfo(ids[i], &frontendInfo);
306 if (!res.isOk()) {
Amy Zhangce2cb402021-01-21 12:50:47 -0800307 continue;
308 }
309 TunerFrontendInfo tunerFrontendInfo{
Hongguang093c5f32021-08-09 19:46:34 -0700310 .handle = TunerHelper::getResourceHandleFromId((int)ids[i], FRONTEND),
Hongguangeae68392021-07-27 20:56:23 -0700311 .type = static_cast<int>(frontendInfo.type),
312 .exclusiveGroupId = frontendInfo.exclusiveGroupId,
Amy Zhangce2cb402021-01-21 12:50:47 -0800313 };
314 infos.push_back(tunerFrontendInfo);
315 }
Hongguang093c5f32021-08-09 19:46:34 -0700316
317 return infos;
Amy Zhangce2cb402021-01-21 12:50:47 -0800318}
319
Kensuke Miyagia5154b32022-11-07 15:08:05 -0800320vector<TunerDemuxInfo> TunerService::getTRMDemuxInfos() {
321 vector<TunerDemuxInfo> infos;
322 vector<int32_t> ids;
323
324 if (mTunerVersion <= TUNER_HAL_VERSION_2_0) {
325 return infos;
326 }
327
328 auto status = mTuner->getDemuxIds(&ids);
329 if (!status.isOk()) {
330 return infos;
331 }
332
333 for (int i = 0; i < ids.size(); i++) {
334 DemuxInfo demuxInfo;
335 mTuner->getDemuxInfo(ids[i], &demuxInfo);
336 TunerDemuxInfo tunerDemuxInfo{
337 .handle = TunerHelper::getResourceHandleFromId((int)ids[i], DEMUX),
338 .filterTypes = static_cast<int>(demuxInfo.filterTypes)
339 };
340 infos.push_back(tunerDemuxInfo);
341 }
342
343 return infos;
344}
345
Hongguang093c5f32021-08-09 19:46:34 -0700346vector<int32_t> TunerService::getTRMLnbHandles() {
Hongguangeae68392021-07-27 20:56:23 -0700347 vector<int32_t> lnbHandles;
348 if (mTuner != nullptr) {
349 vector<int32_t> lnbIds;
350 auto res = mTuner->getLnbIds(&lnbIds);
351 if (res.isOk()) {
Amy Zhangce2cb402021-01-21 12:50:47 -0800352 for (int i = 0; i < lnbIds.size(); i++) {
Hongguang093c5f32021-08-09 19:46:34 -0700353 lnbHandles.push_back(TunerHelper::getResourceHandleFromId(lnbIds[i], LNB));
Amy Zhangce2cb402021-01-21 12:50:47 -0800354 }
355 }
356 }
357
358 return lnbHandles;
359}
360
Hongguangeae68392021-07-27 20:56:23 -0700361} // namespace tuner
362} // namespace tv
363} // namespace media
364} // namespace android
365} // namespace aidl