source: titan/titan/dvbdev.h @ 30684

Last change on this file since 30684 was 30684, 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                                        tmpstr = ostrcat(tmpstr, "fe_0", 1, 0);
116                        else
117                                tmpstr = ostrcat(tmpstr, "fe_1", 1, 0);
118
119                        tmpstr = ostrcat(tmpstr, oitoa(node->devnr), 1, 1);
120                        tmpstr = ostrcat(tmpstr, "_hyprid", 1, 0);
121                        if(getconfig(tmpstr, NULL) != NULL)
122                                sethypridtuner(node->devnr, getconfig(tmpstr, NULL));
123                        free(tmpstr), tmpstr = NULL;
124                }
125                               
126                feinfo = fegetinfo(NULL, fd);
127               
128                free(node->feinfo);
129                node->feinfo = NULL;
130
131                free(node->feaktnr);
132                node->feaktnr = NULL;
133       
134                free(node->fehyprid);
135                node->fehyprid = NULL;
136               
137                node->fd = fd;
138                node->feinfo = feinfo;
139                node->fehyprid = ostrcat(fehyprid, NULL, 0, 0);
140        }
141
142        return node;
143}
144
145//flag 0: use dvbdev
146//flag 1: use dvbdevsim
147void deldvbdev(char *dev, int flag)
148{
149        struct dvbdev *node = NULL, *prev = NULL;
150
151        if(flag == 0)
152        {
153                node = dvbdev;
154                prev = dvbdev;
155        }
156        else
157        {
158                node = dvbdevsim;
159                prev = dvbdevsim;
160        }
161
162        while(node != NULL)
163        {
164                if(ostrcmp(node->dev, dev) == 0)
165                {
166                        if(flag == 0 && node == dvbdev)
167                                dvbdev = node->next;
168                        else if(flag == 1 && node == dvbdevsim)
169                                dvbdevsim = node->next;
170                        else
171                                prev->next = node->next;
172
173                        if(flag == 0)
174                        {
175                                close(node->fd);
176
177                                free(node->feinfo);
178                                node->feinfo = NULL;
179                        }
180
181                        free(node->dev);
182                        node->dev = NULL;
183
184                        free(node->feshortname);
185                        node->feshortname = NULL;
186
187                        free(node->feaktnr);
188                        node->feaktnr = NULL;
189                       
190                        free(node->caslot);
191                        node->caslot = NULL;
192                       
193                        free(node->fehyprid);
194                        node->fehyprid = NULL;
195
196                        free(node);
197                        node = NULL;
198                        break;
199                }
200
201                prev = node;
202                node = node->next;
203        }
204}
205
206//flag 0: use dvbdev
207//flag 1: use dvbdevsim
208void freedvbdev(int flag)
209{
210        struct dvbdev *node = NULL, *prev = NULL;
211
212        if(flag == 0)
213        {
214                node = dvbdev;
215                prev = dvbdev;
216        }
217        else
218        {
219                node = dvbdevsim;
220                prev = dvbdevsim;
221        }
222
223        while(node != NULL)
224        {
225                prev = node;
226                node = node->next;
227                if(prev != NULL)
228                        deldvbdev(prev->dev, flag);
229        }
230}
231
232#endif
Note: See TracBrowser for help on using the repository browser.