blob: e029b6db18cad9f61468144072ddc17c94bf5270
1 | // |
2 | // |
3 | // amlogic 2013 |
4 | // |
5 | // @ Project : tv |
6 | // @ File Name : |
7 | // @ Date : 2013-11 |
8 | // @ Author : |
9 | // |
10 | #define LOG_TAG "CTvScanner" |
11 | |
12 | #include "CTvScanner.h" |
13 | #include "CTvProgram.h" |
14 | #include "CTvRegion.h" |
15 | #include "CFrontEnd.h" |
16 | |
17 | CTvScanner *CTvScanner::m_s_Scanner = NULL; |
18 | //int CTvScanner::getStartPara() |
19 | //{ |
20 | // |
21 | //} |
22 | CTvScanner::CTvScanner() |
23 | { |
24 | mbScanStart = false; |
25 | mpObserver = NULL; |
26 | mSource = 0xff; |
27 | mMinFreq = 1; |
28 | mMaxFreq = 100; |
29 | mCurScanStartFreq = 1; |
30 | mCurScanEndFreq = 100; |
31 | } |
32 | |
33 | CTvScanner::~CTvScanner() |
34 | { |
35 | AM_EVT_Unsubscribe((long)mScanHandle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
36 | AM_EVT_Unsubscribe((long)mScanHandle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
37 | } |
38 | |
39 | |
40 | AM_Bool_t CTvScanner::atv_cvbs_lock_check(v4l2_std_id *colorStd) |
41 | { |
42 | tvafe_cvbs_video_t cvbs_lock_status; |
43 | int ret, i = 0; |
44 | |
45 | *colorStd = 0; |
46 | while (i < 20) { |
47 | ret = CTvin::getInstance()->AFE_GetCVBSLockStatus(&cvbs_lock_status); |
48 | |
49 | if (cvbs_lock_status == TVAFE_CVBS_VIDEO_HV_LOCKED) |
50 | //||cvbs_lock_status == TVAFE_CVBS_VIDEO_V_LOCKED |
51 | //||cvbs_lock_status == TVAFE_CVBS_VIDEO_H_LOCKED) |
52 | { |
53 | usleep(2000 * 1000); |
54 | tvin_info_t info; |
55 | CTvin::getInstance()->VDIN_GetSignalInfo(&info); |
56 | *colorStd = CTvin::CvbsFtmToV4l2ColorStd(info.fmt); |
57 | LOGD("atv_cvbs_lock_check locked and cvbs fmt = %d std = 0x%p", info.fmt, colorStd); |
58 | return true; |
59 | } |
60 | usleep(50 * 1000); |
61 | i++; |
62 | } |
63 | return false; |
64 | } |
65 | |
66 | AM_Bool_t CTvScanner::s_atv_cvbs_lock_check(void *data) |
67 | { |
68 | if (data == NULL) return false; |
69 | AM_SCAN_ATV_LOCK_PARA_t *pAtvPara = (AM_SCAN_ATV_LOCK_PARA_t *)data; |
70 | CTvScanner *pScan = (CTvScanner *)(pAtvPara->pData); |
71 | v4l2_std_id std; |
72 | AM_Bool_t isLock = pScan->atv_cvbs_lock_check(&std); |
73 | pAtvPara->pOutColorSTD = std; |
74 | return isLock; |
75 | } |
76 | |
77 | int CTvScanner::ATVManualScan(int min_freq, int max_freq, int std, int store_Type, int channel_num) |
78 | { |
79 | stopScan(); |
80 | if (min_freq <= 0 || max_freq <= 0 || min_freq == max_freq) { |
81 | LOGD("atv manual scan freq error start = %d end = %d", min_freq, max_freq); |
82 | return -1; |
83 | } |
84 | int direction = (max_freq >= min_freq) ? 1 : 0; |
85 | |
86 | if (!mbScanStart) { //not start or stop |
87 | // |
88 | mCurScanStartFreq = min_freq; |
89 | mCurScanEndFreq = max_freq; |
90 | AM_SCAN_CreatePara_t para; |
91 | AM_DMX_OpenPara_t dmx_para; |
92 | AM_SCAN_Handle_t handle = 0, i; |
93 | LOGD("startScanThread"); |
94 | // Create the scan |
95 | memset(¶, 0, sizeof(para)); |
96 | para.fend_dev_id = 0;//default |
97 | para.mode = AM_SCAN_MODE_ATV_DTV;// |
98 | para.atv_para.mode = AM_SCAN_ATVMODE_MANUAL; |
99 | para.atv_para.storeMode = store_Type; |
100 | para.dtv_para.mode = AM_SCAN_DTVMODE_NONE; |
101 | |
102 | para.atv_para.am_scan_atv_cvbs_lock = s_atv_cvbs_lock_check; |
103 | |
104 | para.atv_para.fe_cnt = 3; |
105 | para.atv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(3, sizeof(AM_FENDCTRL_DVBFrontendParameters_t))); |
106 | if (para.atv_para.fe_paras != NULL) { |
107 | memset(para.atv_para.fe_paras, 0, 3 * sizeof(AM_FENDCTRL_DVBFrontendParameters_t)); |
108 | para.atv_para.fe_paras[0].m_type = FE_ANALOG; |
109 | para.atv_para.fe_paras[0].analog.para.frequency = min_freq; |
110 | para.atv_para.fe_paras[1].m_type = FE_ANALOG; |
111 | para.atv_para.fe_paras[1].analog.para.frequency = max_freq; |
112 | para.atv_para.fe_paras[2].m_type = FE_ANALOG; |
113 | para.atv_para.fe_paras[2].analog.para.frequency = min_freq; |
114 | } |
115 | para.atv_para.direction = direction; |
116 | para.atv_para.default_std = std; |
117 | |
118 | para.atv_para.channel_id = -1; |
119 | para.atv_para.cvbs_unlocked_step = 1000000; |
120 | para.atv_para.cvbs_locked_step = 3000000; |
121 | para.atv_para.afc_range = 2000000; |
122 | |
123 | para.dtv_para.resort_all = AM_FALSE; |
124 | para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID; |
125 | para.store_cb = am_scan_atv_store; |
126 | para.atv_para.channel_num = channel_num; |
127 | |
128 | memset(&dmx_para, 0, sizeof(dmx_para)); |
129 | AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para); |
130 | |
131 | if ((para.dtv_para.mode & 0x07) != AM_SCAN_DTVMODE_NONE) { |
132 | AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source); |
133 | tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id); |
134 | } |
135 | |
136 | LOGD("atv manual scan mode = %d", para.dtv_para.mode); |
137 | // Start Scan |
138 | if (AM_SCAN_Create(¶, &handle) != AM_SUCCESS) { |
139 | LOGD("SCAN CREATE fail"); |
140 | handle = NULL; |
141 | } else { |
142 | mScanHandle = handle; |
143 | AM_SCAN_SetUserData(handle, (void *)this); |
144 | AM_EVT_Subscribe((long)handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
145 | AM_EVT_Subscribe((long)handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
146 | if (AM_SCAN_Start(handle) != AM_SUCCESS) { |
147 | AM_SCAN_Destroy(handle, AM_FALSE); |
148 | AM_EVT_Unsubscribe((long)handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
149 | AM_EVT_Unsubscribe((long)handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
150 | handle = NULL; |
151 | } |
152 | } |
153 | if (para.atv_para.fe_paras != NULL) |
154 | free(para.atv_para.fe_paras); |
155 | if (para.dtv_para.fe_paras != NULL) |
156 | free(para.dtv_para.fe_paras); |
157 | |
158 | if (handle == NULL) { |
159 | return -1; |
160 | } |
161 | mbScanStart = true;//start call ok |
162 | } else { |
163 | LOGD("scanning and not stop"); |
164 | } |
165 | |
166 | return 0; |
167 | |
168 | } |
169 | |
170 | void CTvScanner::am_scan_atv_store(AM_SCAN_Result_t *result) |
171 | { |
172 | AM_SCAN_TS_t *ts; |
173 | int i, ret, db_sat_id = -1; |
174 | //AM_SCAN_RecTab_t srv_tab; |
175 | for (ts = result->tses; ts != NULL; ts = ts->p_next) { |
176 | // |
177 | m_s_Scanner->mCurEv.clear(); |
178 | m_s_Scanner->mCurEv.mType = ScannerEvent::EVENT_ATV_PROG_DATA; |
179 | m_s_Scanner->mCurEv.mVideoStd = CFrontEnd::stdAndColorToVideoEnum(ts->analog.std); |
180 | m_s_Scanner->mCurEv.mAudioStd = CFrontEnd::stdAndColorToAudioEnum(ts->analog.std); |
181 | m_s_Scanner->mCurEv.mIsAutoStd = ((ts->analog.std & V4L2_COLOR_STD_AUTO) == V4L2_COLOR_STD_AUTO) ? 1 : 0; |
182 | m_s_Scanner->mCurEv.mFrequency = ts->analog.freq; |
183 | // |
184 | m_s_Scanner->sendEvent(m_s_Scanner->mCurEv); |
185 | LOGD("ATV: > freq:%d", m_s_Scanner->mCurEv.mFrequency); |
186 | } |
187 | } |
188 | |
189 | void CTvScanner::setGlobalScanerObject(CTvScanner *s) |
190 | { |
191 | m_s_Scanner = s; |
192 | } |
193 | |
194 | int CTvScanner::autoAtvScan(int min_freq, int max_freq, int std, int search_type) |
195 | { |
196 | stopScan(); |
197 | if (min_freq <= 0 || max_freq <= 0 || min_freq > max_freq) |
198 | return -1; |
199 | if (!mbScanStart) { //not start or stop |
200 | mCurScanStartFreq = min_freq; |
201 | mCurScanEndFreq = max_freq; |
202 | |
203 | AM_SCAN_CreatePara_t para; |
204 | AM_DMX_OpenPara_t dmx_para; |
205 | AM_SCAN_Handle_t handle = 0, i; |
206 | // Create the scan |
207 | memset(¶, 0, sizeof(para)); |
208 | |
209 | para.fend_dev_id = 0;//default |
210 | para.mode = AM_SCAN_MODE_ATV_DTV;// |
211 | para.atv_para.mode = AM_SCAN_ATVMODE_AUTO; |
212 | if (search_type == 1) |
213 | para.atv_para.storeMode = 1; |
214 | else |
215 | para.atv_para.storeMode = 0; |
216 | para.dtv_para.mode = AM_SCAN_DTVMODE_NONE; |
217 | |
218 | para.atv_para.am_scan_atv_cvbs_lock = s_atv_cvbs_lock_check; |
219 | |
220 | para.atv_para.fe_cnt = 3; |
221 | para.atv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(3, sizeof(AM_FENDCTRL_DVBFrontendParameters_t))); |
222 | if (para.atv_para.fe_paras != NULL) { |
223 | memset(para.atv_para.fe_paras, 0, 3 * sizeof(AM_FENDCTRL_DVBFrontendParameters_t)); |
224 | para.atv_para.fe_paras[0].m_type = FE_ANALOG; |
225 | para.atv_para.fe_paras[0].analog.para.frequency = min_freq; |
226 | para.atv_para.fe_paras[1].m_type = FE_ANALOG; |
227 | para.atv_para.fe_paras[1].analog.para.frequency = max_freq; |
228 | para.atv_para.fe_paras[2].m_type = FE_ANALOG; |
229 | para.atv_para.fe_paras[2].analog.para.frequency = 0; |
230 | } |
231 | |
232 | para.atv_para.direction = 0; |
233 | para.atv_para.default_std = std; |
234 | |
235 | para.atv_para.channel_id = -1; |
236 | para.atv_para.afc_unlocked_step = 3000000; |
237 | para.atv_para.cvbs_unlocked_step = 1500000; |
238 | para.atv_para.cvbs_locked_step = 6000000; |
239 | para.atv_para.afc_range = 2000000; |
240 | |
241 | para.dtv_para.resort_all = AM_FALSE; |
242 | para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID; |
243 | para.store_cb = am_scan_atv_store; |
244 | |
245 | memset(&dmx_para, 0, sizeof(dmx_para)); |
246 | AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para); |
247 | |
248 | if ((para.dtv_para.mode & 0x07) != AM_SCAN_DTVMODE_NONE) { |
249 | AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source); |
250 | tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id); |
251 | } |
252 | |
253 | // prog->dmx_id = para.dtv_para.dmx_dev_id; |
254 | // prog->fend_id = para.fend_dev_id; |
255 | // prog->mode = para.dtv_para.mode; |
256 | LOGD(" mode = %d", para.dtv_para.mode); |
257 | // Start Scan |
258 | if (AM_SCAN_Create(¶, &handle) != AM_SUCCESS) { |
259 | LOGD("SCAN CREATE fail"); |
260 | handle = NULL; |
261 | } else { |
262 | mScanHandle = handle; |
263 | AM_SCAN_SetUserData(handle, (void *)this); |
264 | //注册搜索事件 |
265 | AM_EVT_Subscribe((long)handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
266 | //注册信号质量通知事件 |
267 | AM_EVT_Subscribe((long)handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
268 | if (AM_SCAN_Start(handle) != AM_SUCCESS) { |
269 | AM_SCAN_Destroy(handle, AM_FALSE); |
270 | AM_EVT_Unsubscribe((long)handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
271 | AM_EVT_Unsubscribe((long)handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
272 | handle = NULL; |
273 | } |
274 | } |
275 | if (para.atv_para.fe_paras != NULL) |
276 | free(para.atv_para.fe_paras); |
277 | if (para.dtv_para.fe_paras != NULL) |
278 | free(para.dtv_para.fe_paras); |
279 | |
280 | if (handle == NULL) { |
281 | return -1; |
282 | } |
283 | mbScanStart = true;//start call ok |
284 | } else { |
285 | LOGD("scanning and not stop"); |
286 | } |
287 | |
288 | return 0; |
289 | } |
290 | |
291 | /* |
292 | int CTvScanner::manualAtscScan(int channelID, int attennaType, int std) |
293 | { |
294 | stopScan(); |
295 | if (!mbScanStart) { //not start or stop |
296 | AM_SCAN_CreatePara_t para; |
297 | AM_DMX_OpenPara_t dmx_para; |
298 | AM_SCAN_Handle_t handle = 0; |
299 | int i; |
300 | // Create the scan |
301 | memset(¶, 0, sizeof(para)); |
302 | |
303 | //strcpy(para.default_text_lang,"eng");//config |
304 | //strcpy(para.text_langs, "local eng zho chi chs first");//config |
305 | para.fend_dev_id = 0;//default |
306 | para.mode = AM_SCAN_MODE_ADTV;//DTV |
307 | para.atv_para.mode = AM_SCAN_ATVMODE_NONE; |
308 | |
309 | para.atv_para.default_std = std; |
310 | |
311 | para.dtv_para.mode = AM_SCAN_DTVMODE_MANUAL;//DTV_MODE_ALLBAND |
312 | //para.dtv_para.mode |= (*env)->GetIntField(env, para, doptions);//忽略 |
313 | para.dtv_para.source = FE_ATSC;//fe_type |
314 | para.dtv_para.dmx_dev_id = 0;//default 0 |
315 | para.dtv_para.resort_all = AM_TRUE; |
316 | para.dtv_para.clear_source = AM_FALSE; |
317 | para.dtv_para.mix_tv_radio = AM_FALSE; |
318 | para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID; |
319 | para.store_cb = NULL; |
320 | //para.dtv_para.attenna = attennaType; |
321 | |
322 | para.dtv_para.standard = AM_SCAN_DTV_STD_ATSC; |
323 | |
324 | mSource = para.dtv_para.source; |
325 | |
326 | Vector<sp<CTvChannel> > vcp; |
327 | |
328 | //CTvDatabase::getChannelParaList("/data/tv_default.xml", vcp);//channel list from xml or db |
329 | getAtscChannelPara(attennaType, vcp); |
330 | LOGD("ANDESEN test attenna type is %d", attennaType); |
331 | |
332 | int size = vcp.size(); |
333 | LOGD("channel list size = %d", size); |
334 | //showboz |
335 | if (size == 0) { |
336 | CTvDatabase::GetTvDb()->importXmlToDB("/etc/tv_default.xml"); |
337 | getAtscChannelPara(attennaType, vcp); |
338 | size = vcp.size(); |
339 | } |
340 | |
341 | if (!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(1, sizeof(AM_FENDCTRL_DVBFrontendParameters_t))))) |
342 | return -1; |
343 | |
344 | //memset(pfp, 0, size * sizeof(AM_FENDCTRL_DVBFrontendParameters_t)); |
345 | |
346 | for (i = 0; i < size; i++) { |
347 | if (channelID == vcp[i]->getLogicalChannelNum()) { |
348 | para.dtv_para.fe_paras[0].m_type = 3;//MODE_ATSC |
349 | para.dtv_para.fe_paras[0].atsc.para.frequency = vcp[i]->getFrequency(); |
350 | para.dtv_para.fe_paras[0].atsc.para.u.vsb.modulation = (fe_modulation_t)(vcp[i]->getModulation()); |
351 | LOGD("andesen test atsc manual type=%d,num=%d,freq=%d,modu=%d", |
352 | para.dtv_para.fe_paras[0].m_type, para.dtv_para.fe_paras[0].m_logicalChannelNum, |
353 | para.dtv_para.fe_paras[0].atsc.para.frequency, para.dtv_para.fe_paras[0].atsc.para.u.vsb.modulation); |
354 | } |
355 | } |
356 | //allband |
357 | para.dtv_para.fe_cnt = 1; |
358 | memset(&dmx_para, 0, sizeof(dmx_para)); |
359 | AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para); |
360 | |
361 | if ((para.dtv_para.mode & 0x07) != AM_SCAN_DTVMODE_NONE) { |
362 | AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source); |
363 | tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id); |
364 | } |
365 | |
366 | // prog->dmx_id = para.dtv_para.dmx_dev_id; |
367 | // prog->fend_id = para.fend_dev_id; |
368 | // prog->mode = para.dtv_para.mode; |
369 | // Start Scan |
370 | if (AM_SCAN_Create(¶, &handle) != AM_SUCCESS) { |
371 | LOGD("SCAN CREATE fail"); |
372 | handle = 0; |
373 | } else { |
374 | mScanHandle = handle; |
375 | AM_SCAN_SetUserData(handle, (void *)this); |
376 | //注册搜索事件 |
377 | AM_EVT_Subscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
378 | //注册信号质量通知事件 |
379 | AM_EVT_Subscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
380 | if (AM_SCAN_Start(handle) != AM_SUCCESS) { |
381 | AM_SCAN_Destroy(handle, AM_FALSE); |
382 | AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
383 | AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
384 | handle = 0; |
385 | } |
386 | } |
387 | if (para.atv_para.fe_paras != NULL) |
388 | free(para.atv_para.fe_paras); |
389 | if (para.dtv_para.fe_paras != NULL) |
390 | free(para.dtv_para.fe_paras); |
391 | if (handle == 0) { |
392 | return -1; |
393 | } |
394 | mbScanStart = true;//start call ok |
395 | } else { |
396 | LOGD("scanning and not stop"); |
397 | } |
398 | return 0; |
399 | } |
400 | */ |
401 | |
402 | #define dvb_fend_para(_p) ((struct dvb_frontend_parameters*)(&_p)) |
403 | #define IS_DVBT2_TS(_para) (_para.m_type == FE_OFDM && _para.terrestrial.para.u.ofdm.ofdm_mode == OFDM_DVBT2) |
404 | #define IS_ISDBT_TS(_para) (_para.m_type == FE_ISDBT) |
405 | |
406 | dvbpsi_pat_t *CTvScanner::get_valid_pats(AM_SCAN_TS_t *ts) |
407 | { |
408 | dvbpsi_pat_t *valid_pat = NULL; |
409 | if (!IS_DVBT2_TS(ts->digital.fend_para)) { |
410 | valid_pat = ts->digital.pats; |
411 | } else if (IS_ISDBT_TS(ts->digital.fend_para)) { |
412 | /* process for isdbt one-seg inserted PAT, which ts_id is 0xffff */ |
413 | valid_pat = ts->digital.pats; |
414 | while (valid_pat != NULL && valid_pat->i_ts_id == 0xffff) { |
415 | valid_pat = valid_pat->p_next; |
416 | } |
417 | |
418 | if (valid_pat == NULL && ts->digital.pats != NULL) { |
419 | valid_pat = ts->digital.pats; |
420 | |
421 | if (ts->digital.sdts != NULL) |
422 | valid_pat->i_ts_id = ts->digital.sdts->i_ts_id; |
423 | } |
424 | } else { |
425 | int plp; |
426 | |
427 | for (plp = 0; plp < ts->digital.dvbt2_data_plp_num; plp++) { |
428 | if (ts->digital.dvbt2_data_plps[plp].pats != NULL) { |
429 | valid_pat = ts->digital.dvbt2_data_plps[plp].pats; |
430 | break; |
431 | } |
432 | } |
433 | } |
434 | |
435 | return valid_pat; |
436 | } |
437 | |
438 | void CTvScanner::scan_process_ts_info(AM_SCAN_Result_t *result __unused, AM_SCAN_TS_t *ts, ScannerEvent *evt) |
439 | { |
440 | dvbpsi_nit_t *nit; |
441 | dvbpsi_descriptor_t *descr; |
442 | |
443 | evt->mONetId = -1; |
444 | evt->mTsId = -1; |
445 | |
446 | if (ts->digital.sdts) |
447 | evt->mONetId = ts->digital.sdts->i_network_id; |
448 | else if (IS_DVBT2_TS(ts->digital.fend_para) && ts->digital.dvbt2_data_plp_num > 0 && ts->digital.dvbt2_data_plps[0].sdts) |
449 | evt->mONetId = ts->digital.dvbt2_data_plps[0].sdts->i_network_id; |
450 | evt->mTsId = get_valid_pats(ts)->i_ts_id; |
451 | |
452 | evt->mFrequency = (int)dvb_fend_para(ts->digital.fend_para)->frequency; |
453 | evt->mMode = ts->digital.fend_para.m_type; |
454 | if (IS_DVBT2_TS(ts->digital.fend_para)) |
455 | evt->mOfdm_mode = (int)dvb_fend_para(ts->digital.fend_para)->u.ofdm.ofdm_mode; |
456 | else if ((ts->digital.fend_para.m_type == FE_DTMB) || (ts->digital.fend_para.m_type == FE_OFDM)) |
457 | evt->mBandwidth = (int)dvb_fend_para(ts->digital.fend_para)->u.ofdm.bandwidth; |
458 | else if (ts->digital.fend_para.m_type == FE_QAM) { |
459 | evt->mSymbolRate = (int)dvb_fend_para(ts->digital.fend_para)->u.qam.symbol_rate; |
460 | evt->mModulation = (int)dvb_fend_para(ts->digital.fend_para)->u.qam.modulation; |
461 | } |
462 | } |
463 | void CTvScanner::scan_init_service_info(SCAN_ServiceInfo_t *srv_info) |
464 | { |
465 | memset(srv_info, 0, sizeof(SCAN_ServiceInfo_t)); |
466 | srv_info->vid = 0x1fff; |
467 | srv_info->vfmt = -1; |
468 | srv_info->free_ca = 1; |
469 | srv_info->srv_id = 0xffff; |
470 | srv_info->srv_dbid = -1; |
471 | srv_info->satpara_dbid = -1; |
472 | srv_info->pmt_pid = 0x1fff; |
473 | srv_info->plp_id = -1; |
474 | srv_info->sdt_version = 0xff; |
475 | } |
476 | int CTvScanner::get_pmt_pid(dvbpsi_pat_t *pats, int program_number) |
477 | { |
478 | dvbpsi_pat_t *pat; |
479 | dvbpsi_pat_program_t *prog; |
480 | |
481 | AM_SI_LIST_BEGIN(pats, pat) |
482 | AM_SI_LIST_BEGIN(pat->p_first_program, prog) |
483 | if (prog->i_number == program_number) |
484 | return prog->i_pid; |
485 | AM_SI_LIST_END() |
486 | AM_SI_LIST_END() |
487 | |
488 | return 0x1fff; |
489 | } |
490 | |
491 | void CTvScanner::scan_extract_ca_scrambled_flag(dvbpsi_descriptor_t *p_first_descriptor, int *flag) |
492 | { |
493 | dvbpsi_descriptor_t *descr; |
494 | |
495 | AM_SI_LIST_BEGIN(p_first_descriptor, descr) |
496 | if (descr->i_tag == AM_SI_DESCR_CA && ! *flag) { |
497 | LOGD( "Found CA descr, set scrambled flag to 1"); |
498 | *flag = 1; |
499 | break; |
500 | } |
501 | AM_SI_LIST_END() |
502 | } |
503 | |
504 | void CTvScanner::scan_extract_srv_info_from_sdt(AM_SCAN_Result_t *result, dvbpsi_sdt_t *sdts, SCAN_ServiceInfo_t *srv_info) |
505 | { |
506 | dvbpsi_sdt_service_t *srv; |
507 | dvbpsi_sdt_t *sdt; |
508 | dvbpsi_descriptor_t *descr; |
509 | const uint8_t split = 0x80; |
510 | const int name_size = (int)sizeof(srv_info->name); |
511 | int curr_name_len = 0, tmp_len; |
512 | char name[AM_DB_MAX_SRV_NAME_LEN + 1]; |
513 | |
514 | UNUSED(result); |
515 | |
516 | #define COPY_NAME(_s, _slen)\ |
517 | AM_MACRO_BEGIN\ |
518 | int copy_len = ((curr_name_len+_slen)>=name_size) ? (name_size-curr_name_len) : _slen;\ |
519 | if (copy_len > 0) {\ |
520 | memcpy(srv_info->name+curr_name_len, _s, copy_len);\ |
521 | curr_name_len += copy_len;\ |
522 | }\ |
523 | AM_MACRO_END |
524 | |
525 | |
526 | AM_SI_LIST_BEGIN(sdts, sdt) |
527 | AM_SI_LIST_BEGIN(sdt->p_first_service, srv) |
528 | /*从SDT表中查找该service并获取信息*/ |
529 | if (srv->i_service_id == srv_info->srv_id) { |
530 | LOGD("SDT for service %d found!", srv_info->srv_id); |
531 | srv_info->eit_sche = (uint8_t)srv->b_eit_schedule; |
532 | srv_info->eit_pf = (uint8_t)srv->b_eit_present; |
533 | srv_info->rs = srv->i_running_status; |
534 | srv_info->free_ca = (uint8_t)srv->b_free_ca; |
535 | srv_info->sdt_version = sdt->i_version; |
536 | |
537 | AM_SI_LIST_BEGIN(srv->p_first_descriptor, descr) |
538 | if (descr->p_decoded && descr->i_tag == AM_SI_DESCR_SERVICE) { |
539 | dvbpsi_service_dr_t *psd = (dvbpsi_service_dr_t *)descr->p_decoded; |
540 | if (psd->i_service_name_length > 0) { |
541 | name[0] = 0; |
542 | AM_SI_ConvertDVBTextCode((char *)psd->i_service_name, psd->i_service_name_length, \ |
543 | name, AM_DB_MAX_SRV_NAME_LEN); |
544 | name[AM_DB_MAX_SRV_NAME_LEN] = 0; |
545 | LOGD("found name [%s]", name); |
546 | |
547 | /*3bytes language code, using xxx to simulate*/ |
548 | COPY_NAME("xxx", 3); |
549 | /*following by name text*/ |
550 | tmp_len = strlen(name); |
551 | COPY_NAME(name, tmp_len); |
552 | } |
553 | /*业务类型*/ |
554 | srv_info->srv_type = psd->i_service_type; |
555 | /*service type 0x16 and 0x19 is user defined, as digital television service*/ |
556 | /*service type 0xc0 is type of partial reception service in ISDBT*/ |
557 | if ((srv_info->srv_type == 0x16) || (srv_info->srv_type == 0x19) || (srv_info->srv_type == 0xc0)) { |
558 | srv_info->srv_type = 0x1; |
559 | } |
560 | break; |
561 | } |
562 | AM_SI_LIST_END() |
563 | |
564 | /* store multilingual service name */ |
565 | AM_SI_LIST_BEGIN(srv->p_first_descriptor, descr) |
566 | if (descr->p_decoded && descr->i_tag == AM_SI_DESCR_MULTI_SERVICE_NAME) { |
567 | int i; |
568 | dvbpsi_multi_service_name_dr_t *pmsnd = (dvbpsi_multi_service_name_dr_t *)descr->p_decoded; |
569 | |
570 | for (i = 0; i < pmsnd->i_name_count; i++) { |
571 | name[0] = 0; |
572 | AM_SI_ConvertDVBTextCode((char *)pmsnd->p_service_name[i].i_service_name, |
573 | pmsnd->p_service_name[i].i_service_name_length, |
574 | name, AM_DB_MAX_SRV_NAME_LEN); |
575 | name[AM_DB_MAX_SRV_NAME_LEN] = 0; |
576 | LOGD("found name [%s]", name); |
577 | |
578 | if (curr_name_len > 0) { |
579 | /*extra split mark*/ |
580 | COPY_NAME(&split, 1); |
581 | } |
582 | /*3bytes language code*/ |
583 | COPY_NAME(pmsnd->p_service_name[i].i_iso_639_code, 3); |
584 | /*following by name text*/ |
585 | tmp_len = strlen(name); |
586 | COPY_NAME(name, tmp_len); |
587 | } |
588 | } |
589 | AM_SI_LIST_END() |
590 | |
591 | /* set the ending null byte */ |
592 | if (curr_name_len >= name_size) |
593 | srv_info->name[name_size - 1] = 0; |
594 | else |
595 | srv_info->name[curr_name_len] = 0; |
596 | |
597 | break; |
598 | } |
599 | AM_SI_LIST_END() |
600 | AM_SI_LIST_END() |
601 | } |
602 | |
603 | void CTvScanner::scan_update_service_info(AM_SCAN_Result_t *result, SCAN_ServiceInfo_t *srv_info) |
604 | { |
605 | #define str(i) (char*)(strings + i) |
606 | |
607 | static char strings[14][256]; |
608 | |
609 | if (srv_info->src != FE_ANALOG) { |
610 | int standard = result->start_para->dtv_para.standard; |
611 | int mode = result->start_para->dtv_para.mode; |
612 | |
613 | /* Transform service types for different dtv standards */ |
614 | if (standard != AM_SCAN_DTV_STD_ATSC) { |
615 | if (srv_info->srv_type == 0x1) |
616 | srv_info->srv_type = AM_SCAN_SRV_DTV; |
617 | else if (srv_info->srv_type == 0x2) |
618 | srv_info->srv_type = AM_SCAN_SRV_DRADIO; |
619 | } else { |
620 | if (srv_info->srv_type == 0x2) |
621 | srv_info->srv_type = AM_SCAN_SRV_DTV; |
622 | else if (srv_info->srv_type == 0x3) |
623 | srv_info->srv_type = AM_SCAN_SRV_DRADIO; |
624 | } |
625 | |
626 | /* if video valid, set this program to tv type, |
627 | * if audio valid, but video not found, set it to radio type, |
628 | * if both invalid, but service_type found in SDT/VCT, set to unknown service, |
629 | * this mechanism is OPTIONAL |
630 | */ |
631 | if (srv_info->vid < 0x1fff) { |
632 | srv_info->srv_type = AM_SCAN_SRV_DTV; |
633 | } else if (srv_info->aud_info.audio_count > 0) { |
634 | srv_info->srv_type = AM_SCAN_SRV_DRADIO; |
635 | } else if (srv_info->srv_type == AM_SCAN_SRV_DTV || |
636 | srv_info->srv_type == AM_SCAN_SRV_DRADIO) { |
637 | srv_info->srv_type = AM_SCAN_SRV_UNKNOWN; |
638 | } |
639 | /* Skip program for FTA mode */ |
640 | if (srv_info->scrambled_flag && (mode & AM_SCAN_DTVMODE_FTA)) { |
641 | LOGD( "Skip program '%s' for FTA mode", srv_info->name); |
642 | return; |
643 | } |
644 | |
645 | /* Skip program for service_type mode */ |
646 | if (srv_info->srv_type == AM_SCAN_SRV_DTV && (mode & AM_SCAN_DTVMODE_NOTV)) { |
647 | LOGD( "Skip program '%s' for NO-TV mode", srv_info->name); |
648 | return; |
649 | } |
650 | if (srv_info->srv_type == AM_SCAN_SRV_DRADIO && (mode & AM_SCAN_DTVMODE_NORADIO)) { |
651 | LOGD( "Skip program '%s' for NO-RADIO mode", srv_info->name); |
652 | return; |
653 | } |
654 | |
655 | /* Set default name to tv/radio program if no name specified */ |
656 | if (!strcmp(srv_info->name, "") && |
657 | (srv_info->srv_type == AM_SCAN_SRV_DTV || |
658 | srv_info->srv_type == AM_SCAN_SRV_DRADIO)) { |
659 | strcpy(srv_info->name, "xxxNo Name"); |
660 | } |
661 | } |
662 | } |
663 | |
664 | void CTvScanner::scan_store_dvb_ts_evt_service(SCAN_ServiceInfo_t *srv) |
665 | { |
666 | LOGD("scan_store_dvb_ts_evt_service freq:%d, sid:%d", m_s_Scanner->mCurEv.mFrequency, srv->srv_id); |
667 | m_s_Scanner->mCurEv.clear(); |
668 | m_s_Scanner->mCurEv.mServiceId = srv->srv_id; |
669 | strncpy(m_s_Scanner->mCurEv.mProgramName, srv->name, 1024); |
670 | m_s_Scanner->mCurEv.mprogramType = srv->srv_type; |
671 | m_s_Scanner->mCurEv.mVid = srv->vid; |
672 | m_s_Scanner->mCurEv.mVfmt = srv->vfmt; |
673 | m_s_Scanner->mCurEv.mAcnt = srv->aud_info.audio_count; |
674 | for (int i = 0; i < srv->aud_info.audio_count; i++) { |
675 | m_s_Scanner->mCurEv.mAid[i] = srv->aud_info.audios[i].pid; |
676 | m_s_Scanner->mCurEv.mAfmt[i] = srv->aud_info.audios[i].fmt; |
677 | strncpy(m_s_Scanner->mCurEv.mAlang[i], srv->aud_info.audios[i].lang, 10); |
678 | m_s_Scanner->mCurEv.mAtype[i] = srv->aud_info.audios[i].audio_type; |
679 | } |
680 | m_s_Scanner->mCurEv.mPcr = srv->pcr_pid; |
681 | m_s_Scanner->mCurEv.mScnt = srv->sub_info.subtitle_count; |
682 | for (int i = 0; i < srv->sub_info.subtitle_count; i++) { |
683 | m_s_Scanner->mCurEv.mStype[i] = TYPE_DVB_SUBTITLE; |
684 | m_s_Scanner->mCurEv.mSid[i] = srv->sub_info.subtitles[i].pid; |
685 | m_s_Scanner->mCurEv.mSstype[i] = srv->sub_info.subtitles[i].type; |
686 | m_s_Scanner->mCurEv.mSid1[i] = srv->sub_info.subtitles[i].comp_page_id; |
687 | m_s_Scanner->mCurEv.mSid2[i] = srv->sub_info.subtitles[i].anci_page_id; |
688 | strncpy(m_s_Scanner->mCurEv.mSlang[i], srv->sub_info.subtitles[i].lang, 10); |
689 | } |
690 | int scnt = m_s_Scanner->mCurEv.mScnt; |
691 | for (int i = 0; i < srv->ttx_info.teletext_count; i++) { |
692 | if (srv->ttx_info.teletexts[i].type == 0x2 || |
693 | srv->ttx_info.teletexts[i].type == 0x5) { |
694 | if (scnt >= (int)(sizeof(m_s_Scanner->mCurEv.mStype) / sizeof(int))) |
695 | break; |
696 | m_s_Scanner->mCurEv.mStype[scnt] = TYPE_DTV_TELETEXT; |
697 | m_s_Scanner->mCurEv.mSid[scnt] = srv->ttx_info.teletexts[i].pid; |
698 | m_s_Scanner->mCurEv.mSstype[scnt] = srv->ttx_info.teletexts[i].type; |
699 | m_s_Scanner->mCurEv.mSid1[scnt] = srv->ttx_info.teletexts[i].magazine_no; |
700 | m_s_Scanner->mCurEv.mSid2[scnt] = srv->ttx_info.teletexts[i].page_no; |
701 | strncpy(m_s_Scanner->mCurEv.mSlang[scnt], srv->ttx_info.teletexts[i].lang, 10); |
702 | scnt++; |
703 | } |
704 | } |
705 | m_s_Scanner->mCurEv.mScnt = scnt; |
706 | |
707 | m_s_Scanner->mCurEv.mMSG[0] = '\0'; |
708 | |
709 | m_s_Scanner->mCurEv.mType = ScannerEvent::EVENT_DTV_PROG_DATA; |
710 | m_s_Scanner->sendEvent(m_s_Scanner->mCurEv); |
711 | } |
712 | |
713 | void CTvScanner::scan_store_dvb_ts(AM_SCAN_Result_t *result, AM_SCAN_TS_t *ts) |
714 | { |
715 | dvbpsi_pmt_t *pmt; |
716 | dvbpsi_pmt_es_t *es; |
717 | dvbpsi_descriptor_t *descr; |
718 | int src = result->start_para->dtv_para.source; |
719 | int mode = result->start_para->dtv_para.mode; |
720 | int net_dbid = -1, dbid = -1, orig_net_id = -1, satpara_dbid = -1; |
721 | char selbuf[256]; |
722 | char insbuf[400]; |
723 | AM_Bool_t store = AM_TRUE; |
724 | dvbpsi_pat_t *valid_pat = NULL; |
725 | uint8_t plp_id; |
726 | SCAN_ServiceInfo_t srv_info; |
727 | |
728 | valid_pat = get_valid_pats(ts); |
729 | if (valid_pat == NULL) { |
730 | LOGD("No PAT found in ts, will not store to dbase"); |
731 | return; |
732 | } |
733 | |
734 | LOGD("@@ TS: src %d @@", src); |
735 | |
736 | scan_process_ts_info(result, ts, &m_s_Scanner->mCurEv); |
737 | |
738 | if (ts->digital.pmts || (IS_DVBT2_TS(ts->digital.fend_para) && ts->digital.dvbt2_data_plp_num > 0)) { |
739 | int loop_count, lc; |
740 | dvbpsi_sdt_t *sdt_list; |
741 | dvbpsi_pmt_t *pmt_list; |
742 | dvbpsi_pat_t *pat_list; |
743 | |
744 | /* For DVB-T2, search for each PLP, else search in current TS*/ |
745 | loop_count = IS_DVBT2_TS(ts->digital.fend_para) ? ts->digital.dvbt2_data_plp_num : 1; |
746 | LOGD("plp num %d", loop_count); |
747 | |
748 | for (lc = 0; lc < loop_count; lc++) { |
749 | pat_list = IS_DVBT2_TS(ts->digital.fend_para) ? ts->digital.dvbt2_data_plps[lc].pats : ts->digital.pats; |
750 | pmt_list = IS_DVBT2_TS(ts->digital.fend_para) ? ts->digital.dvbt2_data_plps[lc].pmts : ts->digital.pmts; |
751 | sdt_list = IS_DVBT2_TS(ts->digital.fend_para) ? ts->digital.dvbt2_data_plps[lc].sdts : ts->digital.sdts; |
752 | plp_id = IS_DVBT2_TS(ts->digital.fend_para) ? ts->digital.dvbt2_data_plps[lc].id : -1; |
753 | LOGD("plp_id %d", plp_id); |
754 | |
755 | AM_SI_LIST_BEGIN(pmt_list, pmt) { |
756 | scan_init_service_info(&srv_info); |
757 | srv_info.satpara_dbid = satpara_dbid; |
758 | srv_info.srv_id = pmt->i_program_number; |
759 | srv_info.src = src; |
760 | srv_info.pmt_pid = get_pmt_pid(pat_list, pmt->i_program_number); |
761 | srv_info.pcr_pid = pmt->i_pcr_pid; |
762 | srv_info.plp_id = plp_id; |
763 | |
764 | /* looking for CA descr */ |
765 | if (! srv_info.scrambled_flag) { |
766 | scan_extract_ca_scrambled_flag(pmt->p_first_descriptor, &srv_info.scrambled_flag); |
767 | } |
768 | |
769 | AM_SI_LIST_BEGIN(pmt->p_first_es, es) { |
770 | AM_SI_ExtractAVFromES(es, &srv_info.vid, &srv_info.vfmt, &srv_info.aud_info); |
771 | |
772 | if (store) { |
773 | AM_SI_ExtractDVBSubtitleFromES(es, &srv_info.sub_info); |
774 | AM_SI_ExtractDVBTeletextFromES(es, &srv_info.ttx_info); |
775 | } |
776 | |
777 | if (! srv_info.scrambled_flag) |
778 | scan_extract_ca_scrambled_flag(es->p_first_descriptor, &srv_info.scrambled_flag); |
779 | } |
780 | AM_SI_LIST_END() |
781 | |
782 | scan_extract_srv_info_from_sdt(result, sdt_list, &srv_info); |
783 | |
784 | /*Store this service*/ |
785 | scan_update_service_info(result, &srv_info); |
786 | |
787 | scan_store_dvb_ts_evt_service(&srv_info); |
788 | |
789 | } |
790 | AM_SI_LIST_END() |
791 | |
792 | /* All programs in PMTs added, now trying the programs in SDT but NOT in PMT */ |
793 | dvbpsi_sdt_service_t *srv; |
794 | dvbpsi_sdt_t *sdt; |
795 | |
796 | AM_SI_LIST_BEGIN(ts->digital.sdts, sdt) { |
797 | AM_SI_LIST_BEGIN(sdt->p_first_service, srv) { |
798 | AM_Bool_t found_in_pmt = AM_FALSE; |
799 | |
800 | /* Is already added in PMT? */ |
801 | AM_SI_LIST_BEGIN(ts->digital.pmts, pmt) |
802 | if (srv->i_service_id == pmt->i_program_number) { |
803 | found_in_pmt = AM_TRUE; |
804 | break; |
805 | } |
806 | AM_SI_LIST_END() |
807 | |
808 | if (found_in_pmt) |
809 | continue; |
810 | |
811 | scan_init_service_info(&srv_info); |
812 | srv_info.satpara_dbid = satpara_dbid; |
813 | srv_info.srv_id = srv->i_service_id; |
814 | srv_info.src = src; |
815 | |
816 | scan_extract_srv_info_from_sdt(result, sdt_list, &srv_info); |
817 | |
818 | scan_update_service_info(result, &srv_info); |
819 | |
820 | /*as no pmt for this srv, set type to data for invisible*/ |
821 | srv_info.srv_type = 0; |
822 | |
823 | scan_store_dvb_ts_evt_service(&srv_info); |
824 | |
825 | } |
826 | AM_SI_LIST_END() |
827 | } |
828 | AM_SI_LIST_END() |
829 | |
830 | } |
831 | } |
832 | } |
833 | |
834 | void CTvScanner::dtv_scan_store(AM_SCAN_Result_t *result) |
835 | { |
836 | AM_SCAN_TS_t *ts; |
837 | |
838 | LOGD("Storing tses ..."); |
839 | |
840 | AM_SI_LIST_BEGIN(result->tses, ts) { |
841 | scan_store_dvb_ts(result, ts); |
842 | } |
843 | AM_SI_LIST_END() |
844 | } |
845 | |
846 | int CTvScanner::manualDtmbScan(int beginFreq, int endFreq, int modulation) |
847 | { |
848 | stopScan(); |
849 | |
850 | if (!mbScanStart) { //not start or stop |
851 | AM_SCAN_CreatePara_t para; |
852 | AM_DMX_OpenPara_t dmx_para; |
853 | AM_SCAN_Handle_t handle = 0; |
854 | int i; |
855 | // Create the scan |
856 | memset(¶, 0, sizeof(para)); |
857 | |
858 | para.fend_dev_id = 0;//default |
859 | para.mode = AM_SCAN_MODE_DTV_ATV;//DTV |
860 | para.atv_para.mode = AM_SCAN_ATVMODE_NONE; |
861 | para.dtv_para.mode = AM_SCAN_DTVMODE_MANUAL; |
862 | para.dtv_para.source = FE_DTMB;//fe_type |
863 | para.dtv_para.dmx_dev_id = 0;//default 0 |
864 | |
865 | Vector<sp<CTvChannel> > vcp; |
866 | CTvRegion::getChannelListByNameAndFreqRange((char *)"CHINA,Default DTMB ALL", beginFreq, endFreq, vcp); |
867 | int size = vcp.size(); |
868 | |
869 | //@author:hao.fu |
870 | if (size == 0) { |
871 | return -1; |
872 | } |
873 | |
874 | if (!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(size, sizeof(AM_FENDCTRL_DVBFrontendParameters_t))))) |
875 | return -1; |
876 | |
877 | for (i = 0; i < size; i++) { |
878 | para.dtv_para.fe_paras[i].m_type = 5;//MODE_DTMB |
879 | para.dtv_para.fe_paras[i].dtmb.para.frequency = vcp[i]->getFrequency(); |
880 | para.dtv_para.fe_paras[i].dtmb.para.inversion = INVERSION_OFF; |
881 | para.dtv_para.fe_paras[i].dtmb.para.u.ofdm.bandwidth = (fe_bandwidth_t)(vcp[i]->getBandwidth()); |
882 | if (modulation == -1) |
883 | para.dtv_para.fe_paras[i].cable.para.u.qam.modulation = (fe_modulation_t)(vcp[i]->getModulation()); |
884 | else |
885 | para.dtv_para.fe_paras[i].cable.para.u.qam.modulation = (fe_modulation_t)modulation; |
886 | } |
887 | |
888 | para.dtv_para.fe_cnt = size; |
889 | para.dtv_para.resort_all = AM_FALSE; |
890 | para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID; |
891 | para.store_cb = dtv_scan_store; |
892 | |
893 | |
894 | memset(&dmx_para, 0, sizeof(dmx_para)); |
895 | AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para); |
896 | |
897 | if ((para.dtv_para.mode & 0x07) != AM_SCAN_DTVMODE_NONE) { |
898 | AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source); |
899 | tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id); |
900 | } |
901 | |
902 | // Start Scan |
903 | if (AM_SCAN_Create(¶, &handle) != AM_SUCCESS) { |
904 | LOGD("SCAN CREATE fail"); |
905 | handle = NULL; |
906 | } else { |
907 | mScanHandle = handle; |
908 | AM_SCAN_SetUserData(handle, (void *)this); |
909 | AM_EVT_Subscribe((long)handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
910 | AM_EVT_Subscribe((long)handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
911 | if (AM_SCAN_Start(handle) != AM_SUCCESS) { |
912 | AM_SCAN_Destroy(handle, AM_FALSE); |
913 | AM_EVT_Unsubscribe((long)handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
914 | AM_EVT_Unsubscribe((long)handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
915 | handle = NULL; |
916 | } |
917 | } |
918 | if (para.atv_para.fe_paras != NULL) |
919 | free(para.atv_para.fe_paras); |
920 | if (para.dtv_para.fe_paras != NULL) |
921 | free(para.dtv_para.fe_paras); |
922 | |
923 | if (handle == NULL) { |
924 | return -1; |
925 | } |
926 | mbScanStart = true;//start call ok |
927 | } else { |
928 | LOGD("scanning and not stop"); |
929 | } |
930 | return 0; |
931 | } |
932 | |
933 | |
934 | /*int CTvScanner::autoTvScan() |
935 | { |
936 | stopScan(); |
937 | |
938 | if(!mbScanStart) { //not start or stop |
939 | AM_SCAN_CreatePara_t para; |
940 | AM_DMX_OpenPara_t dmx_para; |
941 | int handle = 0,i; |
942 | // Create the scan |
943 | memset(¶, 0, sizeof(para)); |
944 | |
945 | //strcpy(para.default_text_lang,"eng");//config |
946 | //strcpy(para.text_langs, "eng zho chi");//config |
947 | para.fend_dev_id = 0;//default |
948 | para.mode = AM_SCAN_MODE_DTV_ATV;//DTV |
949 | para.atv_para.mode = AM_SCAN_ATVMODE_NONE; |
950 | para.dtv_para.mode = AM_SCAN_DTVMODE_ALLBAND;//DTV_MODE_ALLBAND |
951 | //para.dtv_para.mode |= (*env)->GetIntField(env, para, doptions);//忽略 |
952 | para.dtv_para.source = 1;//QAM |
953 | para.dtv_para.dmx_dev_id = 0;//default 0 |
954 | Vector<sp<CTvChannel> > vcp; |
955 | //CTvDatabase::getChannelParaList("/data/tv_default.xml", vcp);//channel list from xml or db |
956 | CTvRegion::getChannelListByName("China,DVB-C allband", vcp); |
957 | |
958 | int size = vcp.size(); |
959 | LOGD("channel list size = %d", size); |
960 | if(!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t*>(calloc(size, sizeof(AM_FENDCTRL_DVBFrontendParameters_t))))) |
961 | return -1; |
962 | |
963 | //memset(pfp, 0, size * sizeof(AM_FENDCTRL_DVBFrontendParameters_t)); |
964 | |
965 | for (i = 0; i < size; i++) { |
966 | para.dtv_para.fe_paras[i].m_type = FE_QAM; |
967 | para.dtv_para.fe_paras[i].cable.para.frequency = vcp[i]->getFrequency(); |
968 | para.dtv_para.fe_paras[i].cable.para.inversion = INVERSION_OFF; |
969 | para.dtv_para.fe_paras[i].cable.para.u.qam.symbol_rate = vcp[i]->getSymbolRate(); |
970 | para.dtv_para.fe_paras[i].cable.para.u.qam.modulation = (fe_modulation_t)(vcp[i]->getModulation()); |
971 | } |
972 | //allband |
973 | para.dtv_para.fe_cnt = size; |
974 | |
975 | para.dtv_para.resort_all = AM_FALSE; |
976 | para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID; |
977 | para.store_cb = NULL; |
978 | memset(&dmx_para, 0, sizeof(dmx_para)); |
979 | AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para); |
980 | |
981 | if ((para.dtv_para.mode&0x07) != AM_SCAN_DTVMODE_NONE) { |
982 | AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source); |
983 | tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id); |
984 | } |
985 | |
986 | // prog->dmx_id = para.dtv_para.dmx_dev_id; |
987 | // prog->fend_id = para.fend_dev_id; |
988 | // prog->mode = para.dtv_para.mode; |
989 | // Start Scan |
990 | if (AM_SCAN_Create(¶, &handle) != AM_SUCCESS) { |
991 | LOGD("SCAN CREATE fail"); |
992 | handle = 0; |
993 | } else { |
994 | LOGD("SCAN CREATE handle = %d", handle); |
995 | mScanHandle = handle; |
996 | AM_SCAN_SetUserData(handle, (void*)this); |
997 | //注册搜索事件 |
998 | AM_EVT_Subscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
999 | //注册信号质量通知事件 |
1000 | //AM_EVT_Subscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
1001 | if (AM_SCAN_Start(handle) != AM_SUCCESS) { |
1002 | AM_SCAN_Destroy(handle, AM_FALSE); |
1003 | AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
1004 | // AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
1005 | handle = 0; |
1006 | } |
1007 | } |
1008 | if (para.atv_para.fe_paras != NULL) |
1009 | free(para.atv_para.fe_paras); |
1010 | if (para.dtv_para.fe_paras != NULL) |
1011 | free(para.dtv_para.fe_paras); |
1012 | |
1013 | if (handle == 0) { |
1014 | return -1; |
1015 | } |
1016 | mbScanStart = true;//start call ok |
1017 | } else { |
1018 | LOGD("scanning and not stop"); |
1019 | } |
1020 | return 0; |
1021 | }*/ |
1022 | //only test for dtv allbland auto |
1023 | /*int CTvScanner::startScan() |
1024 | { |
1025 | stopScan(); |
1026 | |
1027 | if(!mbScanStart) { //not start or stop |
1028 | AM_SCAN_CreatePara_t para; |
1029 | AM_DMX_OpenPara_t dmx_para; |
1030 | int handle = 0,i; |
1031 | // Create the scan |
1032 | memset(¶, 0, sizeof(para)); |
1033 | |
1034 | //strcpy(para.default_text_lang,"eng");//config |
1035 | //strcpy(para.text_langs, "eng zho chi");//config |
1036 | para.fend_dev_id = 0;//default |
1037 | para.mode = AM_SCAN_MODE_DTV_ATV;//DTV |
1038 | para.atv_para.mode = AM_SCAN_ATVMODE_NONE; |
1039 | para.dtv_para.mode = 3;//DTV_MODE_ALLBAND |
1040 | //para.dtv_para.mode |= (*env)->GetIntField(env, para, doptions);//忽略 |
1041 | para.dtv_para.source = 1;//QAM |
1042 | para.dtv_para.dmx_dev_id = 0;//default 0 |
1043 | Vector<sp<CTvChannel> > vcp; |
1044 | //CTvDatabase::getChannelParaList("/data/tv_default.xml", vcp);//channel list from xml or db |
1045 | CTvRegion::getChannelListByName("China,DVB-C allband", vcp); |
1046 | |
1047 | int size = vcp.size(); |
1048 | LOGD("channel list size = %d", size); |
1049 | if(!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t*>(calloc(size, sizeof(AM_FENDCTRL_DVBFrontendParameters_t))))) |
1050 | return -1; |
1051 | |
1052 | //memset(pfp, 0, size * sizeof(AM_FENDCTRL_DVBFrontendParameters_t)); |
1053 | |
1054 | for (i = 0; i < size; i++) { |
1055 | para.dtv_para.fe_paras[i].m_type = FE_QAM; |
1056 | para.dtv_para.fe_paras[i].cable.para.frequency = vcp[i]->getFrequency(); |
1057 | para.dtv_para.fe_paras[i].cable.para.inversion = INVERSION_OFF; |
1058 | para.dtv_para.fe_paras[i].cable.para.u.qam.symbol_rate = vcp[i]->getSymbolRate(); |
1059 | para.dtv_para.fe_paras[i].cable.para.u.qam.modulation = (fe_modulation_t)(vcp[i]->getModulation()); |
1060 | } |
1061 | //allband |
1062 | para.dtv_para.fe_cnt = size; |
1063 | |
1064 | para.dtv_para.resort_all = AM_FALSE; |
1065 | para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID; |
1066 | para.store_cb = NULL; |
1067 | |
1068 | memset(&dmx_para, 0, sizeof(dmx_para)); |
1069 | AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para); |
1070 | |
1071 | if ((para.dtv_para.mode&0x07) != AM_SCAN_DTVMODE_NONE) { |
1072 | AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source); |
1073 | tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id); |
1074 | } |
1075 | |
1076 | // prog->dmx_id = para.dtv_para.dmx_dev_id; |
1077 | // prog->fend_id = para.fend_dev_id; |
1078 | // prog->mode = para.dtv_para.mode; |
1079 | // Start Scan |
1080 | if (AM_SCAN_Create(¶, &handle) != AM_SUCCESS) { |
1081 | LOGD("SCAN CREATE fail"); |
1082 | handle = 0; |
1083 | } else { |
1084 | mScanHandle = handle; |
1085 | AM_SCAN_SetUserData(handle, (void*)this); |
1086 | //注册搜索事件 |
1087 | AM_EVT_Subscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
1088 | //注册信号质量通知事件 |
1089 | //AM_EVT_Subscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
1090 | if (AM_SCAN_Start(handle) != AM_SUCCESS) { |
1091 | AM_SCAN_Destroy(handle, AM_FALSE); |
1092 | AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
1093 | // AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
1094 | handle = 0; |
1095 | } |
1096 | } |
1097 | if (para.atv_para.fe_paras != NULL) |
1098 | free(para.atv_para.fe_paras); |
1099 | if (para.dtv_para.fe_paras != NULL) |
1100 | free(para.dtv_para.fe_paras); |
1101 | |
1102 | if (handle == 0) { |
1103 | return -1; |
1104 | } |
1105 | mbScanStart = true;//start call ok |
1106 | } else { |
1107 | LOGD("scanning and not stop"); |
1108 | } |
1109 | return 0; |
1110 | }*/ |
1111 | |
1112 | |
1113 | //only test for dtv allbland auto |
1114 | int CTvScanner::autoDtmbScan() |
1115 | { |
1116 | stopScan(); |
1117 | |
1118 | if (!mbScanStart) { //not start or stop |
1119 | AM_SCAN_CreatePara_t para; |
1120 | AM_DMX_OpenPara_t dmx_para; |
1121 | AM_SCAN_Handle_t handle = 0; |
1122 | // Create the scan |
1123 | memset(¶, 0, sizeof(para)); |
1124 | |
1125 | //strcpy(para.default_text_lang,"eng");//config |
1126 | //strcpy(para.text_langs, "local eng zho chi chs first");//config |
1127 | para.fend_dev_id = 0;//default |
1128 | para.mode = AM_SCAN_MODE_DTV_ATV;//DTV |
1129 | para.atv_para.mode = AM_SCAN_ATVMODE_NONE; |
1130 | para.dtv_para.mode = AM_SCAN_DTVMODE_ALLBAND;//DTV_MODE_ALLBAND |
1131 | //para.dtv_para.mode |= (*env)->GetIntField(env, para, doptions);//忽略 |
1132 | para.dtv_para.source = FE_DTMB;//fe_type |
1133 | para.dtv_para.dmx_dev_id = 0;//default 0 |
1134 | Vector<sp<CTvChannel> > vcp; |
1135 | //CTvDatabase::getChannelParaList("/data/tv_default.xml", vcp);//channel list from xml or db |
1136 | CTvRegion::getChannelListByName((char *)"CHINA,Default DTMB ALL", vcp); |
1137 | |
1138 | int size = vcp.size(); |
1139 | LOGD("channel list size = %d", size); |
1140 | //showboz |
1141 | if (size == 0) { |
1142 | CTvDatabase::GetTvDb()->importXmlToDB("/etc/tv_default.xml"); |
1143 | CTvRegion::getChannelListByName((char *)"CHINA,Default DTMB ALL", vcp); |
1144 | size = vcp.size(); |
1145 | } |
1146 | |
1147 | if (!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(size, sizeof(AM_FENDCTRL_DVBFrontendParameters_t))))) |
1148 | return -1; |
1149 | |
1150 | //memset(pfp, 0, size * sizeof(AM_FENDCTRL_DVBFrontendParameters_t)); |
1151 | |
1152 | for (int i = 0; i < size; i++) { |
1153 | para.dtv_para.fe_paras[i].m_type = 5;//MODE_DTMB |
1154 | para.dtv_para.fe_paras[i].dtmb.para.frequency = vcp[i]->getFrequency(); |
1155 | para.dtv_para.fe_paras[i].dtmb.para.inversion = INVERSION_OFF; |
1156 | para.dtv_para.fe_paras[i].dtmb.para.u.ofdm.bandwidth = (fe_bandwidth_t)(vcp[i]->getBandwidth()); |
1157 | } |
1158 | //allband |
1159 | para.dtv_para.fe_cnt = size; |
1160 | |
1161 | para.dtv_para.resort_all = AM_FALSE; |
1162 | para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID; |
1163 | para.store_cb = dtv_scan_store; |
1164 | |
1165 | memset(&dmx_para, 0, sizeof(dmx_para)); |
1166 | AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para); |
1167 | |
1168 | if ((para.dtv_para.mode & 0x07) != AM_SCAN_DTVMODE_NONE) { |
1169 | AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source); |
1170 | tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id); |
1171 | } |
1172 | |
1173 | // prog->dmx_id = para.dtv_para.dmx_dev_id; |
1174 | // prog->fend_id = para.fend_dev_id; |
1175 | // prog->mode = para.dtv_para.mode; |
1176 | // Start Scan |
1177 | if (AM_SCAN_Create(¶, &handle) != AM_SUCCESS) { |
1178 | LOGD("SCAN CREATE fail"); |
1179 | handle = NULL; |
1180 | } else { |
1181 | mScanHandle = handle; |
1182 | AM_SCAN_SetUserData(handle, (void *)this); |
1183 | //注册搜索事件 |
1184 | AM_EVT_Subscribe((long)handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
1185 | //注册信号质量通知事件 |
1186 | AM_EVT_Subscribe((long)handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
1187 | if (AM_SCAN_Start(handle) != AM_SUCCESS) { |
1188 | AM_SCAN_Destroy(handle, AM_FALSE); |
1189 | AM_EVT_Unsubscribe((long)handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
1190 | AM_EVT_Unsubscribe((long)handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
1191 | handle = NULL; |
1192 | } |
1193 | } |
1194 | if (para.atv_para.fe_paras != NULL) |
1195 | free(para.atv_para.fe_paras); |
1196 | if (para.dtv_para.fe_paras != NULL) |
1197 | free(para.dtv_para.fe_paras); |
1198 | |
1199 | if (handle == NULL) { |
1200 | return -1; |
1201 | } |
1202 | mbScanStart = true;//start call ok |
1203 | } else { |
1204 | LOGD("scanning and not stop"); |
1205 | } |
1206 | return 0; |
1207 | } |
1208 | |
1209 | /*int CTvScanner::autoAtscScan(int attennaType,int std) |
1210 | { |
1211 | stopScan(); |
1212 | |
1213 | if(!mbScanStart) { //not start or stop |
1214 | AM_SCAN_CreatePara_t para; |
1215 | AM_DMX_OpenPara_t dmx_para; |
1216 | int handle = 0,i; |
1217 | // Create the scan |
1218 | memset(¶, 0, sizeof(para)); |
1219 | |
1220 | //strcpy(para.default_text_lang,"eng");//config |
1221 | //strcpy(para.text_langs, "local eng zho chi chs first");//config |
1222 | para.fend_dev_id = 0;//default |
1223 | para.mode = AM_SCAN_MODE_ADTV;//DTV |
1224 | para.atv_para.mode = AM_SCAN_ATVMODE_NONE; |
1225 | |
1226 | |
1227 | para.atv_para.default_std= std; |
1228 | |
1229 | |
1230 | para.dtv_para.mode = AM_SCAN_DTVMODE_ALLBAND;//DTV_MODE_ALLBAND |
1231 | //para.dtv_para.mode |= (*env)->GetIntField(env, para, doptions);//忽略 |
1232 | para.dtv_para.source = FE_ATSC;//fe_type |
1233 | para.dtv_para.dmx_dev_id = 0;//default 0 |
1234 | para.dtv_para.resort_all = AM_TRUE; |
1235 | para.dtv_para.clear_source = AM_TRUE; |
1236 | para.dtv_para.mix_tv_radio = AM_FALSE; |
1237 | para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID; |
1238 | para.store_cb = NULL; |
1239 | //para.dtv_para.attenna = attennaType;//see dvb atsc-cnc |
1240 | |
1241 | para.dtv_para.standard = AM_SCAN_DTV_STD_ATSC; |
1242 | |
1243 | mSource = para.dtv_para.source; |
1244 | |
1245 | Vector<sp<CTvChannel> > vcp; |
1246 | //CTvDatabase::getChannelParaList("/data/tv_default.xml", vcp);//channel list from xml or db |
1247 | getAtscChannelPara(attennaType,vcp); |
1248 | LOGD("ANDESEN test attenna type is %d",attennaType); |
1249 | |
1250 | int size = vcp.size(); |
1251 | LOGD("channel list size = %d", size); |
1252 | //showboz |
1253 | if(size == 0) { |
1254 | CTvDatabase::GetTvDb()->importXmlToDB("/etc/tv_default.xml"); |
1255 | getAtscChannelPara(attennaType,vcp); |
1256 | size = vcp.size(); |
1257 | } |
1258 | |
1259 | if(!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t*>(calloc(size, sizeof(AM_FENDCTRL_DVBFrontendParameters_t))))) |
1260 | return -1; |
1261 | |
1262 | //memset(pfp, 0, size * sizeof(AM_FENDCTRL_DVBFrontendParameters_t)); |
1263 | |
1264 | for (i = 0; i < size; i++) { |
1265 | para.dtv_para.fe_paras[i].m_type = 3;//MODE_ATSC |
1266 | para.dtv_para.fe_paras[i].m_logicalChannelNum = vcp[i]->getLogicalChannelNum(); |
1267 | para.dtv_para.fe_paras[i].atsc.para.frequency = vcp[i]->getFrequency(); |
1268 | para.dtv_para.fe_paras[i].atsc.para.u.vsb.modulation = (fe_modulation_t)(vcp[i]->getModulation()); |
1269 | } |
1270 | //allband |
1271 | para.dtv_para.fe_cnt = size; |
1272 | |
1273 | memset(&dmx_para, 0, sizeof(dmx_para)); |
1274 | AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para); |
1275 | |
1276 | if ((para.dtv_para.mode&0x07) != AM_SCAN_DTVMODE_NONE) { |
1277 | AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source); |
1278 | tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id); |
1279 | } |
1280 | |
1281 | // prog->dmx_id = para.dtv_para.dmx_dev_id; |
1282 | // prog->fend_id = para.fend_dev_id; |
1283 | // prog->mode = para.dtv_para.mode; |
1284 | // Start Scan |
1285 | if (AM_SCAN_Create(¶, &handle) != AM_SUCCESS) { |
1286 | LOGD("SCAN CREATE fail"); |
1287 | handle = 0; |
1288 | } else { |
1289 | mScanHandle = handle; |
1290 | AM_SCAN_SetUserData(handle, (void*)this); |
1291 | //注册搜索事件 |
1292 | AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
1293 | AM_EVT_Subscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
1294 | //注册信号质量通知事件 |
1295 | AM_EVT_Subscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
1296 | if (AM_SCAN_Start(handle) != AM_SUCCESS) { |
1297 | AM_SCAN_Destroy(handle, AM_FALSE); |
1298 | AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
1299 | AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
1300 | handle = 0; |
1301 | } |
1302 | } |
1303 | if (para.atv_para.fe_paras != NULL) |
1304 | free(para.atv_para.fe_paras); |
1305 | if (para.dtv_para.fe_paras != NULL) |
1306 | free(para.dtv_para.fe_paras); |
1307 | |
1308 | if (handle == 0) { |
1309 | return -1; |
1310 | } |
1311 | mbScanStart = true;//start call ok |
1312 | } else { |
1313 | LOGD("scanning and not stop"); |
1314 | } |
1315 | return 0; |
1316 | }*/ |
1317 | |
1318 | |
1319 | int CTvScanner::stopScan() |
1320 | { |
1321 | LOGD("StopScan"); |
1322 | //requestExit(); |
1323 | if (mbScanStart) { //if start ok and not stop |
1324 | int ret = AM_SCAN_Destroy(mScanHandle, AM_TRUE); |
1325 | AM_EVT_Unsubscribe((long)mScanHandle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
1326 | AM_EVT_Unsubscribe((long)mScanHandle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
1327 | AM_SEC_Cache_Reset(0); |
1328 | //stop loop |
1329 | LOGD("StopScan , ret=%d", ret); |
1330 | mbScanStart = false;//stop ok |
1331 | } else { |
1332 | LOGD("not start scan or scan stoped"); |
1333 | } |
1334 | return 0; |
1335 | } |
1336 | |
1337 | void CTvScanner::tv_scan_evt_callback(long dev_no, int event_type, void *param, void *data __unused) |
1338 | { |
1339 | CTvScanner *pT = NULL; |
1340 | long long tmpFreq = 0; |
1341 | |
1342 | LOGD("evt evt:%d", event_type); |
1343 | AM_SCAN_GetUserData((AM_SCAN_Handle_t)dev_no, (void **)&pT); |
1344 | if (pT == NULL) { |
1345 | return; |
1346 | } |
1347 | pT->mCurEv.clear(); |
1348 | memset(pT->mCurEv.mProgramName, '\0', sizeof(pT->mCurEv.mProgramName)); |
1349 | memset(pT->mCurEv.mMSG, '\0', sizeof(pT->mCurEv.mMSG)); |
1350 | if (event_type == AM_SCAN_EVT_PROGRESS) { |
1351 | AM_SCAN_Progress_t *evt = (AM_SCAN_Progress_t *)param; |
1352 | LOGD("progress evt:%d", evt->evt); |
1353 | switch (evt->evt) { |
1354 | case AM_SCAN_PROGRESS_SCAN_BEGIN: |
1355 | pT->mCurEv.mPercent = 0; |
1356 | break; |
1357 | case AM_SCAN_PROGRESS_NIT_BEGIN: |
1358 | |
1359 | break; |
1360 | case AM_SCAN_PROGRESS_NIT_END: |
1361 | |
1362 | break; |
1363 | case AM_SCAN_PROGRESS_TS_BEGIN: { |
1364 | AM_SCAN_TSProgress_t *tp = (AM_SCAN_TSProgress_t *)evt->data; |
1365 | if (tp == NULL) |
1366 | break; |
1367 | pT->mCurEv.mChannelNumber = tp->index; |
1368 | pT->mCurEv.mMode = tp->fend_para.m_type; |
1369 | pT->mCurEv.mFrequency = ((struct dvb_frontend_parameters *)(&tp->fend_para))->frequency; |
1370 | pT->mCurEv.mSymbolRate = tp->fend_para.cable.para.u.qam.symbol_rate; |
1371 | pT->mCurEv.mModulation = tp->fend_para.cable.para.u.qam.modulation; |
1372 | pT->mCurEv.mBandwidth = tp->fend_para.terrestrial.para.u.ofdm.bandwidth; |
1373 | pT->mCurEv.mOfdm_mode = tp->fend_para.terrestrial.para.u.ofdm.ofdm_mode; |
1374 | pT->mCurEv.mAudio = tp->fend_para.analog.para.u.analog.audmode; |
1375 | pT->mCurEv.mStandard = tp->fend_para.analog.para.u.analog.std; |
1376 | pT->mCurEv.mSat_polarisation = tp->fend_para.sat.polarisation; |
1377 | if (pT->mCurEv.mMode == FE_ANALOG) { |
1378 | if (pT->mSource == FE_ATSC) { |
1379 | pT->mCurEv.mPercent = (tp->index * 100) / tp->total; |
1380 | } else { |
1381 | pT->mCurEv.mPercent = 0; |
1382 | } |
1383 | } else { |
1384 | pT->mCurEv.mPercent = (tp->index * 100) / tp->total; |
1385 | } |
1386 | |
1387 | if (pT->mCurEv.mTotalChannelCount == 0) |
1388 | pT->mCurEv.mTotalChannelCount = tp->total; |
1389 | if (pT->mCurEv.mPercent >= 100) |
1390 | pT->mCurEv.mPercent = 99; |
1391 | |
1392 | pT->mCurEv.mLockedStatus = 0; |
1393 | pT->mCurEv.mStrength = 0; |
1394 | pT->mCurEv.mSnr = 0; |
1395 | pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; |
1396 | |
1397 | pT->sendEvent(pT->mCurEv); |
1398 | } |
1399 | break; |
1400 | case AM_SCAN_PROGRESS_TS_END: { |
1401 | /*pT->mCurEv.mLockedStatus = 0; |
1402 | pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; |
1403 | pT->sendEvent(pT->mCurEv);*/ |
1404 | } |
1405 | break; |
1406 | |
1407 | case AM_SCAN_PROGRESS_PAT_DONE: /*{ |
1408 | if(pT->mCurEv.mTotalChannelCount == 1) { |
1409 | pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; |
1410 | pT->sendEvent(pT->mCurEv); |
1411 | } |
1412 | }*/ |
1413 | break; |
1414 | case AM_SCAN_PROGRESS_SDT_DONE: /*{ |
1415 | dvbpsi_sdt_t *sdts = (dvbpsi_sdt_t *)evt->data; |
1416 | dvbpsi_sdt_t *sdt; |
1417 | |
1418 | if (pT->mCurEv.mTotalChannelCount == 1) { |
1419 | pT->mCurEv.mPercent += 25; |
1420 | if (pT->mCurEv.mPercent >= 100) |
1421 | pT->mCurEv.mPercent = 99; |
1422 | pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; |
1423 | |
1424 | pT->sendEvent(pT->mCurEv); |
1425 | } |
1426 | }*/ |
1427 | break; |
1428 | case AM_SCAN_PROGRESS_CAT_DONE: /*{ |
1429 | dvbpsi_cat_t *cat = (dvbpsi_cat_t *)evt->data; |
1430 | if (pT->mCurEv.mTotalChannelCount == 1) { |
1431 | pT->mCurEv.mPercent += 25; |
1432 | if (pT->mCurEv.mPercent >= 100) |
1433 | pT->mCurEv.mPercent = 99; |
1434 | |
1435 | pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; |
1436 | |
1437 | pT->sendEvent(pT->mCurEv); |
1438 | } |
1439 | }*/ |
1440 | break; |
1441 | case AM_SCAN_PROGRESS_PMT_DONE: /*{ |
1442 | dvbpsi_pmt_t *pmt = (dvbpsi_pmt_t *)evt->data; |
1443 | if (pT->mCurEv.mTotalChannelCount == 1) { |
1444 | pT->mCurEv.mPercent += 25; |
1445 | if (pT->mCurEv.mPercent >= 100) |
1446 | pT->mCurEv.mPercent = 99; |
1447 | |
1448 | pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; |
1449 | pT->sendEvent(pT->mCurEv); |
1450 | } |
1451 | }*/ |
1452 | break; |
1453 | case AM_SCAN_PROGRESS_MGT_DONE: { |
1454 | mgt_section_info_t *mgt = (mgt_section_info_t *)evt->data; |
1455 | |
1456 | if (pT->mCurEv.mTotalChannelCount == 1) { |
1457 | pT->mCurEv.mPercent += 10; |
1458 | if (pT->mCurEv.mPercent >= 100) |
1459 | pT->mCurEv.mPercent = 99; |
1460 | |
1461 | pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; |
1462 | |
1463 | pT->sendEvent(pT->mCurEv); |
1464 | } |
1465 | } |
1466 | break; |
1467 | case AM_SCAN_PROGRESS_VCT_DONE: { |
1468 | /*ATSC TVCT*/ |
1469 | if (pT->mCurEv.mTotalChannelCount == 1) { |
1470 | pT->mCurEv.mPercent += 30; |
1471 | if (pT->mCurEv.mPercent >= 100) |
1472 | pT->mCurEv.mPercent = 99; |
1473 | pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; |
1474 | |
1475 | pT->sendEvent(pT->mCurEv); |
1476 | } |
1477 | } |
1478 | break; |
1479 | case AM_SCAN_PROGRESS_NEW_PROGRAM: { |
1480 | /* Notify the new searched programs */ |
1481 | AM_SCAN_ProgramProgress_t *pp = (AM_SCAN_ProgramProgress_t *)evt->data; |
1482 | if (pp != NULL) { |
1483 | pT->mCurEv.mprogramType = pp->service_type; |
1484 | snprintf(pT->mCurEv.mProgramName, sizeof(pT->mCurEv.mProgramName), "%s", pp->name); |
1485 | |
1486 | pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; |
1487 | |
1488 | pT->sendEvent(pT->mCurEv); |
1489 | } |
1490 | } |
1491 | break; |
1492 | case AM_SCAN_PROGRESS_BLIND_SCAN: { |
1493 | AM_SCAN_DTVBlindScanProgress_t *bs_prog = (AM_SCAN_DTVBlindScanProgress_t *)evt->data; |
1494 | |
1495 | if (bs_prog) { |
1496 | pT->mCurEv.mPercent = bs_prog->progress; |
1497 | |
1498 | snprintf(pT->mCurEv.mMSG, sizeof(pT->mCurEv.mMSG), "%s/%s %dMHz", |
1499 | bs_prog->polar == AM_FEND_POLARISATION_H ? "H" : "V", |
1500 | bs_prog->lo == AM_FEND_LOCALOSCILLATORFREQ_L ? "L-LOF" : "H-LOF", |
1501 | bs_prog->freq / 1000); |
1502 | |
1503 | pT->mCurEv.mType = ScannerEvent::EVENT_BLINDSCAN_PROGRESS; |
1504 | |
1505 | pT->sendEvent(pT->mCurEv); |
1506 | |
1507 | if (bs_prog->new_tp_cnt > 0) { |
1508 | int i = 0; |
1509 | for (i = 0; i < bs_prog->new_tp_cnt; i++) { |
1510 | LOGD("====New tp: %dkS/s %d====", bs_prog->new_tps[i].frequency, |
1511 | bs_prog->new_tps[i].u.qpsk.symbol_rate); |
1512 | |
1513 | pT->mCurEv.mFrequency = bs_prog->new_tps[i].frequency; |
1514 | pT->mCurEv.mSymbolRate = bs_prog->new_tps[i].u.qpsk.symbol_rate; |
1515 | pT->mCurEv.mSat_polarisation = bs_prog->polar; |
1516 | |
1517 | pT->mCurEv.mType = ScannerEvent::EVENT_BLINDSCAN_NEWCHANNEL; |
1518 | |
1519 | pT->sendEvent(pT->mCurEv); |
1520 | } |
1521 | } |
1522 | if (bs_prog->progress >= 100) { |
1523 | |
1524 | pT->mCurEv.mType = ScannerEvent::EVENT_BLINDSCAN_END; |
1525 | |
1526 | pT->sendEvent(pT->mCurEv); |
1527 | |
1528 | pT->mCurEv.mPercent = 0; |
1529 | } |
1530 | } |
1531 | } |
1532 | break; |
1533 | case AM_SCAN_PROGRESS_STORE_BEGIN: { |
1534 | pT->mCurEv.mType = ScannerEvent::EVENT_STORE_BEGIN; |
1535 | pT->mCurEv.mLockedStatus = 0; |
1536 | pT->sendEvent(pT->mCurEv); |
1537 | } |
1538 | break; |
1539 | case AM_SCAN_PROGRESS_STORE_END: { |
1540 | pT->mCurEv.mLockedStatus = 0; |
1541 | pT->mCurEv.mType = ScannerEvent::EVENT_STORE_END; |
1542 | pT->sendEvent(pT->mCurEv); |
1543 | } |
1544 | break; |
1545 | case AM_SCAN_PROGRESS_SCAN_END: { |
1546 | pT->mCurEv.mPercent = 100; |
1547 | pT->mCurEv.mLockedStatus = 0; |
1548 | pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_END; |
1549 | pT->sendEvent(pT->mCurEv); |
1550 | } |
1551 | break; |
1552 | case AM_SCAN_PROGRESS_SCAN_EXIT: { |
1553 | pT->mCurEv.mLockedStatus = 0; |
1554 | pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_EXIT; |
1555 | pT->sendEvent(pT->mCurEv); |
1556 | } |
1557 | break; |
1558 | case AM_SCAN_PROGRESS_ATV_TUNING: { |
1559 | pT->mCurEv.mFrequency = (int)evt->data; |
1560 | pT->mCurEv.mLockedStatus = 0; |
1561 | tmpFreq = (pT->mCurEv.mFrequency - pT->mCurScanStartFreq) / 1000000; |
1562 | pT->mCurEv.mPercent = tmpFreq * 100UL / ((pT->mCurScanEndFreq - pT->mCurScanStartFreq) / 1000000); |
1563 | pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; |
1564 | pT->sendEvent(pT->mCurEv); |
1565 | } |
1566 | break; |
1567 | |
1568 | default: |
1569 | break; |
1570 | } |
1571 | } else if (event_type == AM_SCAN_EVT_SIGNAL) { |
1572 | AM_SCAN_DTVSignalInfo_t *evt = (AM_SCAN_DTVSignalInfo_t *)param; |
1573 | //pT->mCurEv.mprogramType = 0xff; |
1574 | pT->mCurEv.mFrequency = (int)evt->frequency; |
1575 | pT->mCurEv.mLockedStatus = (evt->locked ? 1 : 0); |
1576 | |
1577 | if (pT->mCurEv.mMode == FE_ANALOG && evt->locked)//trick here for atv new prog |
1578 | pT->mCurEv.mLockedStatus |= 0x10; |
1579 | |
1580 | pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; |
1581 | if (pT->mCurEv.mMode != FE_ANALOG && evt->locked) { |
1582 | pT->mCurEv.mStrength = evt->strength; |
1583 | pT->mCurEv.mSnr = evt->snr; |
1584 | } else { |
1585 | pT->mCurEv.mStrength = 0; |
1586 | pT->mCurEv.mSnr = 0; |
1587 | } |
1588 | |
1589 | //if (pT->mCurEv.mMode == FE_ANALOG) |
1590 | pT->sendEvent(pT->mCurEv); |
1591 | |
1592 | pT->mCurEv.mLockedStatus &= ~0x10; |
1593 | } |
1594 | } |
1595 | |
1596 | void CTvScanner::tv_scan_reconnect_dmx_to_fend(int dmx_no, int fend_no) |
1597 | { |
1598 | AM_DMX_Source_t src; |
1599 | |
1600 | if (AM_FEND_GetTSSource(fend_no, &src) == AM_SUCCESS) { |
1601 | LOGD("Set demux%d source to %d", dmx_no, src); |
1602 | AM_DMX_SetSource(dmx_no, src); |
1603 | } else { |
1604 | LOGD("Cannot get frontend ts source!!"); |
1605 | } |
1606 | } |
1607 | |
1608 | int CTvScanner::getAtscChannelPara(int attennaType, Vector<sp<CTvChannel> > &vcp) |
1609 | { |
1610 | switch (attennaType) { //region name should be remove to config file and read here |
1611 | case 1: |
1612 | CTvRegion::getChannelListByName((char *)"U.S.,ATSC Air", vcp); |
1613 | break; |
1614 | case 2: |
1615 | CTvRegion::getChannelListByName((char *)"U.S.,ATSC Cable Standard", vcp); |
1616 | break; |
1617 | case 3: |
1618 | CTvRegion::getChannelListByName((char *)"U.S.,ATSC Cable IRC", vcp); |
1619 | break; |
1620 | case 4: |
1621 | CTvRegion::getChannelListByName((char *)"U.S.,ATSC Cable HRC", vcp); |
1622 | break; |
1623 | default: |
1624 | return -1; |
1625 | } |
1626 | |
1627 | return 0; |
1628 | } |
1629 | |
1630 | void CTvScanner::sendEvent(ScannerEvent &evt) |
1631 | { |
1632 | if (mpObserver) { |
1633 | if (evt.mType != ScannerEvent::EVENT_DTV_PROG_DATA) { |
1634 | evt.mAcnt = 0;//avoid invalid count confused the array. |
1635 | evt.mScnt = 0; |
1636 | } |
1637 | mpObserver->onEvent(evt); |
1638 | } |
1639 | } |
1640 | |
1641 |