source: titan/titan/dvbdev.h @ 30682

Last change on this file since 30682 was 30682, checked in by gost, 9 years ago

fix

File size: 4.3 KB
Line 
1#ifndef DVBDEV_H
2#define DVBDEV
3
4//flag 0: use dvbdev
5//flag 1: use dvbdevsim
6struct dvbdev* adddvbdev(char *dev, int adapter, int devnr, int fd, int type, struct dvb_frontend_info* feinfo, struct dvbdev* last, char *fehyprid, int flag)
7{
8        struct dvbdev *newnode = NULL, *node = NULL;
9        char* tmp = NULL, *tmp1 = NULL;
10
11        if(flag == 0)
12                node = dvbdev;
13        else
14                node = dvbdevsim;
15
16        newnode = (struct dvbdev*)malloc(sizeof(struct dvbdev));       
17        if(newnode == NULL)
18        {
19                err("no mem");
20                return NULL;
21        }
22
23        memset(newnode, 0, sizeof(struct dvbdev));
24
25        newnode->dev = ostrcat(dev, NULL, 0, 0);
26        newnode->fd = -1;
27        newnode->type = type;
28        newnode->feinfo = feinfo;
29        newnode->adapter = adapter;
30        newnode->devnr = devnr;
31        newnode->fehyprid = ostrcat(fehyprid, NULL, 0, 0);
32
33        if(type == CIDEV)
34        {
35                newnode->fd = fd;
36                newnode->caslot = (struct caslot*)malloc(sizeof(struct caslot));       
37                if(newnode->caslot == NULL)
38                {
39                        err("no mem");
40                }
41                else
42                        memset(newnode->caslot, 0, sizeof(struct caslot));
43        }
44
45        if(type == FRONTENDDEV || type == FRONTENDDEVDUMMY)
46        {
47                newnode->fd = fd;
48                tmp1 = oitoa(adapter);
49                tmp = ostrcat("fe_", tmp1, 0, 1);
50                tmp1 = oitoa(devnr);
51                tmp = ostrcat(tmp, tmp1, 1, 1);
52                newnode->feshortname = tmp;
53                if(type == FRONTENDDEV)
54                {
55                        switch(devnr)
56                        {
57                                case 0: newnode->fedmxsource = DMX_SOURCE_FRONT0; break;
58                                case 1: newnode->fedmxsource = DMX_SOURCE_FRONT1; break;
59                                case 2: newnode->fedmxsource = DMX_SOURCE_FRONT2; break;
60                                case 3: newnode->fedmxsource = DMX_SOURCE_FRONT3; break;
61                        }
62                }
63                if(type == FRONTENDDEVDUMMY)
64                {
65                        switch(devnr)
66                        {
67                                case 0: newnode->fedmxsource = DMX_SOURCE_DVR0; break;
68                                case 1: newnode->fedmxsource = DMX_SOURCE_DVR1; break;
69                                case 2: newnode->fedmxsource = DMX_SOURCE_DVR2; break;
70                                case 3: newnode->fedmxsource = DMX_SOURCE_DVR3; break;
71                                case 4: newnode->fedmxsource = DMX_SOURCE_DVR3 + 1; break;
72                        }
73                }
74        }
75
76        if(node != NULL)
77        {
78                if(last == NULL)
79                {
80                        while(node->next != NULL)
81                                node = node->next;
82                        node->next = newnode;
83                }
84                else
85                        last->next = newnode;
86        }
87        else
88        {
89                if(flag == 0)
90                        dvbdev = newnode;
91                else
92                        dvbdevsim = newnode;
93        }
94
95        return newnode;
96}
97
98struct dvbdev* changedvbdev(struct dvbdev *node)
99{
100        if(node == NULL) return NULL;
101
102        char *fehyprid = NULL, *tmpstr = NULL;
103        struct dvb_frontend_info* feinfo = NULL;
104       
105        close(node->fd);
106        node->fd = -1;
107       
108        int fd = feopen(NULL, node->dev);
109        if(fd >= 0)
110        {
111                fehyprid = gethypridtunerchoicesvalue(node->devnr);
112                if(fehyprid != NULL)
113                {
114//                      if(y < 10)
115                        if(fehyprid->y < 10) //??????????????
116                                tmpstr = ostrcat(tmpstr, "fe_0", 1, 0);
117                        else
118                                tmpstr = ostrcat(tmpstr, "fe_1", 1, 0);
119
120                        tmpstr = ostrcat(tmpstr, oitoa(node->devnr), 1, 1);
121                        tmpstr = ostrcat(tmpstr, "_hyprid", 1, 0);
122                        if(getconfig(tmpstr, NULL) != NULL)
123                                sethypridtuner(node->devnr, getconfig(tmpstr, NULL));
124                        free(tmpstr), tmpstr = NULL;
125                }
126                               
127                feinfo = fegetinfo(NULL, fd);
128               
129                free(node->feinfo);
130                node->feinfo = NULL;
131
132                free(node->feaktnr);
133                node->feaktnr = NULL;
134       
135                free(node->fehyprid);
136                node->fehyprid = NULL;
137               
138                node->fd = fd;
139                node->feinfo = feinfo;
140                node->fehyprid = ostrcat(fehyprid, NULL, 0, 0);
141        }
142
143        return node;
144}
145
146//flag 0: use dvbdev
147//flag 1: use dvbdevsim
148void deldvbdev(char *dev, int flag)
149{
150        struct dvbdev *node = NULL, *prev = NULL;
151
152        if(flag == 0)
153        {
154                node = dvbdev;
155                prev = dvbdev;
156        }
157        else
158        {
159                node = dvbdevsim;
160                prev = dvbdevsim;
161        }
162
163        while(node != NULL)
164        {
165                if(ostrcmp(node->dev, dev) == 0)
166                {
167                        if(flag == 0 && node == dvbdev)
168                                dvbdev = node->next;
169                        else if(flag == 1 && node == dvbdevsim)
170                                dvbdevsim = node->next;
171                        else
172                                prev->next = node->next;
173
174                        if(flag == 0)
175                        {
176                                close(node->fd);
177
178                                free(node->feinfo);
179                                node->feinfo = NULL;
180                        }
181
182                        free(node->dev);
183                        node->dev = NULL;
184
185                        free(node->feshortname);
186                        node->feshortname = NULL;
187
188                        free(node->feaktnr);
189                        node->feaktnr = NULL;
190                       
191                        free(node->caslot);
192                        node->caslot = NULL;
193                       
194                        free(node->fehyprid):
195                        node->fehyprid = NULL;
196
197                        free(node);
198                        node = NULL;
199                        break;
200                }
201
202                prev = node;
203                node = node->next;
204        }
205}
206
207//flag 0: use dvbdev
208//flag 1: use dvbdevsim
209void freedvbdev(int flag)
210{
211        struct dvbdev *node = NULL, *prev = NULL;
212
213        if(flag == 0)
214        {
215                node = dvbdev;
216                prev = dvbdev;
217        }
218        else
219        {
220                node = dvbdevsim;
221                prev = dvbdevsim;
222        }
223
224        while(node != NULL)
225        {
226                prev = node;
227                node = node->next;
228                if(prev != NULL)
229                        deldvbdev(prev->dev, flag);
230        }
231}
232
233#endif
Note: See TracBrowser for help on using the repository browser.