source: titan/titan/dvbdev.h @ 41089

Last change on this file since 41089 was 41089, checked in by gost, 6 years ago

[titan] add dvr device

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