blob: 8515874c022fc626d6e78da7d54c87068bbde0bc [file] [log] [blame]
Amy Zhangbf68a162020-11-23 17:42:40 -08001/*
Hongguang56637e92021-07-28 17:32:55 -07002 * Copyright 2021 The Android Open Source Project
Amy Zhangbf68a162020-11-23 17:42:40 -08003 *
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#define LOG_TAG "TunerClient"
18
19#include <android/binder_manager.h>
20#include <android-base/logging.h>
21#include <utils/Log.h>
22
23#include "TunerClient.h"
24
Hongguang56637e92021-07-28 17:32:55 -070025using ::aidl::android::hardware::tv::tuner::FrontendStatusType;
26using ::aidl::android::hardware::tv::tuner::FrontendType;
Amy Zhangbf68a162020-11-23 17:42:40 -080027
28namespace android {
29
Hongguang56637e92021-07-28 17:32:55 -070030int32_t TunerClient::mTunerVersion;
Amy Zhangbf68a162020-11-23 17:42:40 -080031
32/////////////// TunerClient ///////////////////////
33
34TunerClient::TunerClient() {
Hongguang00ef56d2022-08-10 13:17:41 -070035 ::ndk::SpAIBinder binder(AServiceManager_waitForService("media.tuner"));
36 mTunerService = ITunerService::fromBinder(binder);
Hongguang56637e92021-07-28 17:32:55 -070037 if (mTunerService == nullptr) {
Amy Zhangbf68a162020-11-23 17:42:40 -080038 ALOGE("Failed to get tuner service");
Amy Zhang9eeba432021-01-21 12:52:05 -080039 } else {
Amy Zhang9abbe102021-02-08 19:51:18 -080040 mTunerService->getTunerHalVersion(&mTunerVersion);
Amy Zhangbf68a162020-11-23 17:42:40 -080041 }
42}
43
44TunerClient::~TunerClient() {
Amy Zhangbf68a162020-11-23 17:42:40 -080045}
46
Hongguang56637e92021-07-28 17:32:55 -070047vector<int32_t> TunerClient::getFrontendIds() {
48 vector<int32_t> ids;
shubang68f32a32020-12-29 00:34:24 -080049
Hongguang56637e92021-07-28 17:32:55 -070050 if (mTunerService != nullptr) {
51 Status s = mTunerService->getFrontendIds(&ids);
52 if (!s.isOk()) {
shubang68f32a32020-12-29 00:34:24 -080053 ids.clear();
shubang68f32a32020-12-29 00:34:24 -080054 }
Amy Zhangbf68a162020-11-23 17:42:40 -080055 }
56
57 return ids;
58}
59
Hongguang56637e92021-07-28 17:32:55 -070060sp<FrontendClient> TunerClient::openFrontend(int32_t frontendHandle) {
61 if (mTunerService != nullptr) {
Amy Zhangbf68a162020-11-23 17:42:40 -080062 shared_ptr<ITunerFrontend> tunerFrontend;
Amy Zhang4a07e802021-01-21 17:10:21 -080063 Status s = mTunerService->openFrontend(frontendHandle, &tunerFrontend);
Hongguang56637e92021-07-28 17:32:55 -070064 if (!s.isOk() || tunerFrontend == nullptr) {
65 return nullptr;
Amy Zhangb9f3cab2021-01-13 15:24:14 -080066 }
Hongguang56637e92021-07-28 17:32:55 -070067 int32_t id;
Amy Zhang4a07e802021-01-21 17:10:21 -080068 s = tunerFrontend->getFrontendId(&id);
Hongguang56637e92021-07-28 17:32:55 -070069 if (!s.isOk()) {
70 tunerFrontend->close();
71 return nullptr;
Amy Zhang4a07e802021-01-21 17:10:21 -080072 }
Hongguang56637e92021-07-28 17:32:55 -070073 FrontendInfo frontendInfo;
74 s = mTunerService->getFrontendInfo(id, &frontendInfo);
75 if (!s.isOk()) {
76 tunerFrontend->close();
77 return nullptr;
Amy Zhang4a07e802021-01-21 17:10:21 -080078 }
Hongguang56637e92021-07-28 17:32:55 -070079 return new FrontendClient(tunerFrontend, frontendInfo.type);
Amy Zhangbf68a162020-11-23 17:42:40 -080080 }
81
Hongguang56637e92021-07-28 17:32:55 -070082 return nullptr;
Amy Zhangbf68a162020-11-23 17:42:40 -080083}
84
Hongguang56637e92021-07-28 17:32:55 -070085shared_ptr<FrontendInfo> TunerClient::getFrontendInfo(int32_t id) {
86 if (mTunerService != nullptr) {
87 FrontendInfo aidlFrontendInfo;
Amy Zhang4a07e802021-01-21 17:10:21 -080088 Status s = mTunerService->getFrontendInfo(id, &aidlFrontendInfo);
Hongguang56637e92021-07-28 17:32:55 -070089 if (!s.isOk()) {
90 return nullptr;
Amy Zhang4a07e802021-01-21 17:10:21 -080091 }
Hongguang56637e92021-07-28 17:32:55 -070092 return make_shared<FrontendInfo>(aidlFrontendInfo);
Amy Zhangbf68a162020-11-23 17:42:40 -080093 }
94
Hongguang56637e92021-07-28 17:32:55 -070095 return nullptr;
Amy Zhangbf68a162020-11-23 17:42:40 -080096}
97
Hongguang56637e92021-07-28 17:32:55 -070098sp<DemuxClient> TunerClient::openDemux(int32_t demuxHandle) {
99 if (mTunerService != nullptr) {
Amy Zhang4a07e802021-01-21 17:10:21 -0800100 shared_ptr<ITunerDemux> tunerDemux;
101 Status s = mTunerService->openDemux(demuxHandle, &tunerDemux);
Hongguang56637e92021-07-28 17:32:55 -0700102 if (!s.isOk()) {
103 return nullptr;
Amy Zhang4a07e802021-01-21 17:10:21 -0800104 }
105 return new DemuxClient(tunerDemux);
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800106 }
107
Hongguang56637e92021-07-28 17:32:55 -0700108 return nullptr;
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800109}
110
Amy Zhang90a50b42021-01-11 16:58:59 -0800111shared_ptr<DemuxCapabilities> TunerClient::getDemuxCaps() {
Hongguang56637e92021-07-28 17:32:55 -0700112 if (mTunerService != nullptr) {
113 DemuxCapabilities aidlCaps;
Amy Zhang952794662021-02-04 15:56:22 -0800114 Status s = mTunerService->getDemuxCaps(&aidlCaps);
Hongguang56637e92021-07-28 17:32:55 -0700115 if (!s.isOk()) {
116 return nullptr;
Amy Zhang952794662021-02-04 15:56:22 -0800117 }
Hongguang56637e92021-07-28 17:32:55 -0700118 return make_shared<DemuxCapabilities>(aidlCaps);
Amy Zhang952794662021-02-04 15:56:22 -0800119 }
Amy Zhang90a50b42021-01-11 16:58:59 -0800120
Hongguang56637e92021-07-28 17:32:55 -0700121 return nullptr;
Amy Zhangb0f63ab2021-01-06 17:19:27 -0800122}
123
Hongguang56637e92021-07-28 17:32:55 -0700124sp<DescramblerClient> TunerClient::openDescrambler(int32_t descramblerHandle) {
125 if (mTunerService != nullptr) {
Amy Zhang38261c32021-02-03 20:38:52 -0800126 shared_ptr<ITunerDescrambler> tunerDescrambler;
127 Status s = mTunerService->openDescrambler(descramblerHandle, &tunerDescrambler);
Hongguang56637e92021-07-28 17:32:55 -0700128 if (!s.isOk()) {
129 return nullptr;
Amy Zhang38261c32021-02-03 20:38:52 -0800130 }
131 return new DescramblerClient(tunerDescrambler);
Amy Zhang921fd432021-01-07 13:18:27 -0800132 }
133
Hongguang56637e92021-07-28 17:32:55 -0700134 return nullptr;
Amy Zhangb5809be2021-01-26 16:27:23 -0800135}
Amy Zhangb0f63ab2021-01-06 17:19:27 -0800136
Hongguang56637e92021-07-28 17:32:55 -0700137sp<LnbClient> TunerClient::openLnb(int32_t lnbHandle) {
138 if (mTunerService != nullptr) {
Amy Zhang3ac0a3e2021-01-14 18:55:10 -0800139 shared_ptr<ITunerLnb> tunerLnb;
Amy Zhang4a07e802021-01-21 17:10:21 -0800140 Status s = mTunerService->openLnb(lnbHandle, &tunerLnb);
Hongguang56637e92021-07-28 17:32:55 -0700141 if (!s.isOk()) {
142 return nullptr;
Amy Zhang4a07e802021-01-21 17:10:21 -0800143 }
Amy Zhang3ac0a3e2021-01-14 18:55:10 -0800144 return new LnbClient(tunerLnb);
Amy Zhangd3d57b42021-01-07 11:14:43 -0800145 }
146
Hongguang56637e92021-07-28 17:32:55 -0700147 return nullptr;
Amy Zhangb0f63ab2021-01-06 17:19:27 -0800148}
149
Amy Zhangd3d57b42021-01-07 11:14:43 -0800150sp<LnbClient> TunerClient::openLnbByName(string lnbName) {
Hongguang56637e92021-07-28 17:32:55 -0700151 if (mTunerService != nullptr) {
Amy Zhang3ac0a3e2021-01-14 18:55:10 -0800152 shared_ptr<ITunerLnb> tunerLnb;
Amy Zhang4a07e802021-01-21 17:10:21 -0800153 Status s = mTunerService->openLnbByName(lnbName, &tunerLnb);
Hongguang56637e92021-07-28 17:32:55 -0700154 if (!s.isOk()) {
155 return nullptr;
Amy Zhang4a07e802021-01-21 17:10:21 -0800156 }
Amy Zhang3ac0a3e2021-01-14 18:55:10 -0800157 return new LnbClient(tunerLnb);
Amy Zhangd3d57b42021-01-07 11:14:43 -0800158 }
159
Hongguang56637e92021-07-28 17:32:55 -0700160 return nullptr;
Amy Zhangb0f63ab2021-01-06 17:19:27 -0800161}
162
Hongguangbcca4dc2021-10-04 22:13:43 -0700163sp<FilterClient> TunerClient::openSharedFilter(const string& filterToken,
164 sp<FilterClientCallback> cb) {
165 if (cb == nullptr) {
166 return nullptr;
167 }
168
169 if (mTunerService != nullptr) {
170 shared_ptr<ITunerFilter> tunerFilter;
171 shared_ptr<TunerFilterCallback> callback =
172 ::ndk::SharedRefBase::make<TunerFilterCallback>(cb);
173 Status s = mTunerService->openSharedFilter(filterToken, callback, &tunerFilter);
174 if (!s.isOk()) {
175 return nullptr;
176 }
177 DemuxFilterType type;
178 tunerFilter->getFilterType(&type);
179 return new FilterClient(type, tunerFilter);
180 }
181
182 return nullptr;
183}
184
Hongguang38904f82021-12-13 18:17:59 -0800185Result TunerClient::setLna(bool bEnable) {
186 if (mTunerService != nullptr) {
187 Status s = mTunerService->setLna(bEnable);
188 return ClientHelper::getServiceSpecificErrorCode(s);
189 }
190
191 return Result::INVALID_STATE;
192}
193
Hongguang4d9772d2021-12-22 15:58:37 -0800194Result TunerClient::setMaxNumberOfFrontends(FrontendType frontendType, int32_t maxNumber) {
195 if (mTunerService != nullptr) {
196 Status s = mTunerService->setMaxNumberOfFrontends(frontendType, maxNumber);
197 return ClientHelper::getServiceSpecificErrorCode(s);
198 }
199
200 return Result::INVALID_STATE;
201}
202
203int TunerClient::getMaxNumberOfFrontends(FrontendType frontendType) {
204 if (mTunerService != nullptr) {
205 int32_t maxNumber;
206 mTunerService->getMaxNumberOfFrontends(frontendType, &maxNumber);
207 return maxNumber;
208 }
209
210 return -1;
211}
212
Amy Zhangbf68a162020-11-23 17:42:40 -0800213} // namespace android