source: svn/newcon3bcm2_21bu/dst/dmw/src/Channel/DMW_Ucm.c @ 76

Last change on this file since 76 was 76, checked in by megakiss, 10 years ago

1W 대기전력을 만족시키기 위하여 POWEROFF시 튜너를 Standby 상태로 함

  • Property svn:executable set to *
File size: 80.9 KB
Line 
1/*******************************************************************
2 * DMW_Ucm.c
3 *
4 * User Channel Map management routines.
5 *
6 * Copyright 2003 Digital STREAM Technology, Inc.
7 * All Rights Reserved
8 *
9 * $Id: DMW_Ucm.c,v 1.0 2004/05  cafrii Exp $
10 *
11 ********************************************************************/
12
13
14#include "DMW_Platform.h"
15
16
17
18#include "DHL_OSAL.h"
19#include "DHL_DBG.h"
20//#include "DHL_VIDEO.h"
21#define USE_FLATTEN_VIDEO 0
22
23
24#include "DMW_Config.h"
25#include "DMW_Channel.h"
26#include "DMW_ChannelAPI.h"
27#include "DMW_Mutex.h"
28#include "DMW_DebugUtil.h"
29#include "DMW_CodeConv.h"
30
31#include "dmw_ucm_priv.h"
32#include "dmw_channel_priv.h"
33
34//#include <string.h>
35
36DHL_MODULE("$ucm", 0);
37
38//------------------------------------------
39//  Configurations..
40
41BOOL g_bReserveUcmIndex0 = FALSE;
42        // runtime½Ã¿¡ Ucm index 0¸¦ reserve ÇÒ °ÍÀÎÁö ¾Æ´ÑÁö Á¶°Ç üũ.
43        // TRUEÀ̸é reserve¸¦ ÇÑ´Ù.
44
45
46
47
48
49//------------------------------------------
50
51#define equiv4(a1, a2, a3, a4, b1, b2, b3, b4) \
52        ((a1)==(b1) && (a2)==(b2) && (a3)==(b3) && (a4)==(b4))
53
54#define equiv_ucm(a, b) \
55        ((a)->Major==(b)->Major && (a)->Minor==(b)->Minor && (a)->RF==(b)->RF && (a)->VctFlag==(b)->VctFlag)
56        // a == b
57
58
59//------------------------------------------
60// Global variables..
61//
62//
63
64
65char *ShortNameString(UINT16 *src, char *dst) 
66{
67        // 'dst' buffer´Â ÃÖ¼Ò 15¹ÙÀÌÆ®ÀÌ»óÀ̾î¾ß ÇÔ.
68        //
69        return DMW_Unicode2Ks((UINT16*)src, 7, dst);
70        // cafrii 041103 replace
71
72#if 0
73        #if 1   
74                // cafrii 041103 add for MBCS
75                int k;
76                for (k=0; k<7; k++) {
77                        if ((src[k] >> 8) == 0)
78                                dst[k] = src[k] & 0xff;
79                        else
80                                dst[k] = '?';    // ascii°¡ ¾Æ´Ñ ±ÛÀڴ Ưº°ÇÑ Ç¥½Ã¸¦ Çϵµ·Ï ÇÔ..
81                }
82                dst[7] = 0;
83                return dst;
84       
85        #else   
86                int k;
87                for (k=0; k<7; k++)
88                        dst[k] = (char)src[k]; // unicode to ascii
89                dst[7] = 0;
90                return dst;
91        #endif
92       
93#endif
94}
95
96#if 0
97_____________________()
98#endif
99
100//----------------------------
101// UCM libraries..
102//
103UCM_DB_T *g_UCM = NULL;  // DB pointer
104INT32     g_UCM_number;  // number of DB element stored in RAM, not NvRam!!!
105INT32     g_UCM_max;     // max number of writable DB element.
106
107const int g_sizeUcmExtension;
108        // È®Àå ¿µ¿ª Å©±â.
109
110
111
112
113//   Mutex = { SemID, Owner, lockCnt, FailCnt, UseOsMutex, Name, flag,        traceLvl }
114//
115DMW_MUTEX
116  ucmMutex = { 0,     0,     0,       0,       FALSE,  "UcmMtx", OS_SEM_PRIO, FALSE, };
117
118void DMW_MSC_LockUcm()
119{
120        DMW_LockMutex(&ucmMutex);
121}
122
123STATUS DMW_MSC_LockUcmWait(UINT32 tick)
124{
125        STATUS status;
126
127        status = DMW_LockMutexWait(&ucmMutex, tick);
128
129        return status;
130}
131
132void DMW_MSC_UnlockUcm()
133{
134        DMW_UnlockMutex(&ucmMutex);
135}
136
137
138
139#if 0
140_____________________()
141#endif
142
143//---------------------------------------------------------------------
144// UCM management library.
145//
146//  ¾Æ·¡ Á¦°øÇÏ´Â UCMµéÀº ÀÌ¹Ì °ø°³µÈ ±¸Á¶¸¦ °®´Â g_UCM ÀڷᱸÁ¶¸¦ access Çϱâ À§ÇÑ
147//  ÆíÀÇ ÇÔ¼öµéÀÌ´Ù.
148//  ¸ðµÎ lock/unlockÀ¸·Î º¸È£µÇ°í ÀÖÁö ¾ÊÀ¸¹Ç·Î callerÃø¿¡¼­ À̸¦ °í·ÁÇÏ¿© È£ÃâÇØ¾ß ÇÑ´Ù.
149//
150//
151
152
153// UID Generation functions.
154// ÀÌ ÇÔ¼ö´Â MW ³»ºÎÀûÀ¸·Î¸¸ »ç¿ëµÈ´Ù.
155//
156// UID´Â 1ºÎÅÍ ½ÃÀÛÇØ¼­ 1¾¿ Áõ°¡µÇ¾î ºÎ¿©µÈ´Ù.
157// UINT16 ¹üÀ§ÀÇ ÃÖ´ë°ª (65535)¸¦ ³Ñ¾î°¡¸é 0ÀÌ µÇ´Âµ¥ 0ÀÇ °ªÀº »ç¿ëµÇÁö ¾Ê°í 1ºÎÅÍ ´Ù½Ã ½ÃÀÛÇÑ´Ù.
158// ä³Î DB °¹¼ö°¡ 65535°³°¡ ³ÑÁö ¾ÊÀ» °ÍÀ̹ǷΠuid fullÀÌ ³¯ °¡´É¼ºÀº ¾ø´Ù.
159
160// UID°¡ ¸¸µé¾îÁö´Â ½ÃÁ¡:
161//    1. Autoscan Á¾·á ½ÃÁ¡¿¡ MCMÀ¸·ÎºÎÅÍ UCMÀ¸·Î º¹»çµÉ¶§ UID »ý¼º ¹øÈ£°¡ ¸®¼ÂµÇ°í »õ·Ó°Ô UID°¡ ºÎ¿©µÈ´Ù.
162//    2. NvRam¿¡¼­ UCMÀ» ÀоîµéÀ϶§ UID »ý¼º ¹øÈ£°¡ ¸®¼ÂµÇ°í »õ·Ó°Ô UID°¡ ºÎ¿©µÈ´Ù.
163//    3. Application¿¡¼­ Àӽà UCM itemÀ» ¸¸µé¶§ ºÎ¿©µÈ´Ù.
164
165static UINT16 g_current_uid = 1;  // 0 is not used.
166UINT16 make_new_ucm_uid_counter()
167{
168        int i;
169        int original_uid = g_current_uid ? g_current_uid : 1;
170        // 0Àº »ç¿ëÇÏÁö ¾Ê±â·Î ÇßÀ¸´Ï±î..
171       
172        while (1)
173        {
174                for (i=0; i<g_UCM_number; i++) {
175                        if (g_UCM[i].Uid == g_current_uid)
176                                break;
177                }
178                if (i == g_UCM_number)
179                        return g_current_uid;  // ÀÏÄ¡ÇÏ´Â °ÍÀÌ ¾øÀ¸¹Ç·Î ¾ÈÀüÇÏ°Ô »ç¿ë °¡´ÉÇÔ.
180                       
181                g_current_uid++;
182                if (g_current_uid == 0) // 0°ªÀº »ç¿ëÇÏÁö ¾Ê±â·Î ÇÏÀÚ.
183                        g_current_uid++;
184                       
185                if (g_current_uid == original_uid)
186                        dprint(0, "!! uid counter is full???\n");
187        }
188}
189
190void reset_ucm_uid_counter()
191{
192        // UID »ý¼º ¹øÈ£¸¦ ¸®¼ÂÇÑ´Ù. 0 °ªÀº »ç¿ëµÇÁö ¾Ê°í 1ºÎÅÍ »ç¿ëÇÑ´Ù.
193        g_current_uid = 1;
194}
195
196
197STATUS prepare_ucm_space(int margin)
198{
199        // »õ ucmÀ» Ãß°¡Çϱâ À§ÇØ ÇÊ¿äÇÑ °ø°£ÀÌ ÀÖ´ÂÁö °Ë»ç.
200        // "°ø°£ÀÌ ¾ø´Â °æ¿ì¿¡¸¸" È®ÀåÇÑ´Ù.
201        // marginÀº È®ÀåÀ» ÇÏ°Ô µÉ °æ¿ì È®Àå ÇÒ Å©±âÀÌ´Ù.
202       
203        if (g_UCM_number >= g_UCM_max) // °ø°£ÀÌ ºÎÁ·Çϸé,
204        {
205                g_UCM_number = g_UCM_max; // for safety..
206                        // g_UCM_number°¡ g_UCM_maxº¸´Ù Ŭ ¼ö ¾øÀ½.
207
208                if (margin < 8)
209                        margin = 8;
210                                       
211                if (g_UCM) {
212                       
213                #if 0
214                        // ¸Þ¸ð¸® ÀçÇÒ´ç..
215                       
216                        if (OS_Realloc(&g_UCM, g_UCM_max * UcmItemMemorySize(),
217                                        (g_UCM_max + margin) * UcmItemMemorySize())) {
218                                g_UCM_max += margin;
219                        }
220                        else {
221                                // OS_Realloc()ÀÌ ½ÇÆÐÇØµµ g_UCM¿¡´Â º¯È­°¡ ¾ø´Ù.
222                                return statusOutOfMemory;
223                        }
224                #else // cafrii 031112 TL_OS bug..
225               
226                        UCM_DB_T *tmpUcm = DHL_OS_Malloc(UcmItemMemorySize() * (g_UCM_max + margin));
227                        if (tmpUcm == NULL)
228                                return statusOutOfMemory;
229                               
230                        memcpy(tmpUcm, g_UCM, UcmItemMemorySize() * g_UCM_number);
231                       
232                        DHL_OS_Free((void**)&g_UCM);
233                        g_UCM = tmpUcm;
234                        g_UCM_max += margin;
235               
236                #endif
237               
238                }
239                else {
240                        g_UCM_number = 0; // ¸Þ¸ð¸® ½Å±Ô ÇÒ´ç.
241                        g_UCM_max = margin;
242                        g_UCM = DHL_OS_Malloc(UcmItemMemorySize() * g_UCM_max);
243                       
244                        if (g_UCM == NULL) {
245                                g_UCM_max = 0;
246                                return statusOutOfMemory;
247                        }
248                }
249        }
250        return statusOK;
251}
252
253UCM_DB_T *insert_ucm_ptr(int major, int minor, int rf, int vctFlag)
254{
255        int idx = insert_ucm(major, minor, rf, vctFlag);
256        if (g_UCM && idx >= 0)
257                return &g_UCM[idx];
258        else
259                return NULL;
260}
261
262int insert_ucm(int major, int minor, int rf, int vctFlag)
263{
264        // ÁÖ¾îÁø parameterÀÇ ucmÀÌ µé¾î°¥ ÀÚ¸®¸¦ ã´Â´Ù. (¿À¸§Â÷¼ø Á¤·Ä Á¶°ÇÇÏ¿¡¼­..)
265        // »õ ucmÀ» À§ÇÑ °ø°£À» ¸¶·ÃÇϰí,
266        // »õ ucmÀÇ index¸¦ ¸®ÅÏÇÑ´Ù.
267        // ucm È®ÀåÀ» À§ÇÑ ¸Þ¸ð¸®°¡ ºÎÁ·ÇÒ °æ¿ì -1 ¸®ÅÏ.
268        //
269        // ÁÖÀÇ!!!!
270        //  ¸¸¾à ±âÁ¸ÀÇ UCM¿¡ ÀÌ¿Í ¶È°°Àº Á¤º¸¸¦ °¡Áø°Ô ÀÖÀ¸¸é ±âÁ¸ÀÇ °ÍÀ» Áö¿ö¹ö¸± °ÍÀ̴ϱî
271        //  ²À find_ucm_mj_mn_rf_vf()À» ÀÌ¿ëÇØ¼­ È®½ÇÈ÷ ¾ø´Ù°í ÆÇ´Ü ÇÑ ÈÄ ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇϱ⠹ٶ÷.
272       
273        UCM_DB_T *t;
274        int i, k;
275        BOOL equiv_found = FALSE;
276       
277        vctFlag = vctFlag ? 1 : 0;
278
279        if (g_UCM) {
280               
281                //oldidx = find_ucm(major, minor, rf, vctFlag);  // µÎ¹ø ·çÇÁµµ´Â °ÍÀº ºñÈ¿À²ÀûÀ̶ó »èÁ¦ÇÔ..
282                //if (oldidx < 0) ...
283               
284                for (i=0; g_UCM && i<g_UCM_number; i++) {
285                        t = &g_UCM[i];
286                        if (! ordered_ucm(t->Major, t->Minor, t->RF, t->VctFlag, major, minor, rf, vctFlag)) {
287                                if (equiv4(t->Major, t->Minor, t->RF, t->VctFlag, major, minor, rf, vctFlag)) {
288                                        equiv_found = TRUE;
289                                        dprint(0, "!! warning! insert_ucm(): equiv ucm found (%d-%d %d %c, %d). overwritten.\n",
290                                                major, minor, rf, vctFlag ? 'v' : '_', t->Uid);
291                                }
292                                       
293                                break;
294                        }
295                }
296        }
297        else
298                i = 0;  // g_UCMÀÌ ¾øÀ¸¸é ¸Ç óÀ½¿¡ µé¾î°¨.
299       
300        if (equiv_found) {
301                memset(t, 0, UcmItemMemorySize()); // cafrii 030326
302               
303                t->Major = major;  // cafrii 040812 bugfix
304                t->Minor = minor;
305                t->RF = rf;
306                t->VctFlag = vctFlag;
307                t->Skipped = 1;
308                // ÁÖÀÇ!!   cafrii 040812 add comment
309                //  Mj/Mn, RF, Vf ¸¦ Á¦¿ÜÇÑ ¸ðµç ´Ù¸¥ flagµéÀº ¸®¼Â½ÃÄѹö¸°´Ù.
310        }
311        else {
312                // (t == 'i'¹øÁö)°¡ »õ ucmÀÌ µé¾î°¥ ÀÚ¸®´Ù.
313                //  ucm ¹öÆÛ È®ÀåÇÑ´Ù.
314               
315                if (prepare_ucm_space(8) != statusOK)
316                        return -1;
317       
318                // i¹øÂ° ucm ÀÌÇÏ ¸ðµç itemÀ» ÇÑÄ­¾¿ µÚ·Î shift.. (i¹øÂ° ucm Æ÷ÇÔ)
319                for (k=g_UCM_number-1; k>=i; k--)
320                        //g_UCM[k+1] = g_UCM[k];    // BUGBUG!!
321                        memcpy(&g_UCM[k+1], &g_UCM[k], UcmItemMemorySize()); // cafrii, 030326
322               
323                t = &g_UCM[i];
324                // ÀÌÁ¦ t ('i'¹øÂ° ucm) ´Â ºñ¾îÀÖ´Ù.
325                memset(t, 0, UcmItemMemorySize());
326                t->Major = major;
327                t->Minor = minor;
328                t->RF = rf;
329                t->VctFlag = vctFlag;
330                t->Skipped = 1;  // cafrii 030325, initially disable.
331               
332                g_UCM_number++;
333        }
334       
335        return i;  // return index of newly allocated ucm.
336}
337
338int find_ucm_mj_mn_rf_vf(int major, int minor, int rf, int vctFlag)
339{
340        // Á¶°Ç¿¡ ¸Â´Â ucm itemÀ» ã´Â´Ù. index¸¦ ¸®ÅÏÇÑ´Ù. ÀÏÄ¡ÇÏ´Â°Ô ¾øÀ¸¸é -1.
341        int i;
342        if (!g_UCM)
343                return -1;
344       
345        vctFlag = vctFlag ? 1 : 0;
346        for (i=0; i<g_UCM_number; i++)
347        {
348                if (g_bReserveUcmIndex0)
349                        if(i==0) continue;
350
351                if (g_UCM[i].Major == major && g_UCM[i].Minor == minor && 
352                        g_UCM[i].RF == rf && g_UCM[i].VctFlag == vctFlag)
353                        return i;
354        }
355        return -1;
356}
357
358// hschang, 2003-10-08
359int find_ucm_analog_RF(int rf)
360{
361        // analog À̸鼭 (Service_type == 0)
362        // RF == rfÀΠä³ÎÀ» ã´Â´Ù.
363       
364        int i;
365        for (i=0; i<g_UCM_number; i++)
366        {
367                if (g_bReserveUcmIndex0)
368                        if(i==0) continue;
369
370                if (g_UCM[i].RF == rf && g_UCM[i].Minor==0)
371                        return i;
372        }
373        return -1;     
374}
375
376STATUS select_max_ucm(int major, int minor, int vctFlag)
377{
378        // UCM¿¡¼­ °°Àº ¹øÈ£¸¦ °®´Â ä³Îµé Áß¿¡¼­ "´ëǥä³Î"À» ¼±ÅÃÇÏ°í ±× Ã¤³Î¸¸À» enable½ÃŲ´Ù.
379        // ¿©±â¼­ °°Àº ¹øÈ£¶õ, ÇöÀç ¹æÄ§¿¡ µû¸£¸é major/minor/vf ÀÌ´Ù.
380
381        // ÇöÀç sortingµÇ¾î ÀÖ´Â »óÅÂÀ̹ǷΠÀÛÀº ¹øÈ£ÀÇ Ã¤³ÎºÎÅÍ ½ÃÀÛÇØ¼­
382        // µ¿ÀÏÇÑ Mj/Mn/Rf °ªÀ» °®´Â ä³Îµé Áß¿¡¼­ ½ÅÈ£ ¼¼±â°¡ °¡Àå Å« °ÍÀ» ¼±ÅÃÇϰí,
383        //     ³ª¸ÓÁö´Â skip flag¸¦ ¼¼ÆÃÇÑ´Ù.
384
385        int maxnd, n;
386
387        if (g_UCM == NULL || g_UCM_number <= 0)
388                return statusOK;
389
390        vctFlag = vctFlag ? 1 : 0;
391        maxnd = -1;  // maxnd´Â ÇöÀç±îÁö ÃÖ´ë strength¸¦ °®´Â ucmÀÇ À妽º.
392
393        // mj/mn/rf/vctf ¸¸À¸·Î ÆÇ´ÜÇÑ´Ù.
394        //  À§ µ¥ÀÌÅͰ¡ ¸ðµÎ µ¿ÀÏÇϸ鼭 ntsc/8vsb/64qam/256qamÀÌ ¼­·Î ´Ù¸¥ °ÍµéÀº
395        //    Àû´çÇÑ °ÍÀ¸·Î ÀÌ¹Ì ¼±ÅõǾî ÅëÀÏ µÇ¾î ÀÖ´Ù°í °¡Á¤.
396        // 
397
398        for (n=0; n<g_UCM_number; n++)
399        {
400                if (g_UCM[n].Major == major && g_UCM[n].Minor == minor && g_UCM[n].VctFlag == vctFlag)
401                        continue;
402               
403                g_UCM[n].Skipped = TRUE;  // ±âº»À¸·Î ¸ðµÎ skipÀ¸·Î ¼³Á¤Çϰí, ³ªÁß¿¡ ƯÁ¤ÇÑ MCM¸¸ activateÇÑ´Ù.
404
405                if (g_UCM[n].hidden) continue;  // hiddenÀº Ç×»ó Skip.
406
407                if (maxnd == -1)  // ¾ÆÁ÷±îÁö ´ëǥä³ÎÀÌ ¾ø´Â °æ¿ì..
408                        maxnd = n;   // ÀÌ Ã¤³ÎÀ» ´ëÇ¥ ä³Î·Î ÁöÁ¤.
409               
410                // ºñ±³ ´Ü°è °è¼Ó ÁøÇàÁß...
411                // Áö±Ý±îÁöÀÇ ¿ì½ÂÈĺ¸(ÃÖ´ë strengthÀÇ ³ëµå)ÀÎ 'maxnd'¿Í 'n'°ú °æÀï..
412
413                if (g_UCM[maxnd].signal_strength < g_UCM[n].signal_strength)
414                        maxnd = n;      // »õ·Î¿î ¿ì½ÂÀÚ 'n' ź»ý.. maxnd·Î ½Â°Ý.
415        }
416
417        if (maxnd < 0)
418                dprint(0, "!! select_max_ucm(): no ucm (%d-%d %c) exist.\n", major, minor, vctFlag ? 'v' : '_');
419        else {
420                dprint(2, "select_max_ucm(%d-%d %c) uid %d is selected.\n", major, minor, 
421                                vctFlag ? 'v' : '_', g_UCM[maxnd].Uid);
422                g_UCM[maxnd].Skipped = FALSE; // <-- "¼±ÅÃ!!!"
423        }
424
425        return statusOK;
426}
427
428
429BOOL DMW_MSC_IsUcmValid()
430{
431        // Á¤·ÄÀÌ µÇ¾î ÀÖ´ÂÁö üũÇÑ´Ù.
432        // Major/Minor/Rf/VctFlag°¡ Áߺ¹µÈ °ÍÀÌ ÀÖ´ÂÁö üũÇÑ´Ù.
433        // Uid°¡ Áߺ¹µÈ °ÍÀÌ ÀÖ´ÂÁö üũÇÑ´Ù.
434        int i, k;
435        UCM_DB_T *a, *b;
436        BOOL has_err = FALSE;
437       
438        DMW_MSC_LockUcm();
439       
440        dprint(2, "*** Check UCM Validity ***\n");
441        // Á¤·Ä üũ.
442        for (i=1; i<g_UCM_number; i++) {
443                a = &g_UCM[i-1];
444                b = &g_UCM[i];
445                if (equiv_ucm(a, b)) {
446                        dprint(0, "!!  %d:[%03d] and %d:[%03d] equivalent.\n", 
447                                        i-1, g_UCM[i-1].Uid, i, g_UCM[i].Uid);
448                        has_err = TRUE;
449                }
450                else {
451                        if (! ordered_ucm(a->Major, a->Minor, a->RF, a->VctFlag, 
452                                b->Major, b->Minor, b->RF, b->VctFlag)) {
453                                dprint(0, "!!  %d:[%03d] > %d:[%03d], not sorted!\n", 
454                                        i-1, g_UCM[i-1].Uid, i, g_UCM[i].Uid);
455                                has_err = TRUE;
456                        }
457                }
458        }
459
460        // Uid üũ.   
461        for (i=0; i<g_UCM_number-1; i++) {
462                for (k=i+1; k<g_UCM_number; k++) {
463                        if (g_UCM[i].Uid == g_UCM[k].Uid) {
464                                dprint(0, "!!  Uid collision, %d:[%03d] == %d:[%03d]\n", 
465                                        i, g_UCM[i].Uid, k, g_UCM[k].Uid);
466                                has_err = TRUE;
467                        }
468                }
469        }
470       
471        DMW_MSC_UnlockUcm();
472       
473        return (has_err ? FALSE : TRUE);
474}
475
476
477STATUS DMW_MSC_EnableChannel(int uid, BOOL bEnable)
478{
479        int i;
480        STATUS status = statusOK;
481        DMW_MSC_LockUcm();
482       
483        i = DMW_MSC_Uid2Index(uid);
484        if (i>=0) {
485                g_UCM[i].Skipped = bEnable ? 0 : 1;  // caution! inverted.
486                DMW_CDB_ReleaseSurfChannel(i);
487                //g_UCM[i].SurfIndex = 0;
488        }
489        else
490                status = statusChannelNotFound;
491       
492        DMW_MSC_UnlockUcm();
493        return status;
494}
495
496
497
498void DMW_MSC_DisableAllPsiChannel()
499{
500        int i;
501        DMW_MSC_LockUcm();
502        for (i=0; i<g_UCM_number; i++) {
503                if (g_UCM[i].VctFlag == 0) {
504                        g_UCM[i].Skipped = 1;  // skip means disable.
505                        DMW_CDB_ReleaseSurfChannel(i);
506                        //g_UCM[i].SurfIndex = 0;
507                }
508        }
509        DMW_MSC_UnlockUcm();
510}
511
512
513void DMW_MSC_SortUcm()
514{
515        // UCMÀ» Major/Minor/RF/Vf ¼øÀ¸·Î Á¤¸®ÇÑ´Ù. (¿À¸§Â÷¼ø. Vf¸¸ ³»¸²Â÷¼ø.)
516        //
517#define require_ucm_swap(a, b)  \
518        (((a)->Major>(b)->Major) || \
519         ((a)->Major==(b)->Major && (a)->Minor>(b)->Minor) || \
520         ((a)->Major==(b)->Major && (a)->Minor==(b)->Minor && (a)->RF>(b)->RF) || \
521         ((a)->Major==(b)->Major && (a)->Minor==(b)->Minor && (a)->RF==(b)->RF &&   \
522          (a)->VctFlag<(b)->VctFlag) )
523        // UCM Á¤·Ä¿¡¼­ a¿Í b µÎ UCM item À§Ä¡¸¦ ¹Ù²ã¾ß µÇ´ÂÁö üũÇÏ´Â ¸ÅÅ©·Î.
524        // ±âº»ÀûÀ¸·Î Major/Minor/RF/VctFlag ¼ø¼­·Î ¼øÀ§¸¦ µÎ°í, Major/Minor/Rf´Â ¿À¸§Â÷¼ø,
525        // VctFlag´Â ³»¸²Â÷¼øÀ¸·Î Á¤·ÄÇØ¾ß ÇÑ´Ù.
526
527       
528        UCM_DB_T tmp;
529        int i, k;
530       
531        if (g_UCM_number <= 0)
532                return;
533
534        DMW_MSC_LockUcm();
535
536        for (i=0; i<g_UCM_number-1; i++)
537                if (g_UCM[i].VctFlag) 
538                        g_UCM[i].VctFlag = 1;  // TRUEÀÇ Á¤Àǰ¡ non-zero·Î Á» ¾Ö¸ÅÇϹǷΠÁ¤·ÄÇÒ¶§´Â 1·Î °íÁ¤½ÃŰ´Â°Ô ÆíÇÔ.
539               
540        for (i=0; i<g_UCM_number-1; i++)
541        {
542                for (k=i+1; k<g_UCM_number; k++)
543                {
544                        // i¿Í k¸¦ ºñ±³Çؼ­ i°¡ ´õ Å©¸é ±³È¯.
545                        if (require_ucm_swap(&g_UCM[i], &g_UCM[k])) {
546                                // swap
547                                tmp = g_UCM[i];
548                                g_UCM[i] = g_UCM[k];
549                                g_UCM[k] = tmp;
550                        }
551                }
552        }
553       
554        DMW_MSC_UnlockUcm();
555       
556#undef require_ucm_swap
557}
558
559//-----------------------------------------------------------------
560//
561//  miscellaneous functions.
562//  Index¸¦ ¸®ÅÏÇÏ´Â °¢Á¾ ÇÔ¼öµéÀº UCMÀ» lockÇÏÁö ¾ÊÀ½¿¡ À¯ÀÇÇÑ´Ù. caller¿¡¼­ º¸È£¸¦ ÇØ¾ß ÇÑ´Ù.
563
564STATUS DMW_MSC_FindUcmByRF(int rf, int *returnIndex)
565{
566        int i; 
567        for (i=0; i<g_UCM_number; i++) 
568        {
569                if (g_bReserveUcmIndex0)
570                        if(i==0) continue;
571
572                if (rf == g_UCM[i].RF)
573                        break;
574        }
575       
576        if (i < g_UCM_number) {
577                if (returnIndex)
578                        *returnIndex = i;
579                return statusOK;
580        }
581        return statusChannelNotFound;
582}
583
584
585
586
587//----------------
588//  2/24 Ãß°¡..
589
590char *CsfString(int flag, char *buf)
591{
592        static char _buf[40];
593        if (buf == NULL) buf = _buf;
594       
595        sprintf(buf, "%s%s%s%s%s", 
596                (flag & CSF_Include_Disabled) ? "Dis " : "",
597                (flag & CSF_Include_Skipped) ? "" : "Active ",
598                ((flag & CSF_Mask_MF) == CSF_ATSC_Only) ? "AtscOnly " : "",
599                ((flag & CSF_Mask_MF) == CSF_NTSC_Only) ? "NtscOnly " : "",
600                (flag & CSF_Include_PSI) ? "" : "Vct ");
601        return buf;     
602}
603
604int find_next_key_major(int curMajor, BOOLEAN bIncrease, int flag, int *pNewMajor)
605{
606        // 'curMajor'¸¦ ±âÁØÀ¸·Î Â÷ »óÀ§, Â÷ ÇÏÀ§ ä³ÎÀ» ã´Â´Ù.
607        //  °°Àº key major°ªÀ» °®´Â ä³ÎÀÌ ¿©·¯°³ Á¸ÀçÇϸé DB»ó¿¡¼­ ¸Ç óÀ½ ä³Î ÀÎÅØ½º¸¦ ¸®ÅÏÇÑ´Ù.
608       
609        // ³¡±îÁö µµ´ÞÇϸé wrap-aroundµÇ¾î óÀ½ºÎÅÍ °Ë»ö..
610        // ¼±ÅÃÇÒ Ã¤³ÎÀÌ ¾øÀ¸¸é ¿¡·¯ ¸®ÅÏ. (-1)À» ¸®ÅÏ.
611
612        int i, k, newMajor, minimumIndex;
613        char tmp[40];
614       
615        if (bIncrease) 
616        {
617                for (i=0; i<g_UCM_number; i++)  // curMajorº¸´Ù Å« ¸ÞÀÌÀú ä³ÎÀ» ã´Â´Ù.
618                {
619                        if (g_bReserveUcmIndex0)
620                                if(i==0) continue;
621
622                        if ((flag & CSF_Include_Disabled) == 0 && g_UCM[i].disabled) continue; // cafrii 101209
623                        if ((flag & CSF_Include_Skipped) == 0 && g_UCM[i].Skipped) continue;
624                        if ((flag & CSF_Mask_MF) == CSF_ATSC_Only && g_UCM[i].Service_type == 0) continue;
625                        if ((flag & CSF_Mask_MF) == CSF_NTSC_Only && g_UCM[i].Service_type != 0) continue;
626                        if ((flag & CSF_Include_PSI) == 0 && g_UCM[i].VctFlag == 0)     continue; 
627
628                        if ((flag & CSF_Include_Hidden) == 0 && g_UCM[i].hidden) continue; // cafrii 051031 add
629                       
630                        if (curMajor < g_UCM[i].Major) {
631                                dprint(3, " find first ucm: %c(%02d) %d-%d %c %d\n", 
632                                                g_UCM[i].Skipped ? ' ' : '+', i, g_UCM[i].Major, g_UCM[i].Minor, 
633                                                g_UCM[i].VctFlag ? 'v' : 'p', g_UCM[i].Service_type);
634                                break;
635                        }
636                }
637       
638                if (i == g_UCM_number) {
639                        // ucm db ³¡¿¡ µµ´ÞÇØ¹ö·È´Ù!!! ÇöÀç ä³Î ÀÌÈÄÀÇ Àû´çÇÑ up ä³ÎÀÌ ¾ø´Ù´Â ÀǹÌÀÓ.
640                        // ±×·¯¸é UCMÀÇ ¾Õ¿¡¼­ºÎÅÍ Ã¹¹øÂ° enable ä³ÎÀ» µ¹·ÁÁØ´Ù! (wrap-around)
641       
642                        //dprint(2, " ucm not found!. wrap around and retry..\n");
643                        for (i=0; i<g_UCM_number; i++) 
644                        {
645                                if (g_bReserveUcmIndex0)
646                                        if(i==0) continue;
647
648                                if ((flag & CSF_Include_Disabled) == 0 && g_UCM[i].disabled) continue; // cafrii 101209
649                                if ((flag & CSF_Include_Skipped) == 0 && g_UCM[i].Skipped) continue;
650                                if ((flag & CSF_Mask_MF) == CSF_ATSC_Only && g_UCM[i].Service_type == 0) continue;
651                                if ((flag & CSF_Mask_MF) == CSF_NTSC_Only && g_UCM[i].Service_type != 0) continue;
652                                if ((flag & CSF_Include_PSI) == 0 && g_UCM[i].VctFlag == 0)     continue; 
653
654                                if ((flag & CSF_Include_Hidden) == 0 && g_UCM[i].hidden) continue; // cafrii 051031 add
655
656                                break;  // À§ÀÇ Á¶°ÇÀ» ´Ù °Ç³Ê¶Ù¾úÀ¸¸é OK!
657                        }
658                        if (i == g_UCM_number) {
659                                // !!! ÀÌ UCM¿¡´Â enable ä³ÎÀÌ Çϳªµµ ¾ø´Ù!!
660                                // ±×³É ¾Æ¹«°Íµµ ¾ÈÇÑ´Ù.
661                                dprint(0, "!! FindNextMajor: not found %s ucm!!\n", CsfString(flag, tmp));
662                                return -1;
663                        }
664                        else {
665                                dprint(3, " ucm wrapped around: (%02d) %d-%d\n", i, g_UCM[i].Major, g_UCM[i].Minor);
666                        }
667                }
668                newMajor = g_UCM[i].Major;
669        }
670        else // decrese..
671        {
672                for (i=g_UCM_number-1; i>=0; i--) 
673                {
674                        if (g_bReserveUcmIndex0)
675                                if(i==0) continue;
676
677                        if ((flag & CSF_Include_Disabled) == 0 && g_UCM[i].disabled) continue; // cafrii 101209
678                        if ((flag & CSF_Include_Skipped) == 0 && g_UCM[i].Skipped) continue;
679                        if ((flag & CSF_Mask_MF) == CSF_ATSC_Only && g_UCM[i].Service_type == 0) continue;
680                        if ((flag & CSF_Mask_MF) == CSF_NTSC_Only && g_UCM[i].Service_type != 0) continue;
681                        if ((flag & CSF_Include_PSI) == 0 && g_UCM[i].VctFlag == 0)     continue; 
682
683                        if ((flag & CSF_Include_Hidden) == 0 && g_UCM[i].hidden) continue; // cafrii 051031 add
684
685                        // curMajor º¸´Ù À۰ųª °°Àº ä³ÎÁß¿¡¼­ óÀ½ ¹ß°ßµÇ´Â ä³ÎÀ» ã´Â´Ù.
686                        if (curMajor > g_UCM[i].Major) {
687                                dprint(3, " find first ucm: %c(%02d) %d-%d %c %d\n", 
688                                                g_UCM[i].Skipped ? ' ' : '+', i, g_UCM[i].Major, g_UCM[i].Minor, 
689                                                g_UCM[i].VctFlag ? 'v' : 'p', g_UCM[i].Service_type);
690                                break;
691                        }
692                }
693       
694                if (i < 0) {
695                        // ucm db ¸Ç ¾Õ¿¡ µµ´ÞÇØ¹ö·È´Ù!!! Àû´çÇÑ up ä³ÎÀÌ ¾ø´Ù´Â ÀǹÌÀÓ.
696                        // ±×·¯¸é UCMÀÇ ¸Ç µÚ¿¡¼­ºÎÅÍ ´Ù½Ã ã´Â´Ù. (wrap-around)
697                        dprint(3, " ucm not found!. wrap around and retry..\n");
698       
699                        for (i=g_UCM_number-1; i>=0; i--) 
700                        {
701                                if (g_bReserveUcmIndex0)
702                                        if(i==0) continue;
703
704                                if ((flag & CSF_Include_Disabled) == 0 && g_UCM[i].disabled) continue; // cafrii 101209
705                                if ((flag & CSF_Include_Skipped) == 0 && g_UCM[i].Skipped) continue;
706                                if ((flag & CSF_Mask_MF) == CSF_ATSC_Only && g_UCM[i].Service_type == 0) continue;
707                                if ((flag & CSF_Mask_MF) == CSF_NTSC_Only && g_UCM[i].Service_type != 0) continue;
708                                if ((flag & CSF_Include_PSI) == 0 && g_UCM[i].VctFlag == 0)     continue; 
709
710                                if ((flag & CSF_Include_Hidden) == 0 && g_UCM[i].hidden) continue; // cafrii 051031 add
711
712                                break;  // À§ÀÇ Á¶°ÇÀ» ´Ù °Ç³Ê¶Ù¾úÀ¸¸é OK!
713                        }
714                        if (i < 0) {
715                                // !!! ÀÌ UCM¿¡´Â enable ä³ÎÀÌ Çϳªµµ ¾ø´Ù!!
716                                // ±×³É ¾Æ¹«°Íµµ ¾ÈÇÑ´Ù.
717                                dprint(0, "!! FindNextMajor: no proper %s ucm!!\n", CsfString(flag, tmp));
718                                return -1;
719                        }
720                        else {
721                                dprint(3, " ucm wrapped around: (%02d) %d-%d\n", i, g_UCM[i].Major, g_UCM[i].Minor);
722                        }
723                }
724                // decresing ÀÎ °æ¿ìÀÇ Ãß°¡»çÇ×:
725                // ÀÌÁ¦ ÇØ´ç major-XXX ÁýÇÕ Áß¿¡¼­ Á¦ÀÏ ¾Õ¿¡ À§Ä¡ÇÑ Ã¤³ÎÀ» ¼±ÅÃÇÑ´Ù.
726               
727                newMajor = g_UCM[i].Major;
728                minimumIndex = i;
729                for (k=i; k>=0; k--) 
730                {
731                        // cafrii 050906 bugfix!  change 'i' -> 'k' in this for loop
732                        if (g_bReserveUcmIndex0)
733                                if(k==0) continue;
734
735                        if ((flag & CSF_Include_Disabled) == 0 && g_UCM[i].disabled) continue; // cafrii 101209
736                        if ((flag & CSF_Include_Skipped) == 0 && g_UCM[k].Skipped) continue;
737                        if ((flag & CSF_Mask_MF) == CSF_ATSC_Only && g_UCM[k].Service_type == 0) continue;
738                        if ((flag & CSF_Mask_MF) == CSF_NTSC_Only && g_UCM[k].Service_type != 0) continue;
739                        if ((flag & CSF_Include_PSI) == 0 && g_UCM[k].VctFlag == 0)     continue; 
740                       
741                        if ((flag & CSF_Include_Hidden) == 0 && g_UCM[k].hidden) continue; // cafrii 051031 add
742
743                        if (g_UCM[k].Major == newMajor)
744                                minimumIndex = k;
745                }
746                i = minimumIndex;
747        }
748       
749        if (pNewMajor)
750                *pNewMajor = newMajor;
751        return i;
752}
753
754
755
756
757#if 0
758_____________________()
759#endif
760
761// »õ Tuning Policy ¿ä±¸»çÇ×À» Àû¿ëÇÑ ÄÚµå.
762
763// UCM ä³Î Á¤º¸ÀÇ Uid (Unique ID)
764//
765// »õ Tuning Policy¿¡´Â Uid¶ó´Â »õ id°ªÀ» »ç¿ëÇÑ´Ù.
766// ´õÀÌ»ó Major/Minor/RF µ¥ÀÌÅÍ ½ÖÀÌ unique ÇÔÀ» º¸ÀåÇÒ ¼ö ¾ø°í,
767// UCMÀÇ index °ªÀº UCM lockÀ» ÇÒ °æ¿ì¿¡¸¸ Àǹ̰¡ ÀÖÀ¸¹Ç·Î »õ·Î¿î ID°¡ ÇÊ¿äÇÏ°Ô µÈ °Í.
768//
769// Uid´Â 16bit unsigned °ªÀ¸·Î¼­ ä³Î Á¤º¸°¡ ¸Þ¸ð¸®¿¡ Á¸ÀçÇÏ´Â µ¿¾ÈÀº ±× Á¤º¸¸¦ À¯ÀÏÇϰÔ
770// ±¸º°ÇÒ ¼ö ÀÖµµ·Ï ºÎ¿©µÈ °ªÀÌ´Ù.
771// NvRam¿¡´Â ÀúÀåµÇÁö ¾Ê´Â Èֹ߼º °ªÀÌ´Ù. NvRam¿¡¼­ loadµÉ °æ¿ì¿¡´Â »õ·Ó°Ô ID°¡ ÇÒ´çµÈ´Ù.
772//
773// ÇöÀç ±¸Çö Á¤º¸:
774//    ÇöÀç ±¸ÇöÀº 1ºÎÅÍ ½ÃÀÛÇÏ´Â ÀÏ·Ã ¹øÈ£À̸ç, Áß°£¿¡ UCM µ¥ÀÌÅÍ ÀϺθ¦ »èÁ¦ÇÒ °æ¿ì ºó ¹øÈ£°¡
775//    Á¸ÀçÇϱ⵵ ÇÑ´Ù.
776//    UINT16ÀÇ ÃÖ´ë°ªÀÎ 65535¸¦ ³Ñ¾î°¡¸é wrap-aroundµÇÁö¸¸ '0'ÀÇ °ªÀº »ç¿ëÇÏÁö ¾Ê°í ÀÖ´Ù.
777//
778
779//$$
780// int DMW_MSC_Uid2Index(UINT16 uid);
781// int DMW_MSC_Index2Uid(int index);
782//   index <--> Uid°£ÀÇ º¯È¯¿¡ »ç¿ëÇÑ´Ù.
783//   ÇØ´ç ä³ÎÀÌ ¾øÀ¸¸é -1À» ¸®ÅÏÇÑ´Ù.
784//
785// ÁÖÀÇ1:
786// UidÀÇ Å¸ÀÔÀº ¿ø·¡ UINT16À̳ª, -1°ú °°Àº ¿¡·¯¸¦ ¾Ë·ÁÁÖ±â À§ÇØ ¸®Åϰª 'int'°¡ »ç¿ëµÇ¾ú´Ù.
787//
788// ÁÖÀÇ2:
789// index¸¦ ÇÔ¼öÀÎÀÚ³ª ¸®ÅϰªÀ¸·Î »ç¿ëÇÏ´Â ¸ðµç ÇÔ¼ö´Â caller¿¡¼­ UcmÀ» lockÀ» °É¾î º¸È£ÇØ ÁÙ Çʿ䰡 ÀÖ´Ù.
790// ÀÌ µÎ ÇÔ¼öµµ ¿¹¿Ü°¡ ¾Æ´Ô.
791//
792
793int DMW_MSC_Uid2Index(int uid)
794{
795        int i;
796        for (i=0; i<g_UCM_number; i++)
797                if (uid == g_UCM[i].Uid)
798                        return i;
799        return -1;
800}
801
802int DMW_MSC_Index2Uid(int index)
803{
804        // index 0ÀÇ °ªÀº ÀÇ¹Ì ¾øÀ» ¼öµµ ÀÖÀ¸¹Ç·Î caller¿¡¼­ ÁÖÀÇÇÏ¿© »ç¿ëÇϵµ·Ï ÇÑ´Ù.
805       
806        if (index < 0 || index >= g_UCM_number) return -1;
807        return g_UCM[index].Uid;
808}
809
810
811//$$
812// DMW_MSC_GetMaxMinorNumber(int major);
813//
814// ÇØ´ç 'major' °ªÀ» ¸ÞÀÌÀú ¹øÈ£·Î °®´Â ä³Î Á¤º¸µé Áß¿¡¼­ ÃÖ´ë minor°ªÀ» ã´Â´Ù.
815// ÀÌ´Â PSI·ÎºÎÅÍ ÃßÃâµÈ ä³Î Á¤º¸¿¡ Major-Minor ½ºÅ¸ÀÏÀÇ Ã¤³Î ¹øÈ£ ¸í¸íÀ» Çϱâ À§ÇØ
816// application¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
817//
818// ¿¹¸¦ µé¾î ÇöÀç major 9¸¦ °®´Â ä³Î Á¤º¸µé Áß, minor °ªÀÇ ÃÖ´ë°ªÀÌ 3À̶ó°í Çϸé
819// applicaiton¿¡¼­´Â PMT¿¡¼­ ¾Ë¾Æ³½ ä³Î Á¤º¸ µÎ°³¸¦ 9-4, 9-5·Î ¸í¸íÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
820//
821// PSI ä³Î Á¤º¸ÀÇ ¸í¸í¹ýÀº applicationÀÇ ÀÚÀ¯À̹ǷΠÀ§ÀÇ ¿¹´Â °­Á¦»çÇ×ÀÌ ¾Æ´Ï´Ù.
822//
823int DMW_MSC_GetMaxMinorNumber(int major)
824{
825        int i, maxminor = -1;
826        DMW_MSC_LockUcm();
827       
828        for (i=0; i<g_UCM_number; i++) 
829        {
830                if (g_bReserveUcmIndex0)
831                        if(i==0) continue;
832
833                if (major != g_UCM[i].Major)
834                        continue;
835                if (!g_UCM[i].VctFlag)
836                        continue;
837                       
838                // minor °ª Áß¿¡¼­ ÃÖ´ë°ªÀ» ã´Â´Ù.
839                if (maxminor < g_UCM[i].Minor)
840                        maxminor = g_UCM[i].Minor;
841        }
842        DMW_MSC_UnlockUcm();
843        return maxminor;
844}
845
846//
847// ä³Î DB¿¡¼­ °Ë»öÇÏ´Â ÇÔ¼öµé.
848//
849// ¾Æ·¡ ÇÔ¼öµéÀº °øÅëÀûÀ¸·Î  º¹¼ö°³ÀÇ °Ë»ö°á°ú¸¦ ¸®ÅϹޱâ À§Çؼ­
850//   flag, szBuf, *buf ÀÎÀÚ¸¦ °¡Áö°í ÀÖ´Ù.
851//
852// ÇÔ¼öÀÇ ¸®ÅϰªÀº ¸ðµÎ °Ë»öµÈ ä³ÎÀÇ °¹¼öÀÌ´Ù.
853//  szBufÀÇ °ª°ú´Â »ó°ü¾øÀÌ ÇØ´ç ä³ÎÀÇ °¹¼ö¸¦ ¸®ÅÏÇÑ´Ù.
854//
855int DMW_MSC_FindChannelMajorMinor(int major, int minor, int flag, int szBuf, int *buf)
856{
857        // major, minor°¡ ÀÏÄ¡Çϴ ä³ÎÀ» ã´Â´Ù.
858       
859        int i, nMatch = 0;
860        DMW_MSC_LockUcm();
861        for (i=0; i<g_UCM_number; i++)
862        {
863                if (g_bReserveUcmIndex0)
864                        if(i==0) continue;
865
866                if ((flag & CSF_Include_Disabled) == 0 && g_UCM[i].disabled) continue; // cafrii 101209
867                if ((flag & CSF_Include_Skipped) == 0 && g_UCM[i].Skipped) continue;  // cafrii, 030325
868                if (g_UCM[i].Major != major || g_UCM[i].Minor != minor) continue;
869                if ((flag & CSF_Mask_MF) == CSF_ATSC_Only && g_UCM[i].Service_type == 0) continue;
870                if ((flag & CSF_Mask_MF) == CSF_NTSC_Only && g_UCM[i].Service_type != 0) continue;
871                if ((flag & CSF_Include_PSI) == 0 && g_UCM[i].VctFlag == 0)     continue; 
872                                // 'PSI´Â Æ÷ÇÔÇÏÁö ¸»¾Æ¶ó' Àε¥, PSI ä³Î Á¤º¸¶ó¸é skip.
873                if (buf && nMatch < szBuf)
874                        buf[nMatch] = g_UCM[i].Uid;
875                nMatch++;
876        }
877        DMW_MSC_UnlockUcm();
878        return nMatch;
879}
880
881int DMW_MSC_FindChannelMajor(int major, int flag, int szBuf, int *buf)
882{
883        // major¸¸ ÀÏÄ¡ÇÏ´Â ¸ðµç ä³ÎÀ» ã´Â´Ù.
884       
885        int i, nMatch = 0;
886
887        DMW_MSC_LockUcm();
888        for (i=0; i<g_UCM_number; i++)
889        {
890                if (g_bReserveUcmIndex0)
891                        if(i==0) continue;
892
893                if ((flag & CSF_Include_Disabled) == 0 && g_UCM[i].disabled) continue; // cafrii 101209
894                if ((flag & CSF_Include_Skipped) == 0 && g_UCM[i].Skipped) continue;  // cafrii, 030325
895                if (g_UCM[i].Major != major) continue;
896                if ((flag & CSF_Mask_MF) == CSF_ATSC_Only && g_UCM[i].Service_type == 0) continue;
897                if ((flag & CSF_Mask_MF) == CSF_NTSC_Only && g_UCM[i].Service_type != 0) continue;
898                if ((flag & CSF_Include_PSI) == 0 && g_UCM[i].VctFlag == 0)     continue; 
899                if (buf && nMatch < szBuf)
900                        buf[nMatch] = g_UCM[i].Uid;
901                nMatch++;
902        }
903        DMW_MSC_UnlockUcm();
904        return nMatch;
905}
906
907// cafrii 031114, add new feature:
908//     find channel from "Major" info, instead of "Uid"
909//     to use "Major" base, specify negative number.
910//
911int DMW_MSC_FindMajorUp(int uidCurrentOrMajor, int flag, int szBuf, int *uidBuf)
912{
913        // ex)
914        //      DMW_MSC_FindMajorUp(5, flag, sz, buf);
915        //            UID 5¹ø ä³ÎÀÌ 6-1 À̾ú´Ù¸é,
916        //            6-2, 6-3Àº °Ç³Ê¶Ù°í 9-1, 9-2 µîÀÌ °Ë»öµÉ ¼ö ÀÖ´Ù.
917        //
918        //      DMW_MSC_FindMajorUp(-11, flag, sz, buf);
919        //            major ¹øÈ£ 11¹øÀÇ ´ÙÀ½ Up ä³ÎÀ» ã´Â´Ù.
920        //            13-0, 13-1, 13-2 µîÀÌ °Ë»öµÉ ¼ö ÀÖ´Ù.
921        //           
922        int i, index, nMatch = 0, curMajor, newMajor;
923        UINT16 uidCurrent;
924
925        DMW_MSC_LockUcm();
926       
927        if (uidCurrentOrMajor >= 0) // UID·Î ã´Â´Ù.
928        {
929                uidCurrent = uidCurrentOrMajor;
930       
931                index = DMW_MSC_Uid2Index(uidCurrent);
932                if (index < 0) {
933                        DMW_MSC_UnlockUcm();
934                        return 0;
935                }
936                curMajor = g_UCM[index].Major;
937
938                // find next new major number.
939                for (i=index+1; i<g_UCM_number; i++) 
940                {
941                        if (g_bReserveUcmIndex0)
942                                if(i==0) continue;
943
944                        if ((flag & CSF_Include_Disabled) == 0 && g_UCM[i].disabled) continue; // cafrii 101209
945                        if ((flag & CSF_Include_Skipped) == 0 && g_UCM[i].Skipped) continue;  // cafrii, 030325
946                        if (g_UCM[i].Major <= curMajor) continue;
947                        if ((flag & CSF_Mask_MF) == CSF_ATSC_Only && g_UCM[i].Service_type == 0) continue;
948                        if ((flag & CSF_Mask_MF) == CSF_NTSC_Only && g_UCM[i].Service_type != 0) continue;
949                        if ((flag & CSF_Include_PSI) == 0 && g_UCM[i].VctFlag == 0)     continue; 
950                       
951                        if ((flag & CSF_Include_Hidden) == 0 && g_UCM[i].hidden) continue; // cafrii 050608 add
952                       
953                        break; // this is one!!
954                }
955                if (i >= g_UCM_number) // not found!
956                {
957                        // cafrii 050608 add
958                        if (flag & CSF_DontWrapAround)
959                        {
960                                dprint(2, " ucm not found.. return..\n");
961                                DMW_MSC_UnlockUcm();
962                                return 0;
963                        }
964                       
965                        for (i=0; i<=index; i++) // wrap-around and found smallest major.
966                        {
967                                if (g_bReserveUcmIndex0)
968                                        if(i==0) continue;
969
970                                if ((flag & CSF_Include_Disabled) == 0 && g_UCM[i].disabled) continue; // cafrii 101209
971                                if ((flag & CSF_Include_Skipped) == 0 && g_UCM[i].Skipped) continue;  // cafrii, 030325
972                                if ((flag & CSF_Mask_MF) == CSF_ATSC_Only && g_UCM[i].Service_type == 0) continue;
973                                if ((flag & CSF_Mask_MF) == CSF_NTSC_Only && g_UCM[i].Service_type != 0) continue;
974                                if ((flag & CSF_Include_PSI) == 0 && g_UCM[i].VctFlag == 0)     continue; 
975                               
976                                if ((flag & CSF_Include_Hidden) == 0 && g_UCM[i].hidden) continue; // cafrii 050608 add
977                               
978                                break;
979                        }
980                        if (i > index) { // ÇѹÙÄû¸¦ ´Ù µ¹¾Ò´Âµ¥ ¾ø´Ù. not found again!!
981                                DMW_MSC_UnlockUcm();
982                                dprint(0, "!! FindMajorUp: next major of %d (uid %d) not found\n", curMajor, uidCurrent);
983                                return 0;
984                        }
985                }
986                // 'i' is index of new major.
987        }
988        else { // uidCurrentOrMajor°¡ À½ÀÇ °ªÀ» °¡Áö°í ÀÖÀ½.  Major·Î ã´Â´Ù.
989               
990                curMajor = -uidCurrentOrMajor;
991
992                // curMajor °ªº¸´Ù ´õ Å« major °ªÀ» °¡Áö°í ÀÖ´Â channel Á¤º¸¸¦ ã´Â´Ù.
993                i = find_next_key_major(curMajor, TRUE, flag, &newMajor);  // increasing direction
994               
995                if (i < 0) {
996                        // ¹ß°ßµÇÁö ¾ÊÀ½!!!
997                        DMW_MSC_UnlockUcm();
998                        dprint(0, "!! FindMajorDown: smaller major of %d not found!\n", curMajor);
999                        return 0;
1000                }
1001                // 'i' is index of new major.
1002        }
1003       
1004        // 'i' is index of new major.
1005        newMajor = g_UCM[i].Major;
1006       
1007        // ÀÌÁ¦ °°Àº major Áß¿¡¼­ Àִ´ë·Î ¼±ÅÃÇÑ´Ù.
1008        for (; i<g_UCM_number; i++)
1009        {
1010                if (g_bReserveUcmIndex0)
1011                        if(i==0) continue;
1012
1013                if (g_UCM[i].Major != newMajor) 
1014                        break;
1015                if ((flag & CSF_Include_Disabled) == 0 && g_UCM[i].disabled) continue; // cafrii 101209
1016                if ((flag & CSF_Include_Skipped) == 0 && g_UCM[i].Skipped) continue;  // cafrii, 030325
1017                if ((flag & CSF_Mask_MF) == CSF_ATSC_Only && g_UCM[i].Service_type == 0) continue;
1018                if ((flag & CSF_Mask_MF) == CSF_NTSC_Only && g_UCM[i].Service_type != 0) continue;
1019                if ((flag & CSF_Include_PSI) == 0 && g_UCM[i].VctFlag == 0)     continue; 
1020
1021                if ((flag & CSF_Include_Hidden) == 0 && g_UCM[i].hidden) continue; // cafrii 050608 add
1022
1023            if (nMatch < szBuf && uidBuf)
1024                uidBuf[nMatch] = g_UCM[i].Uid;
1025            nMatch++;
1026                dprint(2, " find ucm: (%02d) %d-%d, %d %c[%03d]\n", i, g_UCM[i].Major, g_UCM[i].Minor,
1027                        g_UCM[i].RF, g_UCM[i].VctFlag ? 'v' : ' ', g_UCM[i].Uid);
1028        }
1029               
1030        DMW_MSC_UnlockUcm();
1031        return nMatch;
1032}
1033
1034// cafrii 031114, add new feature:
1035//     find channel from "Major" info, instead of "Uid"
1036//     to use "Major" base, specify negative number.
1037//
1038int DMW_MSC_FindMajorDown(int uidCurrentOrMajor, int flag, int szBuf, int *uidBuf)
1039{
1040        // ex)
1041        //      DMW_MSC_FindMajorDown(5, flag, sz, buf);
1042        //            UID 5¹ø ä³ÎÀÌ 9-2 À̾ú´Ù¸é,
1043        //            9-1, 9-0Àº °Ç³Ê¶Ù°í 6-1, 6-2 µîÀÌ °Ë»öµÉ ¼ö ÀÖ´Ù.
1044        //
1045        //      DMW_MSC_FindMajorDown(-11, flag, sz, buf);
1046        //            major ¹øÈ£ 11¹øÀÇ ÀÌÀü down ä³ÎÀ» ã´Â´Ù.
1047        //            9-0, 9-1, 9-2 µîÀÌ °Ë»öµÉ ¼ö ÀÖ´Ù.
1048        //           
1049       
1050        int i, index, nMatch = 0, curMajor, newMajor;
1051        UINT16 uidCurrent; // cafrii 031114 add
1052       
1053        DMW_MSC_LockUcm();
1054       
1055        if (uidCurrentOrMajor >= 0)
1056        {
1057                uidCurrent = uidCurrentOrMajor; // cafrii 040511 bugfix
1058
1059                //dprint(2, "find major down by uid %d\n", uidCurrent
1060                index = DMW_MSC_Uid2Index(uidCurrent);
1061                if (index < 0) {
1062                        DMW_MSC_UnlockUcm();
1063                        return 0;
1064                }
1065                curMajor = g_UCM[index].Major;
1066               
1067                // find next new major number.
1068                for (i=index-1; i>=0; i--) 
1069                {
1070                        if (g_bReserveUcmIndex0)
1071                                if(i==0) continue;
1072                               
1073                        if ((flag & CSF_Include_Disabled) == 0 && g_UCM[i].disabled) continue; // cafrii 101209
1074                        if ((flag & CSF_Include_Skipped) == 0 && g_UCM[i].Skipped) continue;  // cafrii, 030325
1075                        if (g_UCM[i].Major >= curMajor) continue;  // cafrii, 030325 bug fix.
1076                        if ((flag & CSF_Mask_MF) == CSF_ATSC_Only && g_UCM[i].Service_type == 0) continue;
1077                        if ((flag & CSF_Mask_MF) == CSF_NTSC_Only && g_UCM[i].Service_type != 0) continue;
1078                        if ((flag & CSF_Include_PSI) == 0 && g_UCM[i].VctFlag == 0)     continue; 
1079                       
1080                        if ((flag & CSF_Include_Hidden) == 0 && g_UCM[i].hidden) continue; // cafrii 050608 add
1081                       
1082                        break; // this is one!!
1083                }
1084                if (i < 0) // not found!
1085                {
1086                        // cafrii 050608 add
1087                        if (flag & CSF_DontWrapAround)
1088                        {
1089                                dprint(2, " ucm not found.. return..\n");
1090                                DMW_MSC_UnlockUcm();
1091                                return 0;  // channel not found
1092                        }
1093                       
1094                        for (i=g_UCM_number-1; i>=index; i--) // wrap-around to top and found largest major.
1095                        {
1096                                if (g_bReserveUcmIndex0)
1097                                        if(i==0) continue;
1098
1099                                if ((flag & CSF_Include_Disabled) == 0 && g_UCM[i].disabled) continue; // cafrii 101209
1100                                if ((flag & CSF_Include_Skipped) == 0 && g_UCM[i].Skipped) continue;  // cafrii, 030325
1101                                if ((flag & CSF_Mask_MF) == CSF_ATSC_Only && g_UCM[i].Service_type == 0) continue;
1102                                if ((flag & CSF_Mask_MF) == CSF_NTSC_Only && g_UCM[i].Service_type != 0) continue;
1103                                if ((flag & CSF_Include_PSI) == 0 && g_UCM[i].VctFlag == 0)     continue; 
1104                               
1105                                if ((flag & CSF_Include_Hidden) == 0 && g_UCM[i].hidden) continue; // cafrii 050608 add
1106                               
1107                                break;
1108                        }
1109                        if (i < index) { // not found again!!
1110                                DMW_MSC_UnlockUcm();
1111                                dprint(0, "!! FindMajorDown: smaller major of %d (uid %d) not found\n", curMajor, uidCurrent);
1112                                return 0;
1113                        }
1114                }
1115                // 'i' is index of new major.
1116        }
1117        else {  // uidCurrentOrMajor°¡ À½ÀÇ °ªÀ» °¡Áö°í ÀÖÀ½.
1118
1119                curMajor = -uidCurrentOrMajor;
1120
1121                // curMajor °ªº¸´Ù ´õ Å« major °ªÀ» °¡Áö°í ÀÖ´Â channel Á¤º¸¸¦ ã´Â´Ù.
1122                i = find_next_key_major(curMajor, FALSE, flag, &newMajor);  // decreasing direction
1123               
1124                if (i < 0) {
1125                        // ¹ß°ßµÇÁö ¾ÊÀ½!!!
1126                        DMW_MSC_UnlockUcm();
1127                        dprint(0, "!! FindMajorDown: smaller major of %d not found!\n", curMajor);
1128                        return 0;
1129                }
1130                // 'i' is index of new major.
1131        }
1132       
1133        // 'i' is index of new major.
1134        newMajor = g_UCM[i].Major;
1135       
1136        // ÀÌÁ¦ °°Àº major Áß¿¡¼­ Àִ´ë·Î ¼±ÅÃÇÑ´Ù.
1137       
1138        // Note! cafrii 030331.
1139        //  index¸¦ ³»·Á°¡¸é¼­ ¼±ÅÃÇϸé UCMÀÇ inverse-order°¡ µÈ´Ù.
1140        //  µû¶ó¼­ ¸Ç óÀ½À¸·Î ¸ÕÀú ¿òÁ÷ÀÎ ÈÄ ±×°÷ºÎÅÍ ½ÃÀÛÇØ¼­ ¼±ÅÃÇÑ´Ù.
1141        for (; i>=0; i--)
1142        {
1143                if (g_bReserveUcmIndex0)
1144                        if(i==0) continue;
1145
1146                if (g_UCM[i].Major != newMajor) 
1147                        break;
1148                if ((flag & CSF_Include_Disabled) == 0 && g_UCM[i].disabled) continue; // cafrii 101209
1149                if ((flag & CSF_Include_Skipped) == 0 && g_UCM[i].Skipped) continue;  // cafrii, 030325
1150                if ((flag & CSF_Mask_MF) == CSF_ATSC_Only && g_UCM[i].Service_type == 0) continue;
1151                if ((flag & CSF_Mask_MF) == CSF_NTSC_Only && g_UCM[i].Service_type != 0) continue;
1152                if ((flag & CSF_Include_PSI) == 0 && g_UCM[i].VctFlag == 0)     continue; 
1153
1154                if ((flag & CSF_Include_Hidden) == 0 && g_UCM[i].hidden) continue; // cafrii 050608 add
1155
1156            //if (nMatch < szBuf && uidBuf)
1157            //  uidBuf[nMatch] = g_UCM[i].Uid;
1158            nMatch++;
1159                //dprint(2, " find ucm: (%02d) %d-%d, %d %c[%03d]\n", i, g_UCM[i].Major, g_UCM[i].Minor,
1160                //      g_UCM[i].RF, g_UCM[i].VctFlag ? 'v' : ' ', g_UCM[i].Uid);
1161        }
1162       
1163        if (nMatch == 0) {
1164                dprint(0, "!!! FindMajorDown: Critical Error! Should be greater than 1!!\n");
1165                DMW_MSC_UnlockUcm();
1166                return 0;
1167        }
1168       
1169        // ÀÌ ½ÃÁ¡¿¡¼­ i´Â newMajorº¸´Ù ÀÛÀº majorÀ̰ųª ¶Ç´Â i==-1 ÀÌ µÉ °ÍÀ̹ǷΠÀ̰÷ºÎÅÍ ´Ù½Ã ¿Ã¶ó°¡¸ç
1170        // ¼±ÅÃÇÑ´Ù.
1171        if (i < 0) i = 0;
1172        //if (g_UCM[i].Major != newMajor) i++; // BUGBUG!! skip µÈ ä³ÎÀÌ ÀÖÀ¸¹Ç·Î 1¸¸ ´õÇØ¼­´Â ¾ÈµÊ!
1173                // ¾ó¸¶¸¸Å­ ´õÇØ¾ß µÉÁö ¸ð¸£¹Ç·Î ¿©±â¼­ ´õÇÏÁö ¾Ê°í,
1174                // ³ªÁß¿¡ buffer¿¡ ä¿ö³ÖÀ»¶§ major check¸¦ Çѹø ´õ ÇÑ´Ù.
1175       
1176        nMatch = 0;
1177        for (; i<g_UCM_number; i++)  // index¿¡ ¹«°üÇÏ°Ô Àü UCM¿¡¼­ ÇØ´ç µÇ´Â°ÍÀ» ´Ù ãÀ¸¸é µÈ´Ù.
1178        {
1179                if (g_bReserveUcmIndex0)
1180                        if(i==0) continue;
1181
1182                if (g_UCM[i].Major > newMajor) // Á¶°ÇÀÌ º¯°æµÊ. ´õÀÌ»ó ºñ±³ÇÒ ÇÊ¿ä¾øÀ½!!
1183                        break;
1184                if (g_UCM[i].Major != newMajor) continue;  // Á¶°ÇÀÌ Ãß°¡µÊ.
1185               
1186                if ((flag & CSF_Include_Disabled) == 0 && g_UCM[i].disabled) continue; // cafrii 101209
1187                if ((flag & CSF_Include_Skipped) == 0 && g_UCM[i].Skipped) continue;  // cafrii, 030325
1188                if ((flag & CSF_Mask_MF) == CSF_ATSC_Only && g_UCM[i].Service_type == 0) continue;
1189                if ((flag & CSF_Mask_MF) == CSF_NTSC_Only && g_UCM[i].Service_type != 0) continue;
1190                if ((flag & CSF_Include_PSI) == 0 && g_UCM[i].VctFlag == 0)     continue; 
1191
1192                if ((flag & CSF_Include_Hidden) == 0 && g_UCM[i].hidden) continue; // cafrii 050608 add
1193
1194            if (nMatch < szBuf && uidBuf)
1195                uidBuf[nMatch] = g_UCM[i].Uid;
1196            nMatch++;
1197                dprint(2, " find ucm: (%02d) %d-%d, %d %c[%03d]\n", i, g_UCM[i].Major, g_UCM[i].Minor,
1198                        g_UCM[i].RF, g_UCM[i].VctFlag ? 'v' : ' ', g_UCM[i].Uid);
1199        }
1200       
1201        DMW_MSC_UnlockUcm();
1202        return nMatch;
1203}
1204
1205
1206int DMW_MSC_FindMinorUp(int uidCurrentOrMajorMinor, int flag, int szBuf, int *uidBuf)
1207{
1208        // ÇöÀç uidCurrent ä³Î¿¡¼­ºÎÅÍ Çϳª up ä³ÎÀÇ uid¸¦ ¸®ÅÏ.
1209        // ³¡±îÁö µµ´ÞÇϸé wrap-aroundµÈ´Ù.
1210        // ¼±ÅÃµÈ Ã¤³Î °¹¼ö¸¦ ¸®ÅÏÇÑ´Ù. ÀÌ ÇÔ¼ö´Â Ç×»ó ÇѰ³ÀÇ Ã¤³Î¸¸À» ãÀ¸¹Ç·Î 1À» ¸®ÅÏÇÔ.
1211        // ¼±ÅÃÇÒ Ã¤³ÎÀÌ ¾øÀ¸¸é 0À» ¸®ÅÏ.
1212        //
1213        // ucmÀº Á¤·ÄÀÌ µÇ¾î ÀÖÀ¸¹Ç·Î ÀÛÀº ÂÊ¿¡¼­ºÎÅÍ Ã£¾Æ¿Ã¶ó°¡¸éµÈ´Ù.
1214        // flagÀÇ °ª¿¡ µû¶ó ´Ù¸£°Ô µ¿ÀÛÇÑ´Ù.
1215        //
1216        // uidCurrent°¡ À߸øµÈ °ªÀ̶ó¸é (Á¸ÀçÇÏÁö ¾Ê´Â ä³Î), ¸Ç óÀ½ºÎÅÍ »õ·Î ã´Â´Ù.
1217
1218        int i, index;
1219       
1220        DMW_MSC_LockUcm();
1221       
1222        if (uidCurrentOrMajorMinor < 0) 
1223        {
1224                //int nMajor, nMinor;
1225                UINT32 majorminor;
1226               
1227                uidCurrentOrMajorMinor = -uidCurrentOrMajorMinor;
1228                index = -1;
1229               
1230                for (i=0; i<g_UCM_number; i++)
1231                {
1232                        if (g_bReserveUcmIndex0)
1233                                if(i==0) continue;
1234       
1235                        majorminor = ((g_UCM[i].Major & 0xffff) << 16) | (g_UCM[i].Minor & 0xffff);
1236                       
1237                        if ((unsigned int)uidCurrentOrMajorMinor == majorminor) {
1238                                break;   // Á¤È®È÷ ÀÏÄ¡. ÀÌ Ã¤³Î ´ÙÀ½ºÎÅÍ Ã£À¸¸é µÈ´Ù.
1239                        }
1240                        if ((unsigned int)uidCurrentOrMajorMinor < majorminor) {
1241                                i--;  // ÀÌ i¹øÂ° ä³ÎºÎÅÍ Ã£À¸¸é µÈ´Ù.
1242                                break;
1243                        }
1244                }
1245                if (i < g_UCM_number)
1246                        index = i;
1247                else
1248                        // DBÀÇ ¸ðµç ä³ÎÀÌ ÁöÁ¤ÇÑ °ªº¸´Ù ÀÛÀº °æ¿ì..
1249                        index = g_UCM_number-1;
1250        }
1251        else 
1252        {
1253                UINT16 uidCurrent = (uidCurrentOrMajorMinor & 0xffff);
1254                index = DMW_MSC_Uid2Index(uidCurrent);
1255                if (index < 0) {
1256                        if (g_UCM_number <= 0) {
1257                                dprint(0, "!! no channel info in ucm\n");                       
1258                                DMW_MSC_UnlockUcm();
1259                                return 0;
1260                        }
1261                #if 0
1262                        index = g_UCM_number-1; // cafrii 030323, ¸Ç óÀ½ ä³ÎºÎÅÍ Ã£À» ¼ö ÀÖµµ·Ï..
1263                #else
1264                        index = -1; 
1265                                // cafrii 050614 bugfix
1266                                // ¸Ç óÀ½ ºÎÅÍ Ã£À»·Á¸é ÀÌ·¸°Ô ÇØ¾ß ÇÑ´Ù.
1267                                // ¿Ö³Ä¸é ÀÌÁ¦´Â Don't Wrap Around flag°¡ Àֱ⠶§¹®¿¡
1268                                // ÀÚµ¿À¸·Î wrap-around¸¦ ÇÏÁö ¾Ê±â ¶§¹®.
1269                #endif 
1270                }
1271        }
1272       
1273       
1274        for (i=index+1; i<g_UCM_number; i++) // ÀÌ À§Ä¡¿¡¼­ºÎÅÍ Ã¤³ÎÀ» ã´Â´Ù.
1275        {
1276                if (g_bReserveUcmIndex0)
1277                        if(i==0) continue;
1278
1279                if ((flag & CSF_Include_Disabled) == 0 && g_UCM[i].disabled) continue; // cafrii 101209
1280                if ((flag & CSF_Include_Disabled) == 0 && g_UCM[i].disabled) continue; // cafrii 101209
1281                if ((flag & CSF_Include_Skipped) == 0 && g_UCM[i].Skipped) continue;  // cafrii, 030325
1282                if ((flag & CSF_Mask_MF) == CSF_ATSC_Only && g_UCM[i].Service_type == 0) continue;
1283                if ((flag & CSF_Mask_MF) == CSF_NTSC_Only && g_UCM[i].Service_type != 0) continue;
1284                if ((flag & CSF_Include_PSI) == 0 && g_UCM[i].VctFlag == 0)     continue; 
1285               
1286                if ((flag & CSF_Include_Hidden) == 0 && g_UCM[i].hidden) continue; // cafrii 050602 add
1287
1288                break;
1289        }
1290       
1291        if (i >= g_UCM_number) 
1292        {
1293                // ucm db ³¡¿¡ µµ´ÞÇØ¹ö·È´Ù!!! ÇöÀç ä³Î ÀÌÈÄÀÇ Àû´çÇÑ up ä³ÎÀÌ ¾ø´Ù´Â ÀǹÌÀÓ.
1294                // ±×·¯¸é UCMÀÇ ¾Õ¿¡¼­ºÎÅÍ Ã¹¹øÂ° enable ä³ÎÀ» µ¹·ÁÁØ´Ù! (wrap-around)
1295
1296                // cafrii 050602 add
1297                if (flag & CSF_DontWrapAround)
1298                {
1299                        dprint(2, " ucm not found.. return..\n");
1300                        DMW_MSC_UnlockUcm();
1301                        return 0;  // channel not found
1302                }
1303                               
1304                dprint(2, " ucm not found!. wrap around and retry..\n");
1305
1306                for (i=0; i<=index; i++) 
1307                {
1308                        if (g_bReserveUcmIndex0)
1309                                if(i==0) continue;
1310
1311                        if ((flag & CSF_Include_Disabled) == 0 && g_UCM[i].disabled) continue; // cafrii 101209
1312                        if ((flag & CSF_Include_Skipped) == 0 && g_UCM[i].Skipped) continue;  // cafrii, 030325
1313                        if ((flag & CSF_Mask_MF) == CSF_ATSC_Only && g_UCM[i].Service_type == 0) continue;
1314                        if ((flag & CSF_Mask_MF) == CSF_NTSC_Only && g_UCM[i].Service_type != 0) continue;
1315                        if ((flag & CSF_Include_PSI) == 0 && g_UCM[i].VctFlag == 0)     continue; 
1316
1317                        if ((flag & CSF_Include_Hidden) == 0 && g_UCM[i].hidden) continue; // cafrii 050602 add
1318
1319                        break;
1320                }
1321                if (i > index) {
1322                        // !!! ÀÌ UCM¿¡´Â enable ä³ÎÀÌ Çϳªµµ ¾ø´Ù!!
1323                        // ±×³É ¾Æ¹«°Íµµ ¾ÈÇÑ´Ù.
1324                        dprint(0, "!! no enabled proper ucm!!\n");
1325                        DMW_MSC_UnlockUcm();
1326                        return 0;
1327                }
1328                //dprint(2, " find ucm: (%02d) %d-%d, %d %c[%03d]\n", i, g_UCM[i].Major, g_UCM[i].Minor,
1329                //              g_UCM[i].RF, g_UCM[i].VctFlag ? 'v' : ' ', g_UCM[i].Uid);
1330        }
1331
1332        // minor up/downÀÇ °æ¿ì caller°¡ uid buffer¸¦ Á¦°øÇÏÁö¸¸ ¾îÂ¥ÇÇ ³Ñ°ÜÁÖ´Â °ÍÀº ÃÖ´ë 1°³´Ù.
1333        if (szBuf > 0 && uidBuf)
1334                uidBuf[0] = g_UCM[i].Uid;
1335               
1336        DMW_MSC_UnlockUcm();
1337        return 1;
1338}
1339
1340int DMW_MSC_FindMinorDown(int uidCurrentOrMajorMinor, int flag, int szBuf, int *uidBuf)
1341{
1342        // DMW_MSC_FindMinorUp()°ú µ¿ÀÏÇÏ´Ù.
1343        //
1344        // uidCurrent°¡ À߸øµÈ °ªÀ̶ó¸é (Á¸ÀçÇÏÁö ¾Ê´Â ä³Î), ¸Ç µÚºÎÅÍ »õ·Î ã´Â´Ù.
1345
1346        int i, index;
1347       
1348        DMW_MSC_LockUcm();
1349
1350        if (uidCurrentOrMajorMinor < 0) 
1351        {
1352                //int nMajor, nMinor;
1353                UINT32 majorminor;
1354               
1355                uidCurrentOrMajorMinor = -uidCurrentOrMajorMinor;
1356                index = -1;
1357               
1358                for (i=g_UCM_number-1; i>=0; i--)
1359                {
1360                        if (g_bReserveUcmIndex0)
1361                                if(i==0) continue;
1362       
1363                        majorminor = ((g_UCM[i].Major & 0xffff) << 16) | (g_UCM[i].Minor & 0xffff);
1364                       
1365                        if ((unsigned int)uidCurrentOrMajorMinor == majorminor) {
1366                                break;   // Á¤È®È÷ ÀÏÄ¡. ÀÌ Ã¤³Î ¾ÕºÎÅÍ Ã£¾Æ ³»·Á¿À¸é µÈ´Ù.
1367                        }
1368                        if ((unsigned int)uidCurrentOrMajorMinor > majorminor) {
1369                                i++;  // ÀÌ i¹øÂ° ä³ÎºÎÅÍ Ã£À¸¸é µÈ´Ù.
1370                                break;
1371                        }
1372                }
1373                if (i >= 0)
1374                        index = i;
1375                else
1376                        // DBÀÇ ¸ðµç ä³ÎÀÌ ÁöÁ¤ÇÑ °ªº¸´Ù Å« °æ¿ì..
1377                        index = 0;
1378        }
1379        else
1380        {
1381                UINT16 uidCurrent = (uidCurrentOrMajorMinor & 0xffff);
1382                index = DMW_MSC_Uid2Index(uidCurrent);
1383                if (index < 0) {
1384                        if (g_UCM_number <= 0) {
1385                                dprint(0, "!! no channel info in ucm\n");                       
1386                                DMW_MSC_UnlockUcm();
1387                                return 0;
1388                        }                       
1389                #if 0
1390                        index = 0; // cafrii 030323, ¸Ç ¸¶Áö¸· ä³ÎºÎÅÍ Ã£À» ¼ö ÀÖµµ·Ï..               
1391                #else
1392                        index = g_UCM_number;
1393                                // cafrii 050614 bugfix
1394                                // ¸Ç ¸¶Áö¸· ä³ÎºÎÅÍ Ã£±â À§Çؼ­´Â ÀÌ·¸°Ô ÇØ¾ß ÇÑ´Ù.
1395                                // Don'tWrapAround Ç÷¡±×°¡ Àֱ⠶§¹®..
1396                #endif 
1397                }
1398        }
1399               
1400        for (i=index-1; i>=0; i--) // ÀÌ À§Ä¡¿¡¼­ºÎÅÍ enable ä³ÎÀ» ã´Â´Ù.
1401        {
1402                if (g_bReserveUcmIndex0)
1403                        if(i==0) continue;
1404
1405                if ((flag & CSF_Include_Disabled) == 0 && g_UCM[i].disabled) continue; // cafrii 101209
1406                if ((flag & CSF_Include_Skipped) == 0 && g_UCM[i].Skipped) continue;  // cafrii, 030325
1407                if ((flag & CSF_Mask_MF) == CSF_ATSC_Only && g_UCM[i].Service_type == 0) continue;
1408                if ((flag & CSF_Mask_MF) == CSF_NTSC_Only && g_UCM[i].Service_type != 0) continue;
1409                if ((flag & CSF_Include_PSI) == 0 && g_UCM[i].VctFlag == 0)     continue; 
1410
1411                if ((flag & CSF_Include_Hidden) == 0 && g_UCM[i].hidden) continue; // cafrii 050602 add
1412
1413                break;
1414        }
1415       
1416        if (i < 0) 
1417        {
1418                // ucm db ¾Õ¿¡ µµ´ÞÇØ¹ö·È´Ù!!! ÇöÀç ä³Î ¾Õ¿¡ Àû´çÇÑ down ä³ÎÀÌ ¾ø´Ù´Â ÀǹÌÀÓ.
1419               
1420                // cafrii 050602 add
1421                if (flag & CSF_DontWrapAround)
1422                {
1423                        dprint(2, " ucm not found.. return..\n");
1424                        DMW_MSC_UnlockUcm();
1425                        return 0;  // channel not found
1426                }
1427               
1428                dprint(2, " ucm not found!. wrap around and retry..\n");
1429
1430                for (i=g_UCM_number-1; i>=index; i--) 
1431                {
1432                        if (g_bReserveUcmIndex0)
1433                                if(i==0) continue;
1434
1435                        if ((flag & CSF_Include_Disabled) == 0 && g_UCM[i].disabled) continue; // cafrii 101209
1436                        if ((flag & CSF_Include_Skipped) == 0 && g_UCM[i].Skipped) continue;  // cafrii, 030325
1437                        if ((flag & CSF_Mask_MF) == CSF_ATSC_Only && g_UCM[i].Service_type == 0) continue;
1438                        if ((flag & CSF_Mask_MF) == CSF_NTSC_Only && g_UCM[i].Service_type != 0) continue;
1439                        if ((flag & CSF_Include_PSI) == 0 && g_UCM[i].VctFlag == 0)     continue; 
1440
1441                        if ((flag & CSF_Include_Hidden) == 0 && g_UCM[i].hidden) continue; // cafrii 050602 add
1442
1443                        break;
1444                }
1445                if (i < index) {
1446                        dprint(0, "!! no enabled proper ucm!!\n");
1447                        DMW_MSC_UnlockUcm();   
1448                        return 0;
1449                }
1450                //dprint(2, " find ucm: (%02d) %d-%d, %d %c[%03d]\n", i, g_UCM[i].Major, g_UCM[i].Minor,
1451                //              g_UCM[i].RF, g_UCM[i].VctFlag ? 'v' : ' ', g_UCM[i].Uid);
1452        }
1453        if (szBuf > 0 && uidBuf)
1454                uidBuf[0] = g_UCM[i].Uid;
1455               
1456        DMW_MSC_UnlockUcm();   
1457        return 1;
1458}
1459
1460
1461
1462#if 0
1463_____________________()
1464#endif
1465
1466// Rf surfing °ü·Ã.. 4/24 Ãß°¡
1467//
1468//
1469
1470int DMW_MSC_FindRfUp(UINT16 rfCurrent, int flag, int szBuf, int *uidBuf)
1471{
1472        int i, nMatch = 0;
1473        int rf, rfOriginal = rfCurrent;
1474        BOOL bOverwrapped = FALSE;
1475       
1476        DMW_MSC_LockUcm();
1477
1478        // rfCurrent validity check.
1479        // required??
1480        if (g_UCM_number <= 0) {
1481                DMW_MSC_UnlockUcm();
1482                return 0;
1483        }
1484
1485        while (1) 
1486        {
1487                // ¿øÇÏ´Â Á¤º¸¸¦ ãÀ» ¶§ ±îÁö ¹Ýº¹ÇÑ´Ù.
1488               
1489                // rfCurrentº¸´Ù Å« ÃÖ¼Ò rf¸¦ ã´Â´Ù.
1490                // g_UCM[i].RF °¡ UINT8À̹ǷΠºñ±³¿¡ ÁÖÀǸ¦ ¿äÇÔ!!
1491               
1492                rf = 1000;  // set to maximum.
1493                for (i=0; i<g_UCM_number; i++) 
1494                {
1495                        if (g_bReserveUcmIndex0)
1496                                if(i==0) continue;
1497                        if (g_UCM[i].RF > rfCurrent && g_UCM[i].RF < rf)
1498                                rf = g_UCM[i].RF;
1499                }
1500
1501                if (rf == 1000) {  // not found in this rfCurrent.
1502                        if (bOverwrapped) {
1503                                //dprint(0, "!! no proper channel in UCM!\n");
1504                                break;
1505                        }
1506                        rfCurrent = 0;  // retry finding from lowest rf
1507                        bOverwrapped = TRUE;
1508                        //dprint(2, "RF greater than %d not found. retry from lowest..\n", rfCurrent);
1509                        continue;
1510                }
1511
1512                //dprint(2, "found rf %d\n", rf);
1513
1514                if (bOverwrapped && rfCurrent >= rfOriginal) {
1515                        // not found in whole UCM. end loop.
1516                        //dprint(2, "! overwrapped and return to original %d\n", rfCurrent);
1517                        break;
1518                }
1519
1520                nMatch = 0;
1521                for (i=0; i<g_UCM_number; i++) 
1522                {
1523                        if (g_bReserveUcmIndex0)
1524                                if(i==0) continue;
1525
1526                        if (g_UCM[i].RF != rf) continue;
1527                        if ((flag & CSF_Include_Disabled) == 0 && g_UCM[i].disabled) continue; // cafrii 101209
1528                        if ((flag & CSF_Include_Skipped) == 0 && g_UCM[i].Skipped) continue;  // cafrii, 030325
1529                        if ((flag & CSF_Mask_MF) == CSF_ATSC_Only && g_UCM[i].Service_type == 0) continue;
1530                        if ((flag & CSF_Mask_MF) == CSF_NTSC_Only && g_UCM[i].Service_type != 0) continue;
1531                        if ((flag & CSF_Include_PSI) == 0 && g_UCM[i].VctFlag == 0)     continue; 
1532
1533                    if (nMatch < szBuf && uidBuf)
1534                        uidBuf[nMatch] = g_UCM[i].Uid;
1535                    nMatch++;
1536                        //dprint(2, " find rf ucm: (%02d) %d-%d, %d %c[%03d]\n", i, g_UCM[i].Major, g_UCM[i].Minor,
1537                        //      g_UCM[i].RF, g_UCM[i].VctFlag ? 'v' : ' ', g_UCM[i].Uid);
1538                }
1539               
1540                if (nMatch > 0)
1541                        break;      // some ucm found.
1542                       
1543                //dprint(0, "!! rf %d found, but not proper. continue next rf..\n", rf);
1544                rfCurrent = rf;
1545                       
1546        } // end of while
1547       
1548        DMW_MSC_UnlockUcm();
1549        return nMatch;
1550}
1551
1552
1553int DMW_MSC_FindRfDown(UINT16 rfCurrent, int flag, int szBuf, int *uidBuf)
1554{
1555        int i, nMatch = 0;
1556        int rf, rfOriginal = rfCurrent;
1557        BOOL bOverwrapped = FALSE;
1558       
1559        DMW_MSC_LockUcm();
1560
1561        // rfCurrent validity check.
1562        // required??
1563        if (g_UCM_number <= 0) {
1564                DMW_MSC_UnlockUcm();
1565                return 0;
1566        }
1567
1568        while (1) 
1569        {
1570                // ¿øÇÏ´Â Á¤º¸¸¦ ãÀ» ¶§ ±îÁö ¹Ýº¹ÇÑ´Ù.
1571               
1572                // rfCurrentº¸´Ù ÀÛÀº ÃÖ´ë rf¸¦ ã´Â´Ù.
1573                rf = 0;
1574                for (i=0; i<g_UCM_number; i++) 
1575                {
1576                        if (g_bReserveUcmIndex0)
1577                                if(i==0) continue;
1578
1579                        if (g_UCM[i].RF < rfCurrent && g_UCM[i].RF > rf)
1580                                rf = g_UCM[i].RF;
1581                }
1582
1583                if (rf == 0) {  // not found using this rf. find from largest rf.
1584                        if (bOverwrapped)
1585                                break;
1586                        rfCurrent = 1000;
1587                        bOverwrapped = TRUE;
1588                        continue;
1589                }
1590
1591                if (bOverwrapped && rfCurrent <= rfOriginal) {
1592                        // not found in whole UCM. end loop.
1593                        break;
1594                }
1595
1596                nMatch = 0;
1597                for (i=0; i<g_UCM_number; i++) 
1598                {
1599                        if (g_bReserveUcmIndex0)
1600                                if(i==0) continue;
1601
1602                        if (g_UCM[i].RF != rf) continue;
1603                        if ((flag & CSF_Include_Disabled) == 0 && g_UCM[i].disabled) continue; // cafrii 101209
1604                        if ((flag & CSF_Include_Skipped) == 0 && g_UCM[i].Skipped) continue;  // cafrii, 030325
1605                        if ((flag & CSF_Mask_MF) == CSF_ATSC_Only && g_UCM[i].Service_type == 0) continue;
1606                        if ((flag & CSF_Mask_MF) == CSF_NTSC_Only && g_UCM[i].Service_type != 0) continue;
1607                        if ((flag & CSF_Include_PSI) == 0 && g_UCM[i].VctFlag == 0)     continue; 
1608
1609                    if (nMatch < szBuf && uidBuf)
1610                        uidBuf[nMatch] = g_UCM[i].Uid;
1611                    nMatch++;
1612                        //dprint(2, " find rf ucm: (%02d) %d-%d, %d %c[%03d]\n", i, g_UCM[i].Major, g_UCM[i].Minor,
1613                        //      g_UCM[i].RF, g_UCM[i].VctFlag ? 'v' : ' ', g_UCM[i].Uid);
1614                }
1615               
1616                if (nMatch > 0)
1617                        break;      // some ucm found.
1618                       
1619                rfCurrent = rf;
1620                       
1621        } // end of while
1622       
1623        DMW_MSC_UnlockUcm();
1624        return nMatch;
1625}
1626
1627
1628#if 0
1629_____________________()
1630#endif
1631
1632
1633// surf ä³Î °ü·Ã.. 3/21 Ãß°¡
1634//
1635//
1636
1637int DMW_MSC_Surf2Index(int surf)
1638{
1639        // surfIndex --> index (ucm).  require caller's UCM lock.
1640       
1641        int i, idx = -1;
1642       
1643        for (i=0; i<g_UCM_number; i++) 
1644        {
1645                if (g_bReserveUcmIndex0)
1646                        if(i==0) continue;
1647
1648                if (g_UCM[i].SurfIndex == surf)
1649                        idx = i;
1650        }
1651        return idx;
1652}
1653
1654int DMW_MSC_FindUidFromSurfIndex(int surf)
1655{
1656        // surfIndex --> uid
1657        // µ¿ÀÏÇÑ surfIndex°¡ ¿©·¯°³ ¹ß°ßµÉ °æ¿ì, Á¦ÀÏ ¸¶Áö¸·¿¡ ¹ß°ßµÈ ä³Î uid°¡ ¸®ÅϵȴÙ.
1658       
1659        int i, uid = -1;
1660        if (surf == 0) return 0;
1661       
1662        DMW_MSC_LockUcm();
1663        for (i=0; i<g_UCM_number; i++)
1664        {
1665                if (g_bReserveUcmIndex0)
1666                        if(i==0) continue;
1667
1668                if (g_UCM[i].SurfIndex != surf) continue;
1669               
1670                uid = g_UCM[i].Uid;
1671        }
1672        DMW_MSC_UnlockUcm();
1673        return uid;
1674}
1675
1676
1677UINT16 DMW_MSC_FindSurfIndexFromUid(int uid)
1678{
1679        // uid --> surfIndex
1680       
1681        int index;
1682        UINT16 surf;
1683       
1684        DMW_MSC_LockUcm();
1685        index = DMW_MSC_Uid2Index(uid);
1686
1687        if (index < 0) {
1688                DMW_MSC_UnlockUcm();
1689                return 0;
1690        }
1691        surf = g_UCM[index].SurfIndex;
1692        DMW_MSC_UnlockUcm();
1693        return surf;
1694}
1695
1696UINT16 DMW_MSC_FindMaxSurfIndex(int *returnUcmIndex)
1697{
1698        // *returnUcmIndex: max surfIndex¸¦ °¡Áö´Â channelÀÇ UCM index
1699        // return value: surfIndex
1700        // returnUcmIndex°¡ NonNullÀÏ °æ¿ì¿¡´Â callerÃø¿¡¼­ UcmLockÀ» ÇÊ¿ä·Î ÇÔ.
1701       
1702        int i;
1703        int maxidx = -1;
1704        UINT16 maxsurf = 0;
1705       
1706        DMW_MSC_LockUcm();
1707        for (i=0; i<g_UCM_number; i++) 
1708        {
1709                if (g_bReserveUcmIndex0)
1710                        if(i==0) continue;
1711
1712                //dprint(2, "i=%d SurfIndex=%d\n",i, g_UCM[i].SurfIndex);
1713       
1714                if (maxsurf < g_UCM[i].SurfIndex) 
1715                {
1716                        maxsurf = g_UCM[i].SurfIndex;  // ÇöÀç±îÁöÀÇ ÃÖ´ë surfIndex
1717                        maxidx = i;
1718                }
1719        }
1720        if (maxidx >= 0 && returnUcmIndex) *returnUcmIndex = maxidx;
1721       
1722        DMW_MSC_UnlockUcm();
1723        return maxsurf;
1724}
1725
1726UINT16 DMW_MSC_FindMinSurfIndex(int *returnUcmIndex)
1727{
1728        // *returnUcmIndex: min surfIndex¸¦ °¡Áö´Â channelÀÇ UCM index
1729        // return value: surfIndex
1730        // returnUcmIndex°¡ NonNullÀÏ °æ¿ì¿¡´Â callerÃø¿¡¼­ UcmLockÀ» ÇÊ¿ä·Î ÇÔ.
1731       
1732        int i;
1733        int minidx = -1;
1734        UINT16 minsurf = 65535;
1735       
1736        DMW_MSC_LockUcm();
1737        for (i=0; i<g_UCM_number; i++) 
1738        {
1739                if (g_bReserveUcmIndex0)
1740                        if(i==0) continue;
1741
1742                if (g_UCM[i].SurfIndex && minsurf > g_UCM[i].SurfIndex) {
1743                        minsurf = g_UCM[i].SurfIndex;
1744                        minidx = i;
1745                }
1746        }
1747        if (minidx >= 0 && returnUcmIndex) *returnUcmIndex = minidx;
1748       
1749        DMW_MSC_UnlockUcm();
1750        return minsurf;
1751}       
1752
1753
1754int DMW_MSC_FindSurfUp(int uidCurrent, int flag)
1755{
1756        // return uid.
1757       
1758        int i, index, uid;
1759        UINT16 surf, surf_start, max_surf;
1760
1761        DMW_MSC_LockUcm();
1762        index = DMW_MSC_Uid2Index(uidCurrent);
1763
1764        if (index < 0 || g_UCM[index].SurfIndex == 0)
1765        {
1766                dprint(0, "!! uid %d, idx %d is invalid or not surf ch.\n", uidCurrent, index);
1767                if (index < 0 || flag & CSF_IgnoreSurfOrder) 
1768                {
1769                        // find lowest index channel which is in surf list.
1770                        uid = -1;
1771                        for (i=0; i<g_UCM_number; i++) 
1772                        {
1773                                if (g_bReserveUcmIndex0)
1774                                        if(i==0) continue;
1775
1776                                if (!g_UCM[i].Skipped && g_UCM[i].SurfIndex) {
1777                                        uid = g_UCM[i].Uid;
1778                                        break;
1779                                }
1780                        }
1781                        if (uid < 0) dprint(0, "!! no surf channel!\n");
1782                        DMW_MSC_UnlockUcm();
1783                        return uid;
1784                }
1785                else {
1786                        // find nearest upper surf channel from uidCurrent (index).
1787                        uid = -1;
1788                        for (i=index+1; i!=index; i=(i+1)%g_UCM_number) 
1789                        {
1790                                if (g_bReserveUcmIndex0)
1791                                        if(i==0) continue;
1792
1793                                if (!g_UCM[i].Skipped && g_UCM[i].SurfIndex) {
1794                                        uid = g_UCM[i].Uid;
1795                                        break;
1796                                }
1797                        }
1798                        if (uid < 0) dprint(0, "!! no surf channel!\n");
1799                        DMW_MSC_UnlockUcm();
1800                        return uid;
1801                }
1802        }
1803       
1804        // uidCurrent is one of surf channel.
1805        if (flag & CSF_IgnoreSurfOrder) 
1806        {
1807                // just treat surfindex as binary.
1808                //  find nearest upper surf channel from index.
1809                dprint(2, "** ignore surf order\n");
1810                uid = -1;
1811                for (i=index+1; i!=index; i=(i+1)%g_UCM_number) 
1812                {
1813                        if (g_bReserveUcmIndex0)
1814                                if(i==0) continue;
1815
1816                        if (!g_UCM[i].Skipped && g_UCM[i].SurfIndex) break;
1817                }
1818                // ¸¸¾à ÀÌ ½ÃÁ¡¿¡¼­ index == iÀ̶ó¸é ´Ù¸¥ surf channelÀÌ Çϳªµµ ¾ø´Â °æ¿ìÀÌ´Ù.
1819                if (i==index) dprint(0, "!! not found any other surf channel!\n");
1820                uid = g_UCM[i].Uid;
1821                DMW_MSC_UnlockUcm();
1822                return uid;
1823        }
1824        else {
1825                // surf index °ªÀ» »ç¿ëÇÏ¿© ´ÙÀ½ upper surf index ä³ÎÀ» ã´Â´Ù.
1826                surf_start = g_UCM[index].SurfIndex;
1827                max_surf = DMW_MSC_FindMaxSurfIndex(NULL);
1828       
1829                // surf_index¸¦  surf+1, surf+2, ... ¼ø¼­·Î °è¼Ó ã¾Æº»´Ù.
1830                surf = (surf_start==max_surf) ? 1 : surf_start+1;
1831                dprint(2, "search from sid %d..\n", surf);
1832                for ( ; surf!=surf_start; surf = (surf==max_surf) ? 1 : surf+1) 
1833                {
1834                        //if (g_bReserveUcmIndex0)
1835                        //      if(i==0) continue;
1836
1837                        i = DMW_MSC_Surf2Index(surf);
1838                        if (i >= 0)
1839                                break;
1840                }
1841                if (surf == surf_start) {
1842                        dprint(0, "!! not found any other surf channel!\n");
1843                        i = index;
1844                }
1845                //else dprint(2, "found sid %d\n", surf);
1846                uid = g_UCM[i].Uid;
1847                DMW_MSC_UnlockUcm();
1848                return uid;
1849        }
1850}
1851
1852int DMW_MSC_FindSurfDown(int uidCurrent, int flag)
1853{
1854        // return uid.
1855       
1856        int i, index, uid;
1857        UINT16 surf, surf_start, max_surf;
1858       
1859        DMW_MSC_LockUcm();
1860        index = DMW_MSC_Uid2Index(uidCurrent);
1861
1862        if (index < 0 || g_UCM[index].SurfIndex == 0)
1863        {
1864                dprint(0, "!! uid %d, idx %d is invalid or not surf ch.\n", uidCurrent, index);
1865                if (index < 0 || flag & CSF_IgnoreSurfOrder) {
1866                        // find lowest index channel which is in surf list.
1867                        uid = -1;
1868                        for (i=0; i<g_UCM_number; i++) 
1869                        {
1870                                if (g_bReserveUcmIndex0)
1871                                        if(i==0) continue;
1872
1873                                if (!g_UCM[i].Skipped && g_UCM[i].SurfIndex) {
1874                                        uid = g_UCM[i].Uid;
1875                                        break;
1876                                }
1877                        }
1878                        if (uid < 0) dprint(0, "!! no surf channel!\n");
1879                        DMW_MSC_UnlockUcm();
1880                        return uid;
1881                }
1882                else {
1883                        // find nearest lower surf channel from uidCurrent (index).                     
1884                        uid = -1;
1885                        for (i=index-1; i!=index; i=(i-1+g_UCM_number)%g_UCM_number) 
1886                        {
1887                                if (g_bReserveUcmIndex0)
1888                                        if(i==0) continue;
1889
1890                                if (!g_UCM[i].Skipped && g_UCM[i].SurfIndex) {
1891                                        uid = g_UCM[i].Uid;
1892                                        break;
1893                                }
1894                        }
1895                        if (uid < 0) dprint(0, "!! no surf channel!\n");
1896                        DMW_MSC_UnlockUcm();
1897                        return uid;
1898                }
1899        }
1900       
1901        // uidCurrent is one of surf channel.
1902        if (flag & CSF_IgnoreSurfOrder) {
1903                uid = -1;
1904                for (i=index-1; i!=index; i=(i-1+g_UCM_number)%g_UCM_number) 
1905                {
1906                        if (g_bReserveUcmIndex0)
1907                                if(i==0) continue;
1908
1909                        if (!g_UCM[i].Skipped && g_UCM[i].SurfIndex) break;
1910                }
1911                if (i==index) dprint(0, "!! not found any other surf channel!\n");
1912                uid = g_UCM[i].Uid;
1913                DMW_MSC_UnlockUcm();
1914                return uid;
1915        }
1916        else {
1917                surf_start = g_UCM[index].SurfIndex;
1918                max_surf = DMW_MSC_FindMaxSurfIndex(NULL);
1919       
1920                // surf_index¸¦  surf-1, surf-2, ... ¼ø¼­·Î °è¼Ó ã¾Æº»´Ù.
1921                surf = (surf_start==1) ? max_surf : surf_start-1;
1922                for ( ; surf!=surf_start; surf = (surf==1) ? max_surf : surf-1) 
1923                {
1924                        //if (g_bReserveUcmIndex0)
1925                        //      if(i==0) continue;
1926
1927                        i = DMW_MSC_Surf2Index(surf);
1928                        if (i >= 0)
1929                                break;
1930                }
1931                if (surf == surf_start) {
1932                        dprint(0, "!! not found any other surf channel!\n");
1933                        i = index;
1934                }
1935                //else dprint(2, "found sid %d\n", surf);
1936                uid = g_UCM[i].Uid;
1937                DMW_MSC_UnlockUcm();
1938                return uid;
1939        }
1940}
1941
1942
1943
1944
1945
1946#if 0
1947______API_____________()
1948#endif
1949
1950STATUS (*g_fnUcmDeleteHook)(int idx);
1951        // channel delete hook entry function
1952
1953
1954
1955STATUS DMW_CDB_InitializeChannelLib(ChannelType type, int sizeExtension)
1956{
1957       
1958        if (sizeExtension < 0) sizeExtension = 0;
1959        if (sizeExtension > 32) sizeExtension = 32;
1960
1961#if 1
1962        // Custom ChannelTypeÀ» Ãß°¡ÇÑ °æ¿ì´Â ºñ±³ ±¸¹®À» ¼öÁ¤ÇØ¾ß ÇÑ´Ù.
1963        //
1964        if (type != ChannelType_Air && type != ChannelType_Cable) {
1965                dprint(0, "!! invalid channel type %d\n", type);
1966                return statusInvalidArgument;
1967        }
1968#endif
1969       
1970        if (g_CurChannelType != type)
1971        {
1972                DMW_CDB_ClearAll();  // ±âÁ¸ÀÇ UCmÀ» Æó±â.
1973
1974                if (g_sizeUcmExtension != sizeExtension) 
1975                {
1976                        DMW_MSC_LockUcm();
1977                        DHL_OS_Free((void**)&g_UCM);
1978                        g_UCM_max = 0;
1979                        *(int *)&g_sizeUcmExtension = sizeExtension;   
1980                        DMW_MSC_UnlockUcm();
1981                }
1982               
1983                // cafrii 040628 add
1984                //
1985                // µðÆúÆ® Frequency standard¸¦ Àû¿ë½ÃÄÑÁØ´Ù.
1986                // Cable MultiStandard¸¦ Áö¿øÇÏÁö ¾Ê´Â Application¿¡¼­´Â ½Å°æ¾²Áö ¾Ê°í
1987                // Air/Cable_Std µÎ°¡Áö¸¸ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï...
1988                //
1989                if (type == ChannelType_Air) {
1990                        DMW_HAL_SetChannelStandard(eDHL_FREQ_AIR);
1991                }
1992                else {
1993                        DMW_HAL_SetChannelStandard(eDHL_FREQ_STD); 
1994                        // ÀÏ´Ü STD_Cable·Î ¼³Á¤ÇÑ´Ù.
1995                        // ¸¸¾à STD ÀÌ¿ÜÀÇ ´Ù¸¥ ±Ô°ÝÀ» Áö¿øÇÑ´Ù¸é ÀÌ API ÀÌÈÄ¿¡ º°µµ·Î Change ÇÏ´Â API¸¦
1996                        // ´Ù½Ã È£ÃâÇØ¾ß ÇÑ´Ù.
1997                }
1998               
1999                *(ChannelType *)&g_CurChannelType = type;  // cafrii, 030322 ¹ö±×¼öÁ¤.
2000        }
2001        else {
2002                // cafrii 040628 add
2003                // channel number, PID °ªÀ» Context ÀúÀåÀÇ Å°·Î »ç¿ëÇϱ⠶§¹®¿¡
2004                // ¸ðµç FlattenµÈ Á¤º¸µµ »èÁ¦µÇ¾î¾ß ÇÑ´Ù.
2005                // DB Clear µÉ¶§ ¼öÇàµÇ±â´Â ÇÏÁö¸¸ channel typeÀº µ¿ÀÏÇѵ¥
2006                // Frequency std ¸¸ º¯°æµÇ´Â °æ¿ì¿¡´Â Ȥ UserÀÇ ½Ç¼ö·Î DB¸¦ Áö¿ìÁö ¾ÊÀ» ¼öµµ Àֱ⶧¹®..
2007                //
2008#if USE_FLATTEN_VIDEO
2009                DHL_VID_DeleteAllFlattenedInfo();
2010#endif
2011
2012        }
2013       
2014        return statusOK;
2015}
2016
2017STATUS  DMW_CDB_TerminateChannelLib()
2018{
2019        dprint(2, "TerminateChannelLib.\n");
2020               
2021        return statusOK;
2022}
2023
2024
2025
2026
2027//******************************************************************
2028//
2029//    Update Channel DB APIs
2030//
2031//
2032
2033
2034// channel DB¿Í °ü·ÃÀÖ´Â broadcast typeÀº Air/CableÀε¥,
2035// ÇöÀç ¸Þ¸ð¸®¿¡´Â ÇÑ Á¾·ùÀÇ channel DB¸¸ ¿Ã¶ó¿Ã¼ö ÀÖ´Ù.
2036// ¹°·Ð NvRAM¿¡´Â µÎ Á¾·ù ´Ù ÀúÀåµÇ¾î ÀÖÀ» ¼ö ÀÖ´Ù.
2037
2038
2039//--------------------------------------------------
2040//  initialize channel DB
2041//
2042STATUS DMW_CDB_ClearAll()
2043{
2044        int i;
2045       
2046        DMW_MSC_LockUcm();
2047
2048        // DMW_CDB_DeleteUcmChannel ÀÌ ÇÔ¼ö¸¦ °¢ entryº°·Î °¢°¢ ºÎ¸£¸é ¸Å¹ø delete ÇÒ ¶§¸¶´Ù
2049        // DB sortingÀ» ¼öÇàÇϱ⠶§¹®¿¡ ºÎÇϰ¡ ¸¹´Ù.
2050        // µû¶ó¼­ ¸ðµç DB¸¦ ´Ù Áö¿ì´Â ÀÌ·± ÇÔ¼ö°°Àº °æ¿ì¿¡´Â µû·Î Äڵ带 ÀÛ¼ºÇÑ´Ù.
2051        //
2052        if (g_fnUcmDeleteHook) {
2053                // delete hookÀÌ ÀÖ´Â °æ¿ì¿¡¸¸ °¢ entryº° 󸮸¦ ÇÏ¸é µÈ´Ù.
2054                // delete hookÀÌ ¾ø´Ù¸é ±×³É UCM ¿µ¿ª¸¸ Áö¿ö¹ö¸®¸é µÈ´Ù.
2055
2056                for (i=g_UCM_number-1; i>=0; i--) {
2057                        g_fnUcmDeleteHook(i);
2058                }
2059        }
2060       
2061        // cafrii 041126 add
2062        //for (i=g_UCM_number-1; i>=0; i--)
2063        //      DMW_CDB_DeleteUcmCsd(i);
2064        DMW_CDB_DeleteAllUcmCsd();   // cafrii 041127 fix.. more efficient
2065       
2066        g_UCM_number = 0;
2067        // ÇÒ´çµÈ ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÏÁö´Â ¾Ê´Â´Ù. ´Ù½Ã »ç¿ëµÉ °æ¿ì¸¦ ´ëºñÇØ¼­ ±×³É µÐ´Ù.
2068
2069        // index 0¿¡ ´ëÇÑ Æ¯º°ÇÑ °æ¿ìµµ ÀÌ ÇÔ¼ö¿¡¼­´Â ½Å°æ¾²Áö ¾Ê´Â´Ù.
2070        // caller¿¡¼­ ÇÊ¿äÇÑ °æ¿ì Ãß°¡·Î assine ÇÏ¸é µÈ´Ù.
2071       
2072        DMW_MSC_UnlockUcm();
2073
2074        // cafrii 060630 add
2075        // channel number, PID °ªÀ» Context ÀúÀåÀÇ Å°·Î »ç¿ëÇϱ⠶§¹®¿¡
2076        // ¸ðµç FlattenµÈ Á¤º¸µµ »èÁ¦µÇ¾î¾ß ÇÑ´Ù.
2077        //
2078#if USE_FLATTEN_VIDEO
2079        DHL_VID_DeleteAllFlattenedInfo();
2080#endif
2081
2082        return statusOK;
2083}
2084
2085
2086
2087//------------------------------
2088//  DMW_CDB_UpdateDB
2089//
2090// TV ½Ãû Áß¿¡ ÇöÀç RF ÀÇ Ã¤³ÎÀ» ´Ù½Ã °Ë»öÇÏ´Â ÇÔ¼ö.
2091// ÀÌ¹Ì tuningÀº µÇ¾î Àֱ⠶§¹®¿¡ Tuner ¼³Á¤Àº ÇÏÁö ¾ÊÀ¸¸ç, ´ÜÁö table ¸¸ ´Ù½Ã ¹Þ´Â´Ù.
2092//
2093// ¿©±â¼­ ÁöÁ¤ÇÏ´Â rf´Â ½ÇÁ¦·Î tuner¸¦ settingÇϱâ À§ÇÑ °ÍÀÌ ¾Æ´Ï°í,
2094// updateÇÒ DBÀÇ ÇÊ¿äÇÑ ÀÚ·á·Î¼­ ³Ñ°ÜÁÖ´Â °ÍÀÌ´Ù. µû¶ó¼­ ¹Ýµå½Ã Á¤È®ÇÑ RF¸¦ ³Ñ°ÜÁà¾ß ÇÑ´Ù.
2095//
2096// ÀϺΠTuner ¸ðµâÀº ¾Æ³¯·Î±×¿Í µðÁöÅÐ Æ©´×ÀÌ ¿ÏÀüÈ÷ ±¸ºÐµÇ¾î »ç¿ëµÇ¾î¾ß Çϴµ¥,
2097// ÀÌ °æ¿ì ¸¸¾à ÇöÀç ¾Æ³¯·Î±×¸¦ ½ÃûÁßÀ̶ó¸é µðÁöÅÐ °Ë»öÀÌ ºÒ°¡´ÉÇϸç
2098// ÇöÀç µðÁöÅÐÀ» ½ÃûÁßÀ̶ó¸é ¾Æ³¯·Î±× °Ë»öÀº ºÒ°¡´ÉÇÏ´Ù.
2099// Áï, scan_flagÀÇ ¸ðµç °ªÀÌ ´Ù ¹Ý¿µµÇÁö ¸øÇÏ´Â °æ¿ì°¡ ÀÖ´Ù.
2100//
2101//
2102STATUS DMW_CDB_UpdateDB(int rf, int scan_flag, int *pnUid, int **puidBuf)
2103{
2104
2105        // ÀÌ ÇÔ¼ö´Â ´õÀÌ»ó Áö¿øÇÏÁö ¾Ê´Â´Ù.
2106        return statusNotImpl;
2107}
2108
2109
2110
2111
2112
2113//------------------------------
2114//  DMW_CDB_ScanChannel
2115//
2116// Autoscan ÇÔ¼öÀÇ one-channel ¹öÀü.
2117// ²À TV Stop »óÅ¿¡¼­ call µÇ¾î¾ß ÇÔ. (Æ©³Ê¸¦ »õ·Î ¼³Á¤Çϱ⠶§¹®..)
2118// »ç¿ëÀÚ°¡ ÁöÁ¤ÇÑ Air/Cable Ç÷¡±×´Â ¹«½ÃµÊ. ÇöÀçÀÇ ChannelType »óÅ ¾È¿¡¼­ µ¿ÀÛÇÑ´Ù.
2119// NTSC/VSB/QAM Ç÷¡±×´Â »ç¿ëµÈ´Ù.
2120//
2121// DMW_CDB_ScanChannel °ú DMW_CDB_ScanChannelEx ÀÇ ±¸ºÐÀ» ¾ø¾Ö°í
2122// DMW_CDB_ScanChannel ·Î ÅëÀÏÇÑ´Ù.
2123// Argument°¡ Ãß°¡µÇ¾úÀ½¿¡ À¯ÀÇ.
2124
2125STATUS DMW_CDB_ScanChannel(int rf, int flag, ChannelScanCallback eventcb, 
2126                                                                int *pnUid, int **puidBuf)
2127{
2128        // DMW_ASC_ScanChannel¿¡¼­ Áö¿øÇÑ´Ù.
2129        //
2130        return statusNotImpl;
2131}
2132
2133#if 0
2134// ¾Æ·¡ ÇÔ¼ö°¡ Á¤¸®µÉ ¶§ ±îÁö block
2135STATUS DMW_CDB_UpdateUcmFromTvct(tvctPtr_t tvct, int rf, int scan_flag, int *pnUid, int **puidBuf)
2136{
2137        return update_ucm_from_tvct(tvct, rf, scan_flag, pnUid, puidBuf);
2138}
2139
2140STATUS DMW_CDB_UpdateUcmFromCvct(cvctPtr_t cvct, int rf, int scan_flag, int *pnUid, int **puidBuf)
2141{
2142        return update_ucm_from_cvct(cvct, rf, scan_flag, pnUid, puidBuf);
2143}
2144#endif
2145
2146/*
2147        ÀÌ ÇÔ¼ö´Â ÀÌ¹Ì Áغñ µÈ psi/psip Å×À̺íÀ» ÀÌ¿ëÇÏ¿© ch update¸¦ ¼öÇàÇÑ´Ù.
2148       
2149*/
2150STATUS DMW_CDB_UpdateChannel(xvctPtr_t vct, MPEG_PAT *pat, MPEG_PMT **pmtlist, 
2151                                                int rf, int scan_flag, 
2152                                                int *pnUid, int **puidBuf)
2153{
2154        return SCN_UpdateUcmVct(vct, pat, pmtlist, rf, scan_flag, pnUid, puidBuf);
2155}
2156
2157
2158int DMW_CDB_MakeNewUcm(int major, int minor, int rf, int vf, int st)
2159{
2160        // do not call this function unless you know what this function does..
2161        // ¸®ÅϵǴ idx °ªÀ» »ç¿ëÇÏ·Á¸é callerÂÊ¿¡¼­µµ ¸¶Âù°¡Áö·Î UcmLockÀ» ÇØ¾ß ÇÑ´Ù.
2162       
2163        int idx;
2164       
2165        DMW_MSC_LockUcm();
2166        idx = insert_ucm(major, minor, rf, vf);
2167        if (g_UCM && idx >= 0) {
2168                g_UCM[idx].Service_type = (st & 3);
2169                g_UCM[idx].Uid          = make_new_ucm_uid_counter();
2170        }
2171        DMW_MSC_UnlockUcm();
2172        return idx;
2173}
2174
2175
2176void *DMW_CDB_RegisterUcmDeleteHook(STATUS (*fn)(int idx))
2177{
2178        void *oldfn;
2179       
2180        dprint(2, "RegisterUcmDeleteHook: %x\n", fn);
2181       
2182        oldfn = (void *)g_fnUcmDeleteHook;
2183        g_fnUcmDeleteHook = fn;
2184       
2185        return (void *) oldfn;
2186                // ¸®ÅϵǴ °ªÀº previous hook function. caller´Â ÀÌ °ªÀ» ±â¾ïÇß´Ù°¡
2187                // hook functionÀÌ callµÇ¸é ¸Ç ³ªÁßÀÌ ÀÌÀü previous hookÀ» È£ÃâÇØ¼­
2188                // call chainÀÌ ²÷¾îÁöÁö ¾Êµµ·Ï ÇØ¾ß ÇÑ´Ù.
2189}
2190
2191STATUS DMW_CDB_DeleteUcmChannel(int idx)
2192{
2193        // ÇØ´ç indexÀÇ ucmÀ» Áö¿î´Ù.
2194        //
2195        // ÀÌ ÇÔ¼ö´Â ±²ÀåÈ÷ ÁÖÀÇÇØ¼­ »ç¿ëÇϱ⠹ٶ÷.
2196        // AutoscanÀÇ ¸¶Áö¸· °úÁ¤ À̿ܿ¡ UCMÀ» Áö¿ì´Â °ÍÀº ±ÇÀåµÇÁö ¾Ê´Â´Ù.
2197        //
2198        // Áö¿î ÈÄ¿¡µµ ¿À¸§Â÷¼ø Á¤·ÄÀ» À¯ÁöÇϸç, ºó ÀÚ¸®´Â shiftµÇ¾î ¸Þ²ãÁø´Ù.
2199
2200        // extern STATUS DMW_EPG_DeleteCurrentChannel(int idx);
2201       
2202        int i;
2203        if (!g_UCM || idx < 0 || idx >= g_UCM_number)
2204                return statusOutOfRange;
2205
2206        if (g_bReserveUcmIndex0 && idx == 0) {
2207                dprint(0, "!! Deleting UCM[0] not allowed..\n");
2208                return statusInvalidArgument;   
2209        }
2210       
2211        dprint(2, "DeleteUcmItem(idx %d, uid %d) --> total ucm number %d\n",
2212                idx, g_UCM[idx].Uid, g_UCM_number-1);
2213       
2214        if (g_fnUcmDeleteHook == NULL) {
2215                if (g_UCM[idx].pEpgDB)
2216                        dprint(0, "!! Warning: EPG DB link exist, but fnUcmDeleteHook not registerred\n");
2217        }
2218        else {
2219                g_fnUcmDeleteHook(idx);
2220        }
2221       
2222        // cafrii 041126 add
2223        DMW_CDB_DeleteUcmCsd(idx);
2224       
2225        // idx¸¦ Áö¿ì´Â°Å´Ï±î idx+1 ºÎÅÍ ³¡±îÁö¸¦ ÇÑÄ­¾¿ ¾ÕÀ¸·Î À̵¿..
2226        for (i=idx+1; i<g_UCM_number; i++)
2227                g_UCM[i-1] = g_UCM[i];      // byte copy
2228
2229        g_UCM_number--;
2230        return statusOK;
2231}
2232
2233// Uid·Î ÁöÁ¤ÇÏ¿© UCM itemÀ» Çϳª Áö¿î´Ù.
2234//
2235STATUS DMW_CDB_DeleteChanInfoUid(UINT16 uid)
2236{
2237        int i;
2238        DMW_MSC_LockUcm();
2239       
2240        i = DMW_MSC_Uid2Index(uid);
2241        if (i >= 0)
2242                DMW_CDB_DeleteUcmChannel(i);
2243
2244        DMW_MSC_UnlockUcm();
2245       
2246        return (i>=0) ? statusOK : statusChannelNotFound;
2247}
2248
2249
2250// delete channel information of specified RF channel
2251//
2252STATUS DMW_CDB_DeleteRFChanInfo(int RF_number)
2253{
2254        int i;
2255
2256        if (!g_UCM) return statusOK;
2257               
2258        DMW_MSC_LockUcm();
2259
2260        for (i=0; i<g_UCM_number; i++)
2261        {
2262                if (g_bReserveUcmIndex0)
2263                        if(i==0) continue;
2264
2265                if (g_UCM[i].RF == RF_number)
2266                {
2267                        DMW_CDB_DeleteUcmChannel(i); // ¾È¿¡¼­ UCM_numberµµ °¨¼ÒÇØ¾ß ÇÔ..
2268                        i--;  // ÇöÀç°ÍÀÌ Áö¿öÁ³À¸´Ï±î, ÇöÀç indexºÎÅÍ ´Ù½Ã ½ÃÀÛ.
2269                }
2270        }
2271
2272        DMW_MSC_UnlockUcm();
2273
2274        return statusOK;
2275}
2276
2277// delete channel information of specified major number
2278STATUS DMW_CDB_DeleteMajorChanInfo(int major_number)
2279{
2280        int i;
2281
2282        if (!g_UCM) return statusOK;
2283
2284        DMW_MSC_LockUcm();
2285
2286        for (i=0; i<g_UCM_number; i++)
2287        {
2288                if (g_bReserveUcmIndex0)
2289                        if(i==0) continue;
2290
2291                if (g_UCM[i].Major > major_number) // ¿À¸§Â÷¼ø Á¤·ÄÀ̹ǷΠ´õ ÀÌ»ó ÁøÇà ºÒÇÊ¿ä.
2292                        break;
2293
2294                if (g_UCM[i].Major == major_number && g_UCM[i].VctFlag)
2295                {
2296                        DMW_CDB_DeleteUcmChannel(i); // ¾È¿¡¼­ UCM_numberµµ °¨¼ÒÇØ¾ß ÇÔ..
2297                        i--;  // ÇöÀç°ÍÀÌ Áö¿öÁ³À¸´Ï±î, ÇöÀç indexºÎÅÍ ´Ù½Ã ½ÃÀÛ.
2298                }
2299        }
2300
2301        DMW_MSC_UnlockUcm();
2302
2303        return statusOK;
2304}
2305
2306
2307// delete channel information of specified major number
2308STATUS DMW_CDB_DeleteMajorMinorChanInfo(int major, int minor)
2309{
2310        int i;
2311        if (!g_UCM) return statusOK;
2312
2313        DMW_MSC_LockUcm();
2314
2315        for (i=0; i<g_UCM_number; i++)
2316        {
2317                if (g_bReserveUcmIndex0)
2318                        if(i==0) continue;
2319                               
2320                if (g_UCM[i].Major > major) // ¿À¸§Â÷¼ø Á¤·ÄÀ̹ǷΠ´õ ÀÌ»ó ÁøÇà ºÒÇÊ¿ä.
2321                        break;
2322
2323                if (g_UCM[i].Major == major && g_UCM[i].Minor == minor && g_UCM[i].VctFlag)
2324                {
2325                        DMW_CDB_DeleteUcmChannel(i); // ¾È¿¡¼­ UCM_numberµµ °¨¼ÒÇØ¾ß ÇÔ..
2326                        i--;  // ÇöÀç°ÍÀÌ Áö¿öÁ³À¸´Ï±î, ÇöÀç indexºÎÅÍ ´Ù½Ã ½ÃÀÛ.
2327                }
2328        }
2329
2330        DMW_MSC_UnlockUcm();
2331
2332        return statusOK;
2333}
2334
2335
2336STATUS DMW_CDB_DeleteAllAnalogChannel()
2337{
2338        // Digital only STBÀÇ °æ¿ì VCT¿¡¼­ ÃßÃâµÈ analog ä³Î Á¤º¸°¡ Çʿ䰡 ¾øÀ¸¹Ç·Î
2339        // ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ »èÁ¦ÇÒ ¼ö ÀÖ´Ù.
2340        // StartScan()ÀÇ scanComplete message callback¿¡¼­ ÀÌ ÇÔ¼ö¸¦ ºÒ·¯ÁÖ¸é µÈ´Ù.
2341        //
2342        // ¶Ç´Â ¾Æ¿¹ StartScan()¿¡¼­ VCTÀÇ analog¸¦ skipÇÏ´Â ¹æ¹ýµµ °í·ÁÇØ º¼ ¼ö ÀÖ´Ù.
2343        // À§ µÎ°¡Áö ¹æ¹ýÀ» °â¿ëÇÏ´Â °Íµµ ¾ÈÀüÀ» À§Çؼ­ ¼±ÅÃÇÒ ¼ö ÀÖ´Â ÁÁÀº ¹æ¹ýÀÓ.
2344        //
2345        int i;
2346        if (!g_UCM) return statusOK;
2347
2348        DMW_MSC_LockUcm();
2349
2350        for (i=0; i<g_UCM_number; i++)
2351        {
2352                if (g_UCM[i].Service_type == 0) {
2353                        DMW_CDB_DeleteUcmChannel(i); // ¾È¿¡¼­ UCM_numberµµ °¨¼ÒÇØ¾ß ÇÔ..
2354                        i--;  // ÇöÀç°ÍÀÌ Áö¿öÁ³À¸´Ï±î, ÇöÀç indexºÎÅÍ ´Ù½Ã ½ÃÀÛ.
2355                }
2356        }
2357        DMW_MSC_UnlockUcm();
2358       
2359        return statusOK;
2360}
2361
2362void DMW_CDB_DeleteDisabledChannel(void)
2363{
2364        int i;
2365        if (!g_UCM) return;
2366
2367        DMW_MSC_LockUcm();
2368
2369        for (i=0; i<g_UCM_number; i++)
2370        {
2371                if (g_UCM[i].disabled)  {
2372                        DMW_CDB_DeleteUcmChannel(i); // ¾È¿¡¼­ UCM_numberµµ °¨¼ÒÇØ¾ß ÇÔ..
2373                        i--;  // ÇöÀç°ÍÀÌ Áö¿öÁ³À¸´Ï±î, ÇöÀç indexºÎÅÍ ´Ù½Ã ½ÃÀÛ.
2374                }
2375        }
2376        DMW_MSC_UnlockUcm();
2377}
2378
2379// insert a channel in Surf channel link
2380// add flag parameter to support skipped channel! leon 2003.10.9
2381        // currently supported flag is only CSF_Default or CSF_Include_Skipped.
2382        //      CSF_Default: not include skipped
2383        //      CSF_Include_Skipped: include skipped   
2384STATUS DMW_CDB_SetSurfChannel(int index, int prev_index)
2385{
2386        // prev_indexÀÇ Ã¤³ÎÀÌ surf ä³ÎÀÌ¸é ±× surf_index ´ÙÀ½ ¹øÈ£·Î ¼¼ÆÃ.
2387        // prev_indexÀÇ Ã¤³ÎÀÌ surf ¸®½ºÆ®¿¡ ¾ø´Â ä³ÎÀÌ¸é ¸ÇóÀ½¿¡ Ãß°¡.
2388        // prev_index == -1À̸é surf list ¸Ç óÀ½¿¡ Ãß°¡.
2389        // prev_index == -2À̸é surf list ¸Ç ¸¶Áö¸·¿¡ Ãß°¡.
2390
2391        //
2392        int surfindex, i;
2393       
2394        if (index < 0 || index >= g_UCM_number)
2395                return statusInvalidArgument;
2396               
2397        #if 0//leon 2003.10.9  skipped channelµµ surf¿¡ Ãß°¡ÇÒ¼öÀÖµµ·Ï
2398                if (g_UCM[index].Skipped)
2399                        return statusSkippedChannel;
2400        #endif
2401       
2402        if (g_UCM[index].SurfIndex)
2403                DMW_CDB_ReleaseSurfChannel(index); // ¸ÕÀú Áö¿ìÀÚ.
2404               
2405        // surfIndex´Â 1ºÎÅÍ ½ÃÀÛÇÏ´Â °ªÀÌ´Ù.
2406        if (prev_index == -1)
2407                surfindex = 1;
2408        else if (prev_index == -2)
2409                surfindex = DMW_MSC_FindMaxSurfIndex(NULL) + 1;  // Çϳªµµ ¾øÀ¸¸é 1 (¸ÇóÀ½)
2410        else if (prev_index < 0 || prev_index >= g_UCM_number)
2411                surfindex = 1;    // first channel in surf list.
2412        else {
2413                surfindex = g_UCM[prev_index].SurfIndex + 1;
2414                        // prev_index°¡ surf list¿¡ ¾ø´Â °ÍÀ̸é 1¹øºÎÅÍ ¹øÈ£¸Å±è.
2415        }
2416       
2417        // 'surfindex' ÀÌÈÄÀÇ ¸ðµç surfindexµéÀ» Çϳª¾¿ µÚ·Î ¹Ì·é´Ù.
2418        for (i=0; i<g_UCM_number; i++) 
2419        {
2420                if (g_bReserveUcmIndex0)
2421                        if(i==0) continue;
2422
2423                if (g_UCM[i].SurfIndex && g_UCM[i].SurfIndex >= surfindex) {
2424                        g_UCM[i].SurfIndex++;
2425                }
2426        }
2427       
2428        g_UCM[index].SurfIndex = surfindex;
2429        //g_maxSufIndex++;
2430        return statusOK;
2431}
2432
2433// delete a channel in Surf channel link
2434STATUS DMW_CDB_ReleaseSurfChannel(int index)
2435{
2436        int surfindex, i;
2437        if (index < 0 || index >= g_UCM_number)
2438                return statusInvalidArgument;
2439
2440        surfindex = g_UCM[index].SurfIndex;
2441        g_UCM[index].SurfIndex = 0;
2442       
2443        if (surfindex) {
2444                // 'surfindex' ÀÌÈÄÀÇ ¸ðµç surfindexµéÀ» Çϳª¾¿ µÚ·Î ¹Ì·é´Ù.
2445                for (i=0; i<g_UCM_number; i++) {
2446                        if (g_UCM[i].SurfIndex && g_UCM[i].SurfIndex > surfindex) {
2447                                g_UCM[i].SurfIndex--;
2448                        }
2449                }
2450        }
2451        return statusOK;
2452}
2453
2454
2455// set a channel as active channel
2456STATUS DMW_CDB_SetFavChannel(int index)
2457{
2458        if (index < 0 || index >= g_UCM_number)
2459                return statusInvalidArgument;
2460
2461        g_UCM[index].Skipped = FALSE;
2462        return statusOK;
2463}
2464
2465// set a channel as inactive channel
2466STATUS DMW_CDB_ReleaseFavChannel(int index)
2467{
2468        if (index < 0 || index >= g_UCM_number)
2469                return statusInvalidArgument;
2470               
2471        DMW_CDB_ReleaseSurfChannel(index);
2472        g_UCM[index].Skipped = TRUE;
2473       
2474        return statusOK;
2475}
2476
2477
2478// cafrii 060630 add
2479void DMW_CDB_InvalidateAllPidInfo(void)
2480{
2481        int i;
2482
2483        dprint(2, "invalidate all pids info\n");
2484       
2485        DMW_MSC_LockUcm();
2486       
2487        for (i=0; i<g_UCM_number; i++)
2488        {
2489                g_UCM[i].Video_pid = DMW_PID_NO_INFO;
2490                g_UCM[i].Audio_pid = DMW_PID_NO_INFO;
2491                g_UCM[i].Pcr_pid = DMW_PID_NO_INFO;
2492                g_UCM[i].pmt_pid = DMW_PID_NO_INFO;
2493        }
2494
2495        // NvRam¿¡ ÀúÀå ºÒÇÊ¿ä. PID Á¤º¸´Â ÀúÀå ´ë»ó ¾Æ´Ô..
2496
2497        DMW_MSC_UnlockUcm();   
2498}
2499
2500
2501#if 0
2502______Tune____________()
2503#endif
2504
2505
2506
2507// cafrii 041202 add new API..
2508//
2509STATUS DMW_TUN_TuneChannelByUidAndFlag(UINT16 uid, UINT32 flag,
2510                BOOL bWaitCompletion, ChannelTuneCallback fn, UINT32 userparam)
2511{
2512        // RfTuneÀÇ flag ¼³Á¤À» ÀÌ¿ëÇÏ¿© UID TuneÀ» ÇÑ´Ù.
2513        // »ç½Ç UidTuneÀº DBÀÇ °ªÀ» ÀÌ¿ëÇϰí, Retry ±â´ÉÀ» »ç¿ëÇÏÁö ¾Ê´Â RfTune°ú µ¿ÀÏÇÔ.
2514        // ´Ü,
2515        // RfTune¿¡¼­´Â Prescan PID¸¦ »ç¿ëÇÏÁö ¾ÊÀ¸¹Ç·Î bSkipPids´Â Ç×»ó TRUE·Î µ¿ÀÛÇÑ´Ù.
2516       
2517        TuneParam tuneParam_0, *tuneParam = &tuneParam_0;
2518        int index;
2519       
2520        //bSkipPrescanPids = TRUE;
2521        // UID tuneÀ» ÇÒ ¶§¿¡´Â PID Á¤º¸¸¦ ÃÖ´ëÇÑ ÀÌ¿ëÇÏ¸é ¼º´É¿¡ µµ¿òÀÌ µÈ´Ù.
2522       
2523    DMW_MSC_LockUcm();
2524        index = DMW_MSC_Uid2Index(uid);
2525        if (index >= 0)
2526        {
2527                memset(tuneParam, 0, sizeof(TuneParam));
2528
2529                tuneParam->rf = g_UCM[index].RF;
2530                //tuneParam->tuneRequired = TRUE;
2531                tuneParam->type = (ModulationType) g_UCM[index].Service_type;
2532
2533                // cafrii 060630 change
2534                if ((flag & CTF_SkipPrescanPidInfo) == 0) // if NOT skip,
2535                {
2536                        // ¾î´À ÇϳªÀÇ pid¶óµµ NO_INFO°¡ ÀÖÀ¸¸é pid Æ©´×Àº »ç¿ë ºÒ°¡..
2537                        //
2538                        // todo.. 070201 to check
2539                        //   ¿©±â¼­ pmt_pidµµ üũ ÇØ¾ß Çϴ°¡?
2540                        //
2541                        if (g_UCM[index].Video_pid == DMW_PID_NO_INFO ||
2542                                g_UCM[index].Audio_pid == DMW_PID_NO_INFO ||
2543                                g_UCM[index].Pcr_pid == DMW_PID_NO_INFO)
2544                        {
2545                                dprint(0, "!! no info pid exist. skip prescan pid info..\n");
2546                                tuneParam->vidPid = tuneParam->audPid = tuneParam->pcrPid = 0;
2547                                flag |= CTF_SkipPrescanPidInfo;
2548                        }
2549                        else {
2550                        tuneParam->vidPid = g_UCM[index].Video_pid;
2551                        tuneParam->audPid = g_UCM[index].Audio_pid;
2552                        tuneParam->pcrPid = g_UCM[index].Pcr_pid;
2553                        tuneParam->vidType = g_UCM[index].Video_type;
2554                        tuneParam->audType = g_UCM[index].Audio_type;
2555                }
2556        }
2557        tuneParam->flag = flag;
2558        tuneParam->flag = (tuneParam->flag & ~CTF_Mask_Tuning) |
2559                                                (g_UCM[index].VctFlag ? CTF_VCTOnly : CTF_PSIOnly);
2560               
2561                // CTF_TunerAutoFreqAdjust ´Â »ç¿ëÇÏÁö ¾Ê´Â´Ù. (ÇÊ¿äÇϸé Ãß°¡..)
2562                //tuneParam->flag |= CTF_ShowHiddenChannelAlso;
2563               
2564                if (g_UCM[index].Minor == ONE_PART_CHANNEL_INDICATOR) { // this is one part channel number
2565                        tuneParam->major = g_UCM[index].Major;  // only in VCT
2566                        tuneParam->minor = g_UCM[index].Minor;
2567                }
2568                else {
2569                        tuneParam->major = g_UCM[index].Major;  // only in VCT
2570                        tuneParam->minor = g_UCM[index].Minor;
2571                }
2572                tuneParam->progNumber = g_UCM[index].Prog_number;  // only in PSI
2573               
2574#if 1
2575                // cafrii 050305 bugfix..
2576                tuneParam->freqOffset = g_UCM[index].freqOffset;
2577#else
2578                if(tuneParam->type == 0){
2579                        tuneParam->freqOffset = g_UCM[index].freqOffset;
2580                }else{
2581                        tuneParam->freqOffset = 0;
2582                }
2583#endif
2584        }
2585    DMW_MSC_UnlockUcm();
2586
2587    if (index < 0) {  // no such Uid exist.
2588        dprint(0, "!! invalid Uid %d. stop!\n", uid);
2589        return statusChannelNotFound;
2590    }
2591       
2592        dprint(2, "Call RfTune: rf %d, type %d, offset %d, %d-%d, #%d\n", 
2593                                tuneParam->rf, tuneParam->type, tuneParam->freqOffset,
2594                                tuneParam->major, tuneParam->minor, tuneParam->progNumber);
2595                               
2596        return Dmc_ChangeRfChannelByTuneParam(tuneParam, bWaitCompletion, (void *)fn, userparam);
2597}
2598
2599
2600// cafrii 041202, redesign using new API.. more simple..
2601//
2602STATUS DMW_TUN_TuneChannelByUid(UINT16 uid, BOOL bSkipPrescanPids, 
2603                BOOL bWaitCompletion, ChannelTuneCallback fn, UINT32 userparam)
2604{
2605        UINT32 flag = 0;
2606       
2607        if (bSkipPrescanPids)
2608                flag |= CTF_SkipPrescanPidInfo;
2609               
2610        return DMW_TUN_TuneChannelByUidAndFlag(uid, flag, bWaitCompletion, fn, userparam);
2611}
2612
2613
2614
2615
2616#if 0
2617______Backup____________()
2618#endif
2619
2620
2621//----------------------------------------------------------------
2622// cafrii 031205, add UCM CORE functionalities..
2623//
2624UCM_CORE *DMW_CDB_BackupUcmCore()
2625{
2626        // if NULL, memory resource is not sufficient to allocate memory..
2627        // caller should free this memory after use
2628
2629        int i;
2630        UCM_CORE *core = NULL;
2631        UCM_CORE_ENTRY *uc = NULL;
2632
2633        DMW_MSC_LockUcm();
2634       
2635        if (g_UCM_number) {
2636                uc = (UCM_CORE_ENTRY *) DHL_OS_Malloc(sizeof(UCM_CORE_ENTRY) * g_UCM_number);
2637                if (uc == NULL) {
2638                        dprint(0, "!! Out of memory in BackupUcmCore\n");
2639                        goto end_of_function;
2640                }
2641        }
2642               
2643        core = (UCM_CORE *) DHL_OS_Malloc(sizeof(UCM_CORE));
2644        if (core == NULL) {
2645                dprint(0, "!! Out of memory in BackupUcmCore\n");
2646                DHL_OS_Free((void**)&uc);
2647                goto end_of_function;
2648        }
2649
2650        core->num = g_UCM_number;
2651        core->entry = uc;  // entry may be NULL if g_UCM_number is zero.
2652
2653        for (i=0; i<g_UCM_number; i++) {
2654                uc[i].rf    = g_UCM[i].RF;
2655                uc[i].major = g_UCM[i].Major;
2656                uc[i].minor = g_UCM[i].Minor;
2657                uc[i].skip  = g_UCM[i].Skipped;
2658                uc[i].surf = g_UCM[i].SurfIndex;
2659                uc[i].block = g_UCM[i].blocked;
2660        }
2661
2662end_of_function:
2663       
2664        DMW_MSC_UnlockUcm();
2665       
2666        return core;  // it may be NULL..
2667}
2668
2669void TestPrintUcmCore(UCM_CORE *core)
2670{
2671        int k;
2672        for (k=0; core && core->entry && k<core->num; k++) {
2673                UCM_CORE_ENTRY *uc = core->entry;
2674                DHL_OS_Printf("   [%d] rf %d, %d-%d  skip %d, surf %d, block %d\n", 
2675                        k, (int)uc[k].rf, (int)uc[k].major, (int)uc[k].minor,
2676                        (int)uc[k].skip, (int)uc[k].surf, (int)uc[k].block);
2677        }
2678}
2679
2680STATUS DMW_CDB_UpdateUcmCore(UCM_CORE *core)
2681{
2682        // update UCM core so that channel parameters can be unchanged..
2683        UCM_CORE_ENTRY *uc;
2684        int i, k;
2685
2686        if (core == NULL) 
2687                return statusInvalidArgument;
2688
2689        //dprint(1, "UpdateUcmCore(%x, %d, %x)\n", core, core->num, core->entry);
2690       
2691        if (core->num == 0) {
2692                dprint(2, "  No entries in UcmCore. \n");
2693                return statusOK;  // updateÇÒ µ¥ÀÌÅͰ¡ ¾ø´Ù.
2694        }
2695       
2696        DMW_MSC_LockUcm();
2697        for (k=0; k<core->num; k++) {
2698               
2699                uc = core->entry;
2700               
2701                //dprint(2, "   [%d] rf %d, %d-%d  skip %d, surf %d, block %d\n",
2702                        //k, uc[k].rf, uc[k].major, uc[k].minor, uc[k].skip, uc[k].surf, uc[k].block);
2703               
2704                // ±âÁ¸ µ¥ÀÌÅͶû ÀÏÄ¡ÇÏ´Â °Í ÀÖÀ¸¸é ¹«Á¶°Ç overwrite.
2705                for (i=0; i<g_UCM_number; i++) {
2706                        if (g_UCM[i].RF    == uc[k].rf &&
2707                                g_UCM[i].Major == uc[k].major &&
2708                                g_UCM[i].Minor == uc[k].minor)
2709                        {
2710                                //dprint(2, "!! old match found. new ucm[%d] <= uc[%d] apply..\n", i, k);
2711                                g_UCM[i].Skipped = uc[k].skip;
2712                                g_UCM[i].SurfIndex = uc[k].surf;
2713                                g_UCM[i].blocked = uc[k].block;
2714                        }
2715                }
2716        }
2717        DMW_MSC_UnlockUcm();
2718       
2719        //dprint(2, "Total %d ucm cores are udpated\n", core->num);
2720       
2721        // Please call this "FREE" function in caller (Application)
2722
2723        return statusOK;       
2724}
2725
2726void DMW_CDB_FreeUcmCore(UCM_CORE *core)
2727{
2728        if (!core) return;
2729       
2730        DHL_OS_Free((void**)&core->entry); 
2731        DHL_OS_Free((void**)&core);
2732}
2733
2734
2735
2736
2737
2738// cafrii 041126 add
2739// use MW's own ucm print function
2740//
2741
2742//
2743// ¸Þ¸ð¸®¿¡ ÀÖ´Â UCMÀ» ¸®½ºÆ®ÇÑ´Ù.
2744//
2745void DMW_CDB_PrintOneUcm(int i, int detailLevel)
2746{
2747        char surf[20];
2748        char channel[20]; // 65536 135,  999-999 13
2749
2750        if (g_UCM[i].SurfIndex)
2751                sprintf(surf, "%02d", g_UCM[i].SurfIndex % 100);
2752        else sprintf(surf, "..");
2753
2754        if (g_UCM[i].Service_type == 0) { // NTSC
2755
2756                #if 0
2757                        sprintf(channel, "%2d-%-3d %-3d", g_UCM[i].Major, g_UCM[i].Minor, g_UCM[i].RF);
2758                #else // cafrii 050119 add.. ¾Æ³¯·Î±×µµ OnePart °¡ °¡´ÉÇÔ
2759                        if (g_UCM[i].Minor == ONE_PART_CHANNEL_INDICATOR) 
2760                                sprintf(channel, " %-5d %-3d", g_UCM[i].Major, g_UCM[i].RF);
2761                        else
2762                                sprintf(channel, "%2d-%-3d %-3d", g_UCM[i].Major, g_UCM[i].Minor, g_UCM[i].RF);
2763                #endif
2764               
2765                        DHL_OS_Printf(" %c(%02d) %-10s %c[%03d] %s $%-3d analog (%dKHz) [%s] %d/%d\n",
2766                                g_UCM[i].disabled ? 'x' :
2767                                        g_UCM[i].hidden ? 'h' :
2768                                        g_UCM[i].Skipped ? ' ' : 
2769                                        g_UCM[i].blocked ? 'b' : '+',
2770                                i, channel, // g_UCM[i].Major, g_UCM[i].Minor, g_UCM[i].RF,
2771                                g_UCM[i].VctFlag ? 'v' : ' ',
2772                                g_UCM[i].Uid, surf,
2773                                g_UCM[i].source_id,  // SI ¿¡¼­´Â source_id°¡ Áß¿äÇϹǷΠ°°ÀÌ Ç¥½Ã..
2774                                g_UCM[i].freqOffset/1000,
2775                                DMW_Unicode2Ks((UINT16*)(g_UCM[i].ShortName), 7, NULL),
2776                                g_UCM[i].num_csd,  g_UCM[i].max_csd
2777                        );
2778                        if (detailLevel >= 1 && g_UCM[i].csd)
2779                                DMW_CDB_PrintCsd(g_UCM[i].csd, g_UCM[i].num_csd, 6, detailLevel);
2780        }
2781        else {
2782                if (g_UCM[i].VctFlag) {  // from VCT
2783                        if (g_UCM[i].Minor == ONE_PART_CHANNEL_INDICATOR) 
2784                                sprintf(channel, " %-5d %-3d", g_UCM[i].Major, g_UCM[i].RF);
2785                        else
2786                                sprintf(channel, "%2d-%-3d %-3d", g_UCM[i].Major, g_UCM[i].Minor, g_UCM[i].RF);
2787                       
2788                        DHL_OS_Printf(" %c(%02d) %-10s%c%c[%03d] %s #%-2d $%-3d %s [%s] (%dKHz) %x/%x/%x %x/%x:%x %d/%d\n",
2789                                g_UCM[i].disabled ? 'x' :
2790                                        g_UCM[i].hidden ? 'h' :
2791                                        g_UCM[i].Skipped ? ' ' :
2792                                        g_UCM[i].blocked ? 'b' : '+',         // enabled channel
2793                                i, channel,
2794                                g_UCM[i].scrambled ? '*' : ' ',  // cafrii 041130 add
2795                                g_UCM[i].VctFlag ? 'v' : ' ',
2796                                g_UCM[i].Uid, surf,
2797                                g_UCM[i].Prog_number, g_UCM[i].source_id,
2798                                ServiceTypeString(g_UCM[i].Service_type),
2799                                DMW_Unicode2Ks((UINT16*)(g_UCM[i].ShortName), 7, NULL),
2800                                g_UCM[i].freqOffset/1000,
2801                                g_UCM[i].Pcr_pid, g_UCM[i].Video_pid, g_UCM[i].Audio_pid,
2802                                g_UCM[i].Video_type, g_UCM[i].Audio_type, 
2803                                g_UCM[i].video_format,
2804                                g_UCM[i].num_csd,  g_UCM[i].max_csd
2805                        );
2806                        if (detailLevel >= 1 && g_UCM[i].csd)
2807                                DMW_CDB_PrintCsd(g_UCM[i].csd, g_UCM[i].num_csd, 6, detailLevel);
2808                        if (detailLevel >= 2 && g_UCM[i].LongName[0]) {
2809                                char longname[100];
2810                                DMW_Unicode2Ks((UINT16*)(g_UCM[i].LongName), 
2811                                        (int)sizeof(g_UCM[i].LongName)/sizeof(g_UCM[i].LongName[0]), longname),
2812                                DHL_OS_Printf("      longname: '%s'\n", longname);
2813                        }
2814                }
2815                else {  // from PSI
2816                        //if (g_UCM[i].Minor == ONE_PART_CHANNEL_INDICATOR)
2817                        //      sprintf(channel, "%3d", g_UCM[i].Major);
2818                        //else
2819                                sprintf(channel, "%2d-%-3d %-3d", g_UCM[i].Major, g_UCM[i].Minor, g_UCM[i].RF);
2820
2821                        DHL_OS_Printf(" %c(%02d) %-10s%c%c[%03d] %s #%-2d $%-3d %s [PSI] (%dKHz) %x/%x/%x %x/%x:%x %d/%d\n",
2822                                g_UCM[i].disabled ? 'x' :
2823                                        g_UCM[i].Skipped ? ' ' :
2824                                        g_UCM[i].blocked ? 'b' : '+',         // enabled channel
2825                                i, channel,
2826                                g_UCM[i].scrambled ? '*' : ' ',  // cafrii 041130 add
2827                                g_UCM[i].VctFlag ? 'v' : ' ',
2828                                g_UCM[i].Uid, surf,
2829                                g_UCM[i].Prog_number, g_UCM[i].source_id,
2830                                ServiceTypeString(g_UCM[i].Service_type),
2831                                g_UCM[i].freqOffset/1000,
2832                                g_UCM[i].Pcr_pid, g_UCM[i].Video_pid, g_UCM[i].Audio_pid,
2833                                g_UCM[i].Video_type, g_UCM[i].Audio_type,
2834                                g_UCM[i].video_format,
2835                                g_UCM[i].num_csd,  g_UCM[i].max_csd
2836                        );
2837                        if (detailLevel >= 1 && g_UCM[i].csd)
2838                                DMW_CDB_PrintCsd(g_UCM[i].csd, g_UCM[i].num_csd, 6, detailLevel);
2839                }
2840        }
2841}
2842
2843void DMW_CDB_PrintUcm(int detailLevel) // ¸Þ¸ð¸®¿¡ ÀÖ´Â UCMÀ» ¸®½ºÆ®ÇÑ´Ù.
2844{
2845        int i;
2846        DMW_MSC_LockUcm();
2847        DHL_OS_Printf("  ---- UCM (total %d) [pid:p/v/a vt/at hex]----\n", g_UCM_number);
2848        for (i=0; g_UCM && i<g_UCM_number; i++) {
2849                DMW_CDB_PrintOneUcm(i, detailLevel);
2850        }
2851        DHL_OS_Printf("\n");
2852        DMW_MSC_UnlockUcm();
2853}
2854
2855
2856// cafrii 041206 add
2857//
2858void DMW_CDB_PrintRfUcm(int detailLevel) // ¸Þ¸ð¸®¿¡ ÀÖ´Â UCMÀ» ¸®½ºÆ®ÇÑ´Ù.
2859{
2860        int i, rf, n_ucm;
2861       
2862        DMW_MSC_LockUcm();
2863        DHL_OS_Printf("---- UCM by RF (total %d) ----\n", g_UCM_number);
2864       
2865        n_ucm = 0;  // Ãâ·ÂÇÑ ucm °¹¼ö
2866        for (rf=0; rf<200; rf++) {
2867                for (i=0; g_UCM && i<g_UCM_number; i++) {
2868                        if (g_UCM[i].RF == rf) {
2869                                DMW_CDB_PrintOneUcm(i, detailLevel);
2870                                n_ucm++;
2871                                if (n_ucm == g_UCM_number) break;
2872                        }
2873                }
2874                if (n_ucm == g_UCM_number) break;
2875        }
2876       
2877        if (n_ucm != g_UCM_number) 
2878                DHL_OS_Printf("!! %d ucm exist, but %d ucm printed\n", g_UCM_number, n_ucm);
2879        DHL_OS_Printf("\n");
2880       
2881        DMW_MSC_UnlockUcm();
2882}
2883
2884
2885
2886#if 0
2887______DebugSymbol____()
2888#endif
2889
2890
2891
2892
2893
2894#if DMW_REGISTER_DEBUG_SYMBOL
2895
2896static DHL_SymbolTable ChannelUcmSymbols[] =
2897{
2898        //---- functions
2899        DHL_FNC_SYM_ENTRY(DMW_CDB_InitializeChannelLib),
2900        DHL_FNC_SYM_ENTRY(DMW_CDB_ClearAll),
2901        DHL_FNC_SYM_ENTRY(DMW_CDB_PrintUcm),
2902
2903        DHL_FNC_SYM_ENTRY(DMW_CDB_DeleteChanInfoUid),
2904        DHL_FNC_SYM_ENTRY(DMW_MSC_EnableChannel),
2905
2906        DHL_FNC_SYM_ENTRY(DMW_CDB_InvalidateAllPidInfo),
2907
2908        DHL_FNC_SYM_ENTRY(DMW_MSC_LockUcm),
2909        DHL_FNC_SYM_ENTRY(DMW_MSC_UnlockUcm),
2910       
2911        //---- variables
2912        //DHL_VAR_SYM_ENTRY(g_Trace_bUcmDebug),
2913        //DHL_VAR_SYM_ENTRY(g_Trace_bUcmSearch),
2914        //DHL_VAR_SYM_ENTRY(g_Trace_Mcm),
2915};
2916
2917#endif // DMW_REGISTER_DEBUG_SYMBOL
2918
2919
2920void DMW_CDB_RegisterChannelUcmSymbols()
2921{
2922#if DMW_REGISTER_DEBUG_SYMBOL
2923        DHL_DBG_RegisterSymbols(ChannelUcmSymbols, DHL_NUMSYMBOLS(ChannelUcmSymbols));
2924       
2925#endif
2926}
2927
2928
2929
2930
2931
2932/******************************************************************************
2933 
2934  $Log: DMW_Ucm.c,v $
2935
2936        1.18 2005/4/4   ScanChannel ¿¡ demux start ÄÚµå Ãß°¡
2937
2938        1.17 2005/3/15  NtscFreqOffset->freqOffset À̸§ º¯°æ
2939        1.16 2005/3/5   Uid tune¿¡¼­ freqOffsetÀÌ Àû¿ëµÇÁö ¾Ê´ø ¹®Á¦ ¼öÁ¤
2940        1.15 2005/01/19 PrintUCM ¼öÁ¤
2941        1.14 2004/12/09 update_current_scan ¿¡ bSetTuner ÀÎÀÚ Ãß°¡µÈ°Í Àû¿ë
2942       
2943        1.13 2004/12/06 DMW_CDB_PrintRfUcm Ãß°¡
2944
2945        1.12 2004/12/02 DMW_TUN_TuneChannelByUidAndFlag Ãß°¡.
2946
2947        1.11 2004/11/30 UpdateDB ¿¡¼­ scan_flag Á¶Á¤
2948                        DMW_CDB_PrintOneUcm, scramble channel Ç¥½Ã
2949
2950        1.10 2004/11/27 DMW_CDB_ClearAll ¿¡¼­ Á»´õ È¿À²ÀûÀÎ DeleteAllUcmCsd »ç¿ë
2951        1.09 2004/11/26 ucm entry¸¦ delete ÇÒ¶§ csd µµ °°ÀÌ delete
2952                        ÀÚüÀûÀÎ ucm print ÇÔ¼ö Ãß°¡
2953        1.08 2004/11/5 DMW_TUN_TuneChannelByUid ¿¡¼­ two part channel systemÀ¸·Î
2954                       ´Ù½Ã º¯°æÇÏ´Â ÄÚµå »èÁ¦
2955       
2956        1.07 2004/11/3 ShortNameString¿¡¼­ non-ascii ±ÛÀÚ ±úÁö´Â°Å ¼öÁ¤.
2957                       DebugUtil.h Æ÷ÇÔ
2958
2959        1.06 2004/11/1 UpdateDB¿¡¼­ CBTF_IgnoreScrambledChannel Ç÷¡±× »èÁ¦
2960       
2961        1.05 2004/8/30 DMW_CDB_ChangeFrequencyStandard °¡ ChannelTune ¸ðµâ·Î À̵¿
2962                     FreqSTd °ü·Ã ¸ðµç ±â´ÉÀº ChannelDB¿Í ºÐ¸®
2963           8/31      g_CurChannelType HAL ¸ðµâ·Î À̵¿
2964       
2965        1.04 2004/8/12 insert_ucm ¿¡¼­ ÀÏÄ¡ÇÏ´Â entry°¡ ÀÖÀ»°æ¿ì resetµÇ´Â ¹ö±× ¼öÁ¤ (from miyu)
2966       
2967        1.03 2004/6/4  DMW_CDB_UpdateDB ¿¡¼­ pauseÇϱâ Àü psiCtl»óÅ üũ
2968        1.02 2004/5/11 FindMajorDown bugfix
2969 
2970  OS_Realloc ¹ö±× ȸÇÇÄÚµå Ãß°¡ 031111
2971
2972  DMW_CDB_DeleteMajorMinorChanInfo() Ãß°¡
2973 
2974  rev 1.01 2003/2/24, cafrii
2975  insert_ucm ¹ö±× ¼öÁ¤.
2976  upper/lower major surfing Ãß°¡. 
2977 
2978  Revision 1.0  2003/02/00   cafrii
2979  Initial coding from ground
2980 
2981******************************************************************************/
Note: See TracBrowser for help on using the repository browser.