blob: 44b46f0a0b479faccc4872836d7fd2dbec041d36 [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 "FrontendClient"
18
19#include <android-base/logging.h>
20#include <utils/Log.h>
21
22#include "FrontendClient.h"
23
Amy Zhanga6734682020-11-30 16:14:38 -080024using ::aidl::android::media::tv::tuner::TunerFrontendSettings;
25
Amy Zhangbf68a162020-11-23 17:42:40 -080026namespace android {
27
Amy Zhanga6734682020-11-30 16:14:38 -080028/////////////// FrontendClient ///////////////////////
29
Amy Zhang6bfeaa02020-11-30 15:16:39 -080030FrontendClient::FrontendClient(shared_ptr<ITunerFrontend> tunerFrontend, int frontendHandle) {
Amy Zhangbf68a162020-11-23 17:42:40 -080031 mTunerFrontend = tunerFrontend;
Amy Zhanga6734682020-11-30 16:14:38 -080032 mAidlCallback = NULL;
33 mHidlCallback = NULL;
Amy Zhang6bfeaa02020-11-30 15:16:39 -080034 mFrontendHandle = frontendHandle;
Amy Zhangbf68a162020-11-23 17:42:40 -080035}
36
37FrontendClient::~FrontendClient() {
38 mTunerFrontend = NULL;
39 mFrontend = NULL;
40 mFrontend_1_1 = NULL;
Amy Zhanga6734682020-11-30 16:14:38 -080041 mAidlCallback = NULL;
42 mHidlCallback = NULL;
Amy Zhang6bfeaa02020-11-30 15:16:39 -080043 mFrontendHandle = -1;
Amy Zhanga6734682020-11-30 16:14:38 -080044}
45
46Result FrontendClient::setCallback(sp<FrontendClientCallback> frontendClientCallback) {
47 if (mTunerFrontend != NULL) {
48 mAidlCallback = ::ndk::SharedRefBase::make<TunerFrontendCallback>(frontendClientCallback);
49 mTunerFrontend->setCallback(mAidlCallback);
50 return Result::SUCCESS;
51 }
52
53 mHidlCallback = new HidlFrontendCallback(frontendClientCallback);
54 return mFrontend->setCallback(mHidlCallback);
Amy Zhangbf68a162020-11-23 17:42:40 -080055}
56
57void FrontendClient::setHidlFrontend(sp<IFrontend> frontend) {
58 mFrontend = frontend;
59 mFrontend_1_1 = ::android::hardware::tv::tuner::V1_1::IFrontend::castFrom(mFrontend);
60}
Amy Zhanga6734682020-11-30 16:14:38 -080061
62Result FrontendClient::tune(const FrontendSettings& settings,
63 const FrontendSettingsExt1_1& settingsExt1_1) {
64 if (mTunerFrontend != NULL) {
65 // TODO: parse hidl settings to aidl settings
66 // TODO: aidl frontend settings to include Tuner HAL 1.1 settings
67 TunerFrontendSettings settings;
68 // TODO: handle error message.
69 mTunerFrontend->tune(settings);
70 return Result::SUCCESS;
71 }
72
73 Result result;
74 if (mFrontend_1_1 != NULL) {
75 result = mFrontend_1_1->tune_1_1(settings, settingsExt1_1);
76 return result;
77 }
78
79 if (mFrontend != NULL) {
80 result = mFrontend->tune(settings);
81 return result;
82 }
83
84 return Result::INVALID_STATE;
Amy Zhangbf68a162020-11-23 17:42:40 -080085}
Amy Zhanga6734682020-11-30 16:14:38 -080086
87Result FrontendClient::stopTune() {
88 if (mTunerFrontend != NULL) {
89 // TODO: handle error message.
90 mTunerFrontend->stopTune();
91 return Result::SUCCESS;
92 }
93
94 if (mFrontend != NULL) {
95 Result result = mFrontend->stopTune();
96 return result;
97 }
98
99 return Result::INVALID_STATE;
100}
101
102Result FrontendClient::close() {
103 if (mTunerFrontend != NULL) {
104 // TODO: handle error message.
105 mTunerFrontend->close();
106 return Result::SUCCESS;
107 }
108
109 if (mFrontend != NULL) {
110 Result result = mFrontend->close();
111 if (result == Result::SUCCESS) {
112 mFrontend = NULL;
113 mFrontend_1_1 = NULL;
114 }
115 return result;
116 }
117
118 return Result::INVALID_STATE;
119}
120
Amy Zhang6bfeaa02020-11-30 15:16:39 -0800121shared_ptr<ITunerFrontend> FrontendClient::getAidlFrontend() {
122 return mTunerFrontend;
123}
124
125int FrontendClient::getId() {
126 return getResourceIdFromHandle(mFrontendHandle);
127}
128
Amy Zhanga6734682020-11-30 16:14:38 -0800129/////////////// TunerFrontendCallback ///////////////////////
130
131TunerFrontendCallback::TunerFrontendCallback(sp<FrontendClientCallback> frontendClientCallback)
132 : mFrontendClientCallback(frontendClientCallback) {}
133
134Status TunerFrontendCallback::onEvent(int frontendEventType) {
135 if (mFrontendClientCallback != NULL) {
136 mFrontendClientCallback->onEvent(static_cast<FrontendEventType>(frontendEventType));
137 return Status::ok();
138 }
139 return Status::fromServiceSpecificError(static_cast<int32_t>(Result::INVALID_STATE));
140}
141
142Status TunerFrontendCallback::onLocked() {
143 return Status::ok();
144}
145
146Status TunerFrontendCallback::onScanStopped() {
147 return Status::ok();
148}
149
150Status TunerFrontendCallback::onProgress(int /*percent*/) {
151 return Status::ok();
152}
153
154Status TunerFrontendCallback::onFrequenciesReport(const vector<int>& /*frequency*/) {
155 return Status::ok();
156}
157
158Status TunerFrontendCallback::onSymbolRates(const vector<int>& /*rates*/) {
159 return Status::ok();
160}
161
162Status TunerFrontendCallback::onHierarchy(int /*hierarchy*/) {
163 return Status::ok();
164}
165
166Status TunerFrontendCallback::onSignalType(int /*signalType*/) {
167 return Status::ok();
168}
169
170Status TunerFrontendCallback::onPlpIds(const vector<int>& /*plpIds*/) {
171 return Status::ok();
172}
173
174Status TunerFrontendCallback::onGroupIds(const vector<int>& /*groupIds*/) {
175 return Status::ok();
176}
177
178Status TunerFrontendCallback::onInputStreamIds(const vector<int>& /*inputStreamIds*/) {
179 return Status::ok();
180}
181
182Status TunerFrontendCallback::onDvbsStandard(int /*dvbsStandandard*/) {
183 return Status::ok();
184}
185
186Status TunerFrontendCallback::onAnalogSifStandard(int /*sifStandandard*/) {
187 return Status::ok();
188}
189
190Status TunerFrontendCallback::onAtsc3PlpInfos(const vector<TunerAtsc3PlpInfo>& /*atsc3PlpInfos*/) {
191 return Status::ok();
192}
193
194/////////////// IFrontendCallback ///////////////////////
195
196HidlFrontendCallback::HidlFrontendCallback(sp<FrontendClientCallback> frontendClientCallback)
197 : mFrontendClientCallback(frontendClientCallback) {}
198
199Return<void> HidlFrontendCallback::onEvent(FrontendEventType frontendEventType) {
200 if (mFrontendClientCallback != NULL) {
201 mFrontendClientCallback->onEvent(frontendEventType);
202 }
203 return Void();
204}
205
206Return<void> HidlFrontendCallback::onScanMessage(FrontendScanMessageType type,
207 const FrontendScanMessage& message) {
208 if (mFrontendClientCallback != NULL) {
209 mFrontendClientCallback->onScanMessage(type, message);
210 }
211 return Void();
212}
213
214Return<void> HidlFrontendCallback::onScanMessageExt1_1(FrontendScanMessageTypeExt1_1 type,
215 const FrontendScanMessageExt1_1& message) {
216 if (mFrontendClientCallback != NULL) {
217 mFrontendClientCallback->onScanMessageExt1_1(type, message);
218 }
219 return Void();
220}
221} // namespace android