Mercurial > mplayer.hg
annotate libao2/ao_mpegpes.c @ 13822:9e9b5e6b0513
preliminary pre6 changes from Reimar
author | diego |
---|---|
date | Sun, 31 Oct 2004 01:29:17 +0000 |
parents | c1955840883d |
children | a92101a7eb49 |
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> |
9411 | 4 |
5 #include "../config.h" | |
6 | |
7 #ifdef HAVE_DVB_HEAD | |
8594 | 8 #define HAVE_DVB 1 |
9 #endif | |
10 | |
6856 | 11 #ifdef HAVE_DVB |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
12 #include <sys/ioctl.h> |
6856 | 13 #endif |
2708 | 14 |
15 #include "audio_out.h" | |
16 #include "audio_out_internal.h" | |
17 | |
18 #include "afmt.h" | |
19 | |
7161 | 20 #include "../mp_msg.h" |
13383
c1955840883d
mp_msg transition of unmaintained audio output drivers.
ivo
parents:
12145
diff
changeset
|
21 #include "../help_mp.h" |
7161 | 22 |
4792 | 23 #ifdef HAVE_DVB |
8594 | 24 #ifndef HAVE_DVB_HEAD |
4792 | 25 #include <ost/audio.h> |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
26 audioMixer_t dvb_mixer={255,255}; |
8594 | 27 #else |
9411 | 28 #include <linux/dvb/audio.h> |
8594 | 29 audio_mixer_t dvb_mixer={255,255}; |
30 #endif | |
7609 | 31 #endif |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
32 extern int vo_mpegpes_fd; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
33 extern int vo_mpegpes_fd2; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
34 |
7164 | 35 #include <errno.h> |
36 | |
2708 | 37 static ao_info_t info = |
38 { | |
4792 | 39 #ifdef HAVE_DVB |
40 "DVB audio output", | |
41 #else | |
42 "Mpeg-PES audio output", | |
43 #endif | |
2708 | 44 "mpegpes", |
45 "A'rpi", | |
46 "" | |
47 }; | |
48 | |
49 LIBAO_EXTERN(mpegpes) | |
50 | |
51 | |
52 // to set/get/query special features/parameters | |
9633
12b1790038b0
64bit libao2 fix by Jens Axboe <mplayer-dev@kernel.dk>
alex
parents:
9411
diff
changeset
|
53 static int control(int cmd,void *arg){ |
4792 | 54 #ifdef HAVE_DVB |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
55 switch(cmd){ |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
56 case AOCONTROL_GET_VOLUME: |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
57 if(vo_mpegpes_fd2>=0){ |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
58 ((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
|
59 ((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
|
60 return CONTROL_OK; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
61 } |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
62 return CONTROL_ERROR; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
63 case AOCONTROL_SET_VOLUME: |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
64 if(vo_mpegpes_fd2>=0){ |
5060 | 65 dvb_mixer.volume_left=((ao_control_vol_t*)(arg))->left*2.56; |
66 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
|
67 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
|
68 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
|
69 // 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
|
70 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
|
71 mp_msg(MSGT_AO, MSGL_ERR, MSGTR_AO_MPEGPES_CantSetMixer, |
7161 | 72 strerror(errno)); |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
73 return CONTROL_ERROR; |
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_OK; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
76 } |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
77 return CONTROL_ERROR; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
78 } |
4792 | 79 #endif |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
80 return CONTROL_UNKNOWN; |
2708 | 81 } |
82 | |
4331 | 83 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
|
84 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
|
85 |
2708 | 86 // open & setup audio device |
87 // return: 1=success 0=fail | |
88 static int init(int rate,int channels,int format,int flags){ | |
89 | |
7607 | 90 #ifdef HAVE_DVB |
91 if(vo_mpegpes_fd2<0) return 0; // couldn't open audio dev | |
92 #else | |
93 if(vo_mpegpes_fd<0) return 0; // no file | |
94 #endif | |
95 | |
96 ao_data.channels=2; | |
3095 | 97 ao_data.outburst=2000; |
7607 | 98 switch(format){ |
99 case AFMT_S16_LE: | |
100 case AFMT_S16_BE: | |
101 case AFMT_MPEG: | |
9265 | 102 case AFMT_AC3: |
7607 | 103 ao_data.format=format; |
104 break; | |
105 default: | |
106 ao_data.format=AFMT_S16_BE; | |
107 } | |
4300
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
108 |
7607 | 109 retry: |
4300
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
110 switch(rate){ |
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
111 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
|
112 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
|
113 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
|
114 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
|
115 default: |
13383
c1955840883d
mp_msg transition of unmaintained audio output drivers.
ivo
parents:
12145
diff
changeset
|
116 mp_msg(MSGT_AO, MSGL_ERR, MSGTR_AO_MPEGPES_UnsupSamplerate, rate); |
7607 | 117 #if 0 |
118 if(rate>48000) rate=96000; else | |
119 if(rate>44100) rate=48000; else | |
120 if(rate>32000) rate=44100; else | |
121 rate=32000; | |
122 goto retry; | |
123 #else | |
124 rate=48000; freq_id=0; | |
125 #endif | |
4300
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
126 } |
2708 | 127 |
7607 | 128 ao_data.bps=rate*2*2; |
129 freq=ao_data.samplerate=rate; | |
130 | |
2708 | 131 return 1; |
132 } | |
133 | |
134 // close audio device | |
12145 | 135 static void uninit(int immed){ |
2708 | 136 |
137 } | |
138 | |
139 // stop playing and empty buffers (for seeking/pause) | |
140 static void reset(){ | |
141 | |
142 } | |
143 | |
144 // stop playing, keep buffers (for pause) | |
145 static void audio_pause() | |
146 { | |
147 // for now, just call reset(); | |
148 reset(); | |
149 } | |
150 | |
151 // resume playing, after audio_pause() | |
152 static void audio_resume() | |
153 { | |
154 } | |
155 | |
156 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
|
157 void send_lpcm_packet(unsigned char* data,int len,int id,int timestamp,int freq_id); |
2708 | 158 extern int vo_pts; |
159 | |
160 // return: how many bytes can be played without blocking | |
161 static int get_space(){ | |
4331 | 162 float x=(float)(vo_pts-ao_data.pts)/90000.0; |
2708 | 163 int y; |
7607 | 164 // printf("vo_pts: %5.3f ao_pts: %5.3f\n",vo_pts/90000.0,ao_data.pts/90000.0); |
2708 | 165 if(x<=0) return 0; |
4331 | 166 y=freq*4*x;y/=ao_data.outburst;y*=ao_data.outburst; |
167 if(y>32000) y=32000; | |
2708 | 168 // printf("diff: %5.3f -> %d \n",x,y); |
169 return y; | |
170 } | |
171 | |
172 // plays 'len' bytes of 'data' | |
173 // it should round it down to outburst*n | |
174 // return: number of bytes played | |
175 static int play(void* data,int len,int flags){ | |
7607 | 176 // printf("\nao_mpegpes: play(%d) freq=%d\n",len,freq_id); |
3095 | 177 if(ao_data.format==AFMT_MPEG) |
178 send_pes_packet(data,len,0x1C0,ao_data.pts); | |
2708 | 179 else { |
180 int i; | |
181 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
|
182 // if(len>2000) len=2000; |
4305 | 183 // printf("ao_mpegpes: len=%d \n",len); |
9265 | 184 if(ao_data.format==AFMT_S16_LE || ao_data.format==AFMT_AC3) |
7607 | 185 for(i=0;i<len/2;i++) s[i]=(s[i]>>8)|(s[i]<<8); // le<->be |
4300
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
186 send_lpcm_packet(data,len,0xA0,ao_data.pts,freq_id); |
2708 | 187 } |
188 return len; | |
189 } | |
190 | |
3095 | 191 // return: delay in seconds between first and last sample in buffer |
192 static float get_delay(){ | |
2708 | 193 |
3095 | 194 return 0.0; |
2708 | 195 } |