1*ec779b8eSAndroid Build Coastguard Worker /**
2*ec779b8eSAndroid Build Coastguard Worker * Copyright (c) 2021, 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_NDEBUG 0
18*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "TunerService"
19*ec779b8eSAndroid Build Coastguard Worker
20*ec779b8eSAndroid Build Coastguard Worker #include "TunerService.h"
21*ec779b8eSAndroid Build Coastguard Worker
22*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/hardware/tv/tuner/IDemux.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/hardware/tv/tuner/IDescrambler.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/hardware/tv/tuner/IFrontend.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/hardware/tv/tuner/ILnb.h>
26*ec779b8eSAndroid Build Coastguard Worker #include <aidl/android/hardware/tv/tuner/Result.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <android/binder_manager.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <binder/IPCThreadState.h>
29*ec779b8eSAndroid Build Coastguard Worker #include <binder/PermissionCache.h>
30*ec779b8eSAndroid Build Coastguard Worker #include <cutils/properties.h>
31*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h>
32*ec779b8eSAndroid Build Coastguard Worker
33*ec779b8eSAndroid Build Coastguard Worker #include <string>
34*ec779b8eSAndroid Build Coastguard Worker
35*ec779b8eSAndroid Build Coastguard Worker #include "TunerDemux.h"
36*ec779b8eSAndroid Build Coastguard Worker #include "TunerDescrambler.h"
37*ec779b8eSAndroid Build Coastguard Worker #include "TunerFrontend.h"
38*ec779b8eSAndroid Build Coastguard Worker #include "TunerHelper.h"
39*ec779b8eSAndroid Build Coastguard Worker #include "TunerLnb.h"
40*ec779b8eSAndroid Build Coastguard Worker
41*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::tv::tuner::IDemux;
42*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::tv::tuner::IDescrambler;
43*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::tv::tuner::IFrontend;
44*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::tv::tuner::Result;
45*ec779b8eSAndroid Build Coastguard Worker using ::android::IPCThreadState;
46*ec779b8eSAndroid Build Coastguard Worker using ::android::PermissionCache;
47*ec779b8eSAndroid Build Coastguard Worker using ::android::sp;
48*ec779b8eSAndroid Build Coastguard Worker
49*ec779b8eSAndroid Build Coastguard Worker namespace aidl {
50*ec779b8eSAndroid Build Coastguard Worker namespace android {
51*ec779b8eSAndroid Build Coastguard Worker namespace media {
52*ec779b8eSAndroid Build Coastguard Worker namespace tv {
53*ec779b8eSAndroid Build Coastguard Worker namespace tuner {
54*ec779b8eSAndroid Build Coastguard Worker
TunerService()55*ec779b8eSAndroid Build Coastguard Worker TunerService::TunerService() {
56*ec779b8eSAndroid Build Coastguard Worker const string statsServiceName = string() + ITuner::descriptor + "/default";
57*ec779b8eSAndroid Build Coastguard Worker ::ndk::SpAIBinder binder(AServiceManager_waitForService(statsServiceName.c_str()));
58*ec779b8eSAndroid Build Coastguard Worker mTuner = ITuner::fromBinder(binder);
59*ec779b8eSAndroid Build Coastguard Worker ALOGE_IF(mTuner == nullptr, "Failed to get Tuner HAL Service");
60*ec779b8eSAndroid Build Coastguard Worker
61*ec779b8eSAndroid Build Coastguard Worker mTunerVersion = TUNER_HAL_VERSION_2_0;
62*ec779b8eSAndroid Build Coastguard Worker if (mTuner->getInterfaceVersion(&mTunerVersion).isOk()) {
63*ec779b8eSAndroid Build Coastguard Worker // Tuner AIDL HAL version 1 will be Tuner HAL 2.0
64*ec779b8eSAndroid Build Coastguard Worker mTunerVersion = (mTunerVersion + 1) << 16;
65*ec779b8eSAndroid Build Coastguard Worker }
66*ec779b8eSAndroid Build Coastguard Worker
67*ec779b8eSAndroid Build Coastguard Worker // Register the tuner resources to TRM.
68*ec779b8eSAndroid Build Coastguard Worker updateTunerResources();
69*ec779b8eSAndroid Build Coastguard Worker }
70*ec779b8eSAndroid Build Coastguard Worker
~TunerService()71*ec779b8eSAndroid Build Coastguard Worker TunerService::~TunerService() {
72*ec779b8eSAndroid Build Coastguard Worker mTuner = nullptr;
73*ec779b8eSAndroid Build Coastguard Worker }
74*ec779b8eSAndroid Build Coastguard Worker
instantiate()75*ec779b8eSAndroid Build Coastguard Worker binder_status_t TunerService::instantiate() {
76*ec779b8eSAndroid Build Coastguard Worker shared_ptr<TunerService> tunerService = ::ndk::SharedRefBase::make<TunerService>();
77*ec779b8eSAndroid Build Coastguard Worker bool lazyHal = property_get_bool("ro.tuner.lazyhal", false);
78*ec779b8eSAndroid Build Coastguard Worker if (lazyHal) {
79*ec779b8eSAndroid Build Coastguard Worker return AServiceManager_registerLazyService(tunerService->asBinder().get(),
80*ec779b8eSAndroid Build Coastguard Worker getServiceName());
81*ec779b8eSAndroid Build Coastguard Worker }
82*ec779b8eSAndroid Build Coastguard Worker return AServiceManager_addService(tunerService->asBinder().get(), getServiceName());
83*ec779b8eSAndroid Build Coastguard Worker }
84*ec779b8eSAndroid Build Coastguard Worker
openDemux(int64_t in_demuxHandle,shared_ptr<ITunerDemux> * _aidl_return)85*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerService::openDemux(int64_t in_demuxHandle,
86*ec779b8eSAndroid Build Coastguard Worker shared_ptr<ITunerDemux>* _aidl_return) {
87*ec779b8eSAndroid Build Coastguard Worker ALOGV("openDemux");
88*ec779b8eSAndroid Build Coastguard Worker shared_ptr<IDemux> demux;
89*ec779b8eSAndroid Build Coastguard Worker bool fallBackToOpenDemux = false;
90*ec779b8eSAndroid Build Coastguard Worker vector<int32_t> ids;
91*ec779b8eSAndroid Build Coastguard Worker
92*ec779b8eSAndroid Build Coastguard Worker if (mTunerVersion <= TUNER_HAL_VERSION_2_0) {
93*ec779b8eSAndroid Build Coastguard Worker fallBackToOpenDemux = true;
94*ec779b8eSAndroid Build Coastguard Worker } else {
95*ec779b8eSAndroid Build Coastguard Worker mTuner->getDemuxIds(&ids);
96*ec779b8eSAndroid Build Coastguard Worker if (ids.size() == 0) {
97*ec779b8eSAndroid Build Coastguard Worker fallBackToOpenDemux = true;
98*ec779b8eSAndroid Build Coastguard Worker }
99*ec779b8eSAndroid Build Coastguard Worker }
100*ec779b8eSAndroid Build Coastguard Worker
101*ec779b8eSAndroid Build Coastguard Worker if (fallBackToOpenDemux) {
102*ec779b8eSAndroid Build Coastguard Worker auto status = mTuner->openDemux(&ids, &demux);
103*ec779b8eSAndroid Build Coastguard Worker if (status.isOk()) {
104*ec779b8eSAndroid Build Coastguard Worker *_aidl_return = ::ndk::SharedRefBase::make<TunerDemux>(demux, ids[0],
105*ec779b8eSAndroid Build Coastguard Worker this->ref<TunerService>());
106*ec779b8eSAndroid Build Coastguard Worker }
107*ec779b8eSAndroid Build Coastguard Worker return status;
108*ec779b8eSAndroid Build Coastguard Worker } else {
109*ec779b8eSAndroid Build Coastguard Worker int id = TunerHelper::getResourceIdFromHandle(in_demuxHandle, DEMUX);
110*ec779b8eSAndroid Build Coastguard Worker auto status = mTuner->openDemuxById(id, &demux);
111*ec779b8eSAndroid Build Coastguard Worker if (status.isOk()) {
112*ec779b8eSAndroid Build Coastguard Worker *_aidl_return =
113*ec779b8eSAndroid Build Coastguard Worker ::ndk::SharedRefBase::make<TunerDemux>(demux, id, this->ref<TunerService>());
114*ec779b8eSAndroid Build Coastguard Worker }
115*ec779b8eSAndroid Build Coastguard Worker return status;
116*ec779b8eSAndroid Build Coastguard Worker }
117*ec779b8eSAndroid Build Coastguard Worker }
118*ec779b8eSAndroid Build Coastguard Worker
getDemuxInfo(int64_t in_demuxHandle,DemuxInfo * _aidl_return)119*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerService::getDemuxInfo(int64_t in_demuxHandle, DemuxInfo* _aidl_return) {
120*ec779b8eSAndroid Build Coastguard Worker if (mTunerVersion <= TUNER_HAL_VERSION_2_0) {
121*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::fromServiceSpecificError(
122*ec779b8eSAndroid Build Coastguard Worker static_cast<int32_t>(Result::UNAVAILABLE));
123*ec779b8eSAndroid Build Coastguard Worker }
124*ec779b8eSAndroid Build Coastguard Worker int id = TunerHelper::getResourceIdFromHandle(in_demuxHandle, DEMUX);
125*ec779b8eSAndroid Build Coastguard Worker return mTuner->getDemuxInfo(id, _aidl_return);
126*ec779b8eSAndroid Build Coastguard Worker }
127*ec779b8eSAndroid Build Coastguard Worker
getDemuxInfoList(vector<DemuxInfo> * _aidl_return)128*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerService::getDemuxInfoList(vector<DemuxInfo>* _aidl_return) {
129*ec779b8eSAndroid Build Coastguard Worker if (mTunerVersion <= TUNER_HAL_VERSION_2_0) {
130*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::fromServiceSpecificError(
131*ec779b8eSAndroid Build Coastguard Worker static_cast<int32_t>(Result::UNAVAILABLE));
132*ec779b8eSAndroid Build Coastguard Worker }
133*ec779b8eSAndroid Build Coastguard Worker vector<DemuxInfo> demuxInfoList;
134*ec779b8eSAndroid Build Coastguard Worker vector<int32_t> ids;
135*ec779b8eSAndroid Build Coastguard Worker auto status = mTuner->getDemuxIds(&ids);
136*ec779b8eSAndroid Build Coastguard Worker if (!status.isOk()) {
137*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::fromServiceSpecificError(
138*ec779b8eSAndroid Build Coastguard Worker static_cast<int32_t>(Result::UNAVAILABLE));
139*ec779b8eSAndroid Build Coastguard Worker }
140*ec779b8eSAndroid Build Coastguard Worker
141*ec779b8eSAndroid Build Coastguard Worker for (int i = 0; i < ids.size(); i++) {
142*ec779b8eSAndroid Build Coastguard Worker DemuxInfo demuxInfo;
143*ec779b8eSAndroid Build Coastguard Worker auto res = mTuner->getDemuxInfo(ids[i], &demuxInfo);
144*ec779b8eSAndroid Build Coastguard Worker if (!res.isOk()) {
145*ec779b8eSAndroid Build Coastguard Worker continue;
146*ec779b8eSAndroid Build Coastguard Worker }
147*ec779b8eSAndroid Build Coastguard Worker demuxInfoList.push_back(demuxInfo);
148*ec779b8eSAndroid Build Coastguard Worker }
149*ec779b8eSAndroid Build Coastguard Worker
150*ec779b8eSAndroid Build Coastguard Worker if (demuxInfoList.size() > 0) {
151*ec779b8eSAndroid Build Coastguard Worker *_aidl_return = demuxInfoList;
152*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
153*ec779b8eSAndroid Build Coastguard Worker } else {
154*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::fromServiceSpecificError(
155*ec779b8eSAndroid Build Coastguard Worker static_cast<int32_t>(Result::UNAVAILABLE));
156*ec779b8eSAndroid Build Coastguard Worker }
157*ec779b8eSAndroid Build Coastguard Worker }
158*ec779b8eSAndroid Build Coastguard Worker
getDemuxCaps(DemuxCapabilities * _aidl_return)159*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerService::getDemuxCaps(DemuxCapabilities* _aidl_return) {
160*ec779b8eSAndroid Build Coastguard Worker ALOGV("getDemuxCaps");
161*ec779b8eSAndroid Build Coastguard Worker return mTuner->getDemuxCaps(_aidl_return);
162*ec779b8eSAndroid Build Coastguard Worker }
163*ec779b8eSAndroid Build Coastguard Worker
getFrontendIds(vector<int32_t> * ids)164*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerService::getFrontendIds(vector<int32_t>* ids) {
165*ec779b8eSAndroid Build Coastguard Worker return mTuner->getFrontendIds(ids);
166*ec779b8eSAndroid Build Coastguard Worker }
167*ec779b8eSAndroid Build Coastguard Worker
getFrontendInfo(int32_t id,FrontendInfo * _aidl_return)168*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerService::getFrontendInfo(int32_t id, FrontendInfo* _aidl_return) {
169*ec779b8eSAndroid Build Coastguard Worker return mTuner->getFrontendInfo(id, _aidl_return);
170*ec779b8eSAndroid Build Coastguard Worker }
171*ec779b8eSAndroid Build Coastguard Worker
openFrontend(int64_t frontendHandle,shared_ptr<ITunerFrontend> * _aidl_return)172*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerService::openFrontend(int64_t frontendHandle,
173*ec779b8eSAndroid Build Coastguard Worker shared_ptr<ITunerFrontend>* _aidl_return) {
174*ec779b8eSAndroid Build Coastguard Worker int id = TunerHelper::getResourceIdFromHandle(frontendHandle, FRONTEND);
175*ec779b8eSAndroid Build Coastguard Worker shared_ptr<IFrontend> frontend;
176*ec779b8eSAndroid Build Coastguard Worker auto status = mTuner->openFrontendById(id, &frontend);
177*ec779b8eSAndroid Build Coastguard Worker if (status.isOk()) {
178*ec779b8eSAndroid Build Coastguard Worker *_aidl_return = ::ndk::SharedRefBase::make<TunerFrontend>(frontend, id);
179*ec779b8eSAndroid Build Coastguard Worker }
180*ec779b8eSAndroid Build Coastguard Worker
181*ec779b8eSAndroid Build Coastguard Worker return status;
182*ec779b8eSAndroid Build Coastguard Worker }
183*ec779b8eSAndroid Build Coastguard Worker
openLnb(int64_t lnbHandle,shared_ptr<ITunerLnb> * _aidl_return)184*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerService::openLnb(int64_t lnbHandle, shared_ptr<ITunerLnb>* _aidl_return) {
185*ec779b8eSAndroid Build Coastguard Worker shared_ptr<ILnb> lnb;
186*ec779b8eSAndroid Build Coastguard Worker int id = TunerHelper::getResourceIdFromHandle(lnbHandle, LNB);
187*ec779b8eSAndroid Build Coastguard Worker auto status = mTuner->openLnbById(id, &lnb);
188*ec779b8eSAndroid Build Coastguard Worker if (status.isOk()) {
189*ec779b8eSAndroid Build Coastguard Worker *_aidl_return = ::ndk::SharedRefBase::make<TunerLnb>(lnb, id);
190*ec779b8eSAndroid Build Coastguard Worker }
191*ec779b8eSAndroid Build Coastguard Worker
192*ec779b8eSAndroid Build Coastguard Worker return status;
193*ec779b8eSAndroid Build Coastguard Worker }
194*ec779b8eSAndroid Build Coastguard Worker
openLnbByName(const string & lnbName,shared_ptr<ITunerLnb> * _aidl_return)195*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerService::openLnbByName(const string& lnbName,
196*ec779b8eSAndroid Build Coastguard Worker shared_ptr<ITunerLnb>* _aidl_return) {
197*ec779b8eSAndroid Build Coastguard Worker vector<int32_t> id;
198*ec779b8eSAndroid Build Coastguard Worker shared_ptr<ILnb> lnb;
199*ec779b8eSAndroid Build Coastguard Worker auto status = mTuner->openLnbByName(lnbName, &id, &lnb);
200*ec779b8eSAndroid Build Coastguard Worker if (status.isOk()) {
201*ec779b8eSAndroid Build Coastguard Worker *_aidl_return = ::ndk::SharedRefBase::make<TunerLnb>(lnb, id[0]);
202*ec779b8eSAndroid Build Coastguard Worker }
203*ec779b8eSAndroid Build Coastguard Worker
204*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
205*ec779b8eSAndroid Build Coastguard Worker }
206*ec779b8eSAndroid Build Coastguard Worker
openDescrambler(int64_t,shared_ptr<ITunerDescrambler> * _aidl_return)207*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerService::openDescrambler(int64_t /*descramblerHandle*/,
208*ec779b8eSAndroid Build Coastguard Worker shared_ptr<ITunerDescrambler>* _aidl_return) {
209*ec779b8eSAndroid Build Coastguard Worker shared_ptr<IDescrambler> descrambler;
210*ec779b8eSAndroid Build Coastguard Worker // int id = TunerHelper::getResourceIdFromHandle(descramblerHandle, DESCRAMBLER);
211*ec779b8eSAndroid Build Coastguard Worker auto status = mTuner->openDescrambler(&descrambler);
212*ec779b8eSAndroid Build Coastguard Worker if (status.isOk()) {
213*ec779b8eSAndroid Build Coastguard Worker *_aidl_return = ::ndk::SharedRefBase::make<TunerDescrambler>(descrambler);
214*ec779b8eSAndroid Build Coastguard Worker }
215*ec779b8eSAndroid Build Coastguard Worker
216*ec779b8eSAndroid Build Coastguard Worker return status;
217*ec779b8eSAndroid Build Coastguard Worker }
218*ec779b8eSAndroid Build Coastguard Worker
getTunerHalVersion(int * _aidl_return)219*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerService::getTunerHalVersion(int* _aidl_return) {
220*ec779b8eSAndroid Build Coastguard Worker *_aidl_return = mTunerVersion;
221*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
222*ec779b8eSAndroid Build Coastguard Worker }
223*ec779b8eSAndroid Build Coastguard Worker
openSharedFilter(const string & in_filterToken,const shared_ptr<ITunerFilterCallback> & in_cb,shared_ptr<ITunerFilter> * _aidl_return)224*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerService::openSharedFilter(const string& in_filterToken,
225*ec779b8eSAndroid Build Coastguard Worker const shared_ptr<ITunerFilterCallback>& in_cb,
226*ec779b8eSAndroid Build Coastguard Worker shared_ptr<ITunerFilter>* _aidl_return) {
227*ec779b8eSAndroid Build Coastguard Worker if (!PermissionCache::checkCallingPermission(sSharedFilterPermission)) {
228*ec779b8eSAndroid Build Coastguard Worker ALOGE("Request requires android.permission.ACCESS_TV_SHARED_FILTER");
229*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::fromServiceSpecificError(
230*ec779b8eSAndroid Build Coastguard Worker static_cast<int32_t>(Result::UNAVAILABLE));
231*ec779b8eSAndroid Build Coastguard Worker }
232*ec779b8eSAndroid Build Coastguard Worker
233*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock _l(mSharedFiltersLock);
234*ec779b8eSAndroid Build Coastguard Worker if (mSharedFilters.find(in_filterToken) == mSharedFilters.end()) {
235*ec779b8eSAndroid Build Coastguard Worker *_aidl_return = nullptr;
236*ec779b8eSAndroid Build Coastguard Worker ALOGD("fail to find %s", in_filterToken.c_str());
237*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::fromServiceSpecificError(
238*ec779b8eSAndroid Build Coastguard Worker static_cast<int32_t>(Result::INVALID_STATE));
239*ec779b8eSAndroid Build Coastguard Worker }
240*ec779b8eSAndroid Build Coastguard Worker
241*ec779b8eSAndroid Build Coastguard Worker shared_ptr<TunerFilter> filter = mSharedFilters.at(in_filterToken);
242*ec779b8eSAndroid Build Coastguard Worker IPCThreadState* ipc = IPCThreadState::self();
243*ec779b8eSAndroid Build Coastguard Worker const int pid = ipc->getCallingPid();
244*ec779b8eSAndroid Build Coastguard Worker if (!filter->isSharedFilterAllowed(pid)) {
245*ec779b8eSAndroid Build Coastguard Worker *_aidl_return = nullptr;
246*ec779b8eSAndroid Build Coastguard Worker ALOGD("shared filter %s is opened in the same process", in_filterToken.c_str());
247*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::fromServiceSpecificError(
248*ec779b8eSAndroid Build Coastguard Worker static_cast<int32_t>(Result::INVALID_STATE));
249*ec779b8eSAndroid Build Coastguard Worker }
250*ec779b8eSAndroid Build Coastguard Worker
251*ec779b8eSAndroid Build Coastguard Worker filter->attachSharedFilterCallback(in_cb);
252*ec779b8eSAndroid Build Coastguard Worker
253*ec779b8eSAndroid Build Coastguard Worker *_aidl_return = filter;
254*ec779b8eSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
255*ec779b8eSAndroid Build Coastguard Worker }
256*ec779b8eSAndroid Build Coastguard Worker
isLnaSupported(bool * _aidl_return)257*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerService::isLnaSupported(bool* _aidl_return) {
258*ec779b8eSAndroid Build Coastguard Worker ALOGV("isLnaSupported");
259*ec779b8eSAndroid Build Coastguard Worker return mTuner->isLnaSupported(_aidl_return);
260*ec779b8eSAndroid Build Coastguard Worker }
261*ec779b8eSAndroid Build Coastguard Worker
setLna(bool bEnable)262*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerService::setLna(bool bEnable) {
263*ec779b8eSAndroid Build Coastguard Worker return mTuner->setLna(bEnable);
264*ec779b8eSAndroid Build Coastguard Worker }
265*ec779b8eSAndroid Build Coastguard Worker
setMaxNumberOfFrontends(FrontendType in_frontendType,int32_t in_maxNumber)266*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerService::setMaxNumberOfFrontends(FrontendType in_frontendType,
267*ec779b8eSAndroid Build Coastguard Worker int32_t in_maxNumber) {
268*ec779b8eSAndroid Build Coastguard Worker return mTuner->setMaxNumberOfFrontends(in_frontendType, in_maxNumber);
269*ec779b8eSAndroid Build Coastguard Worker }
270*ec779b8eSAndroid Build Coastguard Worker
getMaxNumberOfFrontends(FrontendType in_frontendType,int32_t * _aidl_return)271*ec779b8eSAndroid Build Coastguard Worker ::ndk::ScopedAStatus TunerService::getMaxNumberOfFrontends(FrontendType in_frontendType,
272*ec779b8eSAndroid Build Coastguard Worker int32_t* _aidl_return) {
273*ec779b8eSAndroid Build Coastguard Worker return mTuner->getMaxNumberOfFrontends(in_frontendType, _aidl_return);
274*ec779b8eSAndroid Build Coastguard Worker }
275*ec779b8eSAndroid Build Coastguard Worker
addFilterToShared(const shared_ptr<TunerFilter> & sharedFilter)276*ec779b8eSAndroid Build Coastguard Worker string TunerService::addFilterToShared(const shared_ptr<TunerFilter>& sharedFilter) {
277*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock _l(mSharedFiltersLock);
278*ec779b8eSAndroid Build Coastguard Worker
279*ec779b8eSAndroid Build Coastguard Worker // Use sharedFilter address as token.
280*ec779b8eSAndroid Build Coastguard Worker string token = to_string(reinterpret_cast<std::uintptr_t>(sharedFilter.get()));
281*ec779b8eSAndroid Build Coastguard Worker mSharedFilters[token] = sharedFilter;
282*ec779b8eSAndroid Build Coastguard Worker return token;
283*ec779b8eSAndroid Build Coastguard Worker }
284*ec779b8eSAndroid Build Coastguard Worker
removeSharedFilter(const shared_ptr<TunerFilter> & sharedFilter)285*ec779b8eSAndroid Build Coastguard Worker void TunerService::removeSharedFilter(const shared_ptr<TunerFilter>& sharedFilter) {
286*ec779b8eSAndroid Build Coastguard Worker Mutex::Autolock _l(mSharedFiltersLock);
287*ec779b8eSAndroid Build Coastguard Worker
288*ec779b8eSAndroid Build Coastguard Worker // Use sharedFilter address as token.
289*ec779b8eSAndroid Build Coastguard Worker mSharedFilters.erase(to_string(reinterpret_cast<std::uintptr_t>(sharedFilter.get())));
290*ec779b8eSAndroid Build Coastguard Worker }
291*ec779b8eSAndroid Build Coastguard Worker
updateTunerResources()292*ec779b8eSAndroid Build Coastguard Worker void TunerService::updateTunerResources() {
293*ec779b8eSAndroid Build Coastguard Worker TunerHelper::updateTunerResources(getTRMFrontendInfos(),
294*ec779b8eSAndroid Build Coastguard Worker getTRMDemuxInfos(),
295*ec779b8eSAndroid Build Coastguard Worker getTRMLnbHandles());
296*ec779b8eSAndroid Build Coastguard Worker }
297*ec779b8eSAndroid Build Coastguard Worker
getTRMFrontendInfos()298*ec779b8eSAndroid Build Coastguard Worker vector<TunerFrontendInfo> TunerService::getTRMFrontendInfos() {
299*ec779b8eSAndroid Build Coastguard Worker vector<TunerFrontendInfo> infos;
300*ec779b8eSAndroid Build Coastguard Worker vector<int32_t> ids;
301*ec779b8eSAndroid Build Coastguard Worker auto status = mTuner->getFrontendIds(&ids);
302*ec779b8eSAndroid Build Coastguard Worker if (!status.isOk()) {
303*ec779b8eSAndroid Build Coastguard Worker return infos;
304*ec779b8eSAndroid Build Coastguard Worker }
305*ec779b8eSAndroid Build Coastguard Worker
306*ec779b8eSAndroid Build Coastguard Worker for (int i = 0; i < ids.size(); i++) {
307*ec779b8eSAndroid Build Coastguard Worker FrontendInfo frontendInfo;
308*ec779b8eSAndroid Build Coastguard Worker auto res = mTuner->getFrontendInfo(ids[i], &frontendInfo);
309*ec779b8eSAndroid Build Coastguard Worker if (!res.isOk()) {
310*ec779b8eSAndroid Build Coastguard Worker continue;
311*ec779b8eSAndroid Build Coastguard Worker }
312*ec779b8eSAndroid Build Coastguard Worker TunerFrontendInfo tunerFrontendInfo{
313*ec779b8eSAndroid Build Coastguard Worker .handle = TunerHelper::getResourceHandleFromId(ids[i], FRONTEND),
314*ec779b8eSAndroid Build Coastguard Worker .type = static_cast<int>(frontendInfo.type),
315*ec779b8eSAndroid Build Coastguard Worker .exclusiveGroupId = frontendInfo.exclusiveGroupId,
316*ec779b8eSAndroid Build Coastguard Worker };
317*ec779b8eSAndroid Build Coastguard Worker infos.push_back(tunerFrontendInfo);
318*ec779b8eSAndroid Build Coastguard Worker }
319*ec779b8eSAndroid Build Coastguard Worker
320*ec779b8eSAndroid Build Coastguard Worker return infos;
321*ec779b8eSAndroid Build Coastguard Worker }
322*ec779b8eSAndroid Build Coastguard Worker
getTRMDemuxInfos()323*ec779b8eSAndroid Build Coastguard Worker vector<TunerDemuxInfo> TunerService::getTRMDemuxInfos() {
324*ec779b8eSAndroid Build Coastguard Worker vector<TunerDemuxInfo> infos;
325*ec779b8eSAndroid Build Coastguard Worker vector<int32_t> ids;
326*ec779b8eSAndroid Build Coastguard Worker
327*ec779b8eSAndroid Build Coastguard Worker if (mTunerVersion <= TUNER_HAL_VERSION_2_0) {
328*ec779b8eSAndroid Build Coastguard Worker return infos;
329*ec779b8eSAndroid Build Coastguard Worker }
330*ec779b8eSAndroid Build Coastguard Worker
331*ec779b8eSAndroid Build Coastguard Worker auto status = mTuner->getDemuxIds(&ids);
332*ec779b8eSAndroid Build Coastguard Worker if (!status.isOk()) {
333*ec779b8eSAndroid Build Coastguard Worker return infos;
334*ec779b8eSAndroid Build Coastguard Worker }
335*ec779b8eSAndroid Build Coastguard Worker
336*ec779b8eSAndroid Build Coastguard Worker for (int i = 0; i < ids.size(); i++) {
337*ec779b8eSAndroid Build Coastguard Worker DemuxInfo demuxInfo;
338*ec779b8eSAndroid Build Coastguard Worker mTuner->getDemuxInfo(ids[i], &demuxInfo);
339*ec779b8eSAndroid Build Coastguard Worker TunerDemuxInfo tunerDemuxInfo{.handle = TunerHelper::getResourceHandleFromId(ids[i], DEMUX),
340*ec779b8eSAndroid Build Coastguard Worker .filterTypes = static_cast<int>(demuxInfo.filterTypes)};
341*ec779b8eSAndroid Build Coastguard Worker infos.push_back(tunerDemuxInfo);
342*ec779b8eSAndroid Build Coastguard Worker }
343*ec779b8eSAndroid Build Coastguard Worker
344*ec779b8eSAndroid Build Coastguard Worker return infos;
345*ec779b8eSAndroid Build Coastguard Worker }
346*ec779b8eSAndroid Build Coastguard Worker
getTRMLnbHandles()347*ec779b8eSAndroid Build Coastguard Worker vector<int64_t> TunerService::getTRMLnbHandles() {
348*ec779b8eSAndroid Build Coastguard Worker vector<int64_t> lnbHandles;
349*ec779b8eSAndroid Build Coastguard Worker if (mTuner != nullptr) {
350*ec779b8eSAndroid Build Coastguard Worker vector<int32_t> lnbIds;
351*ec779b8eSAndroid Build Coastguard Worker auto res = mTuner->getLnbIds(&lnbIds);
352*ec779b8eSAndroid Build Coastguard Worker if (res.isOk()) {
353*ec779b8eSAndroid Build Coastguard Worker for (int i = 0; i < lnbIds.size(); i++) {
354*ec779b8eSAndroid Build Coastguard Worker lnbHandles.push_back(TunerHelper::getResourceHandleFromId(lnbIds[i], LNB));
355*ec779b8eSAndroid Build Coastguard Worker }
356*ec779b8eSAndroid Build Coastguard Worker }
357*ec779b8eSAndroid Build Coastguard Worker }
358*ec779b8eSAndroid Build Coastguard Worker
359*ec779b8eSAndroid Build Coastguard Worker return lnbHandles;
360*ec779b8eSAndroid Build Coastguard Worker }
361*ec779b8eSAndroid Build Coastguard Worker
362*ec779b8eSAndroid Build Coastguard Worker } // namespace tuner
363*ec779b8eSAndroid Build Coastguard Worker } // namespace tv
364*ec779b8eSAndroid Build Coastguard Worker } // namespace media
365*ec779b8eSAndroid Build Coastguard Worker } // namespace android
366*ec779b8eSAndroid Build Coastguard Worker } // namespace aidl
367