source: titan/titan/dvbdev.h @ 40661

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

fix

File size: 4.7 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        if(type == ENCODERDEV)
76        {
77                int number = 99;
78                char *buf = NULL, *enc_decoder = NULL;
79                enc_decoder = getconfig("enc_decoder", NULL);
80                if(enc_decoder != NULL)
81                {
82                        buf = malloc(MINMALLOC);
83                        if(buf != NULL)
84                        {
85                                sprintf(buf, enc_decoder, devnr);
86                                FILE* fbencoder = fopen(buf, "r");
87                                if(fbencoder != NULL)
88                                {
89                                        fscanf(fbencoder, "%i", &number);
90                                        fclose(fbencoder);
91                                }
92                        }
93                }
94                newnode->decoder = number;
95                free(buf);
96        }
97        if(node != NULL)
98        {
99                if(last == NULL)
100                {
101                        while(node->next != NULL)
102                                node = node->next;
103                        node->next = newnode;
104                }
105                else
106                        last->next = newnode;
107        }
108        else
109        {
110                if(flag == 0)
111                        dvbdev = newnode;
112                else
113                        dvbdevsim = newnode;
114        }
115
116        return newnode;
117}
118
119struct dvbdev* changedvbdev(struct dvbdev *node)
120{
121        if(node == NULL) return NULL;
122
123        char *fehyprid = NULL, *tmpstr = NULL;
124        struct dvb_frontend_info* feinfo = NULL;
125       
126        close(node->fd);
127        node->fd = -1;
128       
129        int fd = feopen(NULL, node->dev);
130        if(fd >= 0)
131        {
132                fehyprid = gethypridtunerchoicesvalue(node->devnr);
133                if(fehyprid != NULL)
134                {
135                        if(node->adapter < 10)
136                                tmpstr = ostrcat(tmpstr, "fe_0", 1, 0);
137                        else
138                                tmpstr = ostrcat(tmpstr, "fe_1", 1, 0);
139
140                        tmpstr = ostrcat(tmpstr, oitoa(node->devnr), 1, 1);
141                        tmpstr = ostrcat(tmpstr, "_hyprid", 1, 0);
142                        if(getconfig(tmpstr, NULL) != NULL)
143                                sethypridtuner(node->devnr, getconfig(tmpstr, NULL));
144                        free(tmpstr), tmpstr = NULL;
145                }
146                               
147                feinfo = fegetinfo(NULL, fd);
148               
149                free(node->feinfo);
150                node->feinfo = NULL;
151
152                free(node->feaktnr);
153                node->feaktnr = NULL;
154       
155                free(node->fehyprid);
156                node->fehyprid = NULL;
157               
158                node->fd = fd;
159                node->feinfo = feinfo;
160                node->fehyprid = ostrcat(fehyprid, NULL, 0, 0);
161        }
162
163        return node;
164}
165
166//flag 0: use dvbdev
167//flag 1: use dvbdevsim
168void deldvbdev(char *dev, int flag)
169{
170        struct dvbdev *node = NULL, *prev = NULL;
171
172        if(flag == 0)
173        {
174                node = dvbdev;
175                prev = dvbdev;
176        }
177        else
178        {
179                node = dvbdevsim;
180                prev = dvbdevsim;
181        }
182
183        while(node != NULL)
184        {
185                if(ostrcmp(node->dev, dev) == 0)
186                {
187                        if(flag == 0 && node == dvbdev)
188                                dvbdev = node->next;
189                        else if(flag == 1 && node == dvbdevsim)
190                                dvbdevsim = node->next;
191                        else
192                                prev->next = node->next;
193
194                        if(flag == 0)
195                        {
196                                close(node->fd);
197
198                                free(node->feinfo);
199                                node->feinfo = NULL;
200                        }
201
202                        free(node->dev);
203                        node->dev = NULL;
204
205                        free(node->feshortname);
206                        node->feshortname = NULL;
207
208                        free(node->feaktnr);
209                        node->feaktnr = NULL;
210                       
211                        free(node->caslot);
212                        node->caslot = NULL;
213                       
214                        free(node->fehyprid);
215                        node->fehyprid = NULL;
216
217                        free(node);
218                        node = NULL;
219                        break;
220                }
221
222                prev = node;
223                node = node->next;
224        }
225}
226
227//flag 0: use dvbdev
228//flag 1: use dvbdevsim
229void freedvbdev(int flag)
230{
231        struct dvbdev *node = NULL, *prev = NULL;
232
233        if(flag == 0)
234        {
235                node = dvbdev;
236                prev = dvbdev;
237        }
238        else
239        {
240                node = dvbdevsim;
241                prev = dvbdevsim;
242        }
243
244        while(node != NULL)
245        {
246                prev = node;
247                node = node->next;
248                if(prev != NULL)
249                        deldvbdev(prev->dev, flag);
250        }
251}
252
253#endif
Note: See TracBrowser for help on using the repository browser.