source: titan/titan/audiodev.h @ 38592

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

[titan] mipsel.. fix play ts after pause (audio delay)

File size: 6.0 KB
Line 
1#ifndef AUDIODEV_H
2#define AUDIODEV_H
3
4struct dvbdev* audioopen(int adapter)
5{
6        int fd = -1;
7        struct dvbdev* node = dvbdev;
8
9        while(node != NULL)
10        {
11                if(node->fd == -1 && node->type == AUDIODEV && node->adapter == adapter)
12                        break;
13                //workaround for more then one audiodev
14                if(node->fd == -1 && node->type == AUDIODEV && node->devnr == adapter)
15                        break;
16                node = node->next;
17        }
18
19        if(node != NULL)
20        {
21                if((fd = open(node->dev, O_RDWR)) < 0)
22                {
23                        debug(200, "open audio failed %s", node->dev);
24                        node = NULL;
25                }
26                else
27                {
28                        node->fd = fd;
29                        closeonexec(fd);
30                }
31        }
32
33        return node;
34}
35
36int audioopendirect(char *audiodev)
37{
38        int fd = -1;
39
40        if((fd = open(audiodev, O_RDWR)) < 0)
41        {
42                debug(200, "open audio failed %s", audiodev);
43        }
44
45        closeonexec(fd);
46        return fd;
47}
48
49void audioclose(struct dvbdev* node, int fd)
50{
51        if(node != NULL)
52        {
53                close(node->fd);
54                node->fd = -1;
55        }
56        else
57                close(fd);
58}
59
60int audiostop(struct dvbdev* node)
61{
62        if(node == NULL)
63        {
64                debug(200, "NULL detect");
65                return 1;
66        }
67
68        debug(200, "AUDIO_STOP");
69        if(ioctl(node->fd, AUDIO_STOP) < 0)
70        {
71                perr("AUDIO_STOP");
72                return 1;
73        }
74       
75        return 0;
76}
77
78#ifdef MIPSEL
79int audiocontinue(struct dvbdev* node)
80{
81        if(node == NULL)
82        {
83                err("NULL detect");
84                return 1;
85        }
86
87        if(ioctl(node->fd, AUDIO_CONTINUE) < 0)
88        {
89                perr("AUDIO_CONTINUE");
90                return 1;
91        }
92       
93        return 0;
94}
95#endif
96
97int audioplay(struct dvbdev* node)
98{
99        if(node == NULL)
100        {
101                err("NULL detect");
102                return 1;
103        }
104
105#ifdef MIPSEL
106        char* delay1 = NULL;
107        char* delay2 = NULL;
108       
109        delay1 = ostrcat(getconfig("audiodelaypcm", NULL), NULL, 0, 0);
110        if(delay1 != NULL && node->devnr == 0)
111                setaudiodelaypcm("0");
112
113        delay2 = ostrcat(getconfig("audiodelaybitstream", NULL), NULL, 0, 0);
114        if(delay2 != NULL && node->devnr == 0)
115                setaudiodelaybitstream("0");
116#endif
117
118
119        debug(200, "AUDIO_PLAY");
120        if(ioctl(node->fd, AUDIO_PLAY) < 0)
121        {
122                perr("AUDIO_PLAY");
123                return 1;
124        }
125
126#ifdef MIPSEL
127        if(delay1 != NULL && node->devnr == 0)
128                setaudiodelaypcm(delay1);
129               
130        if(delay2 != NULL && node->devnr == 0)
131                setaudiodelaybitstream(delay2);
132               
133        free(delay1); delay1 = NULL;
134        free(delay2); delay2 = NULL;
135#endif 
136        return 0;
137}
138
139int audiopause(struct dvbdev* node)
140{
141        if(node == NULL)
142        {
143                err("NULL detect");
144                return 1;
145        }
146
147        debug(200, "AUDIO_PAUSE");
148        if(ioctl(node->fd, AUDIO_PAUSE) < 0)
149        {
150                perr("AUDIO_PAUSE");
151                return 1;
152        }
153       
154        return 0;
155}
156
157int audiogetpts(struct dvbdev* node, uint64_t* pts)
158{
159        if(node == NULL)
160        {
161                err("NULL detect");
162                return 1;
163        }
164
165        debug(200, "AUDIO_GET_PTS");
166        if(ioctl(node->fd, AUDIO_GET_PTS, pts) < 0)
167        {
168                perr("AUDIO_GET_PTS");
169                return 1;
170        }
171       
172        return 0;
173}
174
175int audioselectsource(struct dvbdev* node, audio_stream_source_t source)
176{
177        if(node == NULL)
178        {
179                err("NULL detect");
180                return 1;
181        }
182
183        debug(200, "AUDIO_SELECT_SOURCE=%d", source);
184        if(ioctl(node->fd, AUDIO_SELECT_SOURCE, source) < 0)
185        {
186                perr("AUDIO_SELECT_SOURCE");
187                return 1;
188        }
189       
190        return 0;
191}
192
193int audiosetmixer(struct dvbdev* node, int left, int right)
194{
195        if(node == NULL)
196        {
197                debug(200, "NULL detect");
198                return 1;
199        }
200
201#if DVB_API_VERSION < 3
202        audioMixer_t mixer;
203        mixer.volume_left = 63.0 - pow(1.068241, 63 - left);
204        mixer.volume_right = 63.0 - pow(1.068241, 63 - right);
205#else
206        audio_mixer_t mixer;
207        mixer.volume_left = left;
208        mixer.volume_right = right;
209#endif
210
211        debug(200, "AUDIO_SET_MIXER");
212        if(ioctl(node->fd, AUDIO_SET_MIXER, &mixer) < 0)
213        {
214                perr("AUDIO_SET_MIXER");
215                return 1;
216        }
217       
218        return 0;
219}
220
221int audiosetmute(struct dvbdev* node, int state)
222{
223        if(node == NULL)
224        {
225                err("NULL detect");
226                return 1;
227        }
228
229        debug(200, "AUDIO_SET_MUTE=%d", state);
230        if(ioctl(node->fd, AUDIO_SET_MUTE, state) < 0)
231        {
232                perr("AUDIO_SET_MUTE");
233                return 1;
234        }
235       
236        return 0;
237}
238int audiosetavsync(struct dvbdev* node, int state)
239{
240        if(node == NULL)
241        {
242                err("NULL detect");
243                return 1;
244        }
245
246        debug(200, "AUDIO_SET_AV_SYNC=%d", state);
247        if(ioctl(node->fd, AUDIO_SET_AV_SYNC, state) < 0)
248        {
249                perr("AUDIO_SET_AV_SYNC");
250                return 1;
251        }
252       
253        return 0;
254}
255
256int audiosetbypassmode(struct dvbdev* node, int mode)
257{       
258        if(node == NULL)
259        {
260                err("NULL detect");
261                return 1;
262        }
263
264        debug(200, "AUDIO_SET_BYPASS_MODE=%d", mode);
265        if(ioctl(node->fd, AUDIO_SET_BYPASS_MODE, mode) < 0)
266        {
267                perr("AUDIO_SET_BYPASS_MODE");
268                return 1;
269        }
270
271        //auto increase volume for ac3
272        if(status.volautochangevalue != 0)
273        {
274                int aktvol = getvol();
275                if(mode == AC3)
276                {
277                        if(status.volautochange == 0)
278                                status.volautochange = 1;
279                }
280                else if(status.volautochange > 0)
281                        status.volautochange = 0;
282
283                setvol(aktvol);
284        }
285       
286        return 0;
287}
288
289int audiochannelselect(struct dvbdev* node, audio_channel_select_t channel)
290{
291        if(node == NULL)
292        {
293                err("NULL detect");
294                return 1;
295        }
296
297        debug(200, "AUDIO_CHANNEL_SELECT=%d", channel);
298        if(ioctl(node->fd, AUDIO_CHANNEL_SELECT, channel) < 0)
299        {
300                perr("AUDIO_CHANNEL_SELECT");
301                return 1;
302        }
303       
304        return 0;
305}
306
307int audioclearbuffer(struct dvbdev* node)
308{
309        if(node == NULL)
310        {
311                err("NULL detect");
312                return 1;
313        }
314
315        if(ioctl(node->fd, AUDIO_CLEAR_BUFFER) < 0)
316        {
317                perr("AUDIO_CLEAR_BUFFER");
318                return 1;
319        }
320       
321        return 0;
322}
323
324int audiosetid(struct dvbdev* node, int id)
325{
326        if(node == NULL)
327        {
328                err("NULL detect");
329                return 1;
330        }
331
332        debug(200, "AUDIO_SET_ID=%d", id);
333        if(ioctl(node->fd, AUDIO_SET_ID, id) < 0)
334        {
335                perr("AUDIO_SET_ID");
336                return 1;
337        }
338       
339        return 0;
340}
341
342int audiosetstreamtype(struct dvbdev* node, int type)
343{
344        if(node == NULL)
345        {
346                err("NULL detect");
347                return 1;
348        }
349
350        debug(200, "AUDIO_SET_STREAMTYPE=%d", type);
351        if(ioctl(node->fd, AUDIO_SET_STREAMTYPE, type) < 0)
352        {
353                perr("AUDIO_SET_STREAMTYPE");
354                return 1;
355        }
356       
357        return 0;
358}
359
360int audiogetdev()
361{
362        int i, y, fd = -1, count = 0;
363        char *buf = NULL, *audiodev = NULL;
364
365        audiodev = getconfig("audiodev", NULL);
366        if(audiodev == NULL)
367        {
368                err("NULL detect");
369                return count;
370        }
371
372        buf = malloc(MINMALLOC);
373        if(buf == NULL)
374        {
375                err("no memory");
376                return count;
377        }
378
379        for(i = 0; i < MAXDVBADAPTER; i++)
380        {
381                for(y = 0; y < MAXAUDIODEV; y++)
382                {
383                        sprintf(buf, audiodev, i, y);
384                        fd = audioopendirect(buf);
385                        if(fd >= 0)
386                        {
387                                audioclose(NULL, fd);
388                                count++;
389                                adddvbdev(buf, i, y, -1, AUDIODEV, NULL, NULL, NULL, 0);
390                        }
391                }
392        }
393
394        free(buf);
395        return count;
396}
397
398#endif
Note: See TracBrowser for help on using the repository browser.