Mercurial > mplayer.hg
annotate libao2/ao_mpegpes.c @ 24590:2c238fa777ff
ao_alsa: Fix get_space() return values larger than buffersize
After a buffer underrun the ALSA get_space() function sometimes returned
values larger than the ao had set in ao_data.buffersize. Fix this by
replacing the old check against MAX_OUTBURST by one against
ao_data.buffersize. There should be no need for the MAX_OUTBURST check;
the current MPlayer side should no longer have any constant limit on the
amount of data an ao can buffer or request at once.
The get_space() values larger than ao_data.buffersize triggered errors
in audio decoding causing the current attempt to fill audio buffers to
be aborted. I'm not sure how often that caused behavior noticeably worse
then an underrun already is.
author | uau |
---|---|
date | Mon, 24 Sep 2007 21:49:58 +0000 |
parents | 89bae6fd11fe |
children | 634dfaa85718 |
rev | line source |
---|---|
2708 | 1 #include <stdio.h> |
2 #include <stdlib.h> | |
7472
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7164
diff
changeset
|
3 #include <string.h> |
19184
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
4 #include <sys/types.h> |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
5 #include <sys/stat.h> |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
6 #include <fcntl.h> |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
7 #include <unistd.h> |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
8 #include <inttypes.h> |
19362 | 9 #include <errno.h> |
9411 | 10 |
14123 | 11 #include "config.h" |
9411 | 12 |
13 #ifdef HAVE_DVB_HEAD | |
8594 | 14 #define HAVE_DVB 1 |
15 #endif | |
16 | |
6856 | 17 #ifdef HAVE_DVB |
19215
64264df4c4e1
include sys/poll.h only when HAVE_DVB[_HEAD] is set
nicodvb
parents:
19184
diff
changeset
|
18 #include <sys/poll.h> |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
19 #include <sys/ioctl.h> |
6856 | 20 #endif |
2708 | 21 |
22 #include "audio_out.h" | |
23 #include "audio_out_internal.h" | |
24 | |
14245 | 25 #include "libaf/af_format.h" |
19184
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
26 #include "libmpdemux/mpeg_packetizer.h" |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
27 #include "subopt-helper.h" |
2708 | 28 |
14123 | 29 #include "mp_msg.h" |
30 #include "help_mp.h" | |
7161 | 31 |
4792 | 32 #ifdef HAVE_DVB |
8594 | 33 #ifndef HAVE_DVB_HEAD |
4792 | 34 #include <ost/audio.h> |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
35 audioMixer_t dvb_mixer={255,255}; |
8594 | 36 #else |
9411 | 37 #include <linux/dvb/audio.h> |
8594 | 38 audio_mixer_t dvb_mixer={255,255}; |
39 #endif | |
7609 | 40 #endif |
19184
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
41 |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
42 #define true 1 |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
43 #define false 0 |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
44 |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
45 extern int vo_mpegpes_fd; |
19184
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
46 int vo_mpegpes_fd2 = -1; |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
47 |
7164 | 48 #include <errno.h> |
49 | |
2708 | 50 static ao_info_t info = |
51 { | |
4792 | 52 #ifdef HAVE_DVB |
53 "DVB audio output", | |
54 #else | |
55 "Mpeg-PES audio output", | |
56 #endif | |
2708 | 57 "mpegpes", |
58 "A'rpi", | |
59 "" | |
60 }; | |
61 | |
62 LIBAO_EXTERN(mpegpes) | |
63 | |
64 | |
65 // to set/get/query special features/parameters | |
9633
12b1790038b0
64bit libao2 fix by Jens Axboe <mplayer-dev@kernel.dk>
alex
parents:
9411
diff
changeset
|
66 static int control(int cmd,void *arg){ |
4792 | 67 #ifdef HAVE_DVB |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
68 switch(cmd){ |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
69 case AOCONTROL_GET_VOLUME: |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
70 if(vo_mpegpes_fd2>=0){ |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
71 ((ao_control_vol_t*)(arg))->left=dvb_mixer.volume_left/2.56; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
72 ((ao_control_vol_t*)(arg))->right=dvb_mixer.volume_right/2.56; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
73 return CONTROL_OK; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
74 } |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
75 return CONTROL_ERROR; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
76 case AOCONTROL_SET_VOLUME: |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
77 if(vo_mpegpes_fd2>=0){ |
5060 | 78 dvb_mixer.volume_left=((ao_control_vol_t*)(arg))->left*2.56; |
79 dvb_mixer.volume_right=((ao_control_vol_t*)(arg))->right*2.56; | |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
80 if(dvb_mixer.volume_left>255) dvb_mixer.volume_left=255; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
81 if(dvb_mixer.volume_right>255) dvb_mixer.volume_right=255; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
82 // printf("Setting DVB volume: %d ; %d \n",dvb_mixer.volume_left,dvb_mixer.volume_right); |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
83 if ( (ioctl(vo_mpegpes_fd2,AUDIO_SET_MIXER, &dvb_mixer) < 0)){ |
13383
c1955840883d
mp_msg transition of unmaintained audio output drivers.
ivo
parents:
12145
diff
changeset
|
84 mp_msg(MSGT_AO, MSGL_ERR, MSGTR_AO_MPEGPES_CantSetMixer, |
7161 | 85 strerror(errno)); |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
86 return CONTROL_ERROR; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
87 } |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
88 return CONTROL_OK; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
89 } |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
90 return CONTROL_ERROR; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
91 } |
4792 | 92 #endif |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
93 return CONTROL_UNKNOWN; |
2708 | 94 } |
95 | |
4331 | 96 static int freq=0; |
4300
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
97 static int freq_id=0; |
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
98 |
19184
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
99 #ifdef HAVE_DVB |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
100 static int init_device(int card) |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
101 { |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
102 char ao_file[30]; |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
103 #ifndef HAVE_DVB_HEAD |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
104 mp_msg(MSGT_VO,MSGL_INFO, "Opening /dev/ost/audio\n"); |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
105 sprintf(ao_file, "/dev/ost/audio"); |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
106 #else |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
107 mp_msg(MSGT_VO,MSGL_INFO, "Opening /dev/dvb/adapter%d/audio0\n", card); |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
108 sprintf(ao_file, "/dev/dvb/adapter%d/audio0", card); |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
109 #endif |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
110 if((vo_mpegpes_fd2 = open(ao_file,O_RDWR|O_NONBLOCK)) < 0) |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
111 { |
19362 | 112 mp_msg(MSGT_VO, MSGL_ERR, "DVB AUDIO DEVICE: %s\n", strerror(errno)); |
19184
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
113 return -1; |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
114 } |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
115 if( (ioctl(vo_mpegpes_fd2,AUDIO_SELECT_SOURCE, AUDIO_SOURCE_MEMORY) < 0)) |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
116 { |
19362 | 117 mp_msg(MSGT_VO, MSGL_ERR, "DVB AUDIO SELECT SOURCE: %s\n", strerror(errno)); |
19184
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
118 return -1; |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
119 } |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
120 if((ioctl(vo_mpegpes_fd2,AUDIO_PLAY) < 0)) |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
121 { |
19362 | 122 mp_msg(MSGT_VO, MSGL_ERR, "DVB AUDIO PLAY: %s\n", strerror(errno)); |
19184
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
123 return -1; |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
124 } |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
125 if((ioctl(vo_mpegpes_fd2,AUDIO_SET_AV_SYNC, true) < 0)) |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
126 { |
19362 | 127 mp_msg(MSGT_VO, MSGL_ERR, "DVB AUDIO SET AV SYNC: %s\n", strerror(errno)); |
19184
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
128 return -1; |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
129 } |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
130 //FIXME: in vo_mpegpes audio was inited as MUTEd |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
131 if((ioctl(vo_mpegpes_fd2,AUDIO_SET_MUTE, false) < 0)) |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
132 { |
19362 | 133 mp_msg(MSGT_VO, MSGL_ERR, "DVB AUDIO SET MUTE: %s\n", strerror(errno)); |
19184
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
134 return -1; |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
135 } |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
136 return vo_mpegpes_fd2; |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
137 } |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
138 #endif |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
139 |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
140 static int preinit(const char *arg) |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
141 { |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
142 int card = 1; |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
143 char *ao_file = NULL; |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
144 |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
145 opt_t subopts[] = { |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
146 {"card", OPT_ARG_INT, &card, NULL}, |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
147 {"file", OPT_ARG_MSTRZ, &ao_file, NULL}, |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
148 {NULL} |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
149 }; |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
150 |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
151 if(subopt_parse(ao_subdevice, subopts) != 0) |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
152 { |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
153 mp_msg(MSGT_VO, MSGL_ERR, "AO_MPEGPES, Unrecognized options\n"); |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
154 return -1; |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
155 } |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
156 if((card < 1) || (card > 4)) |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
157 { |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
158 mp_msg(MSGT_VO, MSGL_ERR, "DVB card number must be between 1 and 4\n"); |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
159 return -1; |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
160 } |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
161 card--; |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
162 |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
163 #ifdef HAVE_DVB |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
164 if(!ao_file) |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
165 return init_device(card); |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
166 #else |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
167 if(!ao_file) |
19222
5500b7fa33c0
if HAVE_DVB isn't set don't fall back to outputting audiograb.mpg by default, fail instead
nicodvb
parents:
19215
diff
changeset
|
168 return vo_mpegpes_fd; //video fd |
19184
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
169 #endif |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
170 |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
171 vo_mpegpes_fd2=open(ao_file,O_WRONLY|O_CREAT,0666); |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
172 if(vo_mpegpes_fd2<0) |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
173 { |
19362 | 174 mp_msg(MSGT_VO, MSGL_ERR, "ao_mpegpes: %s\n", strerror(errno)); |
19184
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
175 return -1; |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
176 } |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
177 return vo_mpegpes_fd2; |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
178 } |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
179 |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
180 static int my_ao_write(unsigned char* data,int len){ |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
181 int orig_len = len; |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
182 #ifdef HAVE_DVB |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
183 #define NFD 1 |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
184 struct pollfd pfd[NFD]; |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
185 |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
186 pfd[0].fd = vo_mpegpes_fd2; |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
187 pfd[0].events = POLLOUT; |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
188 |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
189 while(len>0){ |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
190 if(poll(pfd,NFD,1)){ |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
191 if(pfd[0].revents & POLLOUT){ |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
192 int ret=write(vo_mpegpes_fd2,data,len); |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
193 if(ret<=0){ |
19362 | 194 mp_msg(MSGT_VO, MSGL_ERR, "ao_mpegpes write: %s\n", strerror(errno)); |
19184
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
195 usleep(0); |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
196 } else { |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
197 len-=ret; |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
198 data+=ret; |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
199 } |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
200 } else usleep(1000); |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
201 } |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
202 } |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
203 |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
204 #else |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
205 if(vo_mpegpes_fd2<0) return 0; // no file |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
206 write(vo_mpegpes_fd2,data,len); // write to file |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
207 #endif |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
208 return orig_len; |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
209 } |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
210 |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
211 |
2708 | 212 // open & setup audio device |
213 // return: 1=success 0=fail | |
214 static int init(int rate,int channels,int format,int flags){ | |
19184
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
215 if(preinit(NULL)<0) return 0; |
7607 | 216 |
217 ao_data.channels=2; | |
3095 | 218 ao_data.outburst=2000; |
7607 | 219 switch(format){ |
14245 | 220 case AF_FORMAT_S16_BE: |
221 case AF_FORMAT_MPEG2: | |
222 case AF_FORMAT_AC3: | |
7607 | 223 ao_data.format=format; |
224 break; | |
225 default: | |
14245 | 226 ao_data.format=AF_FORMAT_S16_BE; |
7607 | 227 } |
24356 | 228 |
4300
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
229 switch(rate){ |
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
230 case 48000: freq_id=0;break; |
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
231 case 96000: freq_id=1;break; |
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
232 case 44100: freq_id=2;break; |
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
233 case 32000: freq_id=3;break; |
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
234 default: |
13383
c1955840883d
mp_msg transition of unmaintained audio output drivers.
ivo
parents:
12145
diff
changeset
|
235 mp_msg(MSGT_AO, MSGL_ERR, MSGTR_AO_MPEGPES_UnsupSamplerate, rate); |
7607 | 236 #if 0 |
237 if(rate>48000) rate=96000; else | |
238 if(rate>44100) rate=48000; else | |
239 if(rate>32000) rate=44100; else | |
240 rate=32000; | |
241 goto retry; | |
242 #else | |
243 rate=48000; freq_id=0; | |
244 #endif | |
4300
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
245 } |
2708 | 246 |
7607 | 247 ao_data.bps=rate*2*2; |
248 freq=ao_data.samplerate=rate; | |
249 | |
2708 | 250 return 1; |
251 } | |
252 | |
253 // close audio device | |
12145 | 254 static void uninit(int immed){ |
2708 | 255 |
256 } | |
257 | |
258 // stop playing and empty buffers (for seeking/pause) | |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
14245
diff
changeset
|
259 static void reset(void){ |
2708 | 260 |
261 } | |
262 | |
263 // stop playing, keep buffers (for pause) | |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
14245
diff
changeset
|
264 static void audio_pause(void) |
2708 | 265 { |
266 // for now, just call reset(); | |
267 reset(); | |
268 } | |
269 | |
270 // resume playing, after audio_pause() | |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
14245
diff
changeset
|
271 static void audio_resume(void) |
2708 | 272 { |
273 } | |
274 | |
275 void send_pes_packet(unsigned char* data,int len,int id,int timestamp); | |
4300
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
276 void send_lpcm_packet(unsigned char* data,int len,int id,int timestamp,int freq_id); |
2708 | 277 extern int vo_pts; |
278 | |
279 // return: how many bytes can be played without blocking | |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
14245
diff
changeset
|
280 static int get_space(void){ |
4331 | 281 float x=(float)(vo_pts-ao_data.pts)/90000.0; |
2708 | 282 int y; |
19184
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
283 //FIXME: is it correct? |
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
284 if(vo_mpegpes_fd < 0) return 32000; //not using -vo mpegpes |
7607 | 285 // printf("vo_pts: %5.3f ao_pts: %5.3f\n",vo_pts/90000.0,ao_data.pts/90000.0); |
2708 | 286 if(x<=0) return 0; |
4331 | 287 y=freq*4*x;y/=ao_data.outburst;y*=ao_data.outburst; |
288 if(y>32000) y=32000; | |
2708 | 289 // printf("diff: %5.3f -> %d \n",x,y); |
290 return y; | |
291 } | |
292 | |
293 // plays 'len' bytes of 'data' | |
294 // it should round it down to outburst*n | |
295 // return: number of bytes played | |
296 static int play(void* data,int len,int flags){ | |
7607 | 297 // printf("\nao_mpegpes: play(%d) freq=%d\n",len,freq_id); |
14245 | 298 if(ao_data.format==AF_FORMAT_MPEG2) |
19184
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
299 send_mpeg_pes_packet (data, len, 0x1C0, ao_data.pts, 1, my_ao_write); |
2708 | 300 else { |
301 int i; | |
302 unsigned short *s=data; | |
4300
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
303 // if(len>2000) len=2000; |
4305 | 304 // printf("ao_mpegpes: len=%d \n",len); |
24522
89bae6fd11fe
ao_mpegpes does not support S16_LE format, do not claim it does!
reimar
parents:
24356
diff
changeset
|
305 if(ao_data.format==AF_FORMAT_AC3) |
7607 | 306 for(i=0;i<len/2;i++) s[i]=(s[i]>>8)|(s[i]<<8); // le<->be |
19184
3f2de7ba8aa0
split the incestous intercourse between ao_mpegpes and vo_mpegpes; now the devices can be used separately
nicodvb
parents:
17566
diff
changeset
|
307 send_mpeg_lpcm_packet(data, len, 0xA0, ao_data.pts, freq_id, my_ao_write); |
2708 | 308 } |
309 return len; | |
310 } | |
311 | |
3095 | 312 // return: delay in seconds between first and last sample in buffer |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
14245
diff
changeset
|
313 static float get_delay(void){ |
2708 | 314 |
3095 | 315 return 0.0; |
2708 | 316 } |