blob: 068d82a674603b136cf98ae4dd813768cdba407b
1 | // |
2 | // |
3 | // amlogic 2013 |
4 | // |
5 | // @ Project : tv |
6 | // @ File Name : |
7 | // @ Date : 2013-11 |
8 | // @ Author : |
9 | // |
10 | // |
11 | #include "CTvScanner.h" |
12 | #include "CTvProgram.h" |
13 | #include "CTvRegion.h" |
14 | #include "CFrontEnd.h" |
15 | #ifdef LOG_TAG |
16 | #undef LOG_TAG |
17 | #define LOG_TAG "CTvScanner" |
18 | #endif |
19 | |
20 | CTvScanner *CTvScanner::m_s_Scanner = NULL; |
21 | //int CTvScanner::getStartPara() |
22 | //{ |
23 | // |
24 | //} |
25 | CTvScanner::CTvScanner(CTvin *pTvin) |
26 | { |
27 | mbScanStart = false; |
28 | mpObserver = NULL; |
29 | mSource = 0xff; |
30 | mMinFreq = 1; |
31 | mMaxFreq = 100; |
32 | mCurScanStartFreq = 1; |
33 | mCurScanEndFreq = 100; |
34 | mpTvin = pTvin; |
35 | } |
36 | |
37 | CTvScanner::~CTvScanner() |
38 | { |
39 | AM_EVT_Unsubscribe((long)mScanHandle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
40 | AM_EVT_Unsubscribe((long)mScanHandle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
41 | } |
42 | |
43 | |
44 | AM_Bool_t CTvScanner::atv_cvbs_lock_check(v4l2_std_id *colorStd) |
45 | { |
46 | tvafe_cvbs_video_t cvbs_lock_status; |
47 | int ret, i = 0; |
48 | |
49 | *colorStd = 0; |
50 | while (i < 20) { |
51 | ret = mpTvin->AFE_GetCVBSLockStatus(&cvbs_lock_status); |
52 | |
53 | if (cvbs_lock_status == TVAFE_CVBS_VIDEO_HV_LOCKED) |
54 | //||cvbs_lock_status == TVAFE_CVBS_VIDEO_V_LOCKED |
55 | //||cvbs_lock_status == TVAFE_CVBS_VIDEO_H_LOCKED) |
56 | { |
57 | usleep(2000 * 1000); |
58 | tvin_info_t info; |
59 | mpTvin->VDIN_GetSignalInfo(&info); |
60 | *colorStd = CTvin::CvbsFtmToV4l2ColorStd(info.fmt); |
61 | LOGD("atv_cvbs_lock_check locked and cvbs fmt = 0x%x std = 0x%x", info.fmt, *colorStd); |
62 | return true; |
63 | } |
64 | usleep(50 * 1000); |
65 | i++; |
66 | } |
67 | return false; |
68 | } |
69 | |
70 | AM_Bool_t CTvScanner::s_atv_cvbs_lock_check(void *data) |
71 | { |
72 | if(data == NULL) return false; |
73 | AM_SCAN_ATV_LOCK_PARA_t *pAtvPara = (AM_SCAN_ATV_LOCK_PARA_t *)data; |
74 | CTvScanner *pScan = (CTvScanner *)(pAtvPara->pData); |
75 | v4l2_std_id std; |
76 | AM_Bool_t isLock = pScan->atv_cvbs_lock_check(&std); |
77 | pAtvPara->pOutColorSTD = std; |
78 | return isLock; |
79 | } |
80 | |
81 | int CTvScanner::ATVManualScan(int min_freq, int max_freq, int std, int store_Type, int channel_num) |
82 | { |
83 | stopScan(); |
84 | if(min_freq <= 0 || max_freq <= 0 || min_freq == max_freq) { |
85 | LOGD("atv manual scan freq error start = %d end = %d", min_freq, max_freq); |
86 | return -1; |
87 | } |
88 | int direction = (max_freq >= min_freq) ? 1 : 0; |
89 | |
90 | if(!mbScanStart) { //not start or stop |
91 | // |
92 | mCurScanStartFreq = min_freq; |
93 | mCurScanEndFreq = max_freq; |
94 | AM_SCAN_CreatePara_t para; |
95 | AM_DMX_OpenPara_t dmx_para; |
96 | AM_SCAN_Handle_t handle = 0, i; |
97 | LOGD("startScanThread"); |
98 | // Create the scan |
99 | memset(¶, 0, sizeof(para)); |
100 | para.fend_dev_id = 0;//default |
101 | para.mode = AM_SCAN_MODE_ATV_DTV;// |
102 | para.atv_para.mode = AM_SCAN_ATVMODE_MANUAL; |
103 | para.atv_para.storeMode = store_Type; |
104 | para.dtv_para.mode = AM_SCAN_DTVMODE_NONE; |
105 | |
106 | para.atv_para.am_scan_atv_cvbs_lock = s_atv_cvbs_lock_check; |
107 | |
108 | para.atv_para.fe_cnt = 3; |
109 | para.atv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(3, sizeof(AM_FENDCTRL_DVBFrontendParameters_t))); |
110 | if(para.atv_para.fe_paras != NULL) { |
111 | memset(para.atv_para.fe_paras, 0, 3 * sizeof(AM_FENDCTRL_DVBFrontendParameters_t)); |
112 | para.atv_para.fe_paras[0].m_type = FE_ANALOG; |
113 | para.atv_para.fe_paras[0].analog.para.frequency = min_freq; |
114 | para.atv_para.fe_paras[1].m_type = FE_ANALOG; |
115 | para.atv_para.fe_paras[1].analog.para.frequency = max_freq; |
116 | para.atv_para.fe_paras[2].m_type = FE_ANALOG; |
117 | para.atv_para.fe_paras[2].analog.para.frequency = min_freq; |
118 | } |
119 | para.atv_para.direction = direction; |
120 | para.atv_para.default_std = std; |
121 | |
122 | para.atv_para.channel_id = -1; |
123 | para.atv_para.cvbs_unlocked_step = 1000000; |
124 | para.atv_para.cvbs_locked_step = 3000000; |
125 | para.atv_para.afc_range = 2000000; |
126 | |
127 | para.dtv_para.resort_all = AM_FALSE; |
128 | para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID; |
129 | para.store_cb = am_scan_atv_store; |
130 | para.atv_para.channel_num = channel_num; |
131 | |
132 | memset(&dmx_para, 0, sizeof(dmx_para)); |
133 | AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para); |
134 | |
135 | if ((para.dtv_para.mode & 0x07) != AM_SCAN_DTVMODE_NONE) { |
136 | AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source); |
137 | tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id); |
138 | } |
139 | |
140 | LOGD("atv manual scan mode = %d", para.dtv_para.mode); |
141 | // Start Scan |
142 | if (AM_SCAN_Create(¶, &handle) != AM_SUCCESS) { |
143 | LOGD("SCAN CREATE fail"); |
144 | handle = NULL; |
145 | } else { |
146 | mScanHandle = handle; |
147 | AM_SCAN_SetUserData(handle, (void *)this); |
148 | AM_EVT_Subscribe((long)handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
149 | AM_EVT_Subscribe((long)handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
150 | if (AM_SCAN_Start(handle) != AM_SUCCESS) { |
151 | AM_SCAN_Destroy(handle, AM_FALSE); |
152 | AM_EVT_Unsubscribe((long)handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
153 | AM_EVT_Unsubscribe((long)handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
154 | handle = NULL; |
155 | } |
156 | } |
157 | if (para.atv_para.fe_paras != NULL) |
158 | free(para.atv_para.fe_paras); |
159 | if (para.dtv_para.fe_paras != NULL) |
160 | free(para.dtv_para.fe_paras); |
161 | |
162 | if (handle == NULL) { |
163 | return -1; |
164 | } |
165 | mbScanStart = true;//start call ok |
166 | } else { |
167 | LOGD("scanning and not stop"); |
168 | } |
169 | |
170 | return 0; |
171 | |
172 | } |
173 | |
174 | void CTvScanner::am_scan_atv_store(AM_SCAN_Result_t *result) |
175 | { |
176 | AM_SCAN_TS_t *ts; |
177 | int i, ret, db_sat_id = -1; |
178 | //AM_SCAN_RecTab_t srv_tab; |
179 | for(ts = result->tses; ts != NULL; ts = ts->p_next) { |
180 | // |
181 | m_s_Scanner->mCurEv.mType = ScannerEvent::EVENT_ATV_PROG_DATA; |
182 | m_s_Scanner->mCurEv.mVideoStd = CFrontEnd::stdAndColorToVideoEnum(ts->analog.std); |
183 | m_s_Scanner->mCurEv.mAudioStd = CFrontEnd::stdAndColorToAudioEnum(ts->analog.std); |
184 | m_s_Scanner->mCurEv.mIsAutoStd = ((ts->analog.std & V4L2_COLOR_STD_AUTO) == V4L2_COLOR_STD_AUTO) ? 1 : 0; |
185 | m_s_Scanner->mCurEv.mFrequency = ts->analog.freq; |
186 | // |
187 | m_s_Scanner->mpObserver->onEvent(m_s_Scanner->mCurEv); |
188 | } |
189 | } |
190 | |
191 | void CTvScanner::setGlobalScanerObject(CTvScanner *s) |
192 | { |
193 | m_s_Scanner = s; |
194 | } |
195 | |
196 | int CTvScanner::autoAtvScan(int min_freq, int max_freq, int std, int search_type) |
197 | { |
198 | stopScan(); |
199 | if(min_freq <= 0 || max_freq <= 0 || min_freq > max_freq) |
200 | return -1; |
201 | if(!mbScanStart) { //not start or stop |
202 | mCurScanStartFreq = min_freq; |
203 | mCurScanEndFreq = max_freq; |
204 | |
205 | AM_SCAN_CreatePara_t para; |
206 | AM_DMX_OpenPara_t dmx_para; |
207 | AM_SCAN_Handle_t handle = 0, i; |
208 | // Create the scan |
209 | memset(¶, 0, sizeof(para)); |
210 | |
211 | para.fend_dev_id = 0;//default |
212 | para.mode = AM_SCAN_MODE_ATV_DTV;// |
213 | if (search_type == 1) |
214 | para.atv_para.storeMode = 1; |
215 | else |
216 | para.atv_para.storeMode = 0; |
217 | para.dtv_para.mode = AM_SCAN_DTVMODE_NONE; |
218 | |
219 | para.atv_para.am_scan_atv_cvbs_lock = s_atv_cvbs_lock_check; |
220 | |
221 | para.atv_para.fe_cnt = 3; |
222 | para.atv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(3, sizeof(AM_FENDCTRL_DVBFrontendParameters_t))); |
223 | if(para.atv_para.fe_paras != NULL) { |
224 | memset(para.atv_para.fe_paras, 0, 3 * sizeof(AM_FENDCTRL_DVBFrontendParameters_t)); |
225 | para.atv_para.fe_paras[0].m_type = FE_ANALOG; |
226 | para.atv_para.fe_paras[0].analog.para.frequency = min_freq; |
227 | para.atv_para.fe_paras[1].m_type = FE_ANALOG; |
228 | para.atv_para.fe_paras[1].analog.para.frequency = max_freq; |
229 | para.atv_para.fe_paras[2].m_type = FE_ANALOG; |
230 | para.atv_para.fe_paras[2].analog.para.frequency = 0; |
231 | } |
232 | |
233 | para.atv_para.direction = 0; |
234 | para.atv_para.default_std = std; |
235 | |
236 | para.atv_para.channel_id = -1; |
237 | para.atv_para.afc_unlocked_step = 3000000; |
238 | para.atv_para.cvbs_unlocked_step = 1500000; |
239 | para.atv_para.cvbs_locked_step = 6000000; |
240 | para.atv_para.afc_range = 2000000; |
241 | |
242 | para.dtv_para.resort_all = AM_FALSE; |
243 | para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID; |
244 | para.store_cb = am_scan_atv_store; |
245 | |
246 | memset(&dmx_para, 0, sizeof(dmx_para)); |
247 | AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para); |
248 | |
249 | if ((para.dtv_para.mode & 0x07) != AM_SCAN_DTVMODE_NONE) { |
250 | AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source); |
251 | tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id); |
252 | } |
253 | |
254 | // prog->dmx_id = para.dtv_para.dmx_dev_id; |
255 | // prog->fend_id = para.fend_dev_id; |
256 | // prog->mode = para.dtv_para.mode; |
257 | LOGD(" mode = %d", para.dtv_para.mode); |
258 | // Start Scan |
259 | if (AM_SCAN_Create(¶, &handle) != AM_SUCCESS) { |
260 | LOGD("SCAN CREATE fail"); |
261 | handle = NULL; |
262 | } else { |
263 | mScanHandle = handle; |
264 | AM_SCAN_SetUserData(handle, (void *)this); |
265 | //注册搜索事件 |
266 | AM_EVT_Subscribe((long)handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
267 | //注册信号质量通知事件 |
268 | AM_EVT_Subscribe((long)handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
269 | if (AM_SCAN_Start(handle) != AM_SUCCESS) { |
270 | AM_SCAN_Destroy(handle, AM_FALSE); |
271 | AM_EVT_Unsubscribe((long)handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
272 | AM_EVT_Unsubscribe((long)handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
273 | handle = NULL; |
274 | } |
275 | } |
276 | if (para.atv_para.fe_paras != NULL) |
277 | free(para.atv_para.fe_paras); |
278 | if (para.dtv_para.fe_paras != NULL) |
279 | free(para.dtv_para.fe_paras); |
280 | |
281 | if (handle == NULL) { |
282 | return -1; |
283 | } |
284 | mbScanStart = true;//start call ok |
285 | } else { |
286 | LOGD("scanning and not stop"); |
287 | } |
288 | |
289 | return 0; |
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 | |
310 | para.atv_para.default_std= std; |
311 | |
312 | |
313 | para.dtv_para.mode = AM_SCAN_DTVMODE_MANUAL;//DTV_MODE_ALLBAND |
314 | //para.dtv_para.mode |= (*env)->GetIntField(env, para, doptions);//忽略 |
315 | para.dtv_para.source = FE_ATSC;//fe_type |
316 | para.dtv_para.dmx_dev_id = 0;//default 0 |
317 | para.dtv_para.resort_all = AM_TRUE; |
318 | para.dtv_para.clear_source = AM_FALSE; |
319 | para.dtv_para.mix_tv_radio = AM_FALSE; |
320 | para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID; |
321 | para.store_cb = NULL; |
322 | //para.dtv_para.attenna = attennaType; |
323 | |
324 | para.dtv_para.standard = AM_SCAN_DTV_STD_ATSC; |
325 | |
326 | mSource = para.dtv_para.source; |
327 | |
328 | Vector<sp<CTvChannel> > vcp; |
329 | //CTvDatabase::getChannelParaList("/data/tv_default.xml", vcp);//channel list from xml or db |
330 | getAtscChannelPara(attennaType,vcp); |
331 | LOGD("ANDESEN test attenna type is %d",attennaType); |
332 | |
333 | int size = vcp.size(); |
334 | LOGD("channel list size = %d", size); |
335 | //showboz |
336 | if(size == 0) { |
337 | CTvDatabase::GetTvDb()->importXmlToDB("/etc/tv_default.xml"); |
338 | getAtscChannelPara(attennaType,vcp); |
339 | size = vcp.size(); |
340 | } |
341 | |
342 | if(!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t*>(calloc(1, sizeof(AM_FENDCTRL_DVBFrontendParameters_t))))) |
343 | return -1; |
344 | |
345 | //memset(pfp, 0, size * sizeof(AM_FENDCTRL_DVBFrontendParameters_t)); |
346 | |
347 | for (i = 0; i < size; i++) { |
348 | if(channelID == vcp[i]->getLogicalChannelNum()) |
349 | { |
350 | para.dtv_para.fe_paras[0].m_type = 3;//MODE_ATSC |
351 | para.dtv_para.fe_paras[0].m_logicalChannelNum = vcp[i]->getLogicalChannelNum(); |
352 | para.dtv_para.fe_paras[0].atsc.para.frequency = vcp[i]->getFrequency(); |
353 | para.dtv_para.fe_paras[0].atsc.para.u.vsb.modulation = (fe_modulation_t)(vcp[i]->getModulation()); |
354 | LOGD("andesen test atsc manual type=%d,num=%d,freq=%d,modu=%d", |
355 | para.dtv_para.fe_paras[0].m_type,para.dtv_para.fe_paras[0].m_logicalChannelNum, |
356 | para.dtv_para.fe_paras[0].atsc.para.frequency,para.dtv_para.fe_paras[0].atsc.para.u.vsb.modulation); |
357 | } |
358 | } |
359 | //allband |
360 | para.dtv_para.fe_cnt = 1; |
361 | memset(&dmx_para, 0, sizeof(dmx_para)); |
362 | AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para); |
363 | |
364 | if ((para.dtv_para.mode&0x07) != AM_SCAN_DTVMODE_NONE) { |
365 | AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source); |
366 | tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id); |
367 | } |
368 | |
369 | // prog->dmx_id = para.dtv_para.dmx_dev_id; |
370 | // prog->fend_id = para.fend_dev_id; |
371 | // prog->mode = para.dtv_para.mode; |
372 | // Start Scan |
373 | if (AM_SCAN_Create(¶, &handle) != AM_SUCCESS) { |
374 | LOGD("SCAN CREATE fail"); |
375 | handle = 0; |
376 | } else { |
377 | mScanHandle = handle; |
378 | AM_SCAN_SetUserData(handle, (void*)this); |
379 | //注册搜索事件 |
380 | AM_EVT_Subscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
381 | //注册信号质量通知事件 |
382 | AM_EVT_Subscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
383 | if (AM_SCAN_Start(handle) != AM_SUCCESS) { |
384 | AM_SCAN_Destroy(handle, AM_FALSE); |
385 | AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
386 | AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
387 | handle = 0; |
388 | } |
389 | } |
390 | if (para.atv_para.fe_paras != NULL) |
391 | free(para.atv_para.fe_paras); |
392 | if (para.dtv_para.fe_paras != NULL) |
393 | free(para.dtv_para.fe_paras); |
394 | |
395 | if (handle == 0) { |
396 | return -1; |
397 | } |
398 | mbScanStart = true;//start call ok |
399 | } else { |
400 | LOGD("scanning and not stop"); |
401 | } return 0; |
402 | }*/ |
403 | |
404 | int CTvScanner::manualDtmbScan(int beginFreq, int endFreq, int modulation) |
405 | { |
406 | stopScan(); |
407 | |
408 | if(!mbScanStart) { //not start or stop |
409 | AM_SCAN_CreatePara_t para; |
410 | AM_DMX_OpenPara_t dmx_para; |
411 | AM_SCAN_Handle_t handle = 0; |
412 | int i; |
413 | // Create the scan |
414 | memset(¶, 0, sizeof(para)); |
415 | |
416 | para.fend_dev_id = 0;//default |
417 | para.mode = AM_SCAN_MODE_DTV_ATV;//DTV |
418 | para.atv_para.mode = AM_SCAN_ATVMODE_NONE; |
419 | para.dtv_para.mode = AM_SCAN_DTVMODE_MANUAL; |
420 | para.dtv_para.source = FE_DTMB;//fe_type |
421 | para.dtv_para.dmx_dev_id = 0;//default 0 |
422 | |
423 | Vector<sp<CTvChannel> > vcp; |
424 | CTvRegion::getChannelListByNameAndFreqRange("CHINA,Default DTMB ALL", beginFreq, endFreq, vcp); |
425 | int size = vcp.size(); |
426 | |
427 | //@author:hao.fu |
428 | if(size == 0) { |
429 | return -1; |
430 | } |
431 | |
432 | if(!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(size, sizeof(AM_FENDCTRL_DVBFrontendParameters_t))))) |
433 | return -1; |
434 | |
435 | for (i = 0; i < size; i++) { |
436 | para.dtv_para.fe_paras[i].m_type = 5;//MODE_DTMB |
437 | para.dtv_para.fe_paras[i].dtmb.para.frequency = vcp[i]->getFrequency(); |
438 | para.dtv_para.fe_paras[i].dtmb.para.inversion = INVERSION_OFF; |
439 | para.dtv_para.fe_paras[i].dtmb.para.u.ofdm.bandwidth = (fe_bandwidth_t)(vcp[i]->getBandwidth()); |
440 | if (modulation == -1) |
441 | para.dtv_para.fe_paras[i].cable.para.u.qam.modulation = (fe_modulation_t)(vcp[i]->getModulation()); |
442 | else |
443 | para.dtv_para.fe_paras[i].cable.para.u.qam.modulation = (fe_modulation_t)modulation; |
444 | } |
445 | |
446 | para.dtv_para.fe_cnt = size; |
447 | para.dtv_para.resort_all = AM_FALSE; |
448 | para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID; |
449 | para.store_cb = NULL; |
450 | |
451 | |
452 | memset(&dmx_para, 0, sizeof(dmx_para)); |
453 | AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para); |
454 | |
455 | if ((para.dtv_para.mode & 0x07) != AM_SCAN_DTVMODE_NONE) { |
456 | AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source); |
457 | tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id); |
458 | } |
459 | |
460 | // Start Scan |
461 | if (AM_SCAN_Create(¶, &handle) != AM_SUCCESS) { |
462 | LOGD("SCAN CREATE fail"); |
463 | handle = NULL; |
464 | } else { |
465 | mScanHandle = handle; |
466 | AM_SCAN_SetUserData(handle, (void *)this); |
467 | AM_EVT_Subscribe((long)handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
468 | AM_EVT_Subscribe((long)handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
469 | if (AM_SCAN_Start(handle) != AM_SUCCESS) { |
470 | AM_SCAN_Destroy(handle, AM_FALSE); |
471 | AM_EVT_Unsubscribe((long)handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
472 | AM_EVT_Unsubscribe((long)handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
473 | handle = NULL; |
474 | } |
475 | } |
476 | if (para.atv_para.fe_paras != NULL) |
477 | free(para.atv_para.fe_paras); |
478 | if (para.dtv_para.fe_paras != NULL) |
479 | free(para.dtv_para.fe_paras); |
480 | |
481 | if (handle == NULL) { |
482 | return -1; |
483 | } |
484 | mbScanStart = true;//start call ok |
485 | } else { |
486 | LOGD("scanning and not stop"); |
487 | } |
488 | return 0; |
489 | } |
490 | |
491 | |
492 | /*int CTvScanner::autoTvScan() |
493 | { |
494 | stopScan(); |
495 | |
496 | if(!mbScanStart) { //not start or stop |
497 | AM_SCAN_CreatePara_t para; |
498 | AM_DMX_OpenPara_t dmx_para; |
499 | int handle = 0,i; |
500 | // Create the scan |
501 | memset(¶, 0, sizeof(para)); |
502 | |
503 | //strcpy(para.default_text_lang,"eng");//config |
504 | //strcpy(para.text_langs, "eng zho chi");//config |
505 | para.fend_dev_id = 0;//default |
506 | para.mode = AM_SCAN_MODE_DTV_ATV;//DTV |
507 | para.atv_para.mode = AM_SCAN_ATVMODE_NONE; |
508 | para.dtv_para.mode = AM_SCAN_DTVMODE_ALLBAND;//DTV_MODE_ALLBAND |
509 | //para.dtv_para.mode |= (*env)->GetIntField(env, para, doptions);//忽略 |
510 | para.dtv_para.source = 1;//QAM |
511 | para.dtv_para.dmx_dev_id = 0;//default 0 |
512 | Vector<sp<CTvChannel> > vcp; |
513 | //CTvDatabase::getChannelParaList("/data/tv_default.xml", vcp);//channel list from xml or db |
514 | CTvRegion::getChannelListByName("China,DVB-C allband", vcp); |
515 | |
516 | int size = vcp.size(); |
517 | LOGD("channel list size = %d", size); |
518 | if(!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t*>(calloc(size, sizeof(AM_FENDCTRL_DVBFrontendParameters_t))))) |
519 | return -1; |
520 | |
521 | //memset(pfp, 0, size * sizeof(AM_FENDCTRL_DVBFrontendParameters_t)); |
522 | |
523 | for (i = 0; i < size; i++) { |
524 | para.dtv_para.fe_paras[i].m_type = FE_QAM; |
525 | para.dtv_para.fe_paras[i].cable.para.frequency = vcp[i]->getFrequency(); |
526 | para.dtv_para.fe_paras[i].cable.para.inversion = INVERSION_OFF; |
527 | para.dtv_para.fe_paras[i].cable.para.u.qam.symbol_rate = vcp[i]->getSymbolRate(); |
528 | para.dtv_para.fe_paras[i].cable.para.u.qam.modulation = (fe_modulation_t)(vcp[i]->getModulation()); |
529 | } |
530 | //allband |
531 | para.dtv_para.fe_cnt = size; |
532 | |
533 | para.dtv_para.resort_all = AM_FALSE; |
534 | para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID; |
535 | para.store_cb = NULL; |
536 | memset(&dmx_para, 0, sizeof(dmx_para)); |
537 | AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para); |
538 | |
539 | if ((para.dtv_para.mode&0x07) != AM_SCAN_DTVMODE_NONE) { |
540 | AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source); |
541 | tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id); |
542 | } |
543 | |
544 | // prog->dmx_id = para.dtv_para.dmx_dev_id; |
545 | // prog->fend_id = para.fend_dev_id; |
546 | // prog->mode = para.dtv_para.mode; |
547 | // Start Scan |
548 | if (AM_SCAN_Create(¶, &handle) != AM_SUCCESS) { |
549 | LOGD("SCAN CREATE fail"); |
550 | handle = 0; |
551 | } else { |
552 | LOGD("SCAN CREATE handle = %d", handle); |
553 | mScanHandle = handle; |
554 | AM_SCAN_SetUserData(handle, (void*)this); |
555 | //注册搜索事件 |
556 | AM_EVT_Subscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
557 | //注册信号质量通知事件 |
558 | //AM_EVT_Subscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
559 | if (AM_SCAN_Start(handle) != AM_SUCCESS) { |
560 | AM_SCAN_Destroy(handle, AM_FALSE); |
561 | AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
562 | // AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
563 | handle = 0; |
564 | } |
565 | } |
566 | if (para.atv_para.fe_paras != NULL) |
567 | free(para.atv_para.fe_paras); |
568 | if (para.dtv_para.fe_paras != NULL) |
569 | free(para.dtv_para.fe_paras); |
570 | |
571 | if (handle == 0) { |
572 | return -1; |
573 | } |
574 | mbScanStart = true;//start call ok |
575 | } else { |
576 | LOGD("scanning and not stop"); |
577 | } |
578 | return 0; |
579 | }*/ |
580 | //only test for dtv allbland auto |
581 | /*int CTvScanner::startScan() |
582 | { |
583 | stopScan(); |
584 | |
585 | if(!mbScanStart) { //not start or stop |
586 | AM_SCAN_CreatePara_t para; |
587 | AM_DMX_OpenPara_t dmx_para; |
588 | int handle = 0,i; |
589 | // Create the scan |
590 | memset(¶, 0, sizeof(para)); |
591 | |
592 | //strcpy(para.default_text_lang,"eng");//config |
593 | //strcpy(para.text_langs, "eng zho chi");//config |
594 | para.fend_dev_id = 0;//default |
595 | para.mode = AM_SCAN_MODE_DTV_ATV;//DTV |
596 | para.atv_para.mode = AM_SCAN_ATVMODE_NONE; |
597 | para.dtv_para.mode = 3;//DTV_MODE_ALLBAND |
598 | //para.dtv_para.mode |= (*env)->GetIntField(env, para, doptions);//忽略 |
599 | para.dtv_para.source = 1;//QAM |
600 | para.dtv_para.dmx_dev_id = 0;//default 0 |
601 | Vector<sp<CTvChannel> > vcp; |
602 | //CTvDatabase::getChannelParaList("/data/tv_default.xml", vcp);//channel list from xml or db |
603 | CTvRegion::getChannelListByName("China,DVB-C allband", vcp); |
604 | |
605 | int size = vcp.size(); |
606 | LOGD("channel list size = %d", size); |
607 | if(!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t*>(calloc(size, sizeof(AM_FENDCTRL_DVBFrontendParameters_t))))) |
608 | return -1; |
609 | |
610 | //memset(pfp, 0, size * sizeof(AM_FENDCTRL_DVBFrontendParameters_t)); |
611 | |
612 | for (i = 0; i < size; i++) { |
613 | para.dtv_para.fe_paras[i].m_type = FE_QAM; |
614 | para.dtv_para.fe_paras[i].cable.para.frequency = vcp[i]->getFrequency(); |
615 | para.dtv_para.fe_paras[i].cable.para.inversion = INVERSION_OFF; |
616 | para.dtv_para.fe_paras[i].cable.para.u.qam.symbol_rate = vcp[i]->getSymbolRate(); |
617 | para.dtv_para.fe_paras[i].cable.para.u.qam.modulation = (fe_modulation_t)(vcp[i]->getModulation()); |
618 | } |
619 | //allband |
620 | para.dtv_para.fe_cnt = size; |
621 | |
622 | para.dtv_para.resort_all = AM_FALSE; |
623 | para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID; |
624 | para.store_cb = NULL; |
625 | |
626 | memset(&dmx_para, 0, sizeof(dmx_para)); |
627 | AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para); |
628 | |
629 | if ((para.dtv_para.mode&0x07) != AM_SCAN_DTVMODE_NONE) { |
630 | AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source); |
631 | tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id); |
632 | } |
633 | |
634 | // prog->dmx_id = para.dtv_para.dmx_dev_id; |
635 | // prog->fend_id = para.fend_dev_id; |
636 | // prog->mode = para.dtv_para.mode; |
637 | // Start Scan |
638 | if (AM_SCAN_Create(¶, &handle) != AM_SUCCESS) { |
639 | LOGD("SCAN CREATE fail"); |
640 | handle = 0; |
641 | } else { |
642 | mScanHandle = handle; |
643 | AM_SCAN_SetUserData(handle, (void*)this); |
644 | //注册搜索事件 |
645 | AM_EVT_Subscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
646 | //注册信号质量通知事件 |
647 | //AM_EVT_Subscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
648 | if (AM_SCAN_Start(handle) != AM_SUCCESS) { |
649 | AM_SCAN_Destroy(handle, AM_FALSE); |
650 | AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
651 | // AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
652 | handle = 0; |
653 | } |
654 | } |
655 | if (para.atv_para.fe_paras != NULL) |
656 | free(para.atv_para.fe_paras); |
657 | if (para.dtv_para.fe_paras != NULL) |
658 | free(para.dtv_para.fe_paras); |
659 | |
660 | if (handle == 0) { |
661 | return -1; |
662 | } |
663 | mbScanStart = true;//start call ok |
664 | } else { |
665 | LOGD("scanning and not stop"); |
666 | } |
667 | return 0; |
668 | }*/ |
669 | |
670 | |
671 | //only test for dtv allbland auto |
672 | int CTvScanner::autoDtmbScan() |
673 | { |
674 | stopScan(); |
675 | |
676 | if(!mbScanStart) { //not start or stop |
677 | AM_SCAN_CreatePara_t para; |
678 | AM_DMX_OpenPara_t dmx_para; |
679 | AM_SCAN_Handle_t handle = 0; |
680 | // Create the scan |
681 | memset(¶, 0, sizeof(para)); |
682 | |
683 | //strcpy(para.default_text_lang,"eng");//config |
684 | //strcpy(para.text_langs, "local eng zho chi chs first");//config |
685 | para.fend_dev_id = 0;//default |
686 | para.mode = AM_SCAN_MODE_DTV_ATV;//DTV |
687 | para.atv_para.mode = AM_SCAN_ATVMODE_NONE; |
688 | para.dtv_para.mode = AM_SCAN_DTVMODE_ALLBAND;//DTV_MODE_ALLBAND |
689 | //para.dtv_para.mode |= (*env)->GetIntField(env, para, doptions);//忽略 |
690 | para.dtv_para.source = FE_DTMB;//fe_type |
691 | para.dtv_para.dmx_dev_id = 0;//default 0 |
692 | Vector<sp<CTvChannel> > vcp; |
693 | //CTvDatabase::getChannelParaList("/data/tv_default.xml", vcp);//channel list from xml or db |
694 | CTvRegion::getChannelListByName("CHINA,Default DTMB ALL", vcp); |
695 | |
696 | int size = vcp.size(); |
697 | LOGD("channel list size = %d", size); |
698 | //showboz |
699 | if(size == 0) { |
700 | CTvDatabase::GetTvDb()->importXmlToDB("/etc/tv_default.xml"); |
701 | CTvRegion::getChannelListByName("CHINA,Default DTMB ALL", vcp); |
702 | size = vcp.size(); |
703 | } |
704 | |
705 | if(!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t *>(calloc(size, sizeof(AM_FENDCTRL_DVBFrontendParameters_t))))) |
706 | return -1; |
707 | |
708 | //memset(pfp, 0, size * sizeof(AM_FENDCTRL_DVBFrontendParameters_t)); |
709 | |
710 | for (int i = 0; i < size; i++) { |
711 | para.dtv_para.fe_paras[i].m_type = 5;//MODE_DTMB |
712 | para.dtv_para.fe_paras[i].dtmb.para.frequency = vcp[i]->getFrequency(); |
713 | para.dtv_para.fe_paras[i].dtmb.para.inversion = INVERSION_OFF; |
714 | para.dtv_para.fe_paras[i].dtmb.para.u.ofdm.bandwidth = (fe_bandwidth_t)(vcp[i]->getBandwidth()); |
715 | } |
716 | //allband |
717 | para.dtv_para.fe_cnt = size; |
718 | |
719 | para.dtv_para.resort_all = AM_FALSE; |
720 | para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID; |
721 | para.store_cb = NULL; |
722 | |
723 | memset(&dmx_para, 0, sizeof(dmx_para)); |
724 | AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para); |
725 | |
726 | if ((para.dtv_para.mode & 0x07) != AM_SCAN_DTVMODE_NONE) { |
727 | AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source); |
728 | tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id); |
729 | } |
730 | |
731 | // prog->dmx_id = para.dtv_para.dmx_dev_id; |
732 | // prog->fend_id = para.fend_dev_id; |
733 | // prog->mode = para.dtv_para.mode; |
734 | // Start Scan |
735 | if (AM_SCAN_Create(¶, &handle) != AM_SUCCESS) { |
736 | LOGD("SCAN CREATE fail"); |
737 | handle = NULL; |
738 | } else { |
739 | mScanHandle = handle; |
740 | AM_SCAN_SetUserData(handle, (void *)this); |
741 | //注册搜索事件 |
742 | AM_EVT_Subscribe((long)handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
743 | //注册信号质量通知事件 |
744 | AM_EVT_Subscribe((long)handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
745 | if (AM_SCAN_Start(handle) != AM_SUCCESS) { |
746 | AM_SCAN_Destroy(handle, AM_FALSE); |
747 | AM_EVT_Unsubscribe((long)handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
748 | AM_EVT_Unsubscribe((long)handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
749 | handle = NULL; |
750 | } |
751 | } |
752 | if (para.atv_para.fe_paras != NULL) |
753 | free(para.atv_para.fe_paras); |
754 | if (para.dtv_para.fe_paras != NULL) |
755 | free(para.dtv_para.fe_paras); |
756 | |
757 | if (handle == NULL) { |
758 | return -1; |
759 | } |
760 | mbScanStart = true;//start call ok |
761 | } else { |
762 | LOGD("scanning and not stop"); |
763 | } |
764 | return 0; |
765 | } |
766 | |
767 | /*int CTvScanner::autoAtscScan(int attennaType,int std) |
768 | { |
769 | stopScan(); |
770 | |
771 | if(!mbScanStart) { //not start or stop |
772 | AM_SCAN_CreatePara_t para; |
773 | AM_DMX_OpenPara_t dmx_para; |
774 | int handle = 0,i; |
775 | // Create the scan |
776 | memset(¶, 0, sizeof(para)); |
777 | |
778 | //strcpy(para.default_text_lang,"eng");//config |
779 | //strcpy(para.text_langs, "local eng zho chi chs first");//config |
780 | para.fend_dev_id = 0;//default |
781 | para.mode = AM_SCAN_MODE_ADTV;//DTV |
782 | para.atv_para.mode = AM_SCAN_ATVMODE_NONE; |
783 | |
784 | |
785 | para.atv_para.default_std= std; |
786 | |
787 | |
788 | para.dtv_para.mode = AM_SCAN_DTVMODE_ALLBAND;//DTV_MODE_ALLBAND |
789 | //para.dtv_para.mode |= (*env)->GetIntField(env, para, doptions);//忽略 |
790 | para.dtv_para.source = FE_ATSC;//fe_type |
791 | para.dtv_para.dmx_dev_id = 0;//default 0 |
792 | para.dtv_para.resort_all = AM_TRUE; |
793 | para.dtv_para.clear_source = AM_TRUE; |
794 | para.dtv_para.mix_tv_radio = AM_FALSE; |
795 | para.dtv_para.sort_method = AM_SCAN_SORT_BY_FREQ_SRV_ID; |
796 | para.store_cb = NULL; |
797 | //para.dtv_para.attenna = attennaType;//see dvb atsc-cnc |
798 | |
799 | para.dtv_para.standard = AM_SCAN_DTV_STD_ATSC; |
800 | |
801 | mSource = para.dtv_para.source; |
802 | |
803 | Vector<sp<CTvChannel> > vcp; |
804 | //CTvDatabase::getChannelParaList("/data/tv_default.xml", vcp);//channel list from xml or db |
805 | getAtscChannelPara(attennaType,vcp); |
806 | LOGD("ANDESEN test attenna type is %d",attennaType); |
807 | |
808 | int size = vcp.size(); |
809 | LOGD("channel list size = %d", size); |
810 | //showboz |
811 | if(size == 0) { |
812 | CTvDatabase::GetTvDb()->importXmlToDB("/etc/tv_default.xml"); |
813 | getAtscChannelPara(attennaType,vcp); |
814 | size = vcp.size(); |
815 | } |
816 | |
817 | if(!(para.dtv_para.fe_paras = static_cast<AM_FENDCTRL_DVBFrontendParameters_t*>(calloc(size, sizeof(AM_FENDCTRL_DVBFrontendParameters_t))))) |
818 | return -1; |
819 | |
820 | //memset(pfp, 0, size * sizeof(AM_FENDCTRL_DVBFrontendParameters_t)); |
821 | |
822 | for (i = 0; i < size; i++) { |
823 | para.dtv_para.fe_paras[i].m_type = 3;//MODE_ATSC |
824 | para.dtv_para.fe_paras[i].m_logicalChannelNum = vcp[i]->getLogicalChannelNum(); |
825 | para.dtv_para.fe_paras[i].atsc.para.frequency = vcp[i]->getFrequency(); |
826 | para.dtv_para.fe_paras[i].atsc.para.u.vsb.modulation = (fe_modulation_t)(vcp[i]->getModulation()); |
827 | } |
828 | //allband |
829 | para.dtv_para.fe_cnt = size; |
830 | |
831 | memset(&dmx_para, 0, sizeof(dmx_para)); |
832 | AM_DMX_Open(para.dtv_para.dmx_dev_id, &dmx_para); |
833 | |
834 | if ((para.dtv_para.mode&0x07) != AM_SCAN_DTVMODE_NONE) { |
835 | AM_FEND_SetMode(para.fend_dev_id, para.dtv_para.source); |
836 | tv_scan_reconnect_dmx_to_fend(para.dtv_para.dmx_dev_id, para.fend_dev_id); |
837 | } |
838 | |
839 | // prog->dmx_id = para.dtv_para.dmx_dev_id; |
840 | // prog->fend_id = para.fend_dev_id; |
841 | // prog->mode = para.dtv_para.mode; |
842 | // Start Scan |
843 | if (AM_SCAN_Create(¶, &handle) != AM_SUCCESS) { |
844 | LOGD("SCAN CREATE fail"); |
845 | handle = 0; |
846 | } else { |
847 | mScanHandle = handle; |
848 | AM_SCAN_SetUserData(handle, (void*)this); |
849 | //注册搜索事件 |
850 | AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
851 | AM_EVT_Subscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
852 | //注册信号质量通知事件 |
853 | AM_EVT_Subscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
854 | if (AM_SCAN_Start(handle) != AM_SUCCESS) { |
855 | AM_SCAN_Destroy(handle, AM_FALSE); |
856 | AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
857 | AM_EVT_Unsubscribe(handle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
858 | handle = 0; |
859 | } |
860 | } |
861 | if (para.atv_para.fe_paras != NULL) |
862 | free(para.atv_para.fe_paras); |
863 | if (para.dtv_para.fe_paras != NULL) |
864 | free(para.dtv_para.fe_paras); |
865 | |
866 | if (handle == 0) { |
867 | return -1; |
868 | } |
869 | mbScanStart = true;//start call ok |
870 | } else { |
871 | LOGD("scanning and not stop"); |
872 | } |
873 | return 0; |
874 | }*/ |
875 | |
876 | |
877 | int CTvScanner::stopScan() |
878 | { |
879 | LOGD("StopScan mScanHandle=%d", mScanHandle); |
880 | //requestExit(); |
881 | if(mbScanStart) { //if start ok and not stop |
882 | int ret = AM_SCAN_Destroy(mScanHandle, AM_TRUE); |
883 | AM_EVT_Unsubscribe((long)mScanHandle, AM_SCAN_EVT_PROGRESS, tv_scan_evt_callback, NULL); |
884 | AM_EVT_Unsubscribe((long)mScanHandle, AM_SCAN_EVT_SIGNAL, tv_scan_evt_callback, NULL); |
885 | AM_SEC_Cache_Reset(0); |
886 | //stop loop |
887 | LOGD("StopScan , ret=%d", ret); |
888 | mbScanStart = false;//stop ok |
889 | } else { |
890 | LOGD("not start scan or scan stoped"); |
891 | } |
892 | return 0; |
893 | } |
894 | |
895 | void CTvScanner::tv_scan_evt_callback(long dev_no, int event_type, void *param, void *data) |
896 | { |
897 | CTvScanner *pT = NULL; |
898 | long long tmpFreq = 0; |
899 | AM_SCAN_GetUserData((AM_SCAN_Handle_t)dev_no, (void **)&pT); |
900 | if(pT == NULL) { |
901 | return; |
902 | } |
903 | memset(pT->mCurEv.mProgramName, '\0', sizeof(pT->mCurEv.mProgramName)); |
904 | memset(pT->mCurEv.mMSG, '\0', sizeof(pT->mCurEv.mMSG)); |
905 | if (event_type == AM_SCAN_EVT_PROGRESS) { |
906 | AM_SCAN_Progress_t *evt = (AM_SCAN_Progress_t *)param; |
907 | switch (evt->evt) { |
908 | case AM_SCAN_PROGRESS_SCAN_BEGIN: |
909 | pT->mCurEv.mPercent = 0; |
910 | break; |
911 | case AM_SCAN_PROGRESS_NIT_BEGIN: |
912 | |
913 | break; |
914 | case AM_SCAN_PROGRESS_NIT_END: |
915 | |
916 | break; |
917 | case AM_SCAN_PROGRESS_TS_BEGIN: { |
918 | AM_SCAN_TSProgress_t *tp = (AM_SCAN_TSProgress_t *)evt->data; |
919 | if (tp == NULL) |
920 | break; |
921 | pT->mCurEv.mChannelNumber = tp->index; |
922 | pT->mCurEv.mMode = tp->fend_para.m_type; |
923 | pT->mCurEv.mFrequency = ((struct dvb_frontend_parameters *)(&tp->fend_para))->frequency; |
924 | pT->mCurEv.mSymbolRate = tp->fend_para.cable.para.u.qam.symbol_rate; |
925 | pT->mCurEv.mModulation = tp->fend_para.cable.para.u.qam.modulation; |
926 | pT->mCurEv.mBandwidth = tp->fend_para.terrestrial.para.u.ofdm.bandwidth; |
927 | pT->mCurEv.mOfdm_mode = tp->fend_para.terrestrial.para.u.ofdm.ofdm_mode; |
928 | pT->mCurEv.mAudio = tp->fend_para.analog.para.u.analog.audmode; |
929 | pT->mCurEv.mStandard = tp->fend_para.analog.para.u.analog.std; |
930 | pT->mCurEv.mSat_polarisation = tp->fend_para.sat.polarisation; |
931 | if (pT->mCurEv.mMode == FE_ANALOG) { |
932 | if(pT->mSource == FE_ATSC) { |
933 | pT->mCurEv.mPercent = (tp->index * 100) / tp->total; |
934 | } else { |
935 | pT->mCurEv.mPercent = 0; |
936 | } |
937 | } else { |
938 | pT->mCurEv.mPercent = (tp->index * 100) / tp->total; |
939 | } |
940 | |
941 | if (pT->mCurEv.mTotalChannelCount == 0) |
942 | pT->mCurEv.mTotalChannelCount = tp->total; |
943 | if (pT->mCurEv.mPercent >= 100) |
944 | pT->mCurEv.mPercent = 99; |
945 | |
946 | pT->mCurEv.mLockedStatus = 0; |
947 | pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; |
948 | |
949 | pT->mpObserver->onEvent(pT->mCurEv); |
950 | } |
951 | break; |
952 | case AM_SCAN_PROGRESS_TS_END: { |
953 | /*pT->mCurEv.mLockedStatus = 0; |
954 | pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; |
955 | pT->mpObserver->onEvent(pT->mCurEv);*/ |
956 | } |
957 | break; |
958 | |
959 | case AM_SCAN_PROGRESS_PAT_DONE: /*{ |
960 | if(pT->mCurEv.mTotalChannelCount == 1) { |
961 | pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; |
962 | pT->mpObserver->onEvent(pT->mCurEv); |
963 | } |
964 | }*/ |
965 | break; |
966 | case AM_SCAN_PROGRESS_SDT_DONE: /*{ |
967 | dvbpsi_sdt_t *sdts = (dvbpsi_sdt_t *)evt->data; |
968 | dvbpsi_sdt_t *sdt; |
969 | |
970 | if (pT->mCurEv.mTotalChannelCount == 1) { |
971 | pT->mCurEv.mPercent += 25; |
972 | if (pT->mCurEv.mPercent >= 100) |
973 | pT->mCurEv.mPercent = 99; |
974 | pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; |
975 | |
976 | pT->mpObserver->onEvent(pT->mCurEv); |
977 | } |
978 | }*/ |
979 | break; |
980 | case AM_SCAN_PROGRESS_CAT_DONE: /*{ |
981 | dvbpsi_cat_t *cat = (dvbpsi_cat_t *)evt->data; |
982 | if (pT->mCurEv.mTotalChannelCount == 1) { |
983 | pT->mCurEv.mPercent += 25; |
984 | if (pT->mCurEv.mPercent >= 100) |
985 | pT->mCurEv.mPercent = 99; |
986 | |
987 | pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; |
988 | |
989 | pT->mpObserver->onEvent(pT->mCurEv); |
990 | } |
991 | }*/ |
992 | break; |
993 | case AM_SCAN_PROGRESS_PMT_DONE: /*{ |
994 | dvbpsi_pmt_t *pmt = (dvbpsi_pmt_t *)evt->data; |
995 | if (pT->mCurEv.mTotalChannelCount == 1) { |
996 | pT->mCurEv.mPercent += 25; |
997 | if (pT->mCurEv.mPercent >= 100) |
998 | pT->mCurEv.mPercent = 99; |
999 | |
1000 | pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; |
1001 | pT->mpObserver->onEvent(pT->mCurEv); |
1002 | } |
1003 | }*/ |
1004 | break; |
1005 | case AM_SCAN_PROGRESS_MGT_DONE: { |
1006 | mgt_section_info_t *mgt = (mgt_section_info_t *)evt->data; |
1007 | |
1008 | if (pT->mCurEv.mTotalChannelCount == 1) { |
1009 | pT->mCurEv.mPercent += 10; |
1010 | if (pT->mCurEv.mPercent >= 100) |
1011 | pT->mCurEv.mPercent = 99; |
1012 | |
1013 | pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; |
1014 | |
1015 | pT->mpObserver->onEvent(pT->mCurEv); |
1016 | } |
1017 | } |
1018 | break; |
1019 | case AM_SCAN_PROGRESS_VCT_DONE: { |
1020 | /*ATSC TVCT*/ |
1021 | if (pT->mCurEv.mTotalChannelCount == 1) { |
1022 | pT->mCurEv.mPercent += 30; |
1023 | if (pT->mCurEv.mPercent >= 100) |
1024 | pT->mCurEv.mPercent = 99; |
1025 | pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; |
1026 | |
1027 | pT->mpObserver->onEvent(pT->mCurEv); |
1028 | } |
1029 | } |
1030 | break; |
1031 | case AM_SCAN_PROGRESS_NEW_PROGRAM: { |
1032 | /* Notify the new searched programs */ |
1033 | AM_SCAN_ProgramProgress_t *pp = (AM_SCAN_ProgramProgress_t *)evt->data; |
1034 | if (pp != NULL) { |
1035 | pT->mCurEv.mprogramType = pp->service_type; |
1036 | snprintf(pT->mCurEv.mProgramName, sizeof(pT->mCurEv.mProgramName), "%s", pp->name); |
1037 | |
1038 | pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; |
1039 | |
1040 | pT->mpObserver->onEvent(pT->mCurEv); |
1041 | } |
1042 | } |
1043 | break; |
1044 | case AM_SCAN_PROGRESS_BLIND_SCAN: { |
1045 | AM_SCAN_DTVBlindScanProgress_t *bs_prog = (AM_SCAN_DTVBlindScanProgress_t *)evt->data; |
1046 | |
1047 | if (bs_prog) { |
1048 | pT->mCurEv.mPercent = bs_prog->progress; |
1049 | |
1050 | snprintf(pT->mCurEv.mMSG, sizeof(pT->mCurEv.mMSG), "%s/%s %dMHz", |
1051 | bs_prog->polar == AM_FEND_POLARISATION_H ? "H" : "V", |
1052 | bs_prog->lo == AM_FEND_LOCALOSCILLATORFREQ_L ? "L-LOF" : "H-LOF", |
1053 | bs_prog->freq / 1000); |
1054 | |
1055 | pT->mCurEv.mType = ScannerEvent::EVENT_BLINDSCAN_PROGRESS; |
1056 | |
1057 | pT->mpObserver->onEvent(pT->mCurEv); |
1058 | |
1059 | if (bs_prog->new_tp_cnt > 0) { |
1060 | int i = 0; |
1061 | for (i = 0; i < bs_prog->new_tp_cnt; i++) { |
1062 | LOGD("====New tp: %dkS/s %d====", bs_prog->new_tps[i].frequency, |
1063 | bs_prog->new_tps[i].u.qpsk.symbol_rate); |
1064 | |
1065 | pT->mCurEv.mFrequency = bs_prog->new_tps[i].frequency; |
1066 | pT->mCurEv.mSymbolRate = bs_prog->new_tps[i].u.qpsk.symbol_rate; |
1067 | pT->mCurEv.mSat_polarisation = bs_prog->polar; |
1068 | |
1069 | pT->mCurEv.mType = ScannerEvent::EVENT_BLINDSCAN_NEWCHANNEL; |
1070 | |
1071 | pT->mpObserver->onEvent(pT->mCurEv); |
1072 | } |
1073 | } |
1074 | if (bs_prog->progress >= 100) { |
1075 | |
1076 | pT->mCurEv.mType = ScannerEvent::EVENT_BLINDSCAN_END; |
1077 | |
1078 | pT->mpObserver->onEvent(pT->mCurEv); |
1079 | |
1080 | pT->mCurEv.mPercent = 0; |
1081 | } |
1082 | } |
1083 | } |
1084 | break; |
1085 | case AM_SCAN_PROGRESS_STORE_BEGIN: { |
1086 | pT->mCurEv.mType = ScannerEvent::EVENT_STORE_BEGIN; |
1087 | pT->mCurEv.mLockedStatus = 0; |
1088 | if(pT->mpObserver != NULL) |
1089 | pT->mpObserver->onEvent(pT->mCurEv); |
1090 | } |
1091 | break; |
1092 | case AM_SCAN_PROGRESS_STORE_END: { |
1093 | pT->mCurEv.mLockedStatus = 0; |
1094 | pT->mCurEv.mType = ScannerEvent::EVENT_STORE_END; |
1095 | pT->mpObserver->onEvent(pT->mCurEv); |
1096 | } |
1097 | break; |
1098 | case AM_SCAN_PROGRESS_SCAN_END: { |
1099 | pT->mCurEv.mPercent = 100; |
1100 | pT->mCurEv.mLockedStatus = 0; |
1101 | pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_END; |
1102 | pT->mpObserver->onEvent(pT->mCurEv); |
1103 | } |
1104 | break; |
1105 | case AM_SCAN_PROGRESS_ATV_TUNING: { |
1106 | pT->mCurEv.mFrequency = (int)evt->data; |
1107 | pT->mCurEv.mLockedStatus = 0; |
1108 | tmpFreq = (pT->mCurEv.mFrequency - pT->mCurScanStartFreq) / 1000000; |
1109 | pT->mCurEv.mPercent = tmpFreq * 100UL / ((pT->mCurScanEndFreq - pT->mCurScanStartFreq) / 1000000); |
1110 | pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; |
1111 | pT->mpObserver->onEvent(pT->mCurEv); |
1112 | } |
1113 | break; |
1114 | |
1115 | default: |
1116 | break; |
1117 | } |
1118 | } else if (event_type == AM_SCAN_EVT_SIGNAL) { |
1119 | AM_SCAN_DTVSignalInfo_t *evt = (AM_SCAN_DTVSignalInfo_t *)param; |
1120 | pT->mCurEv.mprogramType = 0xff; |
1121 | pT->mCurEv.mFrequency = (int)evt->frequency; |
1122 | pT->mCurEv.mLockedStatus = (evt->locked ? 1 : 0); |
1123 | |
1124 | pT->mCurEv.mType = ScannerEvent::EVENT_SCAN_PROGRESS; |
1125 | if(pT->mCurEv.mMode != FE_ANALOG && evt->locked) { |
1126 | pT->mCurEv.mStrength = evt->strength; |
1127 | pT->mCurEv.mSnr = evt->snr; |
1128 | } else { |
1129 | pT->mCurEv.mStrength = 0; |
1130 | pT->mCurEv.mSnr = 0; |
1131 | } |
1132 | |
1133 | if (pT->mCurEv.mMode == FE_ANALOG) |
1134 | pT->mpObserver->onEvent(pT->mCurEv); |
1135 | } |
1136 | } |
1137 | |
1138 | void CTvScanner::tv_scan_reconnect_dmx_to_fend(int dmx_no, int fend_no) |
1139 | { |
1140 | AM_DMX_Source_t src; |
1141 | |
1142 | if (AM_FEND_GetTSSource(fend_no, &src) == AM_SUCCESS) { |
1143 | LOGD("Set demux%d source to %d", dmx_no, src); |
1144 | AM_DMX_SetSource(dmx_no, src); |
1145 | } else { |
1146 | LOGD("Cannot get frontend ts source!!"); |
1147 | } |
1148 | } |
1149 | |
1150 | int CTvScanner::getAtscChannelPara(int attennaType, Vector<sp<CTvChannel> > &vcp) |
1151 | { |
1152 | switch(attennaType) { //region name should be remove to config file and read here |
1153 | case 1: |
1154 | CTvRegion::getChannelListByName("U.S.,ATSC Air", vcp); |
1155 | break; |
1156 | case 2: |
1157 | CTvRegion::getChannelListByName("U.S.,ATSC Cable Standard", vcp); |
1158 | break; |
1159 | case 3: |
1160 | CTvRegion::getChannelListByName("U.S.,ATSC Cable IRC", vcp); |
1161 | break; |
1162 | case 4: |
1163 | CTvRegion::getChannelListByName("U.S.,ATSC Cable HRC", vcp); |
1164 | break; |
1165 | default: |
1166 | return -1; |
1167 | } |
1168 | |
1169 | return 0; |
1170 | } |
1171 | |
1172 |