Mercurial > mplayer.hg
annotate libao2/ao_mpegpes.c @ 7579:24860f7c716f
change i18n to autodetect
author | pontscho |
---|---|
date | Wed, 02 Oct 2002 09:24:34 +0000 |
parents | c4434bdf6e51 |
children | 8d73a0292932 |
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> |
6856 | 4 #ifdef HAVE_DVB |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
5 #include <sys/ioctl.h> |
6856 | 6 #endif |
2708 | 7 |
5060 | 8 #include "../config.h" |
9 | |
2708 | 10 #include "audio_out.h" |
11 #include "audio_out_internal.h" | |
12 | |
13 #include "afmt.h" | |
14 | |
7161 | 15 #include "../mp_msg.h" |
16 | |
4792 | 17 #ifdef HAVE_DVB |
18 #include <ost/audio.h> | |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
19 audioMixer_t dvb_mixer={255,255}; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
20 extern int vo_mpegpes_fd; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
21 extern int vo_mpegpes_fd2; |
4792 | 22 #endif |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
23 |
7164 | 24 #include <errno.h> |
25 | |
2708 | 26 static ao_info_t info = |
27 { | |
4792 | 28 #ifdef HAVE_DVB |
29 "DVB audio output", | |
30 #else | |
31 "Mpeg-PES audio output", | |
32 #endif | |
2708 | 33 "mpegpes", |
34 "A'rpi", | |
35 "" | |
36 }; | |
37 | |
38 LIBAO_EXTERN(mpegpes) | |
39 | |
40 | |
41 // to set/get/query special features/parameters | |
42 static int control(int cmd,int arg){ | |
4792 | 43 #ifdef HAVE_DVB |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
44 switch(cmd){ |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
45 case AOCONTROL_GET_VOLUME: |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
46 if(vo_mpegpes_fd2>=0){ |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
47 ((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
|
48 ((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
|
49 return CONTROL_OK; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
50 } |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
51 return CONTROL_ERROR; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
52 case AOCONTROL_SET_VOLUME: |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
53 if(vo_mpegpes_fd2>=0){ |
5060 | 54 dvb_mixer.volume_left=((ao_control_vol_t*)(arg))->left*2.56; |
55 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
|
56 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
|
57 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
|
58 // 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
|
59 if ( (ioctl(vo_mpegpes_fd2,AUDIO_SET_MIXER, &dvb_mixer) < 0)){ |
7161 | 60 mp_msg(MSGT_AO, MSGL_ERR, "DVB audio set mixer failed: %s\n", |
61 strerror(errno)); | |
4788
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 } |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
64 return CONTROL_OK; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
65 } |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
66 return CONTROL_ERROR; |
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
67 } |
4792 | 68 #endif |
4788
d678ce495a75
Moved HW dependent mixer stuff to libao and removed master switch
anders
parents:
4331
diff
changeset
|
69 return CONTROL_UNKNOWN; |
2708 | 70 } |
71 | |
4331 | 72 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
|
73 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
|
74 |
2708 | 75 // open & setup audio device |
76 // return: 1=success 0=fail | |
77 static int init(int rate,int channels,int format,int flags){ | |
78 | |
3095 | 79 ao_data.outburst=2000; |
80 ao_data.format=format; | |
4331 | 81 freq=rate; |
4300
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
82 |
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
83 switch(rate){ |
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
84 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
|
85 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
|
86 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
|
87 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
|
88 default: |
7161 | 89 mp_msg(MSGT_AO, MSGL_ERR, "ao_mpegpes: %d Hz not supported, try to resample (RTFM)\n",rate); |
4300
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
90 return 0; |
4ebab79785b7
passing samplerate to LPCM writer - 44, 32 and 96khz are also supported from now
arpi
parents:
3095
diff
changeset
|
91 } |
2708 | 92 |
93 return 1; | |
94 } | |
95 | |
96 // close audio device | |
97 static void uninit(){ | |
98 | |
99 } | |
100 | |
101 // stop playing and empty buffers (for seeking/pause) | |
102 static void reset(){ | |
103 | |
104 } | |
105 | |
106 // stop playing, keep buffers (for pause) | |
107 static void audio_pause() | |
108 { | |
109 // for now, just call reset(); | |
110 reset(); | |
111 } | |
112 | |
113 // resume playing, after audio_pause() | |
114 static void audio_resume() | |
115 { | |
116 } | |
117 | |
118 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
|
119 void send_lpcm_packet(unsigned char* data,int len,int id,int timestamp,int freq_id); |
2708 | 120 extern int vo_pts; |
121 | |
122 // return: how many bytes can be played without blocking | |
123 static int get_space(){ | |
4331 | 124 float x=(float)(vo_pts-ao_data.pts)/90000.0; |
2708 | 125 int y; |
126 if(x<=0) return 0; | |
4331 | 127 y=freq*4*x;y/=ao_data.outburst;y*=ao_data.outburst; |
128 if(y>32000) y=32000; | |
2708 | 129 // printf("diff: %5.3f -> %d \n",x,y); |
130 return y; | |
131 } | |
132 | |
133 // plays 'len' bytes of 'data' | |
134 // it should round it down to outburst*n | |
135 // return: number of bytes played | |
136 static int play(void* data,int len,int flags){ | |
3095 | 137 if(ao_data.format==AFMT_MPEG) |
138 send_pes_packet(data,len,0x1C0,ao_data.pts); | |
2708 | 139 else { |
140 int i; | |
141 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
|
142 // if(len>2000) len=2000; |
4305 | 143 // printf("ao_mpegpes: len=%d \n",len); |
2708 | 144 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
|
145 send_lpcm_packet(data,len,0xA0,ao_data.pts,freq_id); |
2708 | 146 } |
147 return len; | |
148 } | |
149 | |
3095 | 150 // return: delay in seconds between first and last sample in buffer |
151 static float get_delay(){ | |
2708 | 152 |
3095 | 153 return 0.0; |
2708 | 154 } |