Mercurial > mplayer.hg
annotate libaf/af_resample.c @ 27808:2988c38b6620
Make sure that linker flags passed as configure parameters appear before
those detected by configure so that the former can override the latter.
patch by Giacomo Comes, comes naic edu
author | diego |
---|---|
date | Tue, 28 Oct 2008 18:00:11 +0000 |
parents | 9079c9745ff9 |
children | 4ff973912251 |
rev | line source |
---|---|
7568 | 1 /*============================================================================= |
2 // | |
13602
14090f7300a8
The full name of the GPL is GNU General Public License.
diego
parents:
8905
diff
changeset
|
3 // This software has been released under the terms of the GNU General Public |
7568 | 4 // license. See http://www.gnu.org/copyleft/gpl.html for details. |
5 // | |
6 // Copyright 2002 Anders Johansson ajh@atri.curtin.edu.au | |
7 // | |
8 //============================================================================= | |
9 */ | |
10 | |
11 /* This audio filter changes the sample rate. */ | |
12 #include <stdio.h> | |
13 #include <stdlib.h> | |
14 #include <inttypes.h> | |
15 | |
24889 | 16 #include "libavutil/common.h" |
7568 | 17 #include "af.h" |
18 #include "dsp.h" | |
19 | |
20 /* Below definition selects the length of each poly phase component. | |
21 Valid definitions are L8 and L16, where the number denotes the | |
22 length of the filter. This definition affects the computational | |
23 complexity (see play()), the performance (see filter.h) and the | |
24595 | 24 memory usage. The filterlength is choosen to 8 if the machine is |
7568 | 25 slow and to 16 if the machine is fast and has MMX. |
26 */ | |
27 | |
8607 | 28 #if !defined(HAVE_MMX) // This machine is slow |
29 #define L8 | |
30 #else | |
31 #define L16 | |
32 #endif | |
7568 | 33 |
8607 | 34 #include "af_resample.h" |
7568 | 35 |
8607 | 36 // Filtering types |
8867
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
37 #define RSMP_LIN (0<<0) // Linear interpolation |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
38 #define RSMP_INT (1<<0) // 16 bit integer |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
39 #define RSMP_FLOAT (2<<0) // 32 bit floating point |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
40 #define RSMP_MASK (3<<0) |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
41 |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
42 // Defines for sloppy or exact resampling |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
43 #define FREQ_SLOPPY (0<<2) |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
44 #define FREQ_EXACT (1<<2) |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
45 #define FREQ_MASK (1<<2) |
7568 | 46 |
8607 | 47 // Accuracy for linear interpolation |
48 #define STEPACCURACY 32 | |
7568 | 49 |
50 // local data | |
51 typedef struct af_resample_s | |
52 { | |
8607 | 53 void* w; // Current filter weights |
54 void** xq; // Circular buffers | |
7580 | 55 uint32_t xi; // Index for circular buffers |
56 uint32_t wi; // Index for w | |
8607 | 57 uint32_t i; // Number of new samples to put in x queue |
7580 | 58 uint32_t dn; // Down sampling factor |
59 uint32_t up; // Up sampling factor | |
8607 | 60 uint64_t step; // Step size for linear interpolation |
61 uint64_t pt; // Pointer remainder for linear interpolation | |
8867
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
62 int setup; // Setup parameters cmdline or through postcreate |
7568 | 63 } af_resample_t; |
64 | |
8607 | 65 // Fast linear interpolation resample with modest audio quality |
66 static int linint(af_data_t* c,af_data_t* l, af_resample_t* s) | |
7568 | 67 { |
8607 | 68 uint32_t len = 0; // Number of input samples |
69 uint32_t nch = l->nch; // Words pre transfer | |
70 uint64_t step = s->step; | |
71 int16_t* in16 = ((int16_t*)c->audio); | |
72 int16_t* out16 = ((int16_t*)l->audio); | |
73 int32_t* in32 = ((int32_t*)c->audio); | |
74 int32_t* out32 = ((int32_t*)l->audio); | |
75 uint64_t end = ((((uint64_t)c->len)/2LL)<<STEPACCURACY); | |
76 uint64_t pt = s->pt; | |
77 uint16_t tmp; | |
78 | |
79 switch (nch){ | |
80 case 1: | |
81 while(pt < end){ | |
82 out16[len++]=in16[pt>>STEPACCURACY]; | |
83 pt+=step; | |
7568 | 84 } |
8607 | 85 s->pt=pt & ((1LL<<STEPACCURACY)-1); |
86 break; | |
87 case 2: | |
88 end/=2; | |
89 while(pt < end){ | |
90 out32[len++]=in32[pt>>STEPACCURACY]; | |
91 pt+=step; | |
92 } | |
93 len=(len<<1); | |
94 s->pt=pt & ((1LL<<STEPACCURACY)-1); | |
95 break; | |
96 default: | |
97 end /=nch; | |
98 while(pt < end){ | |
99 tmp=nch; | |
100 do { | |
101 tmp--; | |
102 out16[len+tmp]=in16[tmp+(pt>>STEPACCURACY)*nch]; | |
103 } while (tmp); | |
104 len+=nch; | |
105 pt+=step; | |
106 } | |
107 s->pt=pt & ((1LL<<STEPACCURACY)-1); | |
7568 | 108 } |
109 return len; | |
110 } | |
111 | |
8867
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
112 /* Determine resampling type and format */ |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
113 static int set_types(struct af_instance_s* af, af_data_t* data) |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
114 { |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
115 af_resample_t* s = af->setup; |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
116 int rv = AF_OK; |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
117 float rd = 0; |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
118 |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
119 // Make sure this filter isn't redundant |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
120 if((af->data->rate == data->rate) || (af->data->rate == 0)) |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
121 return AF_DETACH; |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
122 /* If sloppy and small resampling difference (2%) */ |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
123 rd = abs((float)af->data->rate - (float)data->rate)/(float)data->rate; |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
124 if((((s->setup & FREQ_MASK) == FREQ_SLOPPY) && (rd < 0.02) && |
14245 | 125 (data->format != (AF_FORMAT_FLOAT_NE))) || |
8867
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
126 ((s->setup & RSMP_MASK) == RSMP_LIN)){ |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
127 s->setup = (s->setup & ~RSMP_MASK) | RSMP_LIN; |
14245 | 128 af->data->format = AF_FORMAT_S16_NE; |
8867
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
129 af->data->bps = 2; |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
130 af_msg(AF_MSG_VERBOSE,"[resample] Using linear interpolation. \n"); |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
131 } |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
132 else{ |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
133 /* If the input format is float or if float is explicitly selected |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
134 use float, otherwise use int */ |
14245 | 135 if((data->format == (AF_FORMAT_FLOAT_NE)) || |
8867
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
136 ((s->setup & RSMP_MASK) == RSMP_FLOAT)){ |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
137 s->setup = (s->setup & ~RSMP_MASK) | RSMP_FLOAT; |
14245 | 138 af->data->format = AF_FORMAT_FLOAT_NE; |
8867
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
139 af->data->bps = 4; |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
140 } |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
141 else{ |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
142 s->setup = (s->setup & ~RSMP_MASK) | RSMP_INT; |
14245 | 143 af->data->format = AF_FORMAT_S16_NE; |
8867
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
144 af->data->bps = 2; |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
145 } |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
146 af_msg(AF_MSG_VERBOSE,"[resample] Using %s processing and %s frequecy" |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
147 " conversion.\n", |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
148 ((s->setup & RSMP_MASK) == RSMP_FLOAT)?"floating point":"integer", |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
149 ((s->setup & FREQ_MASK) == FREQ_SLOPPY)?"inexact":"exact"); |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
150 } |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
151 |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
152 if(af->data->format != data->format || af->data->bps != data->bps) |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
153 rv = AF_FALSE; |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
154 data->format = af->data->format; |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
155 data->bps = af->data->bps; |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
156 af->data->nch = data->nch; |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
157 return rv; |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
158 } |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
159 |
7568 | 160 // Initialization and runtime control |
161 static int control(struct af_instance_s* af, int cmd, void* arg) | |
162 { | |
163 switch(cmd){ | |
164 case AF_CONTROL_REINIT:{ | |
165 af_resample_t* s = (af_resample_t*)af->setup; | |
166 af_data_t* n = (af_data_t*)arg; // New configureation | |
167 int i,d = 0; | |
168 int rv = AF_OK; | |
169 | |
8867
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
170 // Free space for circular bufers |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
171 if(s->xq){ |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
172 for(i=1;i<af->data->nch;i++) |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
173 if(s->xq[i]) |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
174 free(s->xq[i]); |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
175 free(s->xq); |
21017
32d611b59079
Fix double free in af_resample when reinited with suitable parameters
uau
parents:
17366
diff
changeset
|
176 s->xq = NULL; |
8867
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
177 } |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
178 |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
179 if(AF_DETACH == (rv = set_types(af,n))) |
7568 | 180 return AF_DETACH; |
8867
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
181 |
8607 | 182 // If linear interpolation |
8867
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
183 if((s->setup & RSMP_MASK) == RSMP_LIN){ |
8607 | 184 s->pt=0LL; |
185 s->step=((uint64_t)n->rate<<STEPACCURACY)/(uint64_t)af->data->rate+1LL; | |
17366 | 186 af_msg(AF_MSG_DEBUG0,"[resample] Linear interpolation step: 0x%016"PRIX64".\n", |
8607 | 187 s->step); |
24888 | 188 af->mul = (double)af->data->rate / n->rate; |
8905 | 189 return rv; |
7568 | 190 } |
191 | |
192 // Calculate up and down sampling factors | |
24889 | 193 d=ff_gcd(af->data->rate,n->rate); |
7568 | 194 |
7998
d48a06d07afb
Adding commandline options for filters and fixing stupid bug in cfg
anders
parents:
7894
diff
changeset
|
195 // If sloppy resampling is enabled limit the upsampling factor |
8867
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
196 if(((s->setup & FREQ_MASK) == FREQ_SLOPPY) && (af->data->rate/d > 5000)){ |
7998
d48a06d07afb
Adding commandline options for filters and fixing stupid bug in cfg
anders
parents:
7894
diff
changeset
|
197 int up=af->data->rate/2; |
d48a06d07afb
Adding commandline options for filters and fixing stupid bug in cfg
anders
parents:
7894
diff
changeset
|
198 int dn=n->rate/2; |
d48a06d07afb
Adding commandline options for filters and fixing stupid bug in cfg
anders
parents:
7894
diff
changeset
|
199 int m=2; |
d48a06d07afb
Adding commandline options for filters and fixing stupid bug in cfg
anders
parents:
7894
diff
changeset
|
200 while(af->data->rate/(d*m) > 5000){ |
24889 | 201 d=ff_gcd(up,dn); |
7998
d48a06d07afb
Adding commandline options for filters and fixing stupid bug in cfg
anders
parents:
7894
diff
changeset
|
202 up/=2; dn/=2; m*=2; |
d48a06d07afb
Adding commandline options for filters and fixing stupid bug in cfg
anders
parents:
7894
diff
changeset
|
203 } |
d48a06d07afb
Adding commandline options for filters and fixing stupid bug in cfg
anders
parents:
7894
diff
changeset
|
204 d*=m; |
d48a06d07afb
Adding commandline options for filters and fixing stupid bug in cfg
anders
parents:
7894
diff
changeset
|
205 } |
d48a06d07afb
Adding commandline options for filters and fixing stupid bug in cfg
anders
parents:
7894
diff
changeset
|
206 |
8867
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
207 // Create space for circular bufers |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
208 s->xq = malloc(n->nch*sizeof(void*)); |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
209 for(i=0;i<n->nch;i++) |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
210 s->xq[i] = malloc(2*L*af->data->bps); |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
211 s->xi = 0; |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
212 |
7568 | 213 // Check if the the design needs to be redone |
214 if(s->up != af->data->rate/d || s->dn != n->rate/d){ | |
215 float* w; | |
216 float* wt; | |
217 float fc; | |
218 int j; | |
219 s->up = af->data->rate/d; | |
220 s->dn = n->rate/d; | |
21058
1ed61a0494c4
Reinitialize some variables on af_resample reinit, fixes crash
uau
parents:
21017
diff
changeset
|
221 s->wi = 0; |
1ed61a0494c4
Reinitialize some variables on af_resample reinit, fixes crash
uau
parents:
21017
diff
changeset
|
222 s->i = 0; |
7568 | 223 |
224 // Calculate cuttof frequency for filter | |
225 fc = 1/(float)(max(s->up,s->dn)); | |
226 // Allocate space for polyphase filter bank and protptype filter | |
227 w = malloc(sizeof(float) * s->up *L); | |
228 if(NULL != s->w) | |
229 free(s->w); | |
8867
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
230 s->w = malloc(L*s->up*af->data->bps); |
7568 | 231 |
232 // Design prototype filter type using Kaiser window with beta = 10 | |
233 if(NULL == w || NULL == s->w || | |
14275
de13fd557440
less namespace pollution #2 (prefixed globals in filter.c with af_filter_)
alex
parents:
14245
diff
changeset
|
234 -1 == af_filter_design_fir(s->up*L, w, &fc, LP|KAISER , 10.0)){ |
8167 | 235 af_msg(AF_MSG_ERROR,"[resample] Unable to design prototype filter.\n"); |
7568 | 236 return AF_ERROR; |
237 } | |
238 // Copy data from prototype to polyphase filter | |
239 wt=w; | |
240 for(j=0;j<L;j++){//Columns | |
241 for(i=0;i<s->up;i++){//Rows | |
8867
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
242 if((s->setup & RSMP_MASK) == RSMP_INT){ |
8607 | 243 float t=(float)s->up*32767.0*(*wt); |
244 ((int16_t*)s->w)[i*L+j] = (int16_t)((t>=0.0)?(t+0.5):(t-0.5)); | |
245 } | |
246 else | |
247 ((float*)s->w)[i*L+j] = (float)s->up*(*wt); | |
7568 | 248 wt++; |
249 } | |
250 } | |
251 free(w); | |
8607 | 252 af_msg(AF_MSG_VERBOSE,"[resample] New filter designed up: %i " |
253 "down: %i\n", s->up, s->dn); | |
7568 | 254 } |
255 | |
7665
fbd5445cc853
Adding function for calculating the delay caused by the filters
anders
parents:
7616
diff
changeset
|
256 // Set multiplier and delay |
24900 | 257 af->delay = 0; // not set correctly, but shouldn't be too large anyway |
24888 | 258 af->mul = (double)s->up / s->dn; |
7568 | 259 return rv; |
260 } | |
7998
d48a06d07afb
Adding commandline options for filters and fixing stupid bug in cfg
anders
parents:
7894
diff
changeset
|
261 case AF_CONTROL_COMMAND_LINE:{ |
d48a06d07afb
Adding commandline options for filters and fixing stupid bug in cfg
anders
parents:
7894
diff
changeset
|
262 af_resample_t* s = (af_resample_t*)af->setup; |
d48a06d07afb
Adding commandline options for filters and fixing stupid bug in cfg
anders
parents:
7894
diff
changeset
|
263 int rate=0; |
8867
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
264 int type=RSMP_INT; |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
265 int sloppy=1; |
8868
398e3fb7c103
10l bug for float conversion control + feature fix in volume control
anders
parents:
8867
diff
changeset
|
266 sscanf((char*)arg,"%i:%i:%i", &rate, &sloppy, &type); |
8867
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
267 s->setup = (sloppy?FREQ_SLOPPY:FREQ_EXACT) | |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
268 (clamp(type,RSMP_LIN,RSMP_FLOAT)); |
8607 | 269 return af->control(af,AF_CONTROL_RESAMPLE_RATE | AF_CONTROL_SET, &rate); |
7998
d48a06d07afb
Adding commandline options for filters and fixing stupid bug in cfg
anders
parents:
7894
diff
changeset
|
270 } |
8607 | 271 case AF_CONTROL_POST_CREATE: |
8867
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
272 if((((af_cfg_t*)arg)->force & AF_INIT_FORMAT_MASK) == AF_INIT_FLOAT) |
8868
398e3fb7c103
10l bug for float conversion control + feature fix in volume control
anders
parents:
8867
diff
changeset
|
273 ((af_resample_t*)af->setup)->setup = RSMP_FLOAT; |
8607 | 274 return AF_OK; |
275 case AF_CONTROL_RESAMPLE_RATE | AF_CONTROL_SET: | |
7568 | 276 // Reinit must be called after this function has been called |
277 | |
278 // Sanity check | |
7616 | 279 if(((int*)arg)[0] < 8000 || ((int*)arg)[0] > 192000){ |
8607 | 280 af_msg(AF_MSG_ERROR,"[resample] The output sample frequency " |
281 "must be between 8kHz and 192kHz. Current value is %i \n", | |
282 ((int*)arg)[0]); | |
7568 | 283 return AF_ERROR; |
284 } | |
285 | |
286 af->data->rate=((int*)arg)[0]; | |
8607 | 287 af_msg(AF_MSG_VERBOSE,"[resample] Changing sample rate " |
288 "to %iHz\n",af->data->rate); | |
7568 | 289 return AF_OK; |
290 } | |
291 return AF_UNKNOWN; | |
292 } | |
293 | |
294 // Deallocate memory | |
295 static void uninit(struct af_instance_s* af) | |
296 { | |
297 if(af->data) | |
22179 | 298 free(af->data->audio); |
299 free(af->data); | |
7568 | 300 } |
301 | |
302 // Filter data through filter | |
303 static af_data_t* play(struct af_instance_s* af, af_data_t* data) | |
304 { | |
305 int len = 0; // Length of output data | |
306 af_data_t* c = data; // Current working data | |
307 af_data_t* l = af->data; // Local data | |
308 af_resample_t* s = (af_resample_t*)af->setup; | |
309 | |
310 if(AF_OK != RESIZE_LOCAL_BUFFER(af,data)) | |
311 return NULL; | |
312 | |
313 // Run resampling | |
8867
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
314 switch(s->setup & RSMP_MASK){ |
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
315 case(RSMP_INT): |
8607 | 316 # define FORMAT_I 1 |
317 if(s->up>s->dn){ | |
318 # define UP | |
319 # include "af_resample.h" | |
320 # undef UP | |
321 } | |
322 else{ | |
323 # define DN | |
324 # include "af_resample.h" | |
325 # undef DN | |
326 } | |
327 break; | |
8867
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
328 case(RSMP_FLOAT): |
8607 | 329 # undef FORMAT_I |
330 # define FORMAT_F 1 | |
331 if(s->up>s->dn){ | |
332 # define UP | |
333 # include "af_resample.h" | |
334 # undef UP | |
335 } | |
336 else{ | |
337 # define DN | |
338 # include "af_resample.h" | |
339 # undef DN | |
340 } | |
341 break; | |
8867
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
342 case(RSMP_LIN): |
8607 | 343 len = linint(c, l, s); |
344 break; | |
345 } | |
7568 | 346 |
347 // Set output data | |
348 c->audio = l->audio; | |
8607 | 349 c->len = len*l->bps; |
7568 | 350 c->rate = l->rate; |
351 | |
352 return c; | |
353 } | |
354 | |
355 // Allocate memory and set function pointers | |
22746
fd6f824ef894
Rename open to af_open so as not to conflict with a previous header definition.
diego
parents:
22179
diff
changeset
|
356 static int af_open(af_instance_t* af){ |
7568 | 357 af->control=control; |
358 af->uninit=uninit; | |
359 af->play=play; | |
24888 | 360 af->mul=1; |
7568 | 361 af->data=calloc(1,sizeof(af_data_t)); |
362 af->setup=calloc(1,sizeof(af_resample_t)); | |
363 if(af->data == NULL || af->setup == NULL) | |
364 return AF_ERROR; | |
8867
558f0b1f45ee
New auto config for volume and resample and added support for float flag in configuration
anders
parents:
8711
diff
changeset
|
365 ((af_resample_t*)af->setup)->setup = RSMP_INT | FREQ_SLOPPY; |
7568 | 366 return AF_OK; |
367 } | |
368 | |
369 // Description of this plugin | |
370 af_info_t af_info_resample = { | |
371 "Sample frequency conversion", | |
372 "resample", | |
373 "Anders", | |
374 "", | |
7615 | 375 AF_FLAGS_REENTRANT, |
22746
fd6f824ef894
Rename open to af_open so as not to conflict with a previous header definition.
diego
parents:
22179
diff
changeset
|
376 af_open |
7568 | 377 }; |
378 |