Mercurial > mplayer.hg
annotate libaf/af.c @ 28615:15e7abed4291
Use the same code to convert fps in float to fraction as used in mencoder,
it ensures all the common frame rates work right.
If this causes issues, it should be changed in the same way in mencoder.c
author | reimar |
---|---|
date | Wed, 18 Feb 2009 16:49:12 +0000 |
parents | df67d03dde3b |
children | 20787bd5c506 |
rev | line source |
---|---|
28229
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
27391
diff
changeset
|
1 /* |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
27391
diff
changeset
|
2 * This file is part of MPlayer. |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
27391
diff
changeset
|
3 * |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
27391
diff
changeset
|
4 * MPlayer is free software; you can redistribute it and/or modify |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
27391
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
27391
diff
changeset
|
6 * the Free Software Foundation; either version 2 of the License, or |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
27391
diff
changeset
|
7 * (at your option) any later version. |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
27391
diff
changeset
|
8 * |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
27391
diff
changeset
|
9 * MPlayer is distributed in the hope that it will be useful, |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
27391
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
27391
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
27391
diff
changeset
|
12 * GNU General Public License for more details. |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
27391
diff
changeset
|
13 * |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
27391
diff
changeset
|
14 * You should have received a copy of the GNU General Public License along |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
27391
diff
changeset
|
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
27391
diff
changeset
|
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
27391
diff
changeset
|
17 */ |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
27391
diff
changeset
|
18 |
7568 | 19 #include <stdio.h> |
20 #include <stdlib.h> | |
21 #include <string.h> | |
22 | |
28594
df67d03dde3b
Convert HAVE_MALLOC_H into a 0/1 definition, fixes the warning:
diego
parents:
28229
diff
changeset
|
23 #if HAVE_MALLOC_H |
7568 | 24 #include <malloc.h> |
25 #endif | |
26 | |
27 #include "af.h" | |
28 | |
29 // Static list of filters | |
30 extern af_info_t af_info_dummy; | |
31 extern af_info_t af_info_delay; | |
32 extern af_info_t af_info_channels; | |
33 extern af_info_t af_info_format; | |
34 extern af_info_t af_info_resample; | |
7974
db1f16543379
enable volume filter and fix nonsense default volume (still not usable
rfelker
parents:
7745
diff
changeset
|
35 extern af_info_t af_info_volume; |
8073 | 36 extern af_info_t af_info_equalizer; |
8607 | 37 extern af_info_t af_info_gate; |
38 extern af_info_t af_info_comp; | |
39 extern af_info_t af_info_pan; | |
8678 | 40 extern af_info_t af_info_surround; |
8832
a1578b329cc0
Adding sub-woofer filter, use this filter to add a sub channel to the audio stream
anders
parents:
8711
diff
changeset
|
41 extern af_info_t af_info_sub; |
10892
2167ac4c1d72
Adding filter for exporting audio data to visual effect applications
anders
parents:
8969
diff
changeset
|
42 extern af_info_t af_info_export; |
13550
81e62cbe57d9
reimplementation of the pl_extrastereo and pl_volnorm plugins
alex
parents:
13269
diff
changeset
|
43 extern af_info_t af_info_volnorm; |
81e62cbe57d9
reimplementation of the pl_extrastereo and pl_volnorm plugins
alex
parents:
13269
diff
changeset
|
44 extern af_info_t af_info_extrastereo; |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
25306
diff
changeset
|
45 extern af_info_t af_info_lavcac3enc; |
13713 | 46 extern af_info_t af_info_lavcresample; |
13721 | 47 extern af_info_t af_info_sweep; |
13996 | 48 extern af_info_t af_info_hrtf; |
14217
5b5ebf93ec16
Adds support for LADSPA (Linux Audio Developer's Simple Plugin API) plugins.
ivo
parents:
13996
diff
changeset
|
49 extern af_info_t af_info_ladspa; |
14750
108423cf7b3f
filter for adding a center channel, adding a high pass filter would be nice
alex
parents:
14569
diff
changeset
|
50 extern af_info_t af_info_center; |
18611
1c2f694d5232
Rename sinesupress to sinesuppress, including af_sinesupress.c file rename.
corey
parents:
18470
diff
changeset
|
51 extern af_info_t af_info_sinesuppress; |
18470 | 52 extern af_info_t af_info_karaoke; |
24896 | 53 extern af_info_t af_info_scaletempo; |
7568 | 54 |
10908 | 55 static af_info_t* filter_list[]={ |
56 &af_info_dummy, | |
57 &af_info_delay, | |
58 &af_info_channels, | |
59 &af_info_format, | |
60 &af_info_resample, | |
61 &af_info_volume, | |
62 &af_info_equalizer, | |
63 &af_info_gate, | |
64 &af_info_comp, | |
65 &af_info_pan, | |
66 &af_info_surround, | |
67 &af_info_sub, | |
68 #ifdef HAVE_SYS_MMAN_H | |
69 &af_info_export, | |
70 #endif | |
13550
81e62cbe57d9
reimplementation of the pl_extrastereo and pl_volnorm plugins
alex
parents:
13269
diff
changeset
|
71 &af_info_volnorm, |
81e62cbe57d9
reimplementation of the pl_extrastereo and pl_volnorm plugins
alex
parents:
13269
diff
changeset
|
72 &af_info_extrastereo, |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
25357
diff
changeset
|
73 #ifdef CONFIG_LIBAVCODEC_A |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
25306
diff
changeset
|
74 &af_info_lavcac3enc, |
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
25306
diff
changeset
|
75 #endif |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
25357
diff
changeset
|
76 #ifdef CONFIG_LIBAVCODEC |
13713 | 77 &af_info_lavcresample, |
78 #endif | |
13721 | 79 &af_info_sweep, |
13996 | 80 &af_info_hrtf, |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
27341
diff
changeset
|
81 #ifdef CONFIG_LADSPA |
14217
5b5ebf93ec16
Adds support for LADSPA (Linux Audio Developer's Simple Plugin API) plugins.
ivo
parents:
13996
diff
changeset
|
82 &af_info_ladspa, |
5b5ebf93ec16
Adds support for LADSPA (Linux Audio Developer's Simple Plugin API) plugins.
ivo
parents:
13996
diff
changeset
|
83 #endif |
14750
108423cf7b3f
filter for adding a center channel, adding a high pass filter would be nice
alex
parents:
14569
diff
changeset
|
84 &af_info_center, |
18611
1c2f694d5232
Rename sinesupress to sinesuppress, including af_sinesupress.c file rename.
corey
parents:
18470
diff
changeset
|
85 &af_info_sinesuppress, |
18470 | 86 &af_info_karaoke, |
24896 | 87 &af_info_scaletempo, |
10908 | 88 NULL |
7568 | 89 }; |
90 | |
8167 | 91 // Message printing |
92 af_msg_cfg_t af_msg_cfg={0,NULL,NULL}; | |
93 | |
94 // CPU speed | |
95 int* af_cpu_speed = NULL; | |
96 | |
7568 | 97 /* Find a filter in the static list of filters using it's name. This |
98 function is used internally */ | |
18967
36db63e8e5d7
makes several libaf functions static coz they are not used outside their source files. Patch by Stefan Huehner, stefan AT huehner-org
reynaldo
parents:
18611
diff
changeset
|
99 static af_info_t* af_find(char*name) |
7568 | 100 { |
101 int i=0; | |
102 while(filter_list[i]){ | |
103 if(!strcmp(filter_list[i]->name,name)) | |
104 return filter_list[i]; | |
105 i++; | |
106 } | |
8167 | 107 af_msg(AF_MSG_ERROR,"Couldn't find audio filter '%s'\n",name); |
7568 | 108 return NULL; |
109 } | |
110 | |
7615 | 111 /* Find filter in the dynamic filter list using it's name This |
112 function is used for finding already initialized filters */ | |
113 af_instance_t* af_get(af_stream_t* s, char* name) | |
114 { | |
115 af_instance_t* af=s->first; | |
116 // Find the filter | |
117 while(af != NULL){ | |
118 if(!strcmp(af->info->name,name)) | |
119 return af; | |
120 af=af->next; | |
121 } | |
122 return NULL; | |
123 } | |
124 | |
7993
ea0680d87f3f
Changing the behavour of the commandline parameter -af to conform with -vop. Adding new commanline parameter -af-adv for advanced af options. Adding changes to volume control to support commandline parameters.
anders
parents:
7974
diff
changeset
|
125 /*/ Function for creating a new filter of type name. The name may |
ea0680d87f3f
Changing the behavour of the commandline parameter -af to conform with -vop. Adding new commanline parameter -af-adv for advanced af options. Adding changes to volume control to support commandline parameters.
anders
parents:
7974
diff
changeset
|
126 contain the commandline parameters for the filter */ |
25302
701de923a20d
Fix missing command line bug by making the input parameter constant.
ulion
parents:
25115
diff
changeset
|
127 static af_instance_t* af_create(af_stream_t* s, const char* name_with_cmd) |
7568 | 128 { |
25302
701de923a20d
Fix missing command line bug by making the input parameter constant.
ulion
parents:
25115
diff
changeset
|
129 char* name = strdup(name_with_cmd); |
7993
ea0680d87f3f
Changing the behavour of the commandline parameter -af to conform with -vop. Adding new commanline parameter -af-adv for advanced af options. Adding changes to volume control to support commandline parameters.
anders
parents:
7974
diff
changeset
|
130 char* cmdline = name; |
7998
d48a06d07afb
Adding commandline options for filters and fixing stupid bug in cfg
anders
parents:
7993
diff
changeset
|
131 |
7568 | 132 // Allocate space for the new filter and reset all pointers |
133 af_instance_t* new=malloc(sizeof(af_instance_t)); | |
25302
701de923a20d
Fix missing command line bug by making the input parameter constant.
ulion
parents:
25115
diff
changeset
|
134 if (!name || !new) { |
8607 | 135 af_msg(AF_MSG_ERROR,"[libaf] Could not allocate memory\n"); |
17780
16c347e53841
fix memory leak when filter with given name does not exist.
reimar
parents:
16815
diff
changeset
|
136 goto err_out; |
7568 | 137 } |
138 memset(new,0,sizeof(af_instance_t)); | |
139 | |
7993
ea0680d87f3f
Changing the behavour of the commandline parameter -af to conform with -vop. Adding new commanline parameter -af-adv for advanced af options. Adding changes to volume control to support commandline parameters.
anders
parents:
7974
diff
changeset
|
140 // Check for commandline parameters |
12668
ce6ab8cb8597
Send a command throught the filter chain until some item returns AF_OK. Patch by Reimar Doeffinger
alex
parents:
11859
diff
changeset
|
141 strsep(&cmdline, "="); |
7993
ea0680d87f3f
Changing the behavour of the commandline parameter -af to conform with -vop. Adding new commanline parameter -af-adv for advanced af options. Adding changes to volume control to support commandline parameters.
anders
parents:
7974
diff
changeset
|
142 |
7568 | 143 // Find filter from name |
7615 | 144 if(NULL == (new->info=af_find(name))) |
17780
16c347e53841
fix memory leak when filter with given name does not exist.
reimar
parents:
16815
diff
changeset
|
145 goto err_out; |
7615 | 146 |
7993
ea0680d87f3f
Changing the behavour of the commandline parameter -af to conform with -vop. Adding new commanline parameter -af-adv for advanced af options. Adding changes to volume control to support commandline parameters.
anders
parents:
7974
diff
changeset
|
147 /* Make sure that the filter is not already in the list if it is |
ea0680d87f3f
Changing the behavour of the commandline parameter -af to conform with -vop. Adding new commanline parameter -af-adv for advanced af options. Adding changes to volume control to support commandline parameters.
anders
parents:
7974
diff
changeset
|
148 non-reentrant */ |
7615 | 149 if(new->info->flags & AF_FLAGS_NOT_REENTRANT){ |
150 if(af_get(s,name)){ | |
8607 | 151 af_msg(AF_MSG_ERROR,"[libaf] There can only be one instance of" |
152 " the filter '%s' in each stream\n",name); | |
17780
16c347e53841
fix memory leak when filter with given name does not exist.
reimar
parents:
16815
diff
changeset
|
153 goto err_out; |
7615 | 154 } |
155 } | |
7993
ea0680d87f3f
Changing the behavour of the commandline parameter -af to conform with -vop. Adding new commanline parameter -af-adv for advanced af options. Adding changes to volume control to support commandline parameters.
anders
parents:
7974
diff
changeset
|
156 |
8607 | 157 af_msg(AF_MSG_VERBOSE,"[libaf] Adding filter %s \n",name); |
7993
ea0680d87f3f
Changing the behavour of the commandline parameter -af to conform with -vop. Adding new commanline parameter -af-adv for advanced af options. Adding changes to volume control to support commandline parameters.
anders
parents:
7974
diff
changeset
|
158 |
7568 | 159 // Initialize the new filter |
7745
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
7665
diff
changeset
|
160 if(AF_OK == new->info->open(new) && |
7993
ea0680d87f3f
Changing the behavour of the commandline parameter -af to conform with -vop. Adding new commanline parameter -af-adv for advanced af options. Adding changes to volume control to support commandline parameters.
anders
parents:
7974
diff
changeset
|
161 AF_ERROR < new->control(new,AF_CONTROL_POST_CREATE,&s->cfg)){ |
ea0680d87f3f
Changing the behavour of the commandline parameter -af to conform with -vop. Adding new commanline parameter -af-adv for advanced af options. Adding changes to volume control to support commandline parameters.
anders
parents:
7974
diff
changeset
|
162 if(cmdline){ |
25306 | 163 if(AF_ERROR>=new->control(new,AF_CONTROL_COMMAND_LINE,cmdline)) |
25302
701de923a20d
Fix missing command line bug by making the input parameter constant.
ulion
parents:
25115
diff
changeset
|
164 goto err_out; |
7993
ea0680d87f3f
Changing the behavour of the commandline parameter -af to conform with -vop. Adding new commanline parameter -af-adv for advanced af options. Adding changes to volume control to support commandline parameters.
anders
parents:
7974
diff
changeset
|
165 } |
25302
701de923a20d
Fix missing command line bug by making the input parameter constant.
ulion
parents:
25115
diff
changeset
|
166 free(name); |
701de923a20d
Fix missing command line bug by making the input parameter constant.
ulion
parents:
25115
diff
changeset
|
167 return new; |
7993
ea0680d87f3f
Changing the behavour of the commandline parameter -af to conform with -vop. Adding new commanline parameter -af-adv for advanced af options. Adding changes to volume control to support commandline parameters.
anders
parents:
7974
diff
changeset
|
168 } |
7745
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
7665
diff
changeset
|
169 |
17780
16c347e53841
fix memory leak when filter with given name does not exist.
reimar
parents:
16815
diff
changeset
|
170 err_out: |
7568 | 171 free(new); |
8607 | 172 af_msg(AF_MSG_ERROR,"[libaf] Couldn't create or open audio filter '%s'\n", |
173 name); | |
25302
701de923a20d
Fix missing command line bug by making the input parameter constant.
ulion
parents:
25115
diff
changeset
|
174 free(name); |
7568 | 175 return NULL; |
176 } | |
177 | |
178 /* Create and insert a new filter of type name before the filter in the | |
179 argument. This function can be called during runtime, the return | |
180 value is the new filter */ | |
18967
36db63e8e5d7
makes several libaf functions static coz they are not used outside their source files. Patch by Stefan Huehner, stefan AT huehner-org
reynaldo
parents:
18611
diff
changeset
|
181 static af_instance_t* af_prepend(af_stream_t* s, af_instance_t* af, char* name) |
7568 | 182 { |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
183 // Create the new filter and make sure it is OK |
7615 | 184 af_instance_t* new=af_create(s,name); |
7568 | 185 if(!new) |
186 return NULL; | |
187 // Update pointers | |
188 new->next=af; | |
189 if(af){ | |
190 new->prev=af->prev; | |
191 af->prev=new; | |
192 } | |
193 else | |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
194 s->last=new; |
7568 | 195 if(new->prev) |
196 new->prev->next=new; | |
197 else | |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
198 s->first=new; |
7568 | 199 return new; |
200 } | |
201 | |
202 /* Create and insert a new filter of type name after the filter in the | |
203 argument. This function can be called during runtime, the return | |
204 value is the new filter */ | |
18967
36db63e8e5d7
makes several libaf functions static coz they are not used outside their source files. Patch by Stefan Huehner, stefan AT huehner-org
reynaldo
parents:
18611
diff
changeset
|
205 static af_instance_t* af_append(af_stream_t* s, af_instance_t* af, char* name) |
7568 | 206 { |
207 // Create the new filter and make sure it is OK | |
7615 | 208 af_instance_t* new=af_create(s,name); |
7568 | 209 if(!new) |
210 return NULL; | |
211 // Update pointers | |
212 new->prev=af; | |
213 if(af){ | |
214 new->next=af->next; | |
215 af->next=new; | |
216 } | |
217 else | |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
218 s->first=new; |
7568 | 219 if(new->next) |
220 new->next->prev=new; | |
221 else | |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
222 s->last=new; |
7568 | 223 return new; |
224 } | |
225 | |
226 // Uninit and remove the filter "af" | |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
227 void af_remove(af_stream_t* s, af_instance_t* af) |
7568 | 228 { |
229 if(!af) return; | |
230 | |
8607 | 231 // Print friendly message |
232 af_msg(AF_MSG_VERBOSE,"[libaf] Removing filter %s \n",af->info->name); | |
233 | |
7745
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
7665
diff
changeset
|
234 // Notify filter before changing anything |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
7665
diff
changeset
|
235 af->control(af,AF_CONTROL_PRE_DESTROY,0); |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
7665
diff
changeset
|
236 |
7568 | 237 // Detach pointers |
238 if(af->prev) | |
239 af->prev->next=af->next; | |
240 else | |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
241 s->first=af->next; |
7568 | 242 if(af->next) |
243 af->next->prev=af->prev; | |
244 else | |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
245 s->last=af->prev; |
7568 | 246 |
247 // Uninitialize af and free memory | |
248 af->uninit(af); | |
249 free(af); | |
250 } | |
251 | |
7649
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
252 /* Reinitializes all filters downstream from the filter given in the |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
253 argument the return value is AF_OK if success and AF_ERROR if |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
254 failure */ |
18967
36db63e8e5d7
makes several libaf functions static coz they are not used outside their source files. Patch by Stefan Huehner, stefan AT huehner-org
reynaldo
parents:
18611
diff
changeset
|
255 static int af_reinit(af_stream_t* s, af_instance_t* af) |
7568 | 256 { |
257 do{ | |
258 af_data_t in; // Format of the input to current filter | |
259 int rv=0; // Return value | |
260 | |
15191
7eab9c86ae19
change list traversal so the loop begins at the first filter after removing
henry
parents:
14818
diff
changeset
|
261 // Check if there are any filters left in the list |
7eab9c86ae19
change list traversal so the loop begins at the first filter after removing
henry
parents:
14818
diff
changeset
|
262 if(NULL == af){ |
7eab9c86ae19
change list traversal so the loop begins at the first filter after removing
henry
parents:
14818
diff
changeset
|
263 if(!(af=af_append(s,s->first,"dummy"))) |
7eab9c86ae19
change list traversal so the loop begins at the first filter after removing
henry
parents:
14818
diff
changeset
|
264 return AF_UNKNOWN; |
7eab9c86ae19
change list traversal so the loop begins at the first filter after removing
henry
parents:
14818
diff
changeset
|
265 else |
7eab9c86ae19
change list traversal so the loop begins at the first filter after removing
henry
parents:
14818
diff
changeset
|
266 return AF_ERROR; |
7eab9c86ae19
change list traversal so the loop begins at the first filter after removing
henry
parents:
14818
diff
changeset
|
267 } |
7eab9c86ae19
change list traversal so the loop begins at the first filter after removing
henry
parents:
14818
diff
changeset
|
268 |
7568 | 269 // Check if this is the first filter |
270 if(!af->prev) | |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
271 memcpy(&in,&(s->input),sizeof(af_data_t)); |
7568 | 272 else |
273 memcpy(&in,af->prev->data,sizeof(af_data_t)); | |
274 // Reset just in case... | |
275 in.audio=NULL; | |
276 in.len=0; | |
277 | |
278 rv = af->control(af,AF_CONTROL_REINIT,&in); | |
279 switch(rv){ | |
280 case AF_OK: | |
15191
7eab9c86ae19
change list traversal so the loop begins at the first filter after removing
henry
parents:
14818
diff
changeset
|
281 af = af->next; |
7568 | 282 break; |
283 case AF_FALSE:{ // Configuration filter is needed | |
8167 | 284 // Do auto insertion only if force is not specified |
285 if((AF_INIT_TYPE_MASK & s->cfg.force) != AF_INIT_FORCE){ | |
286 af_instance_t* new = NULL; | |
287 // Insert channels filter | |
288 if((af->prev?af->prev->data->nch:s->input.nch) != in.nch){ | |
289 // Create channels filter | |
290 if(NULL == (new = af_prepend(s,af,"channels"))) | |
291 return AF_ERROR; | |
292 // Set number of output channels | |
293 if(AF_OK != (rv = new->control(new,AF_CONTROL_CHANNELS,&in.nch))) | |
294 return rv; | |
295 // Initialize channels filter | |
296 if(!new->prev) | |
297 memcpy(&in,&(s->input),sizeof(af_data_t)); | |
298 else | |
299 memcpy(&in,new->prev->data,sizeof(af_data_t)); | |
300 if(AF_OK != (rv = new->control(new,AF_CONTROL_REINIT,&in))) | |
301 return rv; | |
302 } | |
303 // Insert format filter | |
14818
663c1ea5f595
finally remove the refences to bps outside libaf. also simplification of some messages and removed redundants
alex
parents:
14750
diff
changeset
|
304 if((af->prev?af->prev->data->format:s->input.format) != in.format){ |
8167 | 305 // Create format filter |
306 if(NULL == (new = af_prepend(s,af,"format"))) | |
307 return AF_ERROR; | |
8607 | 308 // Set output bits per sample |
14335
8380694ba14f
af_bits2fmt and af_str2fmt_short, also removed the extra FORMAT_BPS control in format.c
alex
parents:
14326
diff
changeset
|
309 in.format |= af_bits2fmt(in.bps*8); |
8380694ba14f
af_bits2fmt and af_str2fmt_short, also removed the extra FORMAT_BPS control in format.c
alex
parents:
14326
diff
changeset
|
310 if(AF_OK != (rv = new->control(new,AF_CONTROL_FORMAT_FMT,&in.format))) |
8167 | 311 return rv; |
312 // Initialize format filter | |
313 if(!new->prev) | |
314 memcpy(&in,&(s->input),sizeof(af_data_t)); | |
315 else | |
316 memcpy(&in,new->prev->data,sizeof(af_data_t)); | |
317 if(AF_OK != (rv = new->control(new,AF_CONTROL_REINIT,&in))) | |
318 return rv; | |
319 } | |
8607 | 320 if(!new){ // Should _never_ happen |
321 af_msg(AF_MSG_ERROR,"[libaf] Unable to correct audio format. " | |
322 "This error should never uccur, please send bugreport.\n"); | |
7568 | 323 return AF_ERROR; |
8607 | 324 } |
15191
7eab9c86ae19
change list traversal so the loop begins at the first filter after removing
henry
parents:
14818
diff
changeset
|
325 af=new->next; |
7568 | 326 } |
16072 | 327 else { |
328 af_msg(AF_MSG_ERROR, "[libaf] Automatic filter insertion disabled " | |
329 "but formats do not match. Giving up.\n"); | |
330 return AF_ERROR; | |
331 } | |
7568 | 332 break; |
333 } | |
334 case AF_DETACH:{ // Filter is redundant and wants to be unloaded | |
8167 | 335 // Do auto remove only if force is not specified |
336 if((AF_INIT_TYPE_MASK & s->cfg.force) != AF_INIT_FORCE){ | |
337 af_instance_t* aft=af->prev; | |
338 af_remove(s,af); | |
339 if(aft) | |
15191
7eab9c86ae19
change list traversal so the loop begins at the first filter after removing
henry
parents:
14818
diff
changeset
|
340 af=aft->next; |
8167 | 341 else |
342 af=s->first; // Restart configuration | |
343 } | |
7568 | 344 break; |
345 } | |
346 default: | |
8607 | 347 af_msg(AF_MSG_ERROR,"[libaf] Reinitialization did not work, audio" |
348 " filter '%s' returned error code %i\n",af->info->name,rv); | |
7568 | 349 return AF_ERROR; |
350 } | |
351 }while(af); | |
352 return AF_OK; | |
353 } | |
354 | |
355 // Uninit and remove all filters | |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
356 void af_uninit(af_stream_t* s) |
7568 | 357 { |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
358 while(s->first) |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
359 af_remove(s,s->first); |
7568 | 360 } |
361 | |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
362 /* Initialize the stream "s". This function creates a new filter list |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
363 if necessary according to the values set in input and output. Input |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
364 and output should contain the format of the current movie and the |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
365 formate of the preferred output respectively. The function is |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
366 reentrant i.e. if called with an already initialized stream the |
15811
9b4bbb6098f6
make -srate work again, unify audio filter init and preinit.
reimar
parents:
15791
diff
changeset
|
367 stream will be reinitialized. |
9b4bbb6098f6
make -srate work again, unify audio filter init and preinit.
reimar
parents:
15791
diff
changeset
|
368 If one of the prefered output parameters is 0 the one that needs |
9b4bbb6098f6
make -srate work again, unify audio filter init and preinit.
reimar
parents:
15791
diff
changeset
|
369 no conversion is used (i.e. the output format in the last filter). |
9b4bbb6098f6
make -srate work again, unify audio filter init and preinit.
reimar
parents:
15791
diff
changeset
|
370 The return value is 0 if success and -1 if failure */ |
9b4bbb6098f6
make -srate work again, unify audio filter init and preinit.
reimar
parents:
15791
diff
changeset
|
371 int af_init(af_stream_t* s) |
7568 | 372 { |
373 int i=0; | |
374 | |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
375 // Sanity check |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
376 if(!s) return -1; |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
377 |
7568 | 378 // Precaution in case caller is misbehaving |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
379 s->input.audio = s->output.audio = NULL; |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
380 s->input.len = s->output.len = 0; |
7568 | 381 |
382 // Figure out how fast the machine is | |
8167 | 383 if(AF_INIT_AUTO == (AF_INIT_TYPE_MASK & s->cfg.force)) |
384 s->cfg.force = (s->cfg.force & ~AF_INIT_TYPE_MASK) | AF_INIT_TYPE; | |
7568 | 385 |
386 // Check if this is the first call | |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
387 if(!s->first){ |
7568 | 388 // Add all filters in the list (if there are any) |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
389 if(!s->cfg.list){ // To make automatic format conversion work |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
390 if(!af_append(s,s->first,"dummy")) |
7568 | 391 return -1; |
392 } | |
393 else{ | |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
394 while(s->cfg.list[i]){ |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
395 if(!af_append(s,s->last,s->cfg.list[i++])) |
7568 | 396 return -1; |
397 } | |
398 } | |
399 } | |
8607 | 400 |
7568 | 401 // Init filters |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
402 if(AF_OK != af_reinit(s,s->first)) |
7568 | 403 return -1; |
404 | |
15312
0313ef8b0730
Prevent segfault when filter chain is empty (e.g. because all
reimar
parents:
15191
diff
changeset
|
405 // make sure the chain is not empty and valid (e.g. because of AF_DETACH) |
0313ef8b0730
Prevent segfault when filter chain is empty (e.g. because all
reimar
parents:
15191
diff
changeset
|
406 if (!s->first) |
0313ef8b0730
Prevent segfault when filter chain is empty (e.g. because all
reimar
parents:
15191
diff
changeset
|
407 if (!af_append(s,s->first,"dummy") || AF_OK != af_reinit(s,s->first)) |
0313ef8b0730
Prevent segfault when filter chain is empty (e.g. because all
reimar
parents:
15191
diff
changeset
|
408 return -1; |
0313ef8b0730
Prevent segfault when filter chain is empty (e.g. because all
reimar
parents:
15191
diff
changeset
|
409 |
7568 | 410 // Check output format |
7745
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
7665
diff
changeset
|
411 if((AF_INIT_TYPE_MASK & s->cfg.force) != AF_INIT_FORCE){ |
7568 | 412 af_instance_t* af = NULL; // New filter |
413 // Check output frequency if not OK fix with resample | |
15811
9b4bbb6098f6
make -srate work again, unify audio filter init and preinit.
reimar
parents:
15791
diff
changeset
|
414 if(s->output.rate && s->last->data->rate!=s->output.rate){ |
14326
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
415 // try to find a filter that can change samplrate |
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
416 af = af_control_any_rev(s, AF_CONTROL_RESAMPLE_RATE | AF_CONTROL_SET, |
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
417 &(s->output.rate)); |
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
418 if (!af) { |
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
419 char *resampler = "resample"; |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
25357
diff
changeset
|
420 #ifdef CONFIG_LIBAVCODEC |
14326
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
421 if ((AF_INIT_TYPE_MASK & s->cfg.force) == AF_INIT_SLOW) |
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
422 resampler = "lavcresample"; |
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
423 #endif |
7745
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
7665
diff
changeset
|
424 if((AF_INIT_TYPE_MASK & s->cfg.force) == AF_INIT_SLOW){ |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
425 if(!strcmp(s->first->info->name,"format")) |
14326
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
426 af = af_append(s,s->first,resampler); |
7568 | 427 else |
14326
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
428 af = af_prepend(s,s->first,resampler); |
7568 | 429 } |
430 else{ | |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
431 if(!strcmp(s->last->info->name,"format")) |
14326
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
432 af = af_prepend(s,s->last,resampler); |
7568 | 433 else |
14326
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
434 af = af_append(s,s->last,resampler); |
7568 | 435 } |
436 // Init the new filter | |
15191
7eab9c86ae19
change list traversal so the loop begins at the first filter after removing
henry
parents:
14818
diff
changeset
|
437 if(!af || (AF_OK != af->control(af,AF_CONTROL_RESAMPLE_RATE | AF_CONTROL_SET, |
8607 | 438 &(s->output.rate)))) |
7568 | 439 return -1; |
11859
b8bee4f4b8bb
if the user wants fast, use fast code! otherwise the user has to put
rfelker
parents:
10908
diff
changeset
|
440 // Use lin int if the user wants fast |
b8bee4f4b8bb
if the user wants fast, use fast code! otherwise the user has to put
rfelker
parents:
10908
diff
changeset
|
441 if ((AF_INIT_TYPE_MASK & s->cfg.force) == AF_INIT_FAST) { |
b8bee4f4b8bb
if the user wants fast, use fast code! otherwise the user has to put
rfelker
parents:
10908
diff
changeset
|
442 char args[32]; |
14326
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
443 sprintf(args, "%d", s->output.rate); |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
25357
diff
changeset
|
444 #ifdef CONFIG_LIBAVCODEC |
14326
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
445 if (strcmp(resampler, "lavcresample") == 0) |
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
446 strcat(args, ":1"); |
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
447 else |
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
448 #endif |
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
449 strcat(args, ":0:0"); |
11859
b8bee4f4b8bb
if the user wants fast, use fast code! otherwise the user has to put
rfelker
parents:
10908
diff
changeset
|
450 af->control(af, AF_CONTROL_COMMAND_LINE, args); |
b8bee4f4b8bb
if the user wants fast, use fast code! otherwise the user has to put
rfelker
parents:
10908
diff
changeset
|
451 } |
14326
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
452 } |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
453 if(AF_OK != af_reinit(s,af)) |
7568 | 454 return -1; |
455 } | |
456 | |
457 // Check number of output channels fix if not OK | |
458 // If needed always inserted last -> easy to screw up other filters | |
15811
9b4bbb6098f6
make -srate work again, unify audio filter init and preinit.
reimar
parents:
15791
diff
changeset
|
459 if(s->output.nch && s->last->data->nch!=s->output.nch){ |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
460 if(!strcmp(s->last->info->name,"format")) |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
461 af = af_prepend(s,s->last,"channels"); |
7568 | 462 else |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
463 af = af_append(s,s->last,"channels"); |
7568 | 464 // Init the new filter |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
465 if(!af || (AF_OK != af->control(af,AF_CONTROL_CHANNELS,&(s->output.nch)))) |
7568 | 466 return -1; |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
467 if(AF_OK != af_reinit(s,af)) |
7568 | 468 return -1; |
469 } | |
470 | |
471 // Check output format fix if not OK | |
20771
1e78e35b6c7b
Change value used to indicate "unknown audio format" from 0 to -1.
uau
parents:
19883
diff
changeset
|
472 if(s->output.format != AF_FORMAT_UNKNOWN && |
1e78e35b6c7b
Change value used to indicate "unknown audio format" from 0 to -1.
uau
parents:
19883
diff
changeset
|
473 s->last->data->format != s->output.format){ |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
474 if(strcmp(s->last->info->name,"format")) |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
475 af = af_append(s,s->last,"format"); |
7568 | 476 else |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
477 af = s->last; |
7568 | 478 // Init the new filter |
14335
8380694ba14f
af_bits2fmt and af_str2fmt_short, also removed the extra FORMAT_BPS control in format.c
alex
parents:
14326
diff
changeset
|
479 s->output.format |= af_bits2fmt(s->output.bps*8); |
8380694ba14f
af_bits2fmt and af_str2fmt_short, also removed the extra FORMAT_BPS control in format.c
alex
parents:
14326
diff
changeset
|
480 if(!af || (AF_OK != af->control(af,AF_CONTROL_FORMAT_FMT,&(s->output.format)))) |
7568 | 481 return -1; |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
482 if(AF_OK != af_reinit(s,af)) |
7568 | 483 return -1; |
484 } | |
485 | |
486 // Re init again just in case | |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
487 if(AF_OK != af_reinit(s,s->first)) |
7568 | 488 return -1; |
489 | |
20771
1e78e35b6c7b
Change value used to indicate "unknown audio format" from 0 to -1.
uau
parents:
19883
diff
changeset
|
490 if (s->output.format == AF_FORMAT_UNKNOWN) |
1e78e35b6c7b
Change value used to indicate "unknown audio format" from 0 to -1.
uau
parents:
19883
diff
changeset
|
491 s->output.format = s->last->data->format; |
15811
9b4bbb6098f6
make -srate work again, unify audio filter init and preinit.
reimar
parents:
15791
diff
changeset
|
492 if (!s->output.nch) s->output.nch = s->last->data->nch; |
9b4bbb6098f6
make -srate work again, unify audio filter init and preinit.
reimar
parents:
15791
diff
changeset
|
493 if (!s->output.rate) s->output.rate = s->last->data->rate; |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
494 if((s->last->data->format != s->output.format) || |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
495 (s->last->data->nch != s->output.nch) || |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
496 (s->last->data->rate != s->output.rate)) { |
7568 | 497 // Something is stuffed audio out will not work |
8607 | 498 af_msg(AF_MSG_ERROR,"[libaf] Unable to setup filter system can not" |
499 " meet sound-card demands, please send bugreport. \n"); | |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
500 af_uninit(s); |
7568 | 501 return -1; |
502 } | |
503 } | |
504 return 0; | |
505 } | |
506 | |
7649
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
507 /* Add filter during execution. This function adds the filter "name" |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
508 to the stream s. The filter will be inserted somewhere nice in the |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
509 list of filters. The return value is a pointer to the new filter, |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
510 If the filter couldn't be added the return value is NULL. */ |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
511 af_instance_t* af_add(af_stream_t* s, char* name){ |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
512 af_instance_t* new; |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
513 // Sanity check |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
514 if(!s || !s->first || !name) |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
515 return NULL; |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
516 // Insert the filter somwhere nice |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
517 if(!strcmp(s->first->info->name,"format")) |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
518 new = af_append(s, s->first, name); |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
519 else |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
520 new = af_prepend(s, s->first, name); |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
521 if(!new) |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
522 return NULL; |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
523 |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
524 // Reinitalize the filter list |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
525 if(AF_OK != af_reinit(s, s->first)){ |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
526 free(new); |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
527 return NULL; |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
528 } |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
529 return new; |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
530 } |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
531 |
7568 | 532 // Filter data chunk through the filters in the list |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
533 af_data_t* af_play(af_stream_t* s, af_data_t* data) |
7568 | 534 { |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
535 af_instance_t* af=s->first; |
7568 | 536 // Iterate through all filters |
537 do{ | |
16815
78c84594247b
semi-hack: avoid passing 0-length blocks to audio filters.
reimar
parents:
16627
diff
changeset
|
538 if (data->len <= 0) break; |
7568 | 539 data=af->play(af,data); |
540 af=af->next; | |
25115
5a0da5dcadd3
Prevent from using data->len when data is NULL (when play() return NULL).
ulion
parents:
24900
diff
changeset
|
541 }while(af && data); |
7568 | 542 return data; |
543 } | |
544 | |
24888 | 545 /* Calculate the minimum output buffer size for given input data d |
546 * when using the RESIZE_LOCAL_BUFFER macro. The +t+1 part ensures the | |
547 * value is >= len*mul rounded upwards to whole samples even if the | |
548 * double 'mul' is inexact. */ | |
549 int af_lencalc(double mul, af_data_t* d) | |
550 { | |
551 int t = d->bps * d->nch; | |
552 return d->len * mul + t + 1; | |
7568 | 553 } |
554 | |
24892 | 555 // Calculate average ratio of filter output size to input size |
556 double af_calc_filter_multiplier(af_stream_t* s) | |
7598
48f8c731efb5
Adding function for estimating required buffer length
anders
parents:
7590
diff
changeset
|
557 { |
48f8c731efb5
Adding function for estimating required buffer length
anders
parents:
7590
diff
changeset
|
558 af_instance_t* af=s->first; |
24888 | 559 double mul = 1; |
7598
48f8c731efb5
Adding function for estimating required buffer length
anders
parents:
7590
diff
changeset
|
560 // Iterate through all filters and calculate total multiplication factor |
48f8c731efb5
Adding function for estimating required buffer length
anders
parents:
7590
diff
changeset
|
561 do{ |
24888 | 562 mul *= af->mul; |
563 af=af->next; | |
7598
48f8c731efb5
Adding function for estimating required buffer length
anders
parents:
7590
diff
changeset
|
564 }while(af); |
8607 | 565 |
24892 | 566 return mul; |
7598
48f8c731efb5
Adding function for estimating required buffer length
anders
parents:
7590
diff
changeset
|
567 } |
48f8c731efb5
Adding function for estimating required buffer length
anders
parents:
7590
diff
changeset
|
568 |
24900 | 569 /* Calculate the total delay [bytes output] caused by the filters */ |
7665
fbd5445cc853
Adding function for calculating the delay caused by the filters
anders
parents:
7649
diff
changeset
|
570 double af_calc_delay(af_stream_t* s) |
fbd5445cc853
Adding function for calculating the delay caused by the filters
anders
parents:
7649
diff
changeset
|
571 { |
fbd5445cc853
Adding function for calculating the delay caused by the filters
anders
parents:
7649
diff
changeset
|
572 af_instance_t* af=s->first; |
fbd5445cc853
Adding function for calculating the delay caused by the filters
anders
parents:
7649
diff
changeset
|
573 register double delay = 0.0; |
fbd5445cc853
Adding function for calculating the delay caused by the filters
anders
parents:
7649
diff
changeset
|
574 // Iterate through all filters |
fbd5445cc853
Adding function for calculating the delay caused by the filters
anders
parents:
7649
diff
changeset
|
575 while(af){ |
fbd5445cc853
Adding function for calculating the delay caused by the filters
anders
parents:
7649
diff
changeset
|
576 delay += af->delay; |
24900 | 577 delay *= af->mul; |
7665
fbd5445cc853
Adding function for calculating the delay caused by the filters
anders
parents:
7649
diff
changeset
|
578 af=af->next; |
fbd5445cc853
Adding function for calculating the delay caused by the filters
anders
parents:
7649
diff
changeset
|
579 } |
fbd5445cc853
Adding function for calculating the delay caused by the filters
anders
parents:
7649
diff
changeset
|
580 return delay; |
fbd5445cc853
Adding function for calculating the delay caused by the filters
anders
parents:
7649
diff
changeset
|
581 } |
fbd5445cc853
Adding function for calculating the delay caused by the filters
anders
parents:
7649
diff
changeset
|
582 |
7568 | 583 /* Helper function called by the macro with the same name this |
584 function should not be called directly */ | |
24890 | 585 int af_resize_local_buffer(af_instance_t* af, af_data_t* data) |
7568 | 586 { |
587 // Calculate new length | |
7589 | 588 register int len = af_lencalc(af->mul,data); |
8607 | 589 af_msg(AF_MSG_VERBOSE,"[libaf] Reallocating memory in module %s, " |
590 "old len = %i, new len = %i\n",af->info->name,af->data->len,len); | |
7568 | 591 // If there is a buffer free it |
592 if(af->data->audio) | |
593 free(af->data->audio); | |
594 // Create new buffer and check that it is OK | |
595 af->data->audio = malloc(len); | |
596 if(!af->data->audio){ | |
8607 | 597 af_msg(AF_MSG_FATAL,"[libaf] Could not allocate memory \n"); |
7568 | 598 return AF_ERROR; |
599 } | |
600 af->data->len=len; | |
601 return AF_OK; | |
602 } | |
12668
ce6ab8cb8597
Send a command throught the filter chain until some item returns AF_OK. Patch by Reimar Doeffinger
alex
parents:
11859
diff
changeset
|
603 |
16627
584bd8980d57
documentation-only patch: make doxygen compatible and create
reimar
parents:
16072
diff
changeset
|
604 // documentation in af.h |
14292
12239a0d5408
Make af_control_any_rev return the matching filter
reimar
parents:
14243
diff
changeset
|
605 af_instance_t *af_control_any_rev (af_stream_t* s, int cmd, void* arg) { |
12668
ce6ab8cb8597
Send a command throught the filter chain until some item returns AF_OK. Patch by Reimar Doeffinger
alex
parents:
11859
diff
changeset
|
606 int res = AF_UNKNOWN; |
ce6ab8cb8597
Send a command throught the filter chain until some item returns AF_OK. Patch by Reimar Doeffinger
alex
parents:
11859
diff
changeset
|
607 af_instance_t* filt = s->last; |
14292
12239a0d5408
Make af_control_any_rev return the matching filter
reimar
parents:
14243
diff
changeset
|
608 while (filt) { |
12668
ce6ab8cb8597
Send a command throught the filter chain until some item returns AF_OK. Patch by Reimar Doeffinger
alex
parents:
11859
diff
changeset
|
609 res = filt->control(filt, cmd, arg); |
14292
12239a0d5408
Make af_control_any_rev return the matching filter
reimar
parents:
14243
diff
changeset
|
610 if (res == AF_OK) |
12239a0d5408
Make af_control_any_rev return the matching filter
reimar
parents:
14243
diff
changeset
|
611 return filt; |
12668
ce6ab8cb8597
Send a command throught the filter chain until some item returns AF_OK. Patch by Reimar Doeffinger
alex
parents:
11859
diff
changeset
|
612 filt = filt->prev; |
ce6ab8cb8597
Send a command throught the filter chain until some item returns AF_OK. Patch by Reimar Doeffinger
alex
parents:
11859
diff
changeset
|
613 } |
14292
12239a0d5408
Make af_control_any_rev return the matching filter
reimar
parents:
14243
diff
changeset
|
614 return NULL; |
12668
ce6ab8cb8597
Send a command throught the filter chain until some item returns AF_OK. Patch by Reimar Doeffinger
alex
parents:
11859
diff
changeset
|
615 } |
ce6ab8cb8597
Send a command throught the filter chain until some item returns AF_OK. Patch by Reimar Doeffinger
alex
parents:
11859
diff
changeset
|
616 |
13269
aa13937da8a0
mplayer -af help now lists all available audio filters.
ivo
parents:
12668
diff
changeset
|
617 void af_help (void) { |
aa13937da8a0
mplayer -af help now lists all available audio filters.
ivo
parents:
12668
diff
changeset
|
618 int i = 0; |
13566
2cfb32a737aa
make af_help conform better to the the afm/vfm/etc equivalents
alex
parents:
13550
diff
changeset
|
619 af_msg(AF_MSG_INFO, "Available audio filters:\n"); |
13269
aa13937da8a0
mplayer -af help now lists all available audio filters.
ivo
parents:
12668
diff
changeset
|
620 while (filter_list[i]) { |
13566
2cfb32a737aa
make af_help conform better to the the afm/vfm/etc equivalents
alex
parents:
13550
diff
changeset
|
621 if (filter_list[i]->comment && filter_list[i]->comment[0]) |
2cfb32a737aa
make af_help conform better to the the afm/vfm/etc equivalents
alex
parents:
13550
diff
changeset
|
622 af_msg(AF_MSG_INFO, " %-15s: %s (%s)\n", filter_list[i]->name, filter_list[i]->info, filter_list[i]->comment); |
2cfb32a737aa
make af_help conform better to the the afm/vfm/etc equivalents
alex
parents:
13550
diff
changeset
|
623 else |
2cfb32a737aa
make af_help conform better to the the afm/vfm/etc equivalents
alex
parents:
13550
diff
changeset
|
624 af_msg(AF_MSG_INFO, " %-15s: %s\n", filter_list[i]->name, filter_list[i]->info); |
13269
aa13937da8a0
mplayer -af help now lists all available audio filters.
ivo
parents:
12668
diff
changeset
|
625 i++; |
aa13937da8a0
mplayer -af help now lists all available audio filters.
ivo
parents:
12668
diff
changeset
|
626 } |
aa13937da8a0
mplayer -af help now lists all available audio filters.
ivo
parents:
12668
diff
changeset
|
627 } |
aa13937da8a0
mplayer -af help now lists all available audio filters.
ivo
parents:
12668
diff
changeset
|
628 |
14818
663c1ea5f595
finally remove the refences to bps outside libaf. also simplification of some messages and removed redundants
alex
parents:
14750
diff
changeset
|
629 void af_fix_parameters(af_data_t *data) |
663c1ea5f595
finally remove the refences to bps outside libaf. also simplification of some messages and removed redundants
alex
parents:
14750
diff
changeset
|
630 { |
663c1ea5f595
finally remove the refences to bps outside libaf. also simplification of some messages and removed redundants
alex
parents:
14750
diff
changeset
|
631 data->bps = af_fmt2bits(data->format)/8; |
663c1ea5f595
finally remove the refences to bps outside libaf. also simplification of some messages and removed redundants
alex
parents:
14750
diff
changeset
|
632 } |