Mercurial > mplayer.hg
annotate libaf/af.c @ 34756:df3ff52039fe
Add code to support CC subtitles in ASTC and MOV.
Code to actually use these will be added later, since it
needs special code in FFmpeg.
Code for MOV is already read, ASTC might take longer.
author | reimar |
---|---|
date | Sat, 07 Apr 2012 00:10:27 +0000 |
parents | 4e7cc799cf54 |
children | b192c23ea7f1 |
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 |
28662
595d419c0610
Add missing #include "config.h", fixes the warning:
diego
parents:
28661
diff
changeset
|
19 #include "config.h" |
7568 | 20 #include <stdio.h> |
21 #include <stdlib.h> | |
22 #include <string.h> | |
34174
a93891202051
Add missing mp_msg.h #includes, remove some unnecessary ones.
diego
parents:
33412
diff
changeset
|
23 |
30313
7f7591482564
Add a proper header for our strsep implementation so strsep will
reimar
parents:
29263
diff
changeset
|
24 #include "osdep/strsep.h" |
32272
fd4cd29b6121
Automatic downmix using the pan filter when the requested channel count is 2
cigaes
parents:
32263
diff
changeset
|
25 #include "libmpcodecs/dec_audio.h" |
34174
a93891202051
Add missing mp_msg.h #includes, remove some unnecessary ones.
diego
parents:
33412
diff
changeset
|
26 #include "mp_msg.h" |
7568 | 27 #include "af.h" |
28 | |
29 // Static list of filters | |
32134
12db4ae0b3d1
const-correctness for af_info_t audio filter declarations
diego
parents:
30617
diff
changeset
|
30 extern const af_info_t af_info_dummy; |
12db4ae0b3d1
const-correctness for af_info_t audio filter declarations
diego
parents:
30617
diff
changeset
|
31 extern const af_info_t af_info_delay; |
12db4ae0b3d1
const-correctness for af_info_t audio filter declarations
diego
parents:
30617
diff
changeset
|
32 extern const af_info_t af_info_channels; |
12db4ae0b3d1
const-correctness for af_info_t audio filter declarations
diego
parents:
30617
diff
changeset
|
33 extern const af_info_t af_info_format; |
12db4ae0b3d1
const-correctness for af_info_t audio filter declarations
diego
parents:
30617
diff
changeset
|
34 extern const af_info_t af_info_resample; |
12db4ae0b3d1
const-correctness for af_info_t audio filter declarations
diego
parents:
30617
diff
changeset
|
35 extern const af_info_t af_info_volume; |
12db4ae0b3d1
const-correctness for af_info_t audio filter declarations
diego
parents:
30617
diff
changeset
|
36 extern const af_info_t af_info_equalizer; |
12db4ae0b3d1
const-correctness for af_info_t audio filter declarations
diego
parents:
30617
diff
changeset
|
37 extern const af_info_t af_info_gate; |
12db4ae0b3d1
const-correctness for af_info_t audio filter declarations
diego
parents:
30617
diff
changeset
|
38 extern const af_info_t af_info_comp; |
12db4ae0b3d1
const-correctness for af_info_t audio filter declarations
diego
parents:
30617
diff
changeset
|
39 extern const af_info_t af_info_pan; |
12db4ae0b3d1
const-correctness for af_info_t audio filter declarations
diego
parents:
30617
diff
changeset
|
40 extern const af_info_t af_info_surround; |
12db4ae0b3d1
const-correctness for af_info_t audio filter declarations
diego
parents:
30617
diff
changeset
|
41 extern const af_info_t af_info_sub; |
12db4ae0b3d1
const-correctness for af_info_t audio filter declarations
diego
parents:
30617
diff
changeset
|
42 extern const af_info_t af_info_export; |
12db4ae0b3d1
const-correctness for af_info_t audio filter declarations
diego
parents:
30617
diff
changeset
|
43 extern const af_info_t af_info_volnorm; |
12db4ae0b3d1
const-correctness for af_info_t audio filter declarations
diego
parents:
30617
diff
changeset
|
44 extern const af_info_t af_info_extrastereo; |
12db4ae0b3d1
const-correctness for af_info_t audio filter declarations
diego
parents:
30617
diff
changeset
|
45 extern const af_info_t af_info_lavcac3enc; |
12db4ae0b3d1
const-correctness for af_info_t audio filter declarations
diego
parents:
30617
diff
changeset
|
46 extern const af_info_t af_info_lavcresample; |
12db4ae0b3d1
const-correctness for af_info_t audio filter declarations
diego
parents:
30617
diff
changeset
|
47 extern const af_info_t af_info_sweep; |
12db4ae0b3d1
const-correctness for af_info_t audio filter declarations
diego
parents:
30617
diff
changeset
|
48 extern const af_info_t af_info_hrtf; |
12db4ae0b3d1
const-correctness for af_info_t audio filter declarations
diego
parents:
30617
diff
changeset
|
49 extern const af_info_t af_info_ladspa; |
12db4ae0b3d1
const-correctness for af_info_t audio filter declarations
diego
parents:
30617
diff
changeset
|
50 extern const af_info_t af_info_center; |
12db4ae0b3d1
const-correctness for af_info_t audio filter declarations
diego
parents:
30617
diff
changeset
|
51 extern const af_info_t af_info_sinesuppress; |
12db4ae0b3d1
const-correctness for af_info_t audio filter declarations
diego
parents:
30617
diff
changeset
|
52 extern const af_info_t af_info_karaoke; |
12db4ae0b3d1
const-correctness for af_info_t audio filter declarations
diego
parents:
30617
diff
changeset
|
53 extern const af_info_t af_info_scaletempo; |
12db4ae0b3d1
const-correctness for af_info_t audio filter declarations
diego
parents:
30617
diff
changeset
|
54 extern const af_info_t af_info_stats; |
12db4ae0b3d1
const-correctness for af_info_t audio filter declarations
diego
parents:
30617
diff
changeset
|
55 extern const af_info_t af_info_bs2b; |
7568 | 56 |
32134
12db4ae0b3d1
const-correctness for af_info_t audio filter declarations
diego
parents:
30617
diff
changeset
|
57 static const af_info_t * const filter_list[] = { |
10908 | 58 &af_info_dummy, |
59 &af_info_delay, | |
60 &af_info_channels, | |
61 &af_info_format, | |
62 &af_info_resample, | |
63 &af_info_volume, | |
64 &af_info_equalizer, | |
65 &af_info_gate, | |
66 &af_info_comp, | |
67 &af_info_pan, | |
68 &af_info_surround, | |
69 &af_info_sub, | |
33412
2a2e9b6551d8
configure: Convert HAVE_SYS_MMAN_H into a 0/1 definition.
diego
parents:
33157
diff
changeset
|
70 #if HAVE_SYS_MMAN_H |
10908 | 71 &af_info_export, |
72 #endif | |
13550
81e62cbe57d9
reimplementation of the pl_extrastereo and pl_volnorm plugins
alex
parents:
13269
diff
changeset
|
73 &af_info_volnorm, |
81e62cbe57d9
reimplementation of the pl_extrastereo and pl_volnorm plugins
alex
parents:
13269
diff
changeset
|
74 &af_info_extrastereo, |
34652
4e7cc799cf54
lavcac3enc: make the filter buildable with shared FFmpeg
diego
parents:
34261
diff
changeset
|
75 #ifdef CONFIG_FFMPEG |
25357
b265c001e64a
Add new audio filter for encoding multi-channel audio into ac3 at runtime.
ulion
parents:
25306
diff
changeset
|
76 &af_info_lavcac3enc, |
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, |
28661
20787bd5c506
Add statistics audio filter that prints information about the audio stream.
diego
parents:
28594
diff
changeset
|
88 &af_info_stats, |
29093 | 89 #ifdef CONFIG_LIBBS2B |
90 &af_info_bs2b, | |
91 #endif | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
92 NULL |
7568 | 93 }; |
94 | |
8167 | 95 // CPU speed |
96 int* af_cpu_speed = NULL; | |
97 | |
7568 | 98 /* Find a filter in the static list of filters using it's name. This |
99 function is used internally */ | |
32134
12db4ae0b3d1
const-correctness for af_info_t audio filter declarations
diego
parents:
30617
diff
changeset
|
100 static const af_info_t* af_find(char*name) |
7568 | 101 { |
102 int i=0; | |
103 while(filter_list[i]){ | |
104 if(!strcmp(filter_list[i]->name,name)) | |
105 return filter_list[i]; | |
106 i++; | |
107 } | |
29049 | 108 mp_msg(MSGT_AFILTER, MSGL_ERR, "Couldn't find audio filter '%s'\n",name); |
7568 | 109 return NULL; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
110 } |
7568 | 111 |
7615 | 112 /* Find filter in the dynamic filter list using it's name This |
113 function is used for finding already initialized filters */ | |
114 af_instance_t* af_get(af_stream_t* s, char* name) | |
115 { | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
116 af_instance_t* af=s->first; |
7615 | 117 // Find the filter |
118 while(af != NULL){ | |
119 if(!strcmp(af->info->name,name)) | |
120 return af; | |
121 af=af->next; | |
122 } | |
123 return NULL; | |
124 } | |
125 | |
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
|
126 /*/ 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
|
127 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
|
128 static af_instance_t* af_create(af_stream_t* s, const char* name_with_cmd) |
7568 | 129 { |
25302
701de923a20d
Fix missing command line bug by making the input parameter constant.
ulion
parents:
25115
diff
changeset
|
130 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
|
131 char* cmdline = name; |
7998
d48a06d07afb
Adding commandline options for filters and fixing stupid bug in cfg
anders
parents:
7993
diff
changeset
|
132 |
7568 | 133 // Allocate space for the new filter and reset all pointers |
134 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
|
135 if (!name || !new) { |
29049 | 136 mp_msg(MSGT_AFILTER, MSGL_ERR, "[libaf] Could not allocate memory\n"); |
17780
16c347e53841
fix memory leak when filter with given name does not exist.
reimar
parents:
16815
diff
changeset
|
137 goto err_out; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
138 } |
7568 | 139 memset(new,0,sizeof(af_instance_t)); |
140 | |
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
|
141 // 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
|
142 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
|
143 |
7568 | 144 // Find filter from name |
7615 | 145 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
|
146 goto err_out; |
7615 | 147 |
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
|
148 /* 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
|
149 non-reentrant */ |
7615 | 150 if(new->info->flags & AF_FLAGS_NOT_REENTRANT){ |
151 if(af_get(s,name)){ | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
152 mp_msg(MSGT_AFILTER, MSGL_ERR, "[libaf] There can only be one instance of" |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
153 " 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
|
154 goto err_out; |
7615 | 155 } |
156 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
157 |
29049 | 158 mp_msg(MSGT_AFILTER, MSGL_V, "[libaf] Adding filter %s \n",name); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
159 |
7568 | 160 // Initialize the new filter |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
161 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
|
162 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
|
163 if(cmdline){ |
25306 | 164 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
|
165 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
|
166 } |
25302
701de923a20d
Fix missing command line bug by making the input parameter constant.
ulion
parents:
25115
diff
changeset
|
167 free(name); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
168 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
|
169 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
170 |
17780
16c347e53841
fix memory leak when filter with given name does not exist.
reimar
parents:
16815
diff
changeset
|
171 err_out: |
7568 | 172 free(new); |
29049 | 173 mp_msg(MSGT_AFILTER, MSGL_ERR, "[libaf] Couldn't create or open audio filter '%s'\n", |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
174 name); |
25302
701de923a20d
Fix missing command line bug by making the input parameter constant.
ulion
parents:
25115
diff
changeset
|
175 free(name); |
7568 | 176 return NULL; |
177 } | |
178 | |
179 /* Create and insert a new filter of type name before the filter in the | |
180 argument. This function can be called during runtime, the return | |
181 value is the new filter */ | |
32262
f67e85fc1f7a
Fix af_append and af_prepend prototypes, the name should be const.
reimar
parents:
32142
diff
changeset
|
182 static af_instance_t* af_prepend(af_stream_t* s, af_instance_t* af, const char* name) |
7568 | 183 { |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
184 // Create the new filter and make sure it is OK |
7615 | 185 af_instance_t* new=af_create(s,name); |
7568 | 186 if(!new) |
187 return NULL; | |
188 // Update pointers | |
189 new->next=af; | |
190 if(af){ | |
191 new->prev=af->prev; | |
192 af->prev=new; | |
193 } | |
194 else | |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
195 s->last=new; |
7568 | 196 if(new->prev) |
197 new->prev->next=new; | |
198 else | |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
199 s->first=new; |
7568 | 200 return new; |
201 } | |
202 | |
203 /* Create and insert a new filter of type name after the filter in the | |
204 argument. This function can be called during runtime, the return | |
205 value is the new filter */ | |
32262
f67e85fc1f7a
Fix af_append and af_prepend prototypes, the name should be const.
reimar
parents:
32142
diff
changeset
|
206 static af_instance_t* af_append(af_stream_t* s, af_instance_t* af, const char* name) |
7568 | 207 { |
208 // Create the new filter and make sure it is OK | |
7615 | 209 af_instance_t* new=af_create(s,name); |
7568 | 210 if(!new) |
211 return NULL; | |
212 // Update pointers | |
213 new->prev=af; | |
214 if(af){ | |
215 new->next=af->next; | |
216 af->next=new; | |
217 } | |
218 else | |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
219 s->first=new; |
7568 | 220 if(new->next) |
221 new->next->prev=new; | |
222 else | |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
223 s->last=new; |
7568 | 224 return new; |
225 } | |
226 | |
227 // 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
|
228 void af_remove(af_stream_t* s, af_instance_t* af) |
7568 | 229 { |
230 if(!af) return; | |
231 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
232 // Print friendly message |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
233 mp_msg(MSGT_AFILTER, MSGL_V, "[libaf] Removing filter %s \n",af->info->name); |
8607 | 234 |
7745
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
7665
diff
changeset
|
235 // Notify filter before changing anything |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
7665
diff
changeset
|
236 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
|
237 |
7568 | 238 // Detach pointers |
239 if(af->prev) | |
240 af->prev->next=af->next; | |
241 else | |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
242 s->first=af->next; |
7568 | 243 if(af->next) |
244 af->next->prev=af->prev; | |
245 else | |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
246 s->last=af->prev; |
7568 | 247 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
248 // Uninitialize af and free memory |
7568 | 249 af->uninit(af); |
250 free(af); | |
251 } | |
252 | |
32418
71a04d45357c
Make af_reinit "public", to allow using it in future patches.
reimar
parents:
32272
diff
changeset
|
253 int af_reinit(af_stream_t* s, af_instance_t* af) |
7568 | 254 { |
255 do{ | |
256 af_data_t in; // Format of the input to current filter | |
257 int rv=0; // Return value | |
258 | |
15191
7eab9c86ae19
change list traversal so the loop begins at the first filter after removing
henry
parents:
14818
diff
changeset
|
259 // 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
|
260 if(NULL == af){ |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
261 if(!(af=af_append(s,s->first,"dummy"))) |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
262 return AF_UNKNOWN; |
15191
7eab9c86ae19
change list traversal so the loop begins at the first filter after removing
henry
parents:
14818
diff
changeset
|
263 else |
7eab9c86ae19
change list traversal so the loop begins at the first filter after removing
henry
parents:
14818
diff
changeset
|
264 return AF_ERROR; |
7eab9c86ae19
change list traversal so the loop begins at the first filter after removing
henry
parents:
14818
diff
changeset
|
265 } |
7eab9c86ae19
change list traversal so the loop begins at the first filter after removing
henry
parents:
14818
diff
changeset
|
266 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
267 // Check if this is the first filter |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
268 if(!af->prev) |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
269 memcpy(&in,&(s->input),sizeof(af_data_t)); |
7568 | 270 else |
271 memcpy(&in,af->prev->data,sizeof(af_data_t)); | |
272 // Reset just in case... | |
273 in.audio=NULL; | |
274 in.len=0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
275 |
7568 | 276 rv = af->control(af,AF_CONTROL_REINIT,&in); |
277 switch(rv){ | |
278 case AF_OK: | |
15191
7eab9c86ae19
change list traversal so the loop begins at the first filter after removing
henry
parents:
14818
diff
changeset
|
279 af = af->next; |
7568 | 280 break; |
281 case AF_FALSE:{ // Configuration filter is needed | |
8167 | 282 // Do auto insertion only if force is not specified |
283 if((AF_INIT_TYPE_MASK & s->cfg.force) != AF_INIT_FORCE){ | |
284 af_instance_t* new = NULL; | |
285 // Insert channels filter | |
286 if((af->prev?af->prev->data->nch:s->input.nch) != in.nch){ | |
287 // Create channels filter | |
288 if(NULL == (new = af_prepend(s,af,"channels"))) | |
289 return AF_ERROR; | |
290 // Set number of output channels | |
291 if(AF_OK != (rv = new->control(new,AF_CONTROL_CHANNELS,&in.nch))) | |
292 return rv; | |
293 // Initialize channels filter | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
294 if(!new->prev) |
8167 | 295 memcpy(&in,&(s->input),sizeof(af_data_t)); |
296 else | |
297 memcpy(&in,new->prev->data,sizeof(af_data_t)); | |
298 if(AF_OK != (rv = new->control(new,AF_CONTROL_REINIT,&in))) | |
299 return rv; | |
300 } | |
301 // 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
|
302 if((af->prev?af->prev->data->format:s->input.format) != in.format){ |
8167 | 303 // Create format filter |
304 if(NULL == (new = af_prepend(s,af,"format"))) | |
305 return AF_ERROR; | |
8607 | 306 // 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
|
307 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
|
308 if(AF_OK != (rv = new->control(new,AF_CONTROL_FORMAT_FMT,&in.format))) |
8167 | 309 return rv; |
310 // Initialize format filter | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
311 if(!new->prev) |
8167 | 312 memcpy(&in,&(s->input),sizeof(af_data_t)); |
313 else | |
314 memcpy(&in,new->prev->data,sizeof(af_data_t)); | |
315 if(AF_OK != (rv = new->control(new,AF_CONTROL_REINIT,&in))) | |
316 return rv; | |
317 } | |
8607 | 318 if(!new){ // Should _never_ happen |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
319 mp_msg(MSGT_AFILTER, MSGL_ERR, "[libaf] Unable to correct audio format. " |
34261 | 320 "This error should never occur, please send a bug report.\n"); |
7568 | 321 return AF_ERROR; |
8607 | 322 } |
15191
7eab9c86ae19
change list traversal so the loop begins at the first filter after removing
henry
parents:
14818
diff
changeset
|
323 af=new->next; |
7568 | 324 } |
16072 | 325 else { |
29049 | 326 mp_msg(MSGT_AFILTER, MSGL_ERR, "[libaf] Automatic filter insertion disabled " |
16072 | 327 "but formats do not match. Giving up.\n"); |
328 return AF_ERROR; | |
329 } | |
7568 | 330 break; |
331 } | |
332 case AF_DETACH:{ // Filter is redundant and wants to be unloaded | |
8167 | 333 // Do auto remove only if force is not specified |
334 if((AF_INIT_TYPE_MASK & s->cfg.force) != AF_INIT_FORCE){ | |
335 af_instance_t* aft=af->prev; | |
336 af_remove(s,af); | |
337 if(aft) | |
15191
7eab9c86ae19
change list traversal so the loop begins at the first filter after removing
henry
parents:
14818
diff
changeset
|
338 af=aft->next; |
8167 | 339 else |
340 af=s->first; // Restart configuration | |
341 } | |
7568 | 342 break; |
343 } | |
344 default: | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
345 mp_msg(MSGT_AFILTER, MSGL_ERR, "[libaf] Reinitialization did not work, audio" |
8607 | 346 " filter '%s' returned error code %i\n",af->info->name,rv); |
7568 | 347 return AF_ERROR; |
348 } | |
349 }while(af); | |
350 return AF_OK; | |
351 } | |
352 | |
353 // 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
|
354 void af_uninit(af_stream_t* s) |
7568 | 355 { |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
356 while(s->first) |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
357 af_remove(s,s->first); |
7568 | 358 } |
359 | |
30617
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
360 /** |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
361 * Extend the filter chain so we get the required output format at the end. |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
362 * \return AF_ERROR on error, AF_OK if successful. |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
363 */ |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
364 static int fixup_output_format(af_stream_t* s) |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
365 { |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
366 af_instance_t* af = NULL; |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
367 // Check number of output channels fix if not OK |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
368 // If needed always inserted last -> easy to screw up other filters |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
369 if(s->output.nch && s->last->data->nch!=s->output.nch){ |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
370 if(!strcmp(s->last->info->name,"format")) |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
371 af = af_prepend(s,s->last,"channels"); |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
372 else |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
373 af = af_append(s,s->last,"channels"); |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
374 // Init the new filter |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
375 if(!af || (AF_OK != af->control(af,AF_CONTROL_CHANNELS,&(s->output.nch)))) |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
376 return AF_ERROR; |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
377 if(AF_OK != af_reinit(s,af)) |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
378 return AF_ERROR; |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
379 } |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
380 |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
381 // Check output format fix if not OK |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
382 if(s->output.format != AF_FORMAT_UNKNOWN && |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
383 s->last->data->format != s->output.format){ |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
384 if(strcmp(s->last->info->name,"format")) |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
385 af = af_append(s,s->last,"format"); |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
386 else |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
387 af = s->last; |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
388 // Init the new filter |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
389 s->output.format |= af_bits2fmt(s->output.bps*8); |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
390 if(!af || (AF_OK != af->control(af,AF_CONTROL_FORMAT_FMT,&(s->output.format)))) |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
391 return AF_ERROR; |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
392 if(AF_OK != af_reinit(s,af)) |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
393 return AF_ERROR; |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
394 } |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
395 |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
396 // Re init again just in case |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
397 if(AF_OK != af_reinit(s,s->first)) |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
398 return AF_ERROR; |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
399 |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
400 if (s->output.format == AF_FORMAT_UNKNOWN) |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
401 s->output.format = s->last->data->format; |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
402 if (!s->output.nch) s->output.nch = s->last->data->nch; |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
403 if (!s->output.rate) s->output.rate = s->last->data->rate; |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
404 if((s->last->data->format != s->output.format) || |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
405 (s->last->data->nch != s->output.nch) || |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
406 (s->last->data->rate != s->output.rate)) { |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
407 return AF_ERROR; |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
408 } |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
409 return AF_OK; |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
410 } |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
411 |
32272
fd4cd29b6121
Automatic downmix using the pan filter when the requested channel count is 2
cigaes
parents:
32263
diff
changeset
|
412 /** |
fd4cd29b6121
Automatic downmix using the pan filter when the requested channel count is 2
cigaes
parents:
32263
diff
changeset
|
413 * Automatic downmix to stereo in case the codec does not implement it. |
fd4cd29b6121
Automatic downmix using the pan filter when the requested channel count is 2
cigaes
parents:
32263
diff
changeset
|
414 */ |
fd4cd29b6121
Automatic downmix using the pan filter when the requested channel count is 2
cigaes
parents:
32263
diff
changeset
|
415 static void af_downmix(af_stream_t* s) |
fd4cd29b6121
Automatic downmix using the pan filter when the requested channel count is 2
cigaes
parents:
32263
diff
changeset
|
416 { |
fd4cd29b6121
Automatic downmix using the pan filter when the requested channel count is 2
cigaes
parents:
32263
diff
changeset
|
417 static const char * const downmix_strs[AF_NCH + 1] = { |
fd4cd29b6121
Automatic downmix using the pan filter when the requested channel count is 2
cigaes
parents:
32263
diff
changeset
|
418 /* FL FR RL RR FC LF AL AR */ |
fd4cd29b6121
Automatic downmix using the pan filter when the requested channel count is 2
cigaes
parents:
32263
diff
changeset
|
419 [3] = "pan=2:" "0.6:0:" "0:0.6:" "0.4:0.4", |
fd4cd29b6121
Automatic downmix using the pan filter when the requested channel count is 2
cigaes
parents:
32263
diff
changeset
|
420 [4] = "pan=2:" "0.6:0:" "0:0.6:" "0.4:0:" "0:0.4", |
fd4cd29b6121
Automatic downmix using the pan filter when the requested channel count is 2
cigaes
parents:
32263
diff
changeset
|
421 [5] = "pan=2:" "0.5:0:" "0:0.5:" "0.2:0:" "0:0.2:" "0.3:0.3", |
fd4cd29b6121
Automatic downmix using the pan filter when the requested channel count is 2
cigaes
parents:
32263
diff
changeset
|
422 [6] = "pan=2:" "0.4:0:" "0:0.4:" "0.2:0:" "0:0.2:" "0.3:0.3:" "0.1:0.1", |
fd4cd29b6121
Automatic downmix using the pan filter when the requested channel count is 2
cigaes
parents:
32263
diff
changeset
|
423 [7] = "pan=2:" "0.4:0:" "0:0.4:" "0.2:0:" "0:0.2:" "0.3:0.3:" "0.1:0:" "0:0.1", |
fd4cd29b6121
Automatic downmix using the pan filter when the requested channel count is 2
cigaes
parents:
32263
diff
changeset
|
424 [8] = "pan=2:" "0.4:0:" "0:0.4:" "0.15:0:" "0:0.15:" "0.25:0.25:" "0.1:0.1:" "0.1:0:" "0:0.1", |
fd4cd29b6121
Automatic downmix using the pan filter when the requested channel count is 2
cigaes
parents:
32263
diff
changeset
|
425 }; |
fd4cd29b6121
Automatic downmix using the pan filter when the requested channel count is 2
cigaes
parents:
32263
diff
changeset
|
426 const char *af_pan_str = downmix_strs[s->input.nch]; |
fd4cd29b6121
Automatic downmix using the pan filter when the requested channel count is 2
cigaes
parents:
32263
diff
changeset
|
427 |
fd4cd29b6121
Automatic downmix using the pan filter when the requested channel count is 2
cigaes
parents:
32263
diff
changeset
|
428 if (af_pan_str) |
fd4cd29b6121
Automatic downmix using the pan filter when the requested channel count is 2
cigaes
parents:
32263
diff
changeset
|
429 af_append(s, s->first, af_pan_str); |
fd4cd29b6121
Automatic downmix using the pan filter when the requested channel count is 2
cigaes
parents:
32263
diff
changeset
|
430 } |
fd4cd29b6121
Automatic downmix using the pan filter when the requested channel count is 2
cigaes
parents:
32263
diff
changeset
|
431 |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
432 /* 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
|
433 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
|
434 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
|
435 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
|
436 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
|
437 stream will be reinitialized. |
9b4bbb6098f6
make -srate work again, unify audio filter init and preinit.
reimar
parents:
15791
diff
changeset
|
438 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
|
439 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
|
440 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
|
441 int af_init(af_stream_t* s) |
7568 | 442 { |
443 int i=0; | |
444 | |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
445 // Sanity check |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
446 if(!s) return -1; |
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
447 |
7568 | 448 // 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
|
449 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
|
450 s->input.len = s->output.len = 0; |
7568 | 451 |
452 // Figure out how fast the machine is | |
8167 | 453 if(AF_INIT_AUTO == (AF_INIT_TYPE_MASK & s->cfg.force)) |
454 s->cfg.force = (s->cfg.force & ~AF_INIT_TYPE_MASK) | AF_INIT_TYPE; | |
7568 | 455 |
456 // 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
|
457 if(!s->first){ |
32272
fd4cd29b6121
Automatic downmix using the pan filter when the requested channel count is 2
cigaes
parents:
32263
diff
changeset
|
458 // Append a downmix pan filter at the beginning of the chain if needed |
fd4cd29b6121
Automatic downmix using the pan filter when the requested channel count is 2
cigaes
parents:
32263
diff
changeset
|
459 if (s->input.nch != audio_output_channels && audio_output_channels == 2) |
fd4cd29b6121
Automatic downmix using the pan filter when the requested channel count is 2
cigaes
parents:
32263
diff
changeset
|
460 af_downmix(s); |
7568 | 461 // Add all filters in the list (if there are any) |
32263 | 462 if (s->cfg.list) { |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
463 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
|
464 if(!af_append(s,s->last,s->cfg.list[i++])) |
7568 | 465 return -1; |
466 } | |
467 } | |
468 } | |
8607 | 469 |
32263 | 470 // If we do not have any filters otherwise |
471 // add dummy to make automatic format conversion work | |
472 if (!s->first && !af_append(s, s->first, "dummy")) | |
473 return -1; | |
474 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
475 // Init filters |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
476 if(AF_OK != af_reinit(s,s->first)) |
7568 | 477 return -1; |
478 | |
15312
0313ef8b0730
Prevent segfault when filter chain is empty (e.g. because all
reimar
parents:
15191
diff
changeset
|
479 // 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
|
480 if (!s->first) |
0313ef8b0730
Prevent segfault when filter chain is empty (e.g. because all
reimar
parents:
15191
diff
changeset
|
481 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
|
482 return -1; |
0313ef8b0730
Prevent segfault when filter chain is empty (e.g. because all
reimar
parents:
15191
diff
changeset
|
483 |
7568 | 484 // Check output format |
7745
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
7665
diff
changeset
|
485 if((AF_INIT_TYPE_MASK & s->cfg.force) != AF_INIT_FORCE){ |
7568 | 486 af_instance_t* af = NULL; // New filter |
487 // 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
|
488 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
|
489 // try to find a filter that can change samplrate |
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
490 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
|
491 &(s->output.rate)); |
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
492 if (!af) { |
33157
8073274a9ff2
Add const to type for pointer to a string constant.
reimar
parents:
32537
diff
changeset
|
493 const char *resampler = "resample"; |
32142
4614728cab25
build system: Merge all FFmpeg library checks into a single FFmpeg check.
diego
parents:
32134
diff
changeset
|
494 #ifdef CONFIG_FFMPEG |
14326
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
495 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
|
496 resampler = "lavcresample"; |
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
497 #endif |
7745
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
7665
diff
changeset
|
498 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
|
499 if(!strcmp(s->first->info->name,"format")) |
14326
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
500 af = af_append(s,s->first,resampler); |
7568 | 501 else |
14326
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
502 af = af_prepend(s,s->first,resampler); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
503 } |
7568 | 504 else{ |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
505 if(!strcmp(s->last->info->name,"format")) |
14326
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
506 af = af_prepend(s,s->last,resampler); |
7568 | 507 else |
14326
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
508 af = af_append(s,s->last,resampler); |
7568 | 509 } |
510 // Init the new filter | |
15191
7eab9c86ae19
change list traversal so the loop begins at the first filter after removing
henry
parents:
14818
diff
changeset
|
511 if(!af || (AF_OK != af->control(af,AF_CONTROL_RESAMPLE_RATE | AF_CONTROL_SET, |
8607 | 512 &(s->output.rate)))) |
7568 | 513 return -1; |
11859
b8bee4f4b8bb
if the user wants fast, use fast code! otherwise the user has to put
rfelker
parents:
10908
diff
changeset
|
514 // 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
|
515 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
|
516 char args[32]; |
14326
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
517 sprintf(args, "%d", s->output.rate); |
32142
4614728cab25
build system: Merge all FFmpeg library checks into a single FFmpeg check.
diego
parents:
32134
diff
changeset
|
518 #ifdef CONFIG_FFMPEG |
14326
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
519 if (strcmp(resampler, "lavcresample") == 0) |
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
520 strcat(args, ":1"); |
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
521 else |
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
522 #endif |
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
523 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
|
524 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
|
525 } |
14326
9261d7dcf5e7
Use lavcresample only when libavcodec is compiled in.
reimar
parents:
14292
diff
changeset
|
526 } |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
527 if(AF_OK != af_reinit(s,af)) |
7568 | 528 return -1; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
529 } |
30617
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
530 if (AF_OK != fixup_output_format(s)) { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
531 // Something is stuffed audio out will not work |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
532 mp_msg(MSGT_AFILTER, MSGL_ERR, "[libaf] Unable to setup filter system can not" |
34261 | 533 " meet sound-card demands, please send a bug report. \n"); |
7571
8819fdf88b5d
Adding support for multiple audio streams and removing annoying message from resample and format
anders
parents:
7568
diff
changeset
|
534 af_uninit(s); |
7568 | 535 return -1; |
536 } | |
537 } | |
538 return 0; | |
539 } | |
540 | |
7649
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
541 /* Add filter during execution. This function adds the filter "name" |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
542 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
|
543 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
|
544 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
|
545 af_instance_t* af_add(af_stream_t* s, char* name){ |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
546 af_instance_t* new; |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
547 // Sanity check |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
548 if(!s || !s->first || !name) |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
549 return NULL; |
34261 | 550 // Insert the filter somewhere nice |
7649
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
551 if(!strcmp(s->first->info->name,"format")) |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
552 new = af_append(s, s->first, name); |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
553 else |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
554 new = af_prepend(s, s->first, name); |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
555 if(!new) |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
556 return NULL; |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
557 |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
558 // Reinitalize the filter list |
30617
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
559 if(AF_OK != af_reinit(s, s->first) || |
22aef54d8833
Move code that makes the filter chain match the desired output format into
reimar
parents:
30313
diff
changeset
|
560 AF_OK != fixup_output_format(s)){ |
7649
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
561 free(new); |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
562 return NULL; |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
563 } |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
564 return new; |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
565 } |
90e16aa8ae5f
Adding functionality for adding filters during execution
anders
parents:
7617
diff
changeset
|
566 |
7568 | 567 // 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
|
568 af_data_t* af_play(af_stream_t* s, af_data_t* data) |
7568 | 569 { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
570 af_instance_t* af=s->first; |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
571 // Iterate through all filters |
7568 | 572 do{ |
16815
78c84594247b
semi-hack: avoid passing 0-length blocks to audio filters.
reimar
parents:
16627
diff
changeset
|
573 if (data->len <= 0) break; |
7568 | 574 data=af->play(af,data); |
575 af=af->next; | |
25115
5a0da5dcadd3
Prevent from using data->len when data is NULL (when play() return NULL).
ulion
parents:
24900
diff
changeset
|
576 }while(af && data); |
7568 | 577 return data; |
578 } | |
579 | |
24888 | 580 /* Calculate the minimum output buffer size for given input data d |
581 * when using the RESIZE_LOCAL_BUFFER macro. The +t+1 part ensures the | |
582 * value is >= len*mul rounded upwards to whole samples even if the | |
583 * double 'mul' is inexact. */ | |
584 int af_lencalc(double mul, af_data_t* d) | |
585 { | |
586 int t = d->bps * d->nch; | |
587 return d->len * mul + t + 1; | |
7568 | 588 } |
589 | |
24892 | 590 // Calculate average ratio of filter output size to input size |
591 double af_calc_filter_multiplier(af_stream_t* s) | |
7598
48f8c731efb5
Adding function for estimating required buffer length
anders
parents:
7590
diff
changeset
|
592 { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
593 af_instance_t* af=s->first; |
24888 | 594 double mul = 1; |
7598
48f8c731efb5
Adding function for estimating required buffer length
anders
parents:
7590
diff
changeset
|
595 // Iterate through all filters and calculate total multiplication factor |
48f8c731efb5
Adding function for estimating required buffer length
anders
parents:
7590
diff
changeset
|
596 do{ |
24888 | 597 mul *= af->mul; |
598 af=af->next; | |
7598
48f8c731efb5
Adding function for estimating required buffer length
anders
parents:
7590
diff
changeset
|
599 }while(af); |
8607 | 600 |
24892 | 601 return mul; |
7598
48f8c731efb5
Adding function for estimating required buffer length
anders
parents:
7590
diff
changeset
|
602 } |
48f8c731efb5
Adding function for estimating required buffer length
anders
parents:
7590
diff
changeset
|
603 |
24900 | 604 /* 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
|
605 double af_calc_delay(af_stream_t* s) |
fbd5445cc853
Adding function for calculating the delay caused by the filters
anders
parents:
7649
diff
changeset
|
606 { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
607 af_instance_t* af=s->first; |
7665
fbd5445cc853
Adding function for calculating the delay caused by the filters
anders
parents:
7649
diff
changeset
|
608 register double delay = 0.0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
609 // Iterate through all filters |
7665
fbd5445cc853
Adding function for calculating the delay caused by the filters
anders
parents:
7649
diff
changeset
|
610 while(af){ |
fbd5445cc853
Adding function for calculating the delay caused by the filters
anders
parents:
7649
diff
changeset
|
611 delay += af->delay; |
24900 | 612 delay *= af->mul; |
7665
fbd5445cc853
Adding function for calculating the delay caused by the filters
anders
parents:
7649
diff
changeset
|
613 af=af->next; |
fbd5445cc853
Adding function for calculating the delay caused by the filters
anders
parents:
7649
diff
changeset
|
614 } |
fbd5445cc853
Adding function for calculating the delay caused by the filters
anders
parents:
7649
diff
changeset
|
615 return delay; |
fbd5445cc853
Adding function for calculating the delay caused by the filters
anders
parents:
7649
diff
changeset
|
616 } |
fbd5445cc853
Adding function for calculating the delay caused by the filters
anders
parents:
7649
diff
changeset
|
617 |
7568 | 618 /* Helper function called by the macro with the same name this |
619 function should not be called directly */ | |
24890 | 620 int af_resize_local_buffer(af_instance_t* af, af_data_t* data) |
7568 | 621 { |
622 // Calculate new length | |
7589 | 623 register int len = af_lencalc(af->mul,data); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29093
diff
changeset
|
624 mp_msg(MSGT_AFILTER, MSGL_V, "[libaf] Reallocating memory in module %s, " |
8607 | 625 "old len = %i, new len = %i\n",af->info->name,af->data->len,len); |
7568 | 626 // If there is a buffer free it |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32418
diff
changeset
|
627 free(af->data->audio); |
7568 | 628 // Create new buffer and check that it is OK |
629 af->data->audio = malloc(len); | |
630 if(!af->data->audio){ | |
29049 | 631 mp_msg(MSGT_AFILTER, MSGL_FATAL, "[libaf] Could not allocate memory \n"); |
7568 | 632 return AF_ERROR; |
633 } | |
634 af->data->len=len; | |
635 return AF_OK; | |
636 } | |
12668
ce6ab8cb8597
Send a command throught the filter chain until some item returns AF_OK. Patch by Reimar Doeffinger
alex
parents:
11859
diff
changeset
|
637 |
16627
584bd8980d57
documentation-only patch: make doxygen compatible and create
reimar
parents:
16072
diff
changeset
|
638 // documentation in af.h |
14292
12239a0d5408
Make af_control_any_rev return the matching filter
reimar
parents:
14243
diff
changeset
|
639 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
|
640 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
|
641 af_instance_t* filt = s->last; |
14292
12239a0d5408
Make af_control_any_rev return the matching filter
reimar
parents:
14243
diff
changeset
|
642 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
|
643 res = filt->control(filt, cmd, arg); |
14292
12239a0d5408
Make af_control_any_rev return the matching filter
reimar
parents:
14243
diff
changeset
|
644 if (res == AF_OK) |
12239a0d5408
Make af_control_any_rev return the matching filter
reimar
parents:
14243
diff
changeset
|
645 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
|
646 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
|
647 } |
14292
12239a0d5408
Make af_control_any_rev return the matching filter
reimar
parents:
14243
diff
changeset
|
648 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
|
649 } |
ce6ab8cb8597
Send a command throught the filter chain until some item returns AF_OK. Patch by Reimar Doeffinger
alex
parents:
11859
diff
changeset
|
650 |
13269
aa13937da8a0
mplayer -af help now lists all available audio filters.
ivo
parents:
12668
diff
changeset
|
651 void af_help (void) { |
aa13937da8a0
mplayer -af help now lists all available audio filters.
ivo
parents:
12668
diff
changeset
|
652 int i = 0; |
29049 | 653 mp_msg(MSGT_AFILTER, MSGL_INFO, "Available audio filters:\n"); |
13269
aa13937da8a0
mplayer -af help now lists all available audio filters.
ivo
parents:
12668
diff
changeset
|
654 while (filter_list[i]) { |
13566
2cfb32a737aa
make af_help conform better to the the afm/vfm/etc equivalents
alex
parents:
13550
diff
changeset
|
655 if (filter_list[i]->comment && filter_list[i]->comment[0]) |
29049 | 656 mp_msg(MSGT_AFILTER, MSGL_INFO, " %-15s: %s (%s)\n", filter_list[i]->name, filter_list[i]->info, filter_list[i]->comment); |
13566
2cfb32a737aa
make af_help conform better to the the afm/vfm/etc equivalents
alex
parents:
13550
diff
changeset
|
657 else |
29049 | 658 mp_msg(MSGT_AFILTER, MSGL_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
|
659 i++; |
aa13937da8a0
mplayer -af help now lists all available audio filters.
ivo
parents:
12668
diff
changeset
|
660 } |
aa13937da8a0
mplayer -af help now lists all available audio filters.
ivo
parents:
12668
diff
changeset
|
661 } |
aa13937da8a0
mplayer -af help now lists all available audio filters.
ivo
parents:
12668
diff
changeset
|
662 |
14818
663c1ea5f595
finally remove the refences to bps outside libaf. also simplification of some messages and removed redundants
alex
parents:
14750
diff
changeset
|
663 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
|
664 { |
34254
f4c0388ddc74
Sanitize channel count for libaf to avoid crashes since it is used unchecked.
reimar
parents:
34174
diff
changeset
|
665 if (data->nch < 0 || data->nch > AF_NCH) { |
f4c0388ddc74
Sanitize channel count for libaf to avoid crashes since it is used unchecked.
reimar
parents:
34174
diff
changeset
|
666 mp_msg(MSGT_AFILTER, MSGL_ERR, "Invalid number of channels %i, assuming 2.\n", data->nch); |
f4c0388ddc74
Sanitize channel count for libaf to avoid crashes since it is used unchecked.
reimar
parents:
34174
diff
changeset
|
667 data->nch = 2; |
f4c0388ddc74
Sanitize channel count for libaf to avoid crashes since it is used unchecked.
reimar
parents:
34174
diff
changeset
|
668 } |
14818
663c1ea5f595
finally remove the refences to bps outside libaf. also simplification of some messages and removed redundants
alex
parents:
14750
diff
changeset
|
669 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
|
670 } |