blob: 2c1735f5fc5afc7bb3e61331eed0140b817c1237 [file] [log] [blame]
Amy Zhangbf68a162020-11-23 17:42:40 -08001/*
2 * Copyright 2020 The Android Open Source Project
3 *
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
25using ::android::hardware::tv::tuner::V1_0::FrontendId;
26using ::android::hardware::tv::tuner::V1_0::FrontendType;
27
28namespace android {
29
30sp<ITuner> TunerClient::mTuner;
31sp<::android::hardware::tv::tuner::V1_1::ITuner> TunerClient::mTuner_1_1;
32shared_ptr<ITunerService> TunerClient::mTunerService;
33int TunerClient::mTunerVersion;
34
35/////////////// TunerClient ///////////////////////
36
37TunerClient::TunerClient() {
38 // Get HIDL Tuner in migration stage.
39 getHidlTuner();
40 // Connect with Tuner Service.
41 ::ndk::SpAIBinder binder(AServiceManager_getService("media.tuner"));
42 mTunerService = ITunerService::fromBinder(binder);
43 if (mTunerService == NULL) {
44 ALOGE("Failed to get tuner service");
45 }
46}
47
48TunerClient::~TunerClient() {
49 mTuner = NULL;
50 mTuner_1_1 = NULL;
51 mTunerVersion = 0;
52 mTunerService = NULL;
53}
54
55vector<FrontendId> TunerClient::getFrontendIds() {
56 vector<FrontendId> ids;
shubang68f32a32020-12-29 00:34:24 -080057
58 if (mTunerService != NULL) {
59 vector<int32_t> v;
60 int aidl_return;
61 Status s = mTunerService->getFrontendIds(&v, &aidl_return);
62 if (!s.isOk() || aidl_return != (int) Result::SUCCESS
63 || v.size() == 0) {
64 ids.clear();
65 return ids;
66 }
67 for (int32_t id : v) {
68 ids.push_back(static_cast<FrontendId>(id));
69 }
70 return ids;
71 }
Amy Zhangbf68a162020-11-23 17:42:40 -080072
73 if (mTuner != NULL) {
74 Result res;
75 mTuner->getFrontendIds([&](Result r, const hardware::hidl_vec<FrontendId>& frontendIds) {
76 res = r;
77 ids = frontendIds;
78 });
79 if (res != Result::SUCCESS || ids.size() == 0) {
80 ALOGW("Frontend ids not available");
81 ids.clear();
82 return ids;
83 }
84 return ids;
85 }
86
87 return ids;
88}
89
90
91sp<FrontendClient> TunerClient::openFrontend(int frontendHandle) {
92 if (mTunerService != NULL) {
93 // TODO: handle error code
94 shared_ptr<ITunerFrontend> tunerFrontend;
95 mTunerService->openFrontend(frontendHandle, &tunerFrontend);
Amy Zhang6bfeaa02020-11-30 15:16:39 -080096 return new FrontendClient(tunerFrontend, frontendHandle);
Amy Zhangbf68a162020-11-23 17:42:40 -080097 }
98
99 if (mTuner != NULL) {
100 sp<IFrontend> hidlFrontend = openHidlFrontendByHandle(frontendHandle);
101 if (hidlFrontend != NULL) {
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800102 sp<FrontendClient> frontendClient = new FrontendClient(NULL, frontendHandle);
Amy Zhangbf68a162020-11-23 17:42:40 -0800103 frontendClient->setHidlFrontend(hidlFrontend);
104 return frontendClient;
105 }
106 }
107
108 return NULL;
109}
110
111shared_ptr<FrontendInfo> TunerClient::getFrontendInfo(int id) {
112 if (mTunerService != NULL) {
113 TunerServiceFrontendInfo aidlFrontendInfo;
114 // TODO: handle error code
115 mTunerService->getFrontendInfo(id, &aidlFrontendInfo);
116 return make_shared<FrontendInfo>(FrontendInfoAidlToHidl(aidlFrontendInfo));
117 }
118
119 if (mTuner != NULL) {
120 FrontendInfo hidlInfo;
121 Result res = getHidlFrontendInfo(id, hidlInfo);
122 if (res != Result::SUCCESS) {
123 return NULL;
124 }
125 return make_shared<FrontendInfo>(hidlInfo);
126 }
127
128 return NULL;
129}
130
131shared_ptr<FrontendDtmbCapabilities> TunerClient::getFrontendDtmbCapabilities(int id) {
132 // pending aidl interface
133
134 if (mTuner_1_1 != NULL) {
135 Result result;
136 FrontendDtmbCapabilities dtmbCaps;
137 mTuner_1_1->getFrontendDtmbCapabilities(id,
138 [&](Result r, const FrontendDtmbCapabilities& caps) {
139 dtmbCaps = caps;
140 result = r;
141 });
142 if (result == Result::SUCCESS) {
143 return make_shared<FrontendDtmbCapabilities>(dtmbCaps);
144 }
145 }
146
147 return NULL;
148}
149
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800150sp<DemuxClient> TunerClient::openDemux(int /*demuxHandle*/) {
151 if (mTunerService != NULL) {
152 // TODO: handle error code
153 /*shared_ptr<ITunerDemux> tunerDemux;
154 mTunerService->openDemux(demuxHandle, &tunerDemux);
155 return new DemuxClient(tunerDemux);*/
156 }
157
158 if (mTuner != NULL) {
159 // TODO: pending aidl interface
160 sp<DemuxClient> demuxClient = new DemuxClient();
161 sp<IDemux> hidlDemux = openHidlDemux();
162 if (hidlDemux != NULL) {
163 demuxClient->setHidlDemux(hidlDemux);
164 return demuxClient;
165 }
166 }
167
168 return NULL;
169}
170
Amy Zhangbf68a162020-11-23 17:42:40 -0800171/////////////// TunerClient Helper Methods ///////////////////////
172
173sp<ITuner> TunerClient::getHidlTuner() {
174 if (mTuner == NULL) {
175 mTunerVersion = 0;
176 mTuner_1_1 = ::android::hardware::tv::tuner::V1_1::ITuner::getService();
177
178 if (mTuner_1_1 == NULL) {
179 ALOGW("Failed to get tuner 1.1 service.");
180 mTuner = ITuner::getService();
181 if (mTuner == NULL) {
182 ALOGW("Failed to get tuner 1.0 service.");
183 } else {
184 mTunerVersion = 1 << 16;
185 }
186 } else {
187 mTuner = static_cast<sp<ITuner>>(mTuner_1_1);
188 mTunerVersion = ((1 << 16) | 1);
189 }
190 }
191 return mTuner;
192}
193
194sp<IFrontend> TunerClient::openHidlFrontendByHandle(int frontendHandle) {
195 sp<IFrontend> fe;
196 Result res;
197 uint32_t id = getResourceIdFromHandle(frontendHandle);
198 mTuner->openFrontendById(id, [&](Result r, const sp<IFrontend>& frontend) {
199 fe = frontend;
200 res = r;
201 });
202 if (res != Result::SUCCESS || fe == nullptr) {
203 ALOGE("Failed to open frontend");
204 return NULL;
205 }
206 return fe;
207}
208
209Result TunerClient::getHidlFrontendInfo(int id, FrontendInfo& feInfo) {
210 Result res;
211 mTuner->getFrontendInfo(id, [&](Result r, const FrontendInfo& info) {
212 feInfo = info;
213 res = r;
214 });
215 return res;
216}
217
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800218sp<IDemux> TunerClient::openHidlDemux() {
219 sp<IDemux> demux;
220 Result res;
221
222 mTuner->openDemux([&](Result result, uint32_t /*id*/, const sp<IDemux>& demuxSp) {
223 demux = demuxSp;
224 res = result;
225 });
226 if (res != Result::SUCCESS || demux == nullptr) {
227 ALOGE("Failed to open demux");
228 return NULL;
229 }
230 return demux;
231}
232
Amy Zhangbf68a162020-11-23 17:42:40 -0800233FrontendInfo TunerClient::FrontendInfoAidlToHidl(TunerServiceFrontendInfo aidlFrontendInfo) {
234 FrontendInfo hidlFrontendInfo {
235 .type = static_cast<FrontendType>(aidlFrontendInfo.type),
236 .minFrequency = static_cast<uint32_t>(aidlFrontendInfo.minFrequency),
237 .maxFrequency = static_cast<uint32_t>(aidlFrontendInfo.maxFrequency),
238 .minSymbolRate = static_cast<uint32_t>(aidlFrontendInfo.minSymbolRate),
239 .maxSymbolRate = static_cast<uint32_t>(aidlFrontendInfo.maxSymbolRate),
240 .acquireRange = static_cast<uint32_t>(aidlFrontendInfo.acquireRange),
241 .exclusiveGroupId = static_cast<uint32_t>(aidlFrontendInfo.exclusiveGroupId),
242 };
243 // TODO: handle Frontend caps
244
245 return hidlFrontendInfo;
246}
247} // namespace android