Add satipclient.
[vuplus_openvuplus] / meta-openvuplus / recipes-vuplus / usbtunerhelper / usbtunerhelper / get_avail_vtuner.patch
1 diff --git a/usbtunerhelper.c b/usbtunerhelper.c
2 index 77b8728..7906f9b 100644
3 --- a/usbtunerhelper.c
4 +++ b/usbtunerhelper.c
5 @@ -94,7 +94,7 @@ struct vtuner_adapter
6  
7  struct vtuner_adapter adapters[MAX_ADAPTERS];
8  int adaptercount = 0;
9 -int vtunercount = 0;
10 +int available_vtuner = 0;
11  
12  int running = 1;
13  void sigint_handler(int sig)
14 @@ -166,31 +166,6 @@ int scan_adapters()
15                 
16         }
17  
18 -       dirvtun = opendir(VTUNER_PATH);
19 -       if (dirvtun)
20 -       {
21 -               while ((edirvtun = readdir(dirvtun)) != NULL)
22 -               {
23 -                       if (strlen(edirvtun->d_name) < 7) continue;
24 -                       if (!strncmp(edirvtun->d_name, "vtuner", 6)) vtunercount++;
25 -               }
26 -               closedir(dirvtun);
27 -       }
28 -
29 -
30 -       for (i = 0; i < adaptercount; i++)
31 -       {
32 -               if (i < vtunercount)
33 -               {
34 -                       adapters[i].vtunerindex = i;
35 -                       printf("usb device %s (adapter%d) assigned to vtuner%d\n", adapters[i].name, adapters[i].index, i);
36 -               }
37 -               else
38 -               {
39 -                       adapters[i].vtunerindex = -1;
40 -                       printf("usb device %s (adapter%d) not assigned\n", adapters[i].name, adapters[i].index);
41 -               }
42 -       }
43         return adaptercount;
44  
45  }
46 @@ -448,25 +423,112 @@ error:
47         return NULL;
48  }
49  
50 +int get_avail_vtuner()
51 +{
52 +       int total_vtuner = 0;
53 +       int reserved_vtuner = 0;
54 +       char filename[32];
55 +
56 +       const char* conf = "/etc/vtuner.conf";
57 +       FILE *fp;
58 +
59 +       /* total vtuner */
60 +       while(1)
61 +       {
62 +               sprintf(filename, "/dev/misc/vtuner%d", total_vtuner);
63 +               if (access(filename, F_OK) < 0 ) break;
64 +               total_vtuner++;
65 +       }
66 +
67 +       /* reserved vtuner */
68 +       fp = fopen(conf, "rt");
69 +       if (fp)
70 +       {
71 +               char line[256];
72 +               const char *vtuner_type = "vtuner_type:";
73 +               const char *usb_tuner = "usb_tuner";
74 +
75 +               while (!feof(fp))
76 +               {
77 +                       if (!fgets(line, sizeof(line), fp))
78 +                               break;
79 +
80 +                       char *p = strstr(line, vtuner_type);
81 +                       if (p != NULL)
82 +                       {
83 +                               p += strlen(vtuner_type);
84 +                               if (strncmp(p, usb_tuner, strlen(usb_tuner)))
85 +                               {
86 +                                       reserved_vtuner ++;
87 +                               }
88 +                       }
89 +               }
90 +               fclose(fp);
91 +       }
92 +       return total_vtuner - reserved_vtuner;
93 +}
94 +
95 +int get_vtuner(int id)
96 +{
97 +       char filename[256];
98 +       int vtuner_fd = -1;
99 +       int vtuner_idx = 0;
100 +
101 +       struct vtuner_adapter *adapter = &adapters[id];
102 +
103 +       adapter->vtuner = -1;
104 +       adapter->vtunerindex = -1;
105 +
106 +       if (!available_vtuner)
107 +               return -1;
108 +
109 +       while (vtuner_fd < 0)
110 +       {
111 +               sprintf(filename, "/dev/misc/vtuner%d", vtuner_idx);
112 +               if (access(filename, F_OK) < 0) break;
113 +
114 +               printf("open vtuner %s\n", filename);
115 +               vtuner_fd = open(filename, O_RDWR);
116 +
117 +               if (vtuner_fd < 0)
118 +               {
119 +                       vtuner_idx++;
120 +               }
121 +       }
122 +
123 +       if (vtuner_fd < 0)
124 +               return -1;
125 +
126 +       adapter->vtuner = vtuner_fd;
127 +       adapter->vtunerindex = vtuner_idx;
128 +       available_vtuner--;
129 +
130 +       return 0;
131 +}
132 +
133  int init_adapter(int id)
134  {
135         char type[8];
136         struct dmx_pes_filter_params filter;
137         struct dvb_frontend_info fe_info;
138 -       char frontend_filename[256], demux_filename[256], vtuner_filename[256];
139 +       char frontend_filename[256], demux_filename[256];
140  
141         struct vtuner_adapter *adapter = &adapters[id];
142  
143         adapter->eventthread = 0;
144         adapter->pumpthread = 0;
145  
146 +       get_vtuner(id);
147 +
148 +       if (adapter->vtunerindex == -1)
149 +               goto error;
150 +
151         printf("linking adapter%d/frontend0 to vtuner%d\n", adapter->index, adapter->vtunerindex);
152  
153         sprintf(frontend_filename, "/dev/dvb/adapter%d/frontend0", adapter->index);
154         sprintf(demux_filename, "/dev/dvb/adapter%d/demux0", adapter->index);
155 -       sprintf(vtuner_filename, "/dev/misc/vtuner%d", adapter->vtunerindex);
156  
157 -       adapter->frontend = adapter->demux = adapter->vtuner = -1;
158 +       adapter->frontend = adapter->demux = -1;
159  
160         adapter->frontend = open(frontend_filename, O_RDWR);
161         if (adapter->frontend < 0)
162 @@ -482,13 +544,6 @@ int init_adapter(int id)
163                 goto error;
164         }
165  
166 -       adapter->vtuner = open(vtuner_filename, O_RDWR);
167 -       if (adapter->vtuner < 0)
168 -       {
169 -               perror(vtuner_filename);
170 -               goto error;
171 -       }
172 -
173         if (ioctl(adapter->frontend, FE_GET_INFO, &fe_info) < 0)
174         {
175                 perror("FE_GET_INFO");
176 @@ -635,9 +690,11 @@ int main(int argc, char *argv[])
177                 sleep(scan_inverval);
178         }
179  
180 +       available_vtuner = get_avail_vtuner();
181 +
182         for (i = 0; i < adaptercount; i++)
183         {
184 -               if (adapters[i].vtunerindex >= 0) init_adapter(i);
185 +               init_adapter(i);
186         }
187  
188         for (i = 0; i < adaptercount; i++)