Mercurial > mplayer.hg
annotate libao2/ao_dxr3.c @ 3394:35b18ed357c2
imported from liba52 CVS
author | arpi |
---|---|
date | Sun, 09 Dec 2001 15:28:44 +0000 |
parents | f8bfaa1c9487 |
children | 2a75bbac913e |
rev | line source |
---|---|
2645 | 1 #include <stdio.h> |
2 #include <stdlib.h> | |
2770 | 3 |
2921 | 4 #include <linux/em8300.h> |
2770 | 5 #include <sys/ioctl.h> |
2645 | 6 #include <unistd.h> |
2770 | 7 #include <sys/time.h> |
2645 | 8 #include <sys/types.h> |
2770 | 9 #include <sys/stat.h> |
10 #include <fcntl.h> | |
2645 | 11 |
12 #include "../config.h" | |
13 | |
14 #include "afmt.h" | |
15 | |
16 #include "audio_out.h" | |
17 #include "audio_out_internal.h" | |
18 | |
3186 | 19 void perror( const char *s ); |
20 #include <errno.h> | |
21 int sys_nerr; | |
2770 | 22 extern int verbose; |
2645 | 23 |
24 static ao_info_t info = | |
25 { | |
26 "DXR3/H+ audio out", | |
27 "dxr3", | |
28 "David Holm <dholm@iname.com>", | |
29 "" | |
30 }; | |
31 | |
32 LIBAO_EXTERN(dxr3) | |
33 | |
2770 | 34 static audio_buf_info dxr3_buf_info; |
2921 | 35 static int fd_control = 0, fd_audio = 0; |
2770 | 36 |
2645 | 37 // to set/get/query special features/parameters |
38 static int control(int cmd,int arg) | |
39 { | |
40 switch(cmd) | |
41 { | |
42 case AOCONTROL_QUERY_FORMAT: | |
43 return CONTROL_TRUE; | |
44 case AOCONTROL_GET_VOLUME: | |
45 case AOCONTROL_SET_VOLUME: | |
2770 | 46 return CONTROL_OK; |
47 return CONTROL_ERROR; | |
2645 | 48 } |
2770 | 49 return CONTROL_UNKNOWN; |
2645 | 50 } |
51 | |
52 // open & setup audio device | |
53 // return: 1=success 0=fail | |
54 static int init(int rate,int channels,int format,int flags) | |
55 { | |
3328
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
56 int ioval; |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
57 fd_audio = open( "/dev/em8300_ma", O_WRONLY ); |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
58 if( fd_audio < 0 ) |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
59 { |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
60 printf("AO: [dxr3] Can't open audio device /dev/em8300_ma -> nosound\n"); |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
61 return 0; |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
62 } |
2770 | 63 |
3328
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
64 fd_control = open( "/dev/em8300", O_WRONLY ); |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
65 if( fd_control < 0 ) |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
66 { |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
67 printf("AO: [dxr3] Can't open em8300 control /dev/em8300\n"); |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
68 return 0; |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
69 } |
3186 | 70 |
3328
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
71 ioctl(fd_audio, SNDCTL_DSP_RESET, NULL); |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
72 ao_data.format = format; |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
73 if( ioctl (fd_audio, SNDCTL_DSP_SETFMT, &ao_data.format) < 0 ) |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
74 printf( "AO: [dxr3] Unable to set audio format\n" ); |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
75 if(format == AFMT_AC3 && ao_data.format != AFMT_AC3) |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
76 { |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
77 printf("AO: [dxr3] Can't set audio device /dev/em8300_ma to AC3 output\n"); |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
78 return 0; |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
79 } |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
80 |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
81 printf("AO: [dxr3] Sample format: %s (requested: %s)\n", |
3186 | 82 audio_out_format_name(ao_data.format), audio_out_format_name(format)); |
2770 | 83 |
3328
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
84 ao_data.channels=channels-1; |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
85 if( ioctl (fd_audio, SNDCTL_DSP_STEREO, &ao_data.channels) < 0 ) |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
86 printf( "AO: [dxr3] Unable to set number of channels\n" ); |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
87 |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
88 ao_data.bps = (channels+1)*rate; |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
89 ao_data.samplerate=rate; |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
90 if( ioctl (fd_audio, SNDCTL_DSP_SPEED, &ao_data.samplerate) < 0 ) |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
91 { |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
92 printf( "AO: [dxr3] Unable to set samplerate\n" ); |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
93 return 0; |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
94 } |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
95 if( rate < ao_data.samplerate ) |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
96 { |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
97 ao_data.samplerate = 44100; |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
98 ioctl(fd_audio, SNDCTL_DSP_SPEED, &ao_data.samplerate); |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
99 if( ao_data.samplerate != 44100 ) |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
100 { |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
101 printf( "AO: [dxr3] Unable to set samplerate\n" ); |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
102 return 0; |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
103 } |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
104 printf("AO: [dxr3] Using %d Hz samplerate (requested: %d) (Upsampling)\n",ao_data.samplerate,rate); |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
105 ao_data.samplerate = rate; |
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
106 } |
3231
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
107 else printf("AO: [dxr3] Using %d Hz samplerate (requested: %d)\n",ao_data.samplerate,rate); |
3328
67bcfb9749df
Tried fixing a bug relating to users with digital audio output (I'm unable to test if this works myself since I don't have a decoder)
mswitch
parents:
3231
diff
changeset
|
108 if(format == AFMT_AC3 ) ao_data.bps *= 2; |
2770 | 109 |
2968 | 110 if( ioctl(fd_audio, SNDCTL_DSP_GETOSPACE, &dxr3_buf_info)==-1 ) |
111 { | |
2770 | 112 int r=0; |
2968 | 113 printf("AO: [dxr3] Driver doesn't support SNDCTL_DSP_GETOSPACE :-(\n"); |
114 if( ioctl( fd_audio, SNDCTL_DSP_GETBLKSIZE, &r) ==-1 ) | |
115 { | |
3186 | 116 printf( "AO: [dxr3] %d bytes/frag (config.h)\n", ao_data.outburst ); |
2968 | 117 } |
118 else | |
119 { | |
3186 | 120 ao_data.outburst=r; |
121 printf( "AO: [dxr3] %d bytes/frag (GETBLKSIZE)\n",ao_data.outburst); | |
2770 | 122 } |
2968 | 123 } |
124 else | |
125 { | |
126 printf("AO: [dxr3] frags: %3d/%d (%d bytes/frag) free: %6d\n", | |
127 dxr3_buf_info.fragments+1, dxr3_buf_info.fragstotal, dxr3_buf_info.fragsize, dxr3_buf_info.bytes); | |
3218
8ba06b63f873
Fix green borders -> black borders, patch from D. Holm, also small fix to dxr3 ao.
atmos4
parents:
3201
diff
changeset
|
128 ao_data.buffersize=(dxr3_buf_info.bytes/2); |
3186 | 129 ao_data.outburst=dxr3_buf_info.fragsize; |
2770 | 130 } |
2645 | 131 |
2921 | 132 ioval = EM8300_PLAYMODE_PLAY; |
2968 | 133 if( ioctl( fd_control, EM8300_IOCTL_SET_PLAYMODE, &ioval ) < 0 ) |
134 printf( "AO: [dxr3] Unable to set playmode\n" ); | |
2921 | 135 close( fd_control ); |
2770 | 136 |
137 return 1; | |
2645 | 138 } |
139 | |
140 // close audio device | |
141 static void uninit() | |
142 { | |
2968 | 143 printf( "AO: [dxr3] Uninitializing\n" ); |
144 if( ioctl(fd_audio, SNDCTL_DSP_RESET, NULL) < 0 ) | |
145 printf( "AO: [dxr3] Unable to reset device\n" ); | |
2921 | 146 close( fd_audio ); |
3186 | 147 close( fd_control ); /* Just in case */ |
2645 | 148 } |
149 | |
150 // stop playing and empty buffers (for seeking/pause) | |
151 static void reset() | |
152 { | |
2968 | 153 if( ioctl(fd_audio, SNDCTL_DSP_RESET, NULL) < 0 ) |
154 printf( "AO: [dxr3] Unable to reset device\n" ); | |
2645 | 155 } |
156 | |
157 // stop playing, keep buffers (for pause) | |
158 static void audio_pause() | |
159 { | |
2968 | 160 int ioval; |
3201 | 161 reset(); |
2968 | 162 fd_control = open( "/dev/em8300", O_WRONLY ); |
163 if( fd_control < 0 ) | |
164 printf( "AO: [dxr3] Oops, unable to pause playback\n" ); | |
165 else | |
166 { | |
167 ioval = EM8300_PLAYMODE_PAUSED; | |
168 if( ioctl( fd_control, EM8300_IOCTL_SET_PLAYMODE, &ioval ) < 0 ) | |
169 printf( "AO: [dxr3] Unable to pause playback\n" ); | |
170 close( fd_control ); | |
171 } | |
2645 | 172 } |
173 | |
174 // resume playing, after audio_pause() | |
175 static void audio_resume() | |
176 { | |
2968 | 177 int ioval; |
178 fd_control = open( "/dev/em8300", O_WRONLY ); | |
179 if( fd_control < 0 ) | |
180 printf( "AO: [dxr3] Oops, unable to resume playback\n" ); | |
181 else | |
182 { | |
183 ioval = EM8300_PLAYMODE_PLAY; | |
184 if( ioctl( fd_control, EM8300_IOCTL_SET_PLAYMODE, &ioval ) < 0 ) | |
185 printf( "AO: [dxr3] Unable to resume playback\n" ); | |
186 close( fd_control ); | |
187 } | |
2645 | 188 } |
189 | |
190 // return: how many bytes can be played without blocking | |
191 static int get_space() | |
192 { | |
2968 | 193 int space = 0; |
3186 | 194 if( ioctl(fd_audio, SNDCTL_DSP_GETODELAY, &space) < 0 ) |
2968 | 195 { |
3186 | 196 printf( "AO: [dxr3] Unable to get unplayed bytes in buffer\n" ); |
197 return ao_data.outburst; | |
2968 | 198 } |
3186 | 199 space = ao_data.buffersize - space; |
3201 | 200 space /= ao_data.outburst; /* This is a smart way of doing a fast modulo reduction */ |
201 space *= ao_data.outburst; /* fetched from ao_mpegpes.c */ | |
2968 | 202 return space; |
2645 | 203 } |
204 | |
3231
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
205 // playes 'len' bytes of 'data' |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
206 // upsamples if samplerate < 44100 |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
207 // return: number of bytes played |
2645 | 208 static int play(void* data,int len,int flags) |
209 { | |
3231
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
210 if( ao_data.samplerate < 44100 ) |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
211 { |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
212 int i,j,ratio,len2; |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
213 unsigned char *data2,*s,*d; |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
214 |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
215 ratio = 44100/ao_data.samplerate;ratio/=2;ratio*=2; |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
216 len2 = len * ratio; |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
217 data2 = malloc(len2); |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
218 |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
219 s = data; |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
220 d = data2; |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
221 |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
222 //Upsampler |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
223 if( ao_data.format == AFMT_U8 ) |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
224 { |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
225 for(i=0;i<ratio/2;i++) |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
226 for(j=0;j<len;j++) |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
227 { |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
228 *d = *s; |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
229 d++; |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
230 *d = *s; |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
231 d++;s++; |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
232 } |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
233 } |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
234 else |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
235 { |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
236 for(i=0;i<ratio/2;i++) |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
237 for(j=0;j<len/2;j++) |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
238 { |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
239 *d = *s; |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
240 d++;s++; |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
241 *d = *s; |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
242 d++;s--; |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
243 *d = *s; |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
244 d++;s++; |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
245 *d = *s; |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
246 d++;s++; |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
247 } |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
248 } |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
249 if( len2 < 0 ) return 0; |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
250 write(fd_audio,data2,len2); |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
251 return len; |
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
252 } |
2921 | 253 return write(fd_audio,data,len); |
2645 | 254 } |
255 | |
3231
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
256 // return: delay in seconds between first and last sample in buffer |
3186 | 257 static float get_delay() |
2645 | 258 { |
3231
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
259 int r=0; |
3186 | 260 if( ioctl(fd_audio, SNDCTL_DSP_GETODELAY, &r) < 0 ) |
261 { | |
2968 | 262 printf( "AO: [dxr3] Unable to get unplayed bytes in buffer\n" ); |
3186 | 263 return ((float)ao_data.buffersize)/(float)ao_data.bps; |
264 } | |
3231
4bc4354ec88e
Added support for upsampling since dxr3/h+ only supports 44100Hz and 48000Hz, currently it only works on 44100/(2*ratio)
mswitch
parents:
3218
diff
changeset
|
265 return (((float)r)/(float)ao_data.bps); |
2645 | 266 } |
267 |