1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker * Copyright 2021 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker *
4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker *
8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker *
10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker */
16*4d7e907cSAndroid Build Coastguard Worker
17*4d7e907cSAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
18*4d7e907cSAndroid Build Coastguard Worker #define LOG_TAG "android.hardware.tv.tuner-service.example-Frontend"
19*4d7e907cSAndroid Build Coastguard Worker
20*4d7e907cSAndroid Build Coastguard Worker #include <aidl/android/hardware/tv/tuner/Result.h>
21*4d7e907cSAndroid Build Coastguard Worker #include <utils/Log.h>
22*4d7e907cSAndroid Build Coastguard Worker
23*4d7e907cSAndroid Build Coastguard Worker #include "Frontend.h"
24*4d7e907cSAndroid Build Coastguard Worker
25*4d7e907cSAndroid Build Coastguard Worker namespace aidl {
26*4d7e907cSAndroid Build Coastguard Worker namespace android {
27*4d7e907cSAndroid Build Coastguard Worker namespace hardware {
28*4d7e907cSAndroid Build Coastguard Worker namespace tv {
29*4d7e907cSAndroid Build Coastguard Worker namespace tuner {
30*4d7e907cSAndroid Build Coastguard Worker
Frontend(FrontendType type,int32_t id)31*4d7e907cSAndroid Build Coastguard Worker Frontend::Frontend(FrontendType type, int32_t id) {
32*4d7e907cSAndroid Build Coastguard Worker mType = type;
33*4d7e907cSAndroid Build Coastguard Worker mId = id;
34*4d7e907cSAndroid Build Coastguard Worker mTuner = nullptr;
35*4d7e907cSAndroid Build Coastguard Worker // Init callback to nullptr
36*4d7e907cSAndroid Build Coastguard Worker mCallback = nullptr;
37*4d7e907cSAndroid Build Coastguard Worker mIptvPluginInterface = nullptr;
38*4d7e907cSAndroid Build Coastguard Worker mIptvPluginStreamer = nullptr;
39*4d7e907cSAndroid Build Coastguard Worker
40*4d7e907cSAndroid Build Coastguard Worker switch (mType) {
41*4d7e907cSAndroid Build Coastguard Worker case FrontendType::ISDBS: {
42*4d7e907cSAndroid Build Coastguard Worker mFrontendCaps.set<FrontendCapabilities::Tag::isdbsCaps>(FrontendIsdbsCapabilities());
43*4d7e907cSAndroid Build Coastguard Worker mFrontendStatusCaps = {
44*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::DEMOD_LOCK,
45*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::SNR,
46*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::FEC,
47*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::MODULATION,
48*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::MODULATIONS,
49*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::ROLL_OFF,
50*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::STREAM_ID_LIST,
51*4d7e907cSAndroid Build Coastguard Worker };
52*4d7e907cSAndroid Build Coastguard Worker break;
53*4d7e907cSAndroid Build Coastguard Worker }
54*4d7e907cSAndroid Build Coastguard Worker case FrontendType::ATSC3: {
55*4d7e907cSAndroid Build Coastguard Worker mFrontendCaps.set<FrontendCapabilities::Tag::atsc3Caps>(FrontendAtsc3Capabilities());
56*4d7e907cSAndroid Build Coastguard Worker mFrontendStatusCaps = {
57*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::BER,
58*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::PER,
59*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::ATSC3_PLP_INFO,
60*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::MODULATIONS,
61*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::BERS,
62*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::INTERLEAVINGS,
63*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::BANDWIDTH,
64*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::ATSC3_ALL_PLP_INFO,
65*4d7e907cSAndroid Build Coastguard Worker };
66*4d7e907cSAndroid Build Coastguard Worker break;
67*4d7e907cSAndroid Build Coastguard Worker }
68*4d7e907cSAndroid Build Coastguard Worker case FrontendType::DVBC: {
69*4d7e907cSAndroid Build Coastguard Worker mFrontendCaps.set<FrontendCapabilities::Tag::dvbcCaps>(FrontendDvbcCapabilities());
70*4d7e907cSAndroid Build Coastguard Worker mFrontendStatusCaps = {
71*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::PRE_BER, FrontendStatusType::SIGNAL_QUALITY,
72*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::MODULATION, FrontendStatusType::SPECTRAL,
73*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::MODULATIONS, FrontendStatusType::CODERATES,
74*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::INTERLEAVINGS, FrontendStatusType::BANDWIDTH,
75*4d7e907cSAndroid Build Coastguard Worker };
76*4d7e907cSAndroid Build Coastguard Worker break;
77*4d7e907cSAndroid Build Coastguard Worker }
78*4d7e907cSAndroid Build Coastguard Worker case FrontendType::DVBS: {
79*4d7e907cSAndroid Build Coastguard Worker mFrontendCaps.set<FrontendCapabilities::Tag::dvbsCaps>(FrontendDvbsCapabilities());
80*4d7e907cSAndroid Build Coastguard Worker mFrontendStatusCaps = {
81*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::SIGNAL_STRENGTH, FrontendStatusType::SYMBOL_RATE,
82*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::MODULATION, FrontendStatusType::MODULATIONS,
83*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::ROLL_OFF, FrontendStatusType::IS_MISO,
84*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::STANDARD_EXT,
85*4d7e907cSAndroid Build Coastguard Worker };
86*4d7e907cSAndroid Build Coastguard Worker break;
87*4d7e907cSAndroid Build Coastguard Worker }
88*4d7e907cSAndroid Build Coastguard Worker case FrontendType::DVBT: {
89*4d7e907cSAndroid Build Coastguard Worker mFrontendCaps.set<FrontendCapabilities::Tag::dvbtCaps>(FrontendDvbtCapabilities());
90*4d7e907cSAndroid Build Coastguard Worker mFrontendStatusCaps = {
91*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::EWBS,
92*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::PLP_ID,
93*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::HIERARCHY,
94*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::MODULATIONS,
95*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::BANDWIDTH,
96*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::GUARD_INTERVAL,
97*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::TRANSMISSION_MODE,
98*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::T2_SYSTEM_ID,
99*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::DVBT_CELL_IDS,
100*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::STANDARD_EXT,
101*4d7e907cSAndroid Build Coastguard Worker };
102*4d7e907cSAndroid Build Coastguard Worker break;
103*4d7e907cSAndroid Build Coastguard Worker }
104*4d7e907cSAndroid Build Coastguard Worker case FrontendType::ISDBT: {
105*4d7e907cSAndroid Build Coastguard Worker FrontendIsdbtCapabilities isdbtCaps{
106*4d7e907cSAndroid Build Coastguard Worker .modeCap = (int)FrontendIsdbtMode::MODE_1 | (int)FrontendIsdbtMode::MODE_2,
107*4d7e907cSAndroid Build Coastguard Worker .bandwidthCap = (int)FrontendIsdbtBandwidth::BANDWIDTH_6MHZ,
108*4d7e907cSAndroid Build Coastguard Worker .modulationCap = (int)FrontendIsdbtModulation::MOD_16QAM,
109*4d7e907cSAndroid Build Coastguard Worker .coderateCap = (int)FrontendIsdbtCoderate::CODERATE_4_5 |
110*4d7e907cSAndroid Build Coastguard Worker (int)FrontendIsdbtCoderate::CODERATE_6_7,
111*4d7e907cSAndroid Build Coastguard Worker .guardIntervalCap = (int)FrontendIsdbtGuardInterval::INTERVAL_1_128,
112*4d7e907cSAndroid Build Coastguard Worker .timeInterleaveCap = (int)FrontendIsdbtTimeInterleaveMode::AUTO |
113*4d7e907cSAndroid Build Coastguard Worker (int)FrontendIsdbtTimeInterleaveMode::INTERLEAVE_1_0,
114*4d7e907cSAndroid Build Coastguard Worker .isSegmentAuto = true,
115*4d7e907cSAndroid Build Coastguard Worker .isFullSegment = true,
116*4d7e907cSAndroid Build Coastguard Worker };
117*4d7e907cSAndroid Build Coastguard Worker mFrontendCaps.set<FrontendCapabilities::Tag::isdbtCaps>(isdbtCaps);
118*4d7e907cSAndroid Build Coastguard Worker mFrontendStatusCaps = {
119*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::AGC,
120*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::LNA,
121*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::MODULATION,
122*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::MODULATIONS,
123*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::BANDWIDTH,
124*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::GUARD_INTERVAL,
125*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::TRANSMISSION_MODE,
126*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::ISDBT_SEGMENTS,
127*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::ISDBT_MODE,
128*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::ISDBT_PARTIAL_RECEPTION_FLAG,
129*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::INTERLEAVINGS,
130*4d7e907cSAndroid Build Coastguard Worker };
131*4d7e907cSAndroid Build Coastguard Worker break;
132*4d7e907cSAndroid Build Coastguard Worker }
133*4d7e907cSAndroid Build Coastguard Worker case FrontendType::ANALOG: {
134*4d7e907cSAndroid Build Coastguard Worker mFrontendCaps.set<FrontendCapabilities::Tag::analogCaps>(FrontendAnalogCapabilities());
135*4d7e907cSAndroid Build Coastguard Worker mFrontendStatusCaps = {
136*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::LAYER_ERROR,
137*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::MER,
138*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::UEC,
139*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::TS_DATA_RATES,
140*4d7e907cSAndroid Build Coastguard Worker };
141*4d7e907cSAndroid Build Coastguard Worker break;
142*4d7e907cSAndroid Build Coastguard Worker }
143*4d7e907cSAndroid Build Coastguard Worker case FrontendType::ATSC: {
144*4d7e907cSAndroid Build Coastguard Worker mFrontendCaps.set<FrontendCapabilities::Tag::atscCaps>(FrontendAtscCapabilities());
145*4d7e907cSAndroid Build Coastguard Worker mFrontendStatusCaps = {
146*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::FREQ_OFFSET,
147*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::RF_LOCK,
148*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::MODULATIONS,
149*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::IS_LINEAR,
150*4d7e907cSAndroid Build Coastguard Worker };
151*4d7e907cSAndroid Build Coastguard Worker break;
152*4d7e907cSAndroid Build Coastguard Worker }
153*4d7e907cSAndroid Build Coastguard Worker case FrontendType::ISDBS3: {
154*4d7e907cSAndroid Build Coastguard Worker mFrontendCaps.set<FrontendCapabilities::Tag::isdbs3Caps>(FrontendIsdbs3Capabilities());
155*4d7e907cSAndroid Build Coastguard Worker mFrontendStatusCaps = {
156*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::DEMOD_LOCK, FrontendStatusType::MODULATION,
157*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::MODULATIONS, FrontendStatusType::ROLL_OFF,
158*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::IS_SHORT_FRAMES, FrontendStatusType::STREAM_ID_LIST,
159*4d7e907cSAndroid Build Coastguard Worker };
160*4d7e907cSAndroid Build Coastguard Worker break;
161*4d7e907cSAndroid Build Coastguard Worker }
162*4d7e907cSAndroid Build Coastguard Worker case FrontendType::DTMB: {
163*4d7e907cSAndroid Build Coastguard Worker mFrontendCaps.set<FrontendCapabilities::Tag::dtmbCaps>(FrontendDtmbCapabilities());
164*4d7e907cSAndroid Build Coastguard Worker mFrontendStatusCaps = {
165*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::MODULATIONS, FrontendStatusType::INTERLEAVINGS,
166*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::BANDWIDTH, FrontendStatusType::GUARD_INTERVAL,
167*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::TRANSMISSION_MODE,
168*4d7e907cSAndroid Build Coastguard Worker };
169*4d7e907cSAndroid Build Coastguard Worker break;
170*4d7e907cSAndroid Build Coastguard Worker }
171*4d7e907cSAndroid Build Coastguard Worker case FrontendType::IPTV: {
172*4d7e907cSAndroid Build Coastguard Worker mFrontendCaps.set<FrontendCapabilities::Tag::iptvCaps>(FrontendIptvCapabilities());
173*4d7e907cSAndroid Build Coastguard Worker mFrontendStatusCaps = {
174*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::IPTV_CONTENT_URL,
175*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::IPTV_PACKETS_LOST,
176*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::IPTV_PACKETS_RECEIVED,
177*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::IPTV_AVERAGE_JITTER_MS,
178*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType::IPTV_WORST_JITTER_MS,
179*4d7e907cSAndroid Build Coastguard Worker };
180*4d7e907cSAndroid Build Coastguard Worker break;
181*4d7e907cSAndroid Build Coastguard Worker }
182*4d7e907cSAndroid Build Coastguard Worker default: {
183*4d7e907cSAndroid Build Coastguard Worker break;
184*4d7e907cSAndroid Build Coastguard Worker }
185*4d7e907cSAndroid Build Coastguard Worker }
186*4d7e907cSAndroid Build Coastguard Worker }
187*4d7e907cSAndroid Build Coastguard Worker
~Frontend()188*4d7e907cSAndroid Build Coastguard Worker Frontend::~Frontend() {
189*4d7e907cSAndroid Build Coastguard Worker ALOGV("%s", __FUNCTION__);
190*4d7e907cSAndroid Build Coastguard Worker mCallback = nullptr;
191*4d7e907cSAndroid Build Coastguard Worker mIsLocked = false;
192*4d7e907cSAndroid Build Coastguard Worker mTuner = nullptr;
193*4d7e907cSAndroid Build Coastguard Worker if (mTuneByteBuffer != nullptr) {
194*4d7e907cSAndroid Build Coastguard Worker free(mTuneByteBuffer);
195*4d7e907cSAndroid Build Coastguard Worker }
196*4d7e907cSAndroid Build Coastguard Worker }
197*4d7e907cSAndroid Build Coastguard Worker
close()198*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Frontend::close() {
199*4d7e907cSAndroid Build Coastguard Worker ALOGV("%s", __FUNCTION__);
200*4d7e907cSAndroid Build Coastguard Worker // Reset callback
201*4d7e907cSAndroid Build Coastguard Worker mCallback = nullptr;
202*4d7e907cSAndroid Build Coastguard Worker mIsLocked = false;
203*4d7e907cSAndroid Build Coastguard Worker if (mTuner != nullptr) {
204*4d7e907cSAndroid Build Coastguard Worker mTuner->removeFrontend(mId);
205*4d7e907cSAndroid Build Coastguard Worker }
206*4d7e907cSAndroid Build Coastguard Worker mTuner = nullptr;
207*4d7e907cSAndroid Build Coastguard Worker
208*4d7e907cSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
209*4d7e907cSAndroid Build Coastguard Worker }
210*4d7e907cSAndroid Build Coastguard Worker
setCallback(const std::shared_ptr<IFrontendCallback> & in_callback)211*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Frontend::setCallback(const std::shared_ptr<IFrontendCallback>& in_callback) {
212*4d7e907cSAndroid Build Coastguard Worker ALOGV("%s", __FUNCTION__);
213*4d7e907cSAndroid Build Coastguard Worker if (in_callback == nullptr) {
214*4d7e907cSAndroid Build Coastguard Worker ALOGW("[ WARN ] Set Frontend callback with nullptr");
215*4d7e907cSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::fromServiceSpecificError(
216*4d7e907cSAndroid Build Coastguard Worker static_cast<int32_t>(Result::INVALID_ARGUMENT));
217*4d7e907cSAndroid Build Coastguard Worker }
218*4d7e907cSAndroid Build Coastguard Worker
219*4d7e907cSAndroid Build Coastguard Worker mCallback = in_callback;
220*4d7e907cSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
221*4d7e907cSAndroid Build Coastguard Worker }
222*4d7e907cSAndroid Build Coastguard Worker
createIptvPluginInterface()223*4d7e907cSAndroid Build Coastguard Worker dtv_plugin* Frontend::createIptvPluginInterface() {
224*4d7e907cSAndroid Build Coastguard Worker const char* path = "/vendor/lib/iptv_udp_plugin.so";
225*4d7e907cSAndroid Build Coastguard Worker DtvPlugin* plugin = new DtvPlugin(path);
226*4d7e907cSAndroid Build Coastguard Worker bool plugin_loaded = plugin->load();
227*4d7e907cSAndroid Build Coastguard Worker if (!plugin_loaded) {
228*4d7e907cSAndroid Build Coastguard Worker ALOGE("Failed to load plugin");
229*4d7e907cSAndroid Build Coastguard Worker return nullptr;
230*4d7e907cSAndroid Build Coastguard Worker }
231*4d7e907cSAndroid Build Coastguard Worker return plugin->interface();
232*4d7e907cSAndroid Build Coastguard Worker }
233*4d7e907cSAndroid Build Coastguard Worker
createIptvPluginStreamer(dtv_plugin * interface,const char * transport_desc)234*4d7e907cSAndroid Build Coastguard Worker dtv_streamer* Frontend::createIptvPluginStreamer(dtv_plugin* interface,
235*4d7e907cSAndroid Build Coastguard Worker const char* transport_desc) {
236*4d7e907cSAndroid Build Coastguard Worker dtv_streamer* streamer = interface->create_streamer();
237*4d7e907cSAndroid Build Coastguard Worker int open_fd = interface->open_stream(streamer, transport_desc);
238*4d7e907cSAndroid Build Coastguard Worker if (open_fd < 0) {
239*4d7e907cSAndroid Build Coastguard Worker return nullptr;
240*4d7e907cSAndroid Build Coastguard Worker }
241*4d7e907cSAndroid Build Coastguard Worker ALOGI("[ INFO ] open_stream successful, open_fd=%d", open_fd);
242*4d7e907cSAndroid Build Coastguard Worker return streamer;
243*4d7e907cSAndroid Build Coastguard Worker }
244*4d7e907cSAndroid Build Coastguard Worker
readTuneByte(void * buf)245*4d7e907cSAndroid Build Coastguard Worker void Frontend::readTuneByte(void* buf) {
246*4d7e907cSAndroid Build Coastguard Worker ssize_t bytes_read = mIptvPluginInterface->read_stream(mIptvPluginStreamer, buf,
247*4d7e907cSAndroid Build Coastguard Worker TUNE_BUFFER_SIZE, TUNE_BUFFER_TIMEOUT);
248*4d7e907cSAndroid Build Coastguard Worker if (bytes_read <= 0) {
249*4d7e907cSAndroid Build Coastguard Worker ALOGI("[ ERROR ] Tune byte couldn't be read.");
250*4d7e907cSAndroid Build Coastguard Worker return;
251*4d7e907cSAndroid Build Coastguard Worker }
252*4d7e907cSAndroid Build Coastguard Worker mCallback->onEvent(FrontendEventType::LOCKED);
253*4d7e907cSAndroid Build Coastguard Worker mIsLocked = true;
254*4d7e907cSAndroid Build Coastguard Worker mTuneByteBuffer = buf;
255*4d7e907cSAndroid Build Coastguard Worker }
256*4d7e907cSAndroid Build Coastguard Worker
tune(const FrontendSettings & in_settings)257*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Frontend::tune(const FrontendSettings& in_settings) {
258*4d7e907cSAndroid Build Coastguard Worker if (mCallback == nullptr) {
259*4d7e907cSAndroid Build Coastguard Worker ALOGW("[ WARN ] Frontend callback is not set for tuning");
260*4d7e907cSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::fromServiceSpecificError(
261*4d7e907cSAndroid Build Coastguard Worker static_cast<int32_t>(Result::INVALID_STATE));
262*4d7e907cSAndroid Build Coastguard Worker }
263*4d7e907cSAndroid Build Coastguard Worker
264*4d7e907cSAndroid Build Coastguard Worker if (mType != FrontendType::IPTV) {
265*4d7e907cSAndroid Build Coastguard Worker mTuner->frontendStartTune(mId);
266*4d7e907cSAndroid Build Coastguard Worker mCallback->onEvent(FrontendEventType::LOCKED);
267*4d7e907cSAndroid Build Coastguard Worker mIsLocked = true;
268*4d7e907cSAndroid Build Coastguard Worker } else {
269*4d7e907cSAndroid Build Coastguard Worker // This is a reference implementation for IPTV. It uses an additional socket buffer.
270*4d7e907cSAndroid Build Coastguard Worker // Vendors can use hardware memory directly to make the implementation more performant.
271*4d7e907cSAndroid Build Coastguard Worker ALOGI("[ INFO ] Frontend type is set to IPTV, tag = %d id=%d", in_settings.getTag(),
272*4d7e907cSAndroid Build Coastguard Worker mId);
273*4d7e907cSAndroid Build Coastguard Worker
274*4d7e907cSAndroid Build Coastguard Worker mIptvPluginInterface = createIptvPluginInterface();
275*4d7e907cSAndroid Build Coastguard Worker if (mIptvPluginInterface == nullptr) {
276*4d7e907cSAndroid Build Coastguard Worker ALOGE("[ INFO ] Failed to load plugin.");
277*4d7e907cSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::fromServiceSpecificError(
278*4d7e907cSAndroid Build Coastguard Worker static_cast<int32_t>(Result::INVALID_ARGUMENT));
279*4d7e907cSAndroid Build Coastguard Worker }
280*4d7e907cSAndroid Build Coastguard Worker
281*4d7e907cSAndroid Build Coastguard Worker // validate content_url format
282*4d7e907cSAndroid Build Coastguard Worker std::string content_url = in_settings.get<FrontendSettings::Tag::iptv>()->contentUrl;
283*4d7e907cSAndroid Build Coastguard Worker mIptvTransportDescription = "{ \"uri\": \"" + content_url + "\"}";
284*4d7e907cSAndroid Build Coastguard Worker ALOGI("[ INFO ] transport_desc: %s", mIptvTransportDescription.c_str());
285*4d7e907cSAndroid Build Coastguard Worker bool is_transport_desc_valid =
286*4d7e907cSAndroid Build Coastguard Worker mIptvPluginInterface->validate(mIptvTransportDescription.c_str());
287*4d7e907cSAndroid Build Coastguard Worker if (!is_transport_desc_valid) { // not of format protocol://ip:port
288*4d7e907cSAndroid Build Coastguard Worker ALOGE("[ INFO ] transport_desc is not valid");
289*4d7e907cSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::fromServiceSpecificError(
290*4d7e907cSAndroid Build Coastguard Worker static_cast<int32_t>(Result::INVALID_ARGUMENT));
291*4d7e907cSAndroid Build Coastguard Worker }
292*4d7e907cSAndroid Build Coastguard Worker
293*4d7e907cSAndroid Build Coastguard Worker // create a streamer and open it for reading data
294*4d7e907cSAndroid Build Coastguard Worker mIptvPluginStreamer =
295*4d7e907cSAndroid Build Coastguard Worker createIptvPluginStreamer(mIptvPluginInterface, mIptvTransportDescription.c_str());
296*4d7e907cSAndroid Build Coastguard Worker
297*4d7e907cSAndroid Build Coastguard Worker void* buf = malloc(sizeof(char) * TUNE_BUFFER_SIZE);
298*4d7e907cSAndroid Build Coastguard Worker if (buf == nullptr) {
299*4d7e907cSAndroid Build Coastguard Worker ALOGE("Failed to allocate 1 byte buffer for tuning.");
300*4d7e907cSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::fromServiceSpecificError(
301*4d7e907cSAndroid Build Coastguard Worker static_cast<int32_t>(Result::INVALID_STATE));
302*4d7e907cSAndroid Build Coastguard Worker }
303*4d7e907cSAndroid Build Coastguard Worker mIptvFrontendTuneThread = std::thread(&Frontend::readTuneByte, this, buf);
304*4d7e907cSAndroid Build Coastguard Worker if (mIptvFrontendTuneThread.joinable()) {
305*4d7e907cSAndroid Build Coastguard Worker mIptvFrontendTuneThread.join();
306*4d7e907cSAndroid Build Coastguard Worker }
307*4d7e907cSAndroid Build Coastguard Worker }
308*4d7e907cSAndroid Build Coastguard Worker
309*4d7e907cSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
310*4d7e907cSAndroid Build Coastguard Worker }
311*4d7e907cSAndroid Build Coastguard Worker
stopTune()312*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Frontend::stopTune() {
313*4d7e907cSAndroid Build Coastguard Worker ALOGV("%s", __FUNCTION__);
314*4d7e907cSAndroid Build Coastguard Worker
315*4d7e907cSAndroid Build Coastguard Worker mTuner->frontendStopTune(mId);
316*4d7e907cSAndroid Build Coastguard Worker mIsLocked = false;
317*4d7e907cSAndroid Build Coastguard Worker
318*4d7e907cSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
319*4d7e907cSAndroid Build Coastguard Worker }
320*4d7e907cSAndroid Build Coastguard Worker
scan(const FrontendSettings & in_settings,FrontendScanType in_type)321*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Frontend::scan(const FrontendSettings& in_settings, FrontendScanType in_type) {
322*4d7e907cSAndroid Build Coastguard Worker ALOGV("%s", __FUNCTION__);
323*4d7e907cSAndroid Build Coastguard Worker
324*4d7e907cSAndroid Build Coastguard Worker // If it's in middle of scanning, stop it first.
325*4d7e907cSAndroid Build Coastguard Worker if (mScanThread.joinable()) {
326*4d7e907cSAndroid Build Coastguard Worker mScanThread.join();
327*4d7e907cSAndroid Build Coastguard Worker }
328*4d7e907cSAndroid Build Coastguard Worker
329*4d7e907cSAndroid Build Coastguard Worker mFrontendSettings = in_settings;
330*4d7e907cSAndroid Build Coastguard Worker mFrontendScanType = in_type;
331*4d7e907cSAndroid Build Coastguard Worker mScanThread = std::thread(&Frontend::scanThreadLoop, this);
332*4d7e907cSAndroid Build Coastguard Worker
333*4d7e907cSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
334*4d7e907cSAndroid Build Coastguard Worker }
335*4d7e907cSAndroid Build Coastguard Worker
setTunerService(std::shared_ptr<Tuner> tuner)336*4d7e907cSAndroid Build Coastguard Worker void Frontend::setTunerService(std::shared_ptr<Tuner> tuner) {
337*4d7e907cSAndroid Build Coastguard Worker mTuner = tuner;
338*4d7e907cSAndroid Build Coastguard Worker }
339*4d7e907cSAndroid Build Coastguard Worker
scanThreadLoop()340*4d7e907cSAndroid Build Coastguard Worker void Frontend::scanThreadLoop() {
341*4d7e907cSAndroid Build Coastguard Worker if (mIsLocked) {
342*4d7e907cSAndroid Build Coastguard Worker FrontendScanMessage msg;
343*4d7e907cSAndroid Build Coastguard Worker msg.set<FrontendScanMessage::Tag::isEnd>(true);
344*4d7e907cSAndroid Build Coastguard Worker mCallback->onScanMessage(FrontendScanMessageType::END, msg);
345*4d7e907cSAndroid Build Coastguard Worker return;
346*4d7e907cSAndroid Build Coastguard Worker }
347*4d7e907cSAndroid Build Coastguard Worker
348*4d7e907cSAndroid Build Coastguard Worker int64_t frequency = 0;
349*4d7e907cSAndroid Build Coastguard Worker switch (mFrontendSettings.getTag()) {
350*4d7e907cSAndroid Build Coastguard Worker case FrontendSettings::Tag::analog:
351*4d7e907cSAndroid Build Coastguard Worker frequency = mFrontendSettings.get<FrontendSettings::Tag::analog>().frequency;
352*4d7e907cSAndroid Build Coastguard Worker break;
353*4d7e907cSAndroid Build Coastguard Worker case FrontendSettings::Tag::atsc:
354*4d7e907cSAndroid Build Coastguard Worker frequency = mFrontendSettings.get<FrontendSettings::Tag::atsc>().frequency;
355*4d7e907cSAndroid Build Coastguard Worker break;
356*4d7e907cSAndroid Build Coastguard Worker case FrontendSettings::Tag::atsc3:
357*4d7e907cSAndroid Build Coastguard Worker frequency = mFrontendSettings.get<FrontendSettings::Tag::atsc3>().frequency;
358*4d7e907cSAndroid Build Coastguard Worker break;
359*4d7e907cSAndroid Build Coastguard Worker case FrontendSettings::Tag::dvbs:
360*4d7e907cSAndroid Build Coastguard Worker frequency = mFrontendSettings.get<FrontendSettings::Tag::dvbs>().frequency;
361*4d7e907cSAndroid Build Coastguard Worker break;
362*4d7e907cSAndroid Build Coastguard Worker case FrontendSettings::Tag::dvbc:
363*4d7e907cSAndroid Build Coastguard Worker frequency = mFrontendSettings.get<FrontendSettings::Tag::dvbc>().frequency;
364*4d7e907cSAndroid Build Coastguard Worker break;
365*4d7e907cSAndroid Build Coastguard Worker case FrontendSettings::Tag::dvbt:
366*4d7e907cSAndroid Build Coastguard Worker frequency = mFrontendSettings.get<FrontendSettings::Tag::dvbt>().frequency;
367*4d7e907cSAndroid Build Coastguard Worker break;
368*4d7e907cSAndroid Build Coastguard Worker case FrontendSettings::Tag::isdbs:
369*4d7e907cSAndroid Build Coastguard Worker frequency = mFrontendSettings.get<FrontendSettings::Tag::isdbs>().frequency;
370*4d7e907cSAndroid Build Coastguard Worker break;
371*4d7e907cSAndroid Build Coastguard Worker case FrontendSettings::Tag::isdbs3:
372*4d7e907cSAndroid Build Coastguard Worker frequency = mFrontendSettings.get<FrontendSettings::Tag::isdbs3>().frequency;
373*4d7e907cSAndroid Build Coastguard Worker break;
374*4d7e907cSAndroid Build Coastguard Worker case FrontendSettings::Tag::isdbt:
375*4d7e907cSAndroid Build Coastguard Worker frequency = mFrontendSettings.get<FrontendSettings::Tag::isdbt>().frequency;
376*4d7e907cSAndroid Build Coastguard Worker break;
377*4d7e907cSAndroid Build Coastguard Worker default:
378*4d7e907cSAndroid Build Coastguard Worker break;
379*4d7e907cSAndroid Build Coastguard Worker }
380*4d7e907cSAndroid Build Coastguard Worker
381*4d7e907cSAndroid Build Coastguard Worker if (mFrontendScanType == FrontendScanType::SCAN_BLIND) {
382*4d7e907cSAndroid Build Coastguard Worker frequency += 100 * 1000;
383*4d7e907cSAndroid Build Coastguard Worker }
384*4d7e907cSAndroid Build Coastguard Worker
385*4d7e907cSAndroid Build Coastguard Worker {
386*4d7e907cSAndroid Build Coastguard Worker FrontendScanMessage msg;
387*4d7e907cSAndroid Build Coastguard Worker vector<int64_t> frequencies = {frequency};
388*4d7e907cSAndroid Build Coastguard Worker msg.set<FrontendScanMessage::Tag::frequencies>(frequencies);
389*4d7e907cSAndroid Build Coastguard Worker mCallback->onScanMessage(FrontendScanMessageType::FREQUENCY, msg);
390*4d7e907cSAndroid Build Coastguard Worker }
391*4d7e907cSAndroid Build Coastguard Worker
392*4d7e907cSAndroid Build Coastguard Worker {
393*4d7e907cSAndroid Build Coastguard Worker FrontendScanMessage msg;
394*4d7e907cSAndroid Build Coastguard Worker msg.set<FrontendScanMessage::Tag::progressPercent>(20);
395*4d7e907cSAndroid Build Coastguard Worker mCallback->onScanMessage(FrontendScanMessageType::PROGRESS_PERCENT, msg);
396*4d7e907cSAndroid Build Coastguard Worker }
397*4d7e907cSAndroid Build Coastguard Worker
398*4d7e907cSAndroid Build Coastguard Worker {
399*4d7e907cSAndroid Build Coastguard Worker FrontendScanMessage msg;
400*4d7e907cSAndroid Build Coastguard Worker vector<int32_t> symbolRates = {30};
401*4d7e907cSAndroid Build Coastguard Worker msg.set<FrontendScanMessage::Tag::symbolRates>(symbolRates);
402*4d7e907cSAndroid Build Coastguard Worker mCallback->onScanMessage(FrontendScanMessageType::SYMBOL_RATE, msg);
403*4d7e907cSAndroid Build Coastguard Worker }
404*4d7e907cSAndroid Build Coastguard Worker
405*4d7e907cSAndroid Build Coastguard Worker if (mType == FrontendType::DVBT) {
406*4d7e907cSAndroid Build Coastguard Worker FrontendScanMessage msg;
407*4d7e907cSAndroid Build Coastguard Worker msg.set<FrontendScanMessage::Tag::hierarchy>(FrontendDvbtHierarchy::HIERARCHY_NON_NATIVE);
408*4d7e907cSAndroid Build Coastguard Worker mCallback->onScanMessage(FrontendScanMessageType::HIERARCHY, msg);
409*4d7e907cSAndroid Build Coastguard Worker }
410*4d7e907cSAndroid Build Coastguard Worker
411*4d7e907cSAndroid Build Coastguard Worker if (mType == FrontendType::ANALOG) {
412*4d7e907cSAndroid Build Coastguard Worker FrontendScanMessage msg;
413*4d7e907cSAndroid Build Coastguard Worker msg.set<FrontendScanMessage::Tag::analogType>(FrontendAnalogType::PAL);
414*4d7e907cSAndroid Build Coastguard Worker mCallback->onScanMessage(FrontendScanMessageType::ANALOG_TYPE, msg);
415*4d7e907cSAndroid Build Coastguard Worker }
416*4d7e907cSAndroid Build Coastguard Worker
417*4d7e907cSAndroid Build Coastguard Worker {
418*4d7e907cSAndroid Build Coastguard Worker FrontendScanMessage msg;
419*4d7e907cSAndroid Build Coastguard Worker vector<int32_t> plpIds = {2};
420*4d7e907cSAndroid Build Coastguard Worker msg.set<FrontendScanMessage::Tag::plpIds>(plpIds);
421*4d7e907cSAndroid Build Coastguard Worker mCallback->onScanMessage(FrontendScanMessageType::PLP_IDS, msg);
422*4d7e907cSAndroid Build Coastguard Worker }
423*4d7e907cSAndroid Build Coastguard Worker
424*4d7e907cSAndroid Build Coastguard Worker {
425*4d7e907cSAndroid Build Coastguard Worker FrontendScanMessage msg;
426*4d7e907cSAndroid Build Coastguard Worker vector<int32_t> groupIds = {3};
427*4d7e907cSAndroid Build Coastguard Worker msg.set<FrontendScanMessage::Tag::groupIds>(groupIds);
428*4d7e907cSAndroid Build Coastguard Worker mCallback->onScanMessage(FrontendScanMessageType::GROUP_IDS, msg);
429*4d7e907cSAndroid Build Coastguard Worker }
430*4d7e907cSAndroid Build Coastguard Worker
431*4d7e907cSAndroid Build Coastguard Worker {
432*4d7e907cSAndroid Build Coastguard Worker FrontendScanMessage msg;
433*4d7e907cSAndroid Build Coastguard Worker vector<int32_t> inputStreamIds = {1};
434*4d7e907cSAndroid Build Coastguard Worker msg.set<FrontendScanMessage::Tag::inputStreamIds>(inputStreamIds);
435*4d7e907cSAndroid Build Coastguard Worker mCallback->onScanMessage(FrontendScanMessageType::INPUT_STREAM_IDS, msg);
436*4d7e907cSAndroid Build Coastguard Worker }
437*4d7e907cSAndroid Build Coastguard Worker
438*4d7e907cSAndroid Build Coastguard Worker switch (mType) {
439*4d7e907cSAndroid Build Coastguard Worker case FrontendType::DVBT: {
440*4d7e907cSAndroid Build Coastguard Worker FrontendScanMessage msg;
441*4d7e907cSAndroid Build Coastguard Worker FrontendScanMessageStandard std;
442*4d7e907cSAndroid Build Coastguard Worker std.set<FrontendScanMessageStandard::Tag::tStd>(FrontendDvbtStandard::AUTO);
443*4d7e907cSAndroid Build Coastguard Worker msg.set<FrontendScanMessage::Tag::std>(std);
444*4d7e907cSAndroid Build Coastguard Worker mCallback->onScanMessage(FrontendScanMessageType::STANDARD, msg);
445*4d7e907cSAndroid Build Coastguard Worker break;
446*4d7e907cSAndroid Build Coastguard Worker }
447*4d7e907cSAndroid Build Coastguard Worker case FrontendType::DVBS: {
448*4d7e907cSAndroid Build Coastguard Worker FrontendScanMessage msg;
449*4d7e907cSAndroid Build Coastguard Worker FrontendScanMessageStandard std;
450*4d7e907cSAndroid Build Coastguard Worker std.set<FrontendScanMessageStandard::Tag::sStd>(FrontendDvbsStandard::AUTO);
451*4d7e907cSAndroid Build Coastguard Worker msg.set<FrontendScanMessage::Tag::std>(std);
452*4d7e907cSAndroid Build Coastguard Worker mCallback->onScanMessage(FrontendScanMessageType::STANDARD, msg);
453*4d7e907cSAndroid Build Coastguard Worker break;
454*4d7e907cSAndroid Build Coastguard Worker }
455*4d7e907cSAndroid Build Coastguard Worker case FrontendType::ANALOG: {
456*4d7e907cSAndroid Build Coastguard Worker FrontendScanMessage msg;
457*4d7e907cSAndroid Build Coastguard Worker FrontendScanMessageStandard std;
458*4d7e907cSAndroid Build Coastguard Worker std.set<FrontendScanMessageStandard::Tag::sifStd>(FrontendAnalogSifStandard::AUTO);
459*4d7e907cSAndroid Build Coastguard Worker msg.set<FrontendScanMessage::Tag::std>(std);
460*4d7e907cSAndroid Build Coastguard Worker mCallback->onScanMessage(FrontendScanMessageType::STANDARD, msg);
461*4d7e907cSAndroid Build Coastguard Worker break;
462*4d7e907cSAndroid Build Coastguard Worker }
463*4d7e907cSAndroid Build Coastguard Worker default:
464*4d7e907cSAndroid Build Coastguard Worker break;
465*4d7e907cSAndroid Build Coastguard Worker }
466*4d7e907cSAndroid Build Coastguard Worker
467*4d7e907cSAndroid Build Coastguard Worker {
468*4d7e907cSAndroid Build Coastguard Worker FrontendScanMessage msg;
469*4d7e907cSAndroid Build Coastguard Worker FrontendScanAtsc3PlpInfo info;
470*4d7e907cSAndroid Build Coastguard Worker info.plpId = 1;
471*4d7e907cSAndroid Build Coastguard Worker info.bLlsFlag = false;
472*4d7e907cSAndroid Build Coastguard Worker vector<FrontendScanAtsc3PlpInfo> atsc3PlpInfos = {info};
473*4d7e907cSAndroid Build Coastguard Worker msg.set<FrontendScanMessage::Tag::atsc3PlpInfos>(atsc3PlpInfos);
474*4d7e907cSAndroid Build Coastguard Worker mCallback->onScanMessage(FrontendScanMessageType::ATSC3_PLP_INFO, msg);
475*4d7e907cSAndroid Build Coastguard Worker }
476*4d7e907cSAndroid Build Coastguard Worker
477*4d7e907cSAndroid Build Coastguard Worker {
478*4d7e907cSAndroid Build Coastguard Worker FrontendScanMessage msg;
479*4d7e907cSAndroid Build Coastguard Worker FrontendModulation modulation;
480*4d7e907cSAndroid Build Coastguard Worker modulation.set<FrontendModulation::Tag::dvbc>(FrontendDvbcModulation::MOD_16QAM);
481*4d7e907cSAndroid Build Coastguard Worker msg.set<FrontendScanMessage::Tag::modulation>(modulation);
482*4d7e907cSAndroid Build Coastguard Worker mCallback->onScanMessage(FrontendScanMessageType::MODULATION, msg);
483*4d7e907cSAndroid Build Coastguard Worker }
484*4d7e907cSAndroid Build Coastguard Worker
485*4d7e907cSAndroid Build Coastguard Worker {
486*4d7e907cSAndroid Build Coastguard Worker FrontendScanMessage msg;
487*4d7e907cSAndroid Build Coastguard Worker msg.set<FrontendScanMessage::Tag::isHighPriority>(true);
488*4d7e907cSAndroid Build Coastguard Worker mCallback->onScanMessage(FrontendScanMessageType::HIGH_PRIORITY, msg);
489*4d7e907cSAndroid Build Coastguard Worker }
490*4d7e907cSAndroid Build Coastguard Worker
491*4d7e907cSAndroid Build Coastguard Worker if (mType == FrontendType::DVBT) {
492*4d7e907cSAndroid Build Coastguard Worker FrontendScanMessage msg;
493*4d7e907cSAndroid Build Coastguard Worker vector<int32_t> dvbtCellIds = {0, 1};
494*4d7e907cSAndroid Build Coastguard Worker msg.set<FrontendScanMessage::Tag::dvbtCellIds>(dvbtCellIds);
495*4d7e907cSAndroid Build Coastguard Worker mCallback->onScanMessage(FrontendScanMessageType::DVBT_CELL_IDS, msg);
496*4d7e907cSAndroid Build Coastguard Worker }
497*4d7e907cSAndroid Build Coastguard Worker
498*4d7e907cSAndroid Build Coastguard Worker {
499*4d7e907cSAndroid Build Coastguard Worker FrontendScanMessage msg;
500*4d7e907cSAndroid Build Coastguard Worker msg.set<FrontendScanMessage::Tag::isLocked>(false);
501*4d7e907cSAndroid Build Coastguard Worker mCallback->onScanMessage(FrontendScanMessageType::LOCKED, msg);
502*4d7e907cSAndroid Build Coastguard Worker mIsLocked = false;
503*4d7e907cSAndroid Build Coastguard Worker }
504*4d7e907cSAndroid Build Coastguard Worker
505*4d7e907cSAndroid Build Coastguard Worker {
506*4d7e907cSAndroid Build Coastguard Worker FrontendScanMessage msg;
507*4d7e907cSAndroid Build Coastguard Worker msg.set<FrontendScanMessage::Tag::isLocked>(true);
508*4d7e907cSAndroid Build Coastguard Worker mCallback->onScanMessage(FrontendScanMessageType::LOCKED, msg);
509*4d7e907cSAndroid Build Coastguard Worker mIsLocked = true;
510*4d7e907cSAndroid Build Coastguard Worker }
511*4d7e907cSAndroid Build Coastguard Worker }
512*4d7e907cSAndroid Build Coastguard Worker
stopScan()513*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Frontend::stopScan() {
514*4d7e907cSAndroid Build Coastguard Worker ALOGV("%s", __FUNCTION__);
515*4d7e907cSAndroid Build Coastguard Worker
516*4d7e907cSAndroid Build Coastguard Worker if (mScanThread.joinable()) {
517*4d7e907cSAndroid Build Coastguard Worker mScanThread.join();
518*4d7e907cSAndroid Build Coastguard Worker }
519*4d7e907cSAndroid Build Coastguard Worker
520*4d7e907cSAndroid Build Coastguard Worker mIsLocked = false;
521*4d7e907cSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
522*4d7e907cSAndroid Build Coastguard Worker }
523*4d7e907cSAndroid Build Coastguard Worker
getStatus(const std::vector<FrontendStatusType> & in_statusTypes,std::vector<FrontendStatus> * _aidl_return)524*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Frontend::getStatus(const std::vector<FrontendStatusType>& in_statusTypes,
525*4d7e907cSAndroid Build Coastguard Worker std::vector<FrontendStatus>* _aidl_return) {
526*4d7e907cSAndroid Build Coastguard Worker ALOGV("%s", __FUNCTION__);
527*4d7e907cSAndroid Build Coastguard Worker
528*4d7e907cSAndroid Build Coastguard Worker for (int i = 0; i < in_statusTypes.size(); i++) {
529*4d7e907cSAndroid Build Coastguard Worker FrontendStatusType type = in_statusTypes[i];
530*4d7e907cSAndroid Build Coastguard Worker FrontendStatus status;
531*4d7e907cSAndroid Build Coastguard Worker // assign randomly selected values for testing.
532*4d7e907cSAndroid Build Coastguard Worker switch (type) {
533*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::DEMOD_LOCK: {
534*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::isDemodLocked>(true);
535*4d7e907cSAndroid Build Coastguard Worker break;
536*4d7e907cSAndroid Build Coastguard Worker }
537*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::SNR: {
538*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::snr>(221);
539*4d7e907cSAndroid Build Coastguard Worker break;
540*4d7e907cSAndroid Build Coastguard Worker }
541*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::BER: {
542*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::ber>(1);
543*4d7e907cSAndroid Build Coastguard Worker break;
544*4d7e907cSAndroid Build Coastguard Worker }
545*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::PER: {
546*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::per>(2);
547*4d7e907cSAndroid Build Coastguard Worker break;
548*4d7e907cSAndroid Build Coastguard Worker }
549*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::PRE_BER: {
550*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::preBer>(3);
551*4d7e907cSAndroid Build Coastguard Worker break;
552*4d7e907cSAndroid Build Coastguard Worker }
553*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::SIGNAL_QUALITY: {
554*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::signalQuality>(4);
555*4d7e907cSAndroid Build Coastguard Worker break;
556*4d7e907cSAndroid Build Coastguard Worker }
557*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::SIGNAL_STRENGTH: {
558*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::signalStrength>(5);
559*4d7e907cSAndroid Build Coastguard Worker break;
560*4d7e907cSAndroid Build Coastguard Worker }
561*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::SYMBOL_RATE: {
562*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::symbolRate>(6);
563*4d7e907cSAndroid Build Coastguard Worker break;
564*4d7e907cSAndroid Build Coastguard Worker }
565*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::FEC: {
566*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::innerFec>(FrontendInnerFec::FEC_2_9); // value = 1 << 7
567*4d7e907cSAndroid Build Coastguard Worker break;
568*4d7e907cSAndroid Build Coastguard Worker }
569*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::MODULATION: {
570*4d7e907cSAndroid Build Coastguard Worker switch (mType) {
571*4d7e907cSAndroid Build Coastguard Worker case FrontendType::ISDBS: {
572*4d7e907cSAndroid Build Coastguard Worker FrontendModulationStatus modulationStatus;
573*4d7e907cSAndroid Build Coastguard Worker modulationStatus.set<FrontendModulationStatus::Tag::isdbs>(
574*4d7e907cSAndroid Build Coastguard Worker FrontendIsdbsModulation::MOD_BPSK); // value = 1 << 1
575*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::modulationStatus>(modulationStatus);
576*4d7e907cSAndroid Build Coastguard Worker break;
577*4d7e907cSAndroid Build Coastguard Worker }
578*4d7e907cSAndroid Build Coastguard Worker case FrontendType::DVBC: {
579*4d7e907cSAndroid Build Coastguard Worker FrontendModulationStatus modulationStatus;
580*4d7e907cSAndroid Build Coastguard Worker modulationStatus.set<FrontendModulationStatus::Tag::dvbc>(
581*4d7e907cSAndroid Build Coastguard Worker FrontendDvbcModulation::MOD_16QAM); // value = 1 << 1
582*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::modulationStatus>(modulationStatus);
583*4d7e907cSAndroid Build Coastguard Worker break;
584*4d7e907cSAndroid Build Coastguard Worker }
585*4d7e907cSAndroid Build Coastguard Worker case FrontendType::DVBS: {
586*4d7e907cSAndroid Build Coastguard Worker FrontendModulationStatus modulationStatus;
587*4d7e907cSAndroid Build Coastguard Worker modulationStatus.set<FrontendModulationStatus::Tag::dvbs>(
588*4d7e907cSAndroid Build Coastguard Worker FrontendDvbsModulation::MOD_QPSK); // value = 1 << 1
589*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::modulationStatus>(modulationStatus);
590*4d7e907cSAndroid Build Coastguard Worker break;
591*4d7e907cSAndroid Build Coastguard Worker }
592*4d7e907cSAndroid Build Coastguard Worker case FrontendType::ISDBS3: {
593*4d7e907cSAndroid Build Coastguard Worker FrontendModulationStatus modulationStatus;
594*4d7e907cSAndroid Build Coastguard Worker modulationStatus.set<FrontendModulationStatus::Tag::isdbs3>(
595*4d7e907cSAndroid Build Coastguard Worker FrontendIsdbs3Modulation::MOD_BPSK); // value = 1 << 1
596*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::modulationStatus>(modulationStatus);
597*4d7e907cSAndroid Build Coastguard Worker break;
598*4d7e907cSAndroid Build Coastguard Worker }
599*4d7e907cSAndroid Build Coastguard Worker case FrontendType::ISDBT: {
600*4d7e907cSAndroid Build Coastguard Worker FrontendModulationStatus modulationStatus;
601*4d7e907cSAndroid Build Coastguard Worker modulationStatus.set<FrontendModulationStatus::Tag::isdbt>(
602*4d7e907cSAndroid Build Coastguard Worker FrontendIsdbtModulation::MOD_DQPSK); // value = 1 << 1
603*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::modulationStatus>(modulationStatus);
604*4d7e907cSAndroid Build Coastguard Worker break;
605*4d7e907cSAndroid Build Coastguard Worker }
606*4d7e907cSAndroid Build Coastguard Worker default:
607*4d7e907cSAndroid Build Coastguard Worker break;
608*4d7e907cSAndroid Build Coastguard Worker }
609*4d7e907cSAndroid Build Coastguard Worker break;
610*4d7e907cSAndroid Build Coastguard Worker }
611*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::SPECTRAL: {
612*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::inversion>(FrontendSpectralInversion::NORMAL);
613*4d7e907cSAndroid Build Coastguard Worker break;
614*4d7e907cSAndroid Build Coastguard Worker }
615*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::LNB_VOLTAGE: {
616*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::lnbVoltage>(LnbVoltage::VOLTAGE_5V);
617*4d7e907cSAndroid Build Coastguard Worker break;
618*4d7e907cSAndroid Build Coastguard Worker }
619*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::PLP_ID: {
620*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::plpId>(101);
621*4d7e907cSAndroid Build Coastguard Worker break;
622*4d7e907cSAndroid Build Coastguard Worker }
623*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::EWBS: {
624*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::isEWBS>(false);
625*4d7e907cSAndroid Build Coastguard Worker break;
626*4d7e907cSAndroid Build Coastguard Worker }
627*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::AGC: {
628*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::agc>(7);
629*4d7e907cSAndroid Build Coastguard Worker break;
630*4d7e907cSAndroid Build Coastguard Worker }
631*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::LNA: {
632*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::isLnaOn>(false);
633*4d7e907cSAndroid Build Coastguard Worker break;
634*4d7e907cSAndroid Build Coastguard Worker }
635*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::LAYER_ERROR: {
636*4d7e907cSAndroid Build Coastguard Worker vector<bool> v = {false, true, true};
637*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::isLayerError>(v);
638*4d7e907cSAndroid Build Coastguard Worker break;
639*4d7e907cSAndroid Build Coastguard Worker }
640*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::MER: {
641*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::mer>(8);
642*4d7e907cSAndroid Build Coastguard Worker break;
643*4d7e907cSAndroid Build Coastguard Worker }
644*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::FREQ_OFFSET: {
645*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::freqOffset>(9);
646*4d7e907cSAndroid Build Coastguard Worker break;
647*4d7e907cSAndroid Build Coastguard Worker }
648*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::HIERARCHY: {
649*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::hierarchy>(FrontendDvbtHierarchy::HIERARCHY_1_NATIVE);
650*4d7e907cSAndroid Build Coastguard Worker break;
651*4d7e907cSAndroid Build Coastguard Worker }
652*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::RF_LOCK: {
653*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::isRfLocked>(false);
654*4d7e907cSAndroid Build Coastguard Worker break;
655*4d7e907cSAndroid Build Coastguard Worker }
656*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::ATSC3_PLP_INFO: {
657*4d7e907cSAndroid Build Coastguard Worker FrontendStatusAtsc3PlpInfo info1;
658*4d7e907cSAndroid Build Coastguard Worker info1.plpId = 3;
659*4d7e907cSAndroid Build Coastguard Worker info1.isLocked = false;
660*4d7e907cSAndroid Build Coastguard Worker info1.uec = 313;
661*4d7e907cSAndroid Build Coastguard Worker FrontendStatusAtsc3PlpInfo info2;
662*4d7e907cSAndroid Build Coastguard Worker info2.plpId = 5;
663*4d7e907cSAndroid Build Coastguard Worker info2.isLocked = true;
664*4d7e907cSAndroid Build Coastguard Worker info2.uec = 515;
665*4d7e907cSAndroid Build Coastguard Worker vector<FrontendStatusAtsc3PlpInfo> infos = {info1, info2};
666*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::plpInfo>(infos);
667*4d7e907cSAndroid Build Coastguard Worker break;
668*4d7e907cSAndroid Build Coastguard Worker }
669*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::MODULATIONS: {
670*4d7e907cSAndroid Build Coastguard Worker FrontendModulation modulation;
671*4d7e907cSAndroid Build Coastguard Worker vector<FrontendModulation> modulations;
672*4d7e907cSAndroid Build Coastguard Worker switch (mType) {
673*4d7e907cSAndroid Build Coastguard Worker case FrontendType::ISDBS: {
674*4d7e907cSAndroid Build Coastguard Worker modulation.set<FrontendModulation::Tag::isdbs>(
675*4d7e907cSAndroid Build Coastguard Worker FrontendIsdbsModulation::MOD_BPSK); // value = 1 << 1
676*4d7e907cSAndroid Build Coastguard Worker modulations.push_back(modulation);
677*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::modulations>(modulations);
678*4d7e907cSAndroid Build Coastguard Worker break;
679*4d7e907cSAndroid Build Coastguard Worker }
680*4d7e907cSAndroid Build Coastguard Worker case FrontendType::DVBC: {
681*4d7e907cSAndroid Build Coastguard Worker modulation.set<FrontendModulation::Tag::dvbc>(
682*4d7e907cSAndroid Build Coastguard Worker FrontendDvbcModulation::MOD_16QAM); // value = 1 << 1
683*4d7e907cSAndroid Build Coastguard Worker modulations.push_back(modulation);
684*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::modulations>(modulations);
685*4d7e907cSAndroid Build Coastguard Worker break;
686*4d7e907cSAndroid Build Coastguard Worker }
687*4d7e907cSAndroid Build Coastguard Worker case FrontendType::DVBS: {
688*4d7e907cSAndroid Build Coastguard Worker modulation.set<FrontendModulation::Tag::dvbs>(
689*4d7e907cSAndroid Build Coastguard Worker FrontendDvbsModulation::MOD_QPSK); // value = 1 << 1
690*4d7e907cSAndroid Build Coastguard Worker modulations.push_back(modulation);
691*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::modulations>(modulations);
692*4d7e907cSAndroid Build Coastguard Worker break;
693*4d7e907cSAndroid Build Coastguard Worker }
694*4d7e907cSAndroid Build Coastguard Worker case FrontendType::DVBT: {
695*4d7e907cSAndroid Build Coastguard Worker modulation.set<FrontendModulation::Tag::dvbt>(
696*4d7e907cSAndroid Build Coastguard Worker FrontendDvbtConstellation::CONSTELLATION_16QAM_R); // value = 1 <<
697*4d7e907cSAndroid Build Coastguard Worker // 16
698*4d7e907cSAndroid Build Coastguard Worker modulations.push_back(modulation);
699*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::modulations>(modulations);
700*4d7e907cSAndroid Build Coastguard Worker break;
701*4d7e907cSAndroid Build Coastguard Worker }
702*4d7e907cSAndroid Build Coastguard Worker case FrontendType::ISDBS3: {
703*4d7e907cSAndroid Build Coastguard Worker modulation.set<FrontendModulation::Tag::isdbs3>(
704*4d7e907cSAndroid Build Coastguard Worker FrontendIsdbs3Modulation::MOD_BPSK); // value = 1 << 1
705*4d7e907cSAndroid Build Coastguard Worker modulations.push_back(modulation);
706*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::modulations>(modulations);
707*4d7e907cSAndroid Build Coastguard Worker break;
708*4d7e907cSAndroid Build Coastguard Worker }
709*4d7e907cSAndroid Build Coastguard Worker case FrontendType::ISDBT: {
710*4d7e907cSAndroid Build Coastguard Worker modulation.set<FrontendModulation::Tag::isdbt>(
711*4d7e907cSAndroid Build Coastguard Worker FrontendIsdbtModulation::MOD_DQPSK); // value = 1 << 1
712*4d7e907cSAndroid Build Coastguard Worker modulations.push_back(modulation);
713*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::modulations>(modulations);
714*4d7e907cSAndroid Build Coastguard Worker break;
715*4d7e907cSAndroid Build Coastguard Worker }
716*4d7e907cSAndroid Build Coastguard Worker case FrontendType::ATSC: {
717*4d7e907cSAndroid Build Coastguard Worker modulation.set<FrontendModulation::Tag::atsc>(
718*4d7e907cSAndroid Build Coastguard Worker FrontendAtscModulation::MOD_8VSB); // value = 1 << 2
719*4d7e907cSAndroid Build Coastguard Worker modulations.push_back(modulation);
720*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::modulations>(modulations);
721*4d7e907cSAndroid Build Coastguard Worker break;
722*4d7e907cSAndroid Build Coastguard Worker }
723*4d7e907cSAndroid Build Coastguard Worker case FrontendType::ATSC3: {
724*4d7e907cSAndroid Build Coastguard Worker modulation.set<FrontendModulation::Tag::atsc3>(
725*4d7e907cSAndroid Build Coastguard Worker FrontendAtsc3Modulation::MOD_QPSK); // value = 1 << 1
726*4d7e907cSAndroid Build Coastguard Worker modulations.push_back(modulation);
727*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::modulations>(modulations);
728*4d7e907cSAndroid Build Coastguard Worker break;
729*4d7e907cSAndroid Build Coastguard Worker }
730*4d7e907cSAndroid Build Coastguard Worker case FrontendType::DTMB: {
731*4d7e907cSAndroid Build Coastguard Worker modulation.set<FrontendModulation::Tag::dtmb>(
732*4d7e907cSAndroid Build Coastguard Worker FrontendDtmbModulation::CONSTELLATION_4QAM); // value = 1 << 1
733*4d7e907cSAndroid Build Coastguard Worker modulations.push_back(modulation);
734*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::modulations>(modulations);
735*4d7e907cSAndroid Build Coastguard Worker break;
736*4d7e907cSAndroid Build Coastguard Worker }
737*4d7e907cSAndroid Build Coastguard Worker default:
738*4d7e907cSAndroid Build Coastguard Worker break;
739*4d7e907cSAndroid Build Coastguard Worker }
740*4d7e907cSAndroid Build Coastguard Worker break;
741*4d7e907cSAndroid Build Coastguard Worker }
742*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::BERS: {
743*4d7e907cSAndroid Build Coastguard Worker vector<int32_t> bers = {1};
744*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::bers>(bers);
745*4d7e907cSAndroid Build Coastguard Worker break;
746*4d7e907cSAndroid Build Coastguard Worker }
747*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::CODERATES: {
748*4d7e907cSAndroid Build Coastguard Worker vector<FrontendInnerFec> rates;
749*4d7e907cSAndroid Build Coastguard Worker rates.push_back(FrontendInnerFec::FEC_6_15); // value = 1 << 39
750*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::codeRates>(rates);
751*4d7e907cSAndroid Build Coastguard Worker break;
752*4d7e907cSAndroid Build Coastguard Worker }
753*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::BANDWIDTH: {
754*4d7e907cSAndroid Build Coastguard Worker FrontendBandwidth bandwidth;
755*4d7e907cSAndroid Build Coastguard Worker switch (mType) {
756*4d7e907cSAndroid Build Coastguard Worker case FrontendType::DVBC: {
757*4d7e907cSAndroid Build Coastguard Worker bandwidth.set<FrontendBandwidth::Tag::dvbc>(
758*4d7e907cSAndroid Build Coastguard Worker FrontendDvbcBandwidth::BANDWIDTH_6MHZ); // value = 1 << 1
759*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::bandwidth>(bandwidth);
760*4d7e907cSAndroid Build Coastguard Worker break;
761*4d7e907cSAndroid Build Coastguard Worker }
762*4d7e907cSAndroid Build Coastguard Worker case FrontendType::DVBT: {
763*4d7e907cSAndroid Build Coastguard Worker bandwidth.set<FrontendBandwidth::Tag::dvbt>(
764*4d7e907cSAndroid Build Coastguard Worker FrontendDvbtBandwidth::BANDWIDTH_8MHZ); // value = 1 << 1
765*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::bandwidth>(bandwidth);
766*4d7e907cSAndroid Build Coastguard Worker break;
767*4d7e907cSAndroid Build Coastguard Worker }
768*4d7e907cSAndroid Build Coastguard Worker case FrontendType::ISDBT: {
769*4d7e907cSAndroid Build Coastguard Worker bandwidth.set<FrontendBandwidth::Tag::isdbt>(
770*4d7e907cSAndroid Build Coastguard Worker FrontendIsdbtBandwidth::BANDWIDTH_8MHZ); // value = 1 << 1
771*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::bandwidth>(bandwidth);
772*4d7e907cSAndroid Build Coastguard Worker break;
773*4d7e907cSAndroid Build Coastguard Worker }
774*4d7e907cSAndroid Build Coastguard Worker case FrontendType::ATSC3: {
775*4d7e907cSAndroid Build Coastguard Worker bandwidth.set<FrontendBandwidth::Tag::atsc3>(
776*4d7e907cSAndroid Build Coastguard Worker FrontendAtsc3Bandwidth::BANDWIDTH_6MHZ); // value = 1 << 1
777*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::bandwidth>(bandwidth);
778*4d7e907cSAndroid Build Coastguard Worker break;
779*4d7e907cSAndroid Build Coastguard Worker }
780*4d7e907cSAndroid Build Coastguard Worker case FrontendType::DTMB: {
781*4d7e907cSAndroid Build Coastguard Worker bandwidth.set<FrontendBandwidth::Tag::dtmb>(
782*4d7e907cSAndroid Build Coastguard Worker FrontendDtmbBandwidth::BANDWIDTH_8MHZ); // value = 1 << 1
783*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::bandwidth>(bandwidth);
784*4d7e907cSAndroid Build Coastguard Worker break;
785*4d7e907cSAndroid Build Coastguard Worker }
786*4d7e907cSAndroid Build Coastguard Worker default:
787*4d7e907cSAndroid Build Coastguard Worker break;
788*4d7e907cSAndroid Build Coastguard Worker }
789*4d7e907cSAndroid Build Coastguard Worker break;
790*4d7e907cSAndroid Build Coastguard Worker }
791*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::GUARD_INTERVAL: {
792*4d7e907cSAndroid Build Coastguard Worker FrontendGuardInterval interval;
793*4d7e907cSAndroid Build Coastguard Worker switch (mType) {
794*4d7e907cSAndroid Build Coastguard Worker case FrontendType::DVBT: {
795*4d7e907cSAndroid Build Coastguard Worker interval.set<FrontendGuardInterval::Tag::dvbt>(
796*4d7e907cSAndroid Build Coastguard Worker FrontendDvbtGuardInterval::INTERVAL_1_32); // value = 1 << 1
797*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::interval>(interval);
798*4d7e907cSAndroid Build Coastguard Worker break;
799*4d7e907cSAndroid Build Coastguard Worker }
800*4d7e907cSAndroid Build Coastguard Worker case FrontendType::ISDBT: {
801*4d7e907cSAndroid Build Coastguard Worker interval.set<FrontendGuardInterval::Tag::isdbt>(
802*4d7e907cSAndroid Build Coastguard Worker FrontendIsdbtGuardInterval::INTERVAL_1_32); // value = 1 << 1
803*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::interval>(interval);
804*4d7e907cSAndroid Build Coastguard Worker break;
805*4d7e907cSAndroid Build Coastguard Worker }
806*4d7e907cSAndroid Build Coastguard Worker case FrontendType::DTMB: {
807*4d7e907cSAndroid Build Coastguard Worker interval.set<FrontendGuardInterval::Tag::dtmb>(
808*4d7e907cSAndroid Build Coastguard Worker FrontendDtmbGuardInterval::PN_420_VARIOUS); // value = 1 << 1
809*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::interval>(interval);
810*4d7e907cSAndroid Build Coastguard Worker break;
811*4d7e907cSAndroid Build Coastguard Worker }
812*4d7e907cSAndroid Build Coastguard Worker default:
813*4d7e907cSAndroid Build Coastguard Worker break;
814*4d7e907cSAndroid Build Coastguard Worker }
815*4d7e907cSAndroid Build Coastguard Worker break;
816*4d7e907cSAndroid Build Coastguard Worker }
817*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::TRANSMISSION_MODE: {
818*4d7e907cSAndroid Build Coastguard Worker FrontendTransmissionMode transMode;
819*4d7e907cSAndroid Build Coastguard Worker switch (mType) {
820*4d7e907cSAndroid Build Coastguard Worker case FrontendType::DVBT: {
821*4d7e907cSAndroid Build Coastguard Worker transMode.set<FrontendTransmissionMode::Tag::dvbt>(
822*4d7e907cSAndroid Build Coastguard Worker FrontendDvbtTransmissionMode::MODE_16K_E); // value = 1 << 8
823*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::transmissionMode>(transMode);
824*4d7e907cSAndroid Build Coastguard Worker break;
825*4d7e907cSAndroid Build Coastguard Worker }
826*4d7e907cSAndroid Build Coastguard Worker case FrontendType::ISDBT: {
827*4d7e907cSAndroid Build Coastguard Worker transMode.set<FrontendTransmissionMode::Tag::isdbt>(
828*4d7e907cSAndroid Build Coastguard Worker FrontendIsdbtMode::MODE_1); // value = 1 << 1
829*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::transmissionMode>(transMode);
830*4d7e907cSAndroid Build Coastguard Worker break;
831*4d7e907cSAndroid Build Coastguard Worker }
832*4d7e907cSAndroid Build Coastguard Worker case FrontendType::DTMB: {
833*4d7e907cSAndroid Build Coastguard Worker transMode.set<FrontendTransmissionMode::Tag::dtmb>(
834*4d7e907cSAndroid Build Coastguard Worker FrontendDtmbTransmissionMode::C1); // value = 1 << 1
835*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::transmissionMode>(transMode);
836*4d7e907cSAndroid Build Coastguard Worker break;
837*4d7e907cSAndroid Build Coastguard Worker }
838*4d7e907cSAndroid Build Coastguard Worker default:
839*4d7e907cSAndroid Build Coastguard Worker break;
840*4d7e907cSAndroid Build Coastguard Worker }
841*4d7e907cSAndroid Build Coastguard Worker break;
842*4d7e907cSAndroid Build Coastguard Worker }
843*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::UEC: {
844*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::uec>(4);
845*4d7e907cSAndroid Build Coastguard Worker break;
846*4d7e907cSAndroid Build Coastguard Worker }
847*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::T2_SYSTEM_ID: {
848*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::systemId>(5);
849*4d7e907cSAndroid Build Coastguard Worker break;
850*4d7e907cSAndroid Build Coastguard Worker }
851*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::INTERLEAVINGS: {
852*4d7e907cSAndroid Build Coastguard Worker FrontendInterleaveMode interleave;
853*4d7e907cSAndroid Build Coastguard Worker vector<FrontendInterleaveMode> interleaves;
854*4d7e907cSAndroid Build Coastguard Worker switch (mType) {
855*4d7e907cSAndroid Build Coastguard Worker case FrontendType::DVBC: {
856*4d7e907cSAndroid Build Coastguard Worker // value = 1 << 1
857*4d7e907cSAndroid Build Coastguard Worker interleave.set<FrontendInterleaveMode::Tag::dvbc>(
858*4d7e907cSAndroid Build Coastguard Worker FrontendCableTimeInterleaveMode::INTERLEAVING_128_1_0);
859*4d7e907cSAndroid Build Coastguard Worker interleaves.push_back(interleave);
860*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::interleaving>(interleaves);
861*4d7e907cSAndroid Build Coastguard Worker break;
862*4d7e907cSAndroid Build Coastguard Worker }
863*4d7e907cSAndroid Build Coastguard Worker case FrontendType::ATSC3: {
864*4d7e907cSAndroid Build Coastguard Worker interleave.set<FrontendInterleaveMode::Tag::atsc3>(
865*4d7e907cSAndroid Build Coastguard Worker FrontendAtsc3TimeInterleaveMode::CTI); // value = 1 << 1
866*4d7e907cSAndroid Build Coastguard Worker interleaves.push_back(interleave);
867*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::interleaving>(interleaves);
868*4d7e907cSAndroid Build Coastguard Worker break;
869*4d7e907cSAndroid Build Coastguard Worker }
870*4d7e907cSAndroid Build Coastguard Worker case FrontendType::DTMB: {
871*4d7e907cSAndroid Build Coastguard Worker interleave.set<FrontendInterleaveMode::Tag::dtmb>(
872*4d7e907cSAndroid Build Coastguard Worker FrontendDtmbTimeInterleaveMode::TIMER_INT_240); // value = 1 << 1
873*4d7e907cSAndroid Build Coastguard Worker interleaves.push_back(interleave);
874*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::interleaving>(interleaves);
875*4d7e907cSAndroid Build Coastguard Worker break;
876*4d7e907cSAndroid Build Coastguard Worker }
877*4d7e907cSAndroid Build Coastguard Worker case FrontendType::ISDBT: {
878*4d7e907cSAndroid Build Coastguard Worker interleave.set<FrontendInterleaveMode::Tag::isdbt>(
879*4d7e907cSAndroid Build Coastguard Worker FrontendIsdbtTimeInterleaveMode::INTERLEAVE_1_0); // value = 1 << 1
880*4d7e907cSAndroid Build Coastguard Worker interleaves.push_back(interleave);
881*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::interleaving>(interleaves);
882*4d7e907cSAndroid Build Coastguard Worker break;
883*4d7e907cSAndroid Build Coastguard Worker }
884*4d7e907cSAndroid Build Coastguard Worker default:
885*4d7e907cSAndroid Build Coastguard Worker break;
886*4d7e907cSAndroid Build Coastguard Worker }
887*4d7e907cSAndroid Build Coastguard Worker break;
888*4d7e907cSAndroid Build Coastguard Worker }
889*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::ISDBT_SEGMENTS: {
890*4d7e907cSAndroid Build Coastguard Worker vector<int32_t> segments = {2, 3};
891*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::isdbtSegment>(segments);
892*4d7e907cSAndroid Build Coastguard Worker break;
893*4d7e907cSAndroid Build Coastguard Worker }
894*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::TS_DATA_RATES: {
895*4d7e907cSAndroid Build Coastguard Worker vector<int32_t> dataRates = {4, 5};
896*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::tsDataRate>(dataRates);
897*4d7e907cSAndroid Build Coastguard Worker break;
898*4d7e907cSAndroid Build Coastguard Worker }
899*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::ROLL_OFF: {
900*4d7e907cSAndroid Build Coastguard Worker FrontendRollOff rollOff;
901*4d7e907cSAndroid Build Coastguard Worker switch (mType) {
902*4d7e907cSAndroid Build Coastguard Worker case FrontendType::DVBS: {
903*4d7e907cSAndroid Build Coastguard Worker rollOff.set<FrontendRollOff::Tag::dvbs>(
904*4d7e907cSAndroid Build Coastguard Worker FrontendDvbsRolloff::ROLLOFF_0_35); // value = 1
905*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::rollOff>(rollOff);
906*4d7e907cSAndroid Build Coastguard Worker break;
907*4d7e907cSAndroid Build Coastguard Worker }
908*4d7e907cSAndroid Build Coastguard Worker case FrontendType::ISDBS: {
909*4d7e907cSAndroid Build Coastguard Worker rollOff.set<FrontendRollOff::Tag::isdbs>(
910*4d7e907cSAndroid Build Coastguard Worker FrontendIsdbsRolloff::ROLLOFF_0_35); // value = 1
911*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::rollOff>(rollOff);
912*4d7e907cSAndroid Build Coastguard Worker break;
913*4d7e907cSAndroid Build Coastguard Worker }
914*4d7e907cSAndroid Build Coastguard Worker case FrontendType::ISDBS3: {
915*4d7e907cSAndroid Build Coastguard Worker rollOff.set<FrontendRollOff::Tag::isdbs3>(
916*4d7e907cSAndroid Build Coastguard Worker FrontendIsdbs3Rolloff::ROLLOFF_0_03); // value = 1
917*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::rollOff>(rollOff);
918*4d7e907cSAndroid Build Coastguard Worker break;
919*4d7e907cSAndroid Build Coastguard Worker }
920*4d7e907cSAndroid Build Coastguard Worker default:
921*4d7e907cSAndroid Build Coastguard Worker break;
922*4d7e907cSAndroid Build Coastguard Worker }
923*4d7e907cSAndroid Build Coastguard Worker break;
924*4d7e907cSAndroid Build Coastguard Worker }
925*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::IS_MISO: {
926*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::isMiso>(true);
927*4d7e907cSAndroid Build Coastguard Worker break;
928*4d7e907cSAndroid Build Coastguard Worker }
929*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::IS_LINEAR: {
930*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::isLinear>(true);
931*4d7e907cSAndroid Build Coastguard Worker break;
932*4d7e907cSAndroid Build Coastguard Worker }
933*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::IS_SHORT_FRAMES: {
934*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::isShortFrames>(true);
935*4d7e907cSAndroid Build Coastguard Worker break;
936*4d7e907cSAndroid Build Coastguard Worker }
937*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::ISDBT_MODE: {
938*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::isdbtMode>(FrontendIsdbtMode::AUTO);
939*4d7e907cSAndroid Build Coastguard Worker break;
940*4d7e907cSAndroid Build Coastguard Worker }
941*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::ISDBT_PARTIAL_RECEPTION_FLAG: {
942*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::partialReceptionFlag>(
943*4d7e907cSAndroid Build Coastguard Worker FrontendIsdbtPartialReceptionFlag::AUTO);
944*4d7e907cSAndroid Build Coastguard Worker break;
945*4d7e907cSAndroid Build Coastguard Worker }
946*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::STREAM_ID_LIST: {
947*4d7e907cSAndroid Build Coastguard Worker vector<int32_t> streamIds = {0, 1};
948*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::streamIdList>(streamIds);
949*4d7e907cSAndroid Build Coastguard Worker break;
950*4d7e907cSAndroid Build Coastguard Worker }
951*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::DVBT_CELL_IDS: {
952*4d7e907cSAndroid Build Coastguard Worker vector<int32_t> dvbtCellIds = {0, 1};
953*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::dvbtCellIds>(dvbtCellIds);
954*4d7e907cSAndroid Build Coastguard Worker break;
955*4d7e907cSAndroid Build Coastguard Worker }
956*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::ATSC3_ALL_PLP_INFO: {
957*4d7e907cSAndroid Build Coastguard Worker FrontendScanAtsc3PlpInfo info1;
958*4d7e907cSAndroid Build Coastguard Worker info1.plpId = 1;
959*4d7e907cSAndroid Build Coastguard Worker info1.bLlsFlag = false;
960*4d7e907cSAndroid Build Coastguard Worker FrontendScanAtsc3PlpInfo info2;
961*4d7e907cSAndroid Build Coastguard Worker info2.plpId = 2;
962*4d7e907cSAndroid Build Coastguard Worker info2.bLlsFlag = true;
963*4d7e907cSAndroid Build Coastguard Worker FrontendScanAtsc3PlpInfo info3;
964*4d7e907cSAndroid Build Coastguard Worker info3.plpId = 3;
965*4d7e907cSAndroid Build Coastguard Worker info3.bLlsFlag = false;
966*4d7e907cSAndroid Build Coastguard Worker vector<FrontendScanAtsc3PlpInfo> infos = {info1, info2, info3};
967*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::allPlpInfo>(infos);
968*4d7e907cSAndroid Build Coastguard Worker break;
969*4d7e907cSAndroid Build Coastguard Worker }
970*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::IPTV_CONTENT_URL: {
971*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::iptvContentUrl>("");
972*4d7e907cSAndroid Build Coastguard Worker break;
973*4d7e907cSAndroid Build Coastguard Worker }
974*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::IPTV_PACKETS_LOST: {
975*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::iptvPacketsLost>(5);
976*4d7e907cSAndroid Build Coastguard Worker break;
977*4d7e907cSAndroid Build Coastguard Worker }
978*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::IPTV_PACKETS_RECEIVED: {
979*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::iptvPacketsReceived>(5);
980*4d7e907cSAndroid Build Coastguard Worker break;
981*4d7e907cSAndroid Build Coastguard Worker }
982*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::IPTV_WORST_JITTER_MS: {
983*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::iptvWorstJitterMs>(5);
984*4d7e907cSAndroid Build Coastguard Worker break;
985*4d7e907cSAndroid Build Coastguard Worker }
986*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::IPTV_AVERAGE_JITTER_MS: {
987*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::iptvAverageJitterMs>(5);
988*4d7e907cSAndroid Build Coastguard Worker break;
989*4d7e907cSAndroid Build Coastguard Worker }
990*4d7e907cSAndroid Build Coastguard Worker case FrontendStatusType::STANDARD_EXT: {
991*4d7e907cSAndroid Build Coastguard Worker FrontendStandardExt standardExt;
992*4d7e907cSAndroid Build Coastguard Worker if (mType == FrontendType::DVBS) {
993*4d7e907cSAndroid Build Coastguard Worker standardExt.set<FrontendStandardExt::dvbsStandardExt>(
994*4d7e907cSAndroid Build Coastguard Worker FrontendDvbsStandard::S2X);
995*4d7e907cSAndroid Build Coastguard Worker } else if (mType == FrontendType::DVBT) {
996*4d7e907cSAndroid Build Coastguard Worker standardExt.set<FrontendStandardExt::dvbtStandardExt>(FrontendDvbtStandard::T2);
997*4d7e907cSAndroid Build Coastguard Worker }
998*4d7e907cSAndroid Build Coastguard Worker status.set<FrontendStatus::standardExt>(standardExt);
999*4d7e907cSAndroid Build Coastguard Worker break;
1000*4d7e907cSAndroid Build Coastguard Worker }
1001*4d7e907cSAndroid Build Coastguard Worker default: {
1002*4d7e907cSAndroid Build Coastguard Worker continue;
1003*4d7e907cSAndroid Build Coastguard Worker }
1004*4d7e907cSAndroid Build Coastguard Worker }
1005*4d7e907cSAndroid Build Coastguard Worker _aidl_return->push_back(status);
1006*4d7e907cSAndroid Build Coastguard Worker }
1007*4d7e907cSAndroid Build Coastguard Worker
1008*4d7e907cSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
1009*4d7e907cSAndroid Build Coastguard Worker }
1010*4d7e907cSAndroid Build Coastguard Worker
setLnb(int32_t)1011*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Frontend::setLnb(int32_t /* in_lnbId */) {
1012*4d7e907cSAndroid Build Coastguard Worker ALOGV("%s", __FUNCTION__);
1013*4d7e907cSAndroid Build Coastguard Worker if (!supportsSatellite()) {
1014*4d7e907cSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::fromServiceSpecificError(
1015*4d7e907cSAndroid Build Coastguard Worker static_cast<int32_t>(Result::INVALID_STATE));
1016*4d7e907cSAndroid Build Coastguard Worker }
1017*4d7e907cSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
1018*4d7e907cSAndroid Build Coastguard Worker }
1019*4d7e907cSAndroid Build Coastguard Worker
linkCiCam(int32_t in_ciCamId,int32_t * _aidl_return)1020*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Frontend::linkCiCam(int32_t in_ciCamId, int32_t* _aidl_return) {
1021*4d7e907cSAndroid Build Coastguard Worker ALOGV("%s", __FUNCTION__);
1022*4d7e907cSAndroid Build Coastguard Worker
1023*4d7e907cSAndroid Build Coastguard Worker mCiCamId = in_ciCamId;
1024*4d7e907cSAndroid Build Coastguard Worker *_aidl_return = 0;
1025*4d7e907cSAndroid Build Coastguard Worker
1026*4d7e907cSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
1027*4d7e907cSAndroid Build Coastguard Worker }
1028*4d7e907cSAndroid Build Coastguard Worker
unlinkCiCam(int32_t)1029*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Frontend::unlinkCiCam(int32_t /* in_ciCamId */) {
1030*4d7e907cSAndroid Build Coastguard Worker ALOGV("%s", __FUNCTION__);
1031*4d7e907cSAndroid Build Coastguard Worker
1032*4d7e907cSAndroid Build Coastguard Worker mCiCamId = -1;
1033*4d7e907cSAndroid Build Coastguard Worker
1034*4d7e907cSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
1035*4d7e907cSAndroid Build Coastguard Worker }
1036*4d7e907cSAndroid Build Coastguard Worker
dump(int fd,const char **,uint32_t)1037*4d7e907cSAndroid Build Coastguard Worker binder_status_t Frontend::dump(int fd, const char** /* args */, uint32_t /* numArgs */) {
1038*4d7e907cSAndroid Build Coastguard Worker dprintf(fd, " Frontend %d\n", mId);
1039*4d7e907cSAndroid Build Coastguard Worker dprintf(fd, " mType: %d\n", mType);
1040*4d7e907cSAndroid Build Coastguard Worker dprintf(fd, " mIsLocked: %d\n", mIsLocked);
1041*4d7e907cSAndroid Build Coastguard Worker dprintf(fd, " mCiCamId: %d\n", mCiCamId);
1042*4d7e907cSAndroid Build Coastguard Worker dprintf(fd, " mFrontendStatusCaps:");
1043*4d7e907cSAndroid Build Coastguard Worker for (int i = 0; i < mFrontendStatusCaps.size(); i++) {
1044*4d7e907cSAndroid Build Coastguard Worker dprintf(fd, " %d\n", mFrontendStatusCaps[i]);
1045*4d7e907cSAndroid Build Coastguard Worker }
1046*4d7e907cSAndroid Build Coastguard Worker return STATUS_OK;
1047*4d7e907cSAndroid Build Coastguard Worker }
1048*4d7e907cSAndroid Build Coastguard Worker
getHardwareInfo(std::string * _aidl_return)1049*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Frontend::getHardwareInfo(std::string* _aidl_return) {
1050*4d7e907cSAndroid Build Coastguard Worker ALOGV("%s", __FUNCTION__);
1051*4d7e907cSAndroid Build Coastguard Worker
1052*4d7e907cSAndroid Build Coastguard Worker *_aidl_return = "Sample Frontend";
1053*4d7e907cSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
1054*4d7e907cSAndroid Build Coastguard Worker }
1055*4d7e907cSAndroid Build Coastguard Worker
removeOutputPid(int32_t)1056*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Frontend::removeOutputPid(int32_t /* in_pid */) {
1057*4d7e907cSAndroid Build Coastguard Worker ALOGV("%s", __FUNCTION__);
1058*4d7e907cSAndroid Build Coastguard Worker
1059*4d7e907cSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::fromServiceSpecificError(
1060*4d7e907cSAndroid Build Coastguard Worker static_cast<int32_t>(Result::UNAVAILABLE));
1061*4d7e907cSAndroid Build Coastguard Worker }
1062*4d7e907cSAndroid Build Coastguard Worker
getFrontendStatusReadiness(const std::vector<FrontendStatusType> & in_statusTypes,std::vector<FrontendStatusReadiness> * _aidl_return)1063*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus Frontend::getFrontendStatusReadiness(
1064*4d7e907cSAndroid Build Coastguard Worker const std::vector<FrontendStatusType>& in_statusTypes,
1065*4d7e907cSAndroid Build Coastguard Worker std::vector<FrontendStatusReadiness>* _aidl_return) {
1066*4d7e907cSAndroid Build Coastguard Worker ALOGV("%s", __FUNCTION__);
1067*4d7e907cSAndroid Build Coastguard Worker
1068*4d7e907cSAndroid Build Coastguard Worker _aidl_return->resize(in_statusTypes.size());
1069*4d7e907cSAndroid Build Coastguard Worker for (int i = 0; i < in_statusTypes.size(); i++) {
1070*4d7e907cSAndroid Build Coastguard Worker int j = 0;
1071*4d7e907cSAndroid Build Coastguard Worker while (j < mFrontendStatusCaps.size()) {
1072*4d7e907cSAndroid Build Coastguard Worker if (in_statusTypes[i] == mFrontendStatusCaps[j]) {
1073*4d7e907cSAndroid Build Coastguard Worker (*_aidl_return)[i] = FrontendStatusReadiness::STABLE;
1074*4d7e907cSAndroid Build Coastguard Worker break;
1075*4d7e907cSAndroid Build Coastguard Worker }
1076*4d7e907cSAndroid Build Coastguard Worker j++;
1077*4d7e907cSAndroid Build Coastguard Worker }
1078*4d7e907cSAndroid Build Coastguard Worker if (j >= mFrontendStatusCaps.size()) {
1079*4d7e907cSAndroid Build Coastguard Worker (*_aidl_return)[i] = FrontendStatusReadiness::UNSUPPORTED;
1080*4d7e907cSAndroid Build Coastguard Worker }
1081*4d7e907cSAndroid Build Coastguard Worker }
1082*4d7e907cSAndroid Build Coastguard Worker
1083*4d7e907cSAndroid Build Coastguard Worker return ::ndk::ScopedAStatus::ok();
1084*4d7e907cSAndroid Build Coastguard Worker }
1085*4d7e907cSAndroid Build Coastguard Worker
getFrontendType()1086*4d7e907cSAndroid Build Coastguard Worker FrontendType Frontend::getFrontendType() {
1087*4d7e907cSAndroid Build Coastguard Worker return mType;
1088*4d7e907cSAndroid Build Coastguard Worker }
1089*4d7e907cSAndroid Build Coastguard Worker
getFrontendId()1090*4d7e907cSAndroid Build Coastguard Worker int32_t Frontend::getFrontendId() {
1091*4d7e907cSAndroid Build Coastguard Worker return mId;
1092*4d7e907cSAndroid Build Coastguard Worker }
1093*4d7e907cSAndroid Build Coastguard Worker
getIptvPluginInterface()1094*4d7e907cSAndroid Build Coastguard Worker dtv_plugin* Frontend::getIptvPluginInterface() {
1095*4d7e907cSAndroid Build Coastguard Worker return mIptvPluginInterface;
1096*4d7e907cSAndroid Build Coastguard Worker }
1097*4d7e907cSAndroid Build Coastguard Worker
getIptvTransportDescription()1098*4d7e907cSAndroid Build Coastguard Worker string Frontend::getIptvTransportDescription() {
1099*4d7e907cSAndroid Build Coastguard Worker return mIptvTransportDescription;
1100*4d7e907cSAndroid Build Coastguard Worker }
1101*4d7e907cSAndroid Build Coastguard Worker
getIptvPluginStreamer()1102*4d7e907cSAndroid Build Coastguard Worker dtv_streamer* Frontend::getIptvPluginStreamer() {
1103*4d7e907cSAndroid Build Coastguard Worker return mIptvPluginStreamer;
1104*4d7e907cSAndroid Build Coastguard Worker }
1105*4d7e907cSAndroid Build Coastguard Worker
supportsSatellite()1106*4d7e907cSAndroid Build Coastguard Worker bool Frontend::supportsSatellite() {
1107*4d7e907cSAndroid Build Coastguard Worker return mType == FrontendType::DVBS || mType == FrontendType::ISDBS ||
1108*4d7e907cSAndroid Build Coastguard Worker mType == FrontendType::ISDBS3;
1109*4d7e907cSAndroid Build Coastguard Worker }
1110*4d7e907cSAndroid Build Coastguard Worker
isLocked()1111*4d7e907cSAndroid Build Coastguard Worker bool Frontend::isLocked() {
1112*4d7e907cSAndroid Build Coastguard Worker return mIsLocked;
1113*4d7e907cSAndroid Build Coastguard Worker }
1114*4d7e907cSAndroid Build Coastguard Worker
getFrontendInfo(FrontendInfo * _aidl_return)1115*4d7e907cSAndroid Build Coastguard Worker void Frontend::getFrontendInfo(FrontendInfo* _aidl_return) {
1116*4d7e907cSAndroid Build Coastguard Worker // assign randomly selected values for testing.
1117*4d7e907cSAndroid Build Coastguard Worker *_aidl_return = {
1118*4d7e907cSAndroid Build Coastguard Worker .type = mType,
1119*4d7e907cSAndroid Build Coastguard Worker .minFrequency = 139000000,
1120*4d7e907cSAndroid Build Coastguard Worker .maxFrequency = 1139000000,
1121*4d7e907cSAndroid Build Coastguard Worker .minSymbolRate = 45,
1122*4d7e907cSAndroid Build Coastguard Worker .maxSymbolRate = 1145,
1123*4d7e907cSAndroid Build Coastguard Worker .acquireRange = 30,
1124*4d7e907cSAndroid Build Coastguard Worker .exclusiveGroupId = 57,
1125*4d7e907cSAndroid Build Coastguard Worker .statusCaps = mFrontendStatusCaps,
1126*4d7e907cSAndroid Build Coastguard Worker .frontendCaps = mFrontendCaps,
1127*4d7e907cSAndroid Build Coastguard Worker };
1128*4d7e907cSAndroid Build Coastguard Worker }
1129*4d7e907cSAndroid Build Coastguard Worker
1130*4d7e907cSAndroid Build Coastguard Worker } // namespace tuner
1131*4d7e907cSAndroid Build Coastguard Worker } // namespace tv
1132*4d7e907cSAndroid Build Coastguard Worker } // namespace hardware
1133*4d7e907cSAndroid Build Coastguard Worker } // namespace android
1134*4d7e907cSAndroid Build Coastguard Worker } // namespace aidl
1135