annotate libaf/af.c @ 7568:d08513b9fed6

Adding new audio output filter layer libaf
author anders
date Tue, 01 Oct 2002 06:45:08 +0000
parents
children 8819fdf88b5d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7568
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
1 #include <stdio.h>
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
2 #include <stdlib.h>
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
3 #include <string.h>
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
4
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
5 #ifdef HAVE_MALLOC_H
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
6 #include <malloc.h>
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
7 #endif
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
8
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
9 #include "../config.h"
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
10 #include "../mp_msg.h"
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
11
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
12 #include "af.h"
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
13
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
14 // Static list of filters
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
15 extern af_info_t af_info_dummy;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
16 extern af_info_t af_info_delay;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
17 extern af_info_t af_info_channels;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
18 extern af_info_t af_info_format;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
19 extern af_info_t af_info_resample;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
20
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
21 static af_info_t* filter_list[]={ \
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
22 &af_info_dummy,\
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
23 &af_info_delay,\
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
24 &af_info_channels,\
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
25 &af_info_format,\
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
26 &af_info_resample,\
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
27 NULL \
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
28 };
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
29
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
30 // Command line config switches
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
31 af_cfg_t af_cfg={\
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
32 0,\
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
33 0,\
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
34 0,\
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
35 0,\
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
36 NULL,\
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
37 };
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
38
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
39
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
40 // Initialization types
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
41 #define SLOW 1
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
42 #define FAST 2
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
43 #define FORCE 3
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
44
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
45 // The first and last filter in the list
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
46 static af_instance_t* first=NULL;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
47 static af_instance_t* last=NULL;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
48 // Storage for input and output data formats (set by init)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
49 static af_data_t input;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
50 static af_data_t output;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
51
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
52 /* Find a filter in the static list of filters using it's name. This
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
53 function is used internally */
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
54 af_info_t* af_find(char*name)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
55 {
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
56 int i=0;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
57 while(filter_list[i]){
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
58 if(!strcmp(filter_list[i]->name,name))
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
59 return filter_list[i];
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
60 i++;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
61 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
62 mp_msg(MSGT_AFILTER,MSGL_ERR,"Couldn't find audio filter '%s'\n",name);
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
63 return NULL;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
64 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
65
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
66 // Function for creating a new filter of type name
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
67 af_instance_t* af_create(char* name)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
68 {
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
69 // Allocate space for the new filter and reset all pointers
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
70 af_instance_t* new=malloc(sizeof(af_instance_t));
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
71 if(!new){
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
72 mp_msg(MSGT_AFILTER,MSGL_ERR,"Could not allocate memory\n");
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
73 return NULL;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
74 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
75 memset(new,0,sizeof(af_instance_t));
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
76
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
77 // Find filter from name
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
78 new->info=af_find(name);
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
79
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
80 // Initialize the new filter
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
81 if(new->info && (AF_OK==new->info->open(new)))
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
82 return new;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
83
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
84 free(new);
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
85 mp_msg(MSGT_AFILTER,MSGL_ERR,"Couldn't create audio filter '%s'\n",name);
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
86 return NULL;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
87 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
88
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
89 /* Create and insert a new filter of type name before the filter in the
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
90 argument. This function can be called during runtime, the return
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
91 value is the new filter */
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
92 af_instance_t* af_prepend(af_instance_t* af, char* name)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
93 {
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
94 // Create the new filter and make sure it is ok
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
95 af_instance_t* new=af_create(name);
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
96 if(!new)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
97 return NULL;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
98 // Update pointers
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
99 new->next=af;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
100 if(af){
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
101 new->prev=af->prev;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
102 af->prev=new;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
103 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
104 else
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
105 last=new;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
106 if(new->prev)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
107 new->prev->next=new;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
108 else
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
109 first=new;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
110 return new;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
111 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
112
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
113 /* Create and insert a new filter of type name after the filter in the
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
114 argument. This function can be called during runtime, the return
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
115 value is the new filter */
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
116 af_instance_t* af_append(af_instance_t* af, char* name)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
117 {
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
118 // Create the new filter and make sure it is OK
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
119 af_instance_t* new=af_create(name);
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
120 if(!new)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
121 return NULL;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
122 // Update pointers
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
123 new->prev=af;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
124 if(af){
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
125 new->next=af->next;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
126 af->next=new;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
127 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
128 else
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
129 first=new;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
130 if(new->next)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
131 new->next->prev=new;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
132 else
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
133 last=new;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
134 return new;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
135 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
136
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
137 // Uninit and remove the filter "af"
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
138 void af_remove(af_instance_t* af)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
139 {
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
140 if(!af) return;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
141
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
142 // Detach pointers
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
143 if(af->prev)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
144 af->prev->next=af->next;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
145 else
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
146 first=af->next;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
147 if(af->next)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
148 af->next->prev=af->prev;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
149 else
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
150 last=af->prev;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
151
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
152 // Uninitialize af and free memory
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
153 af->uninit(af);
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
154 free(af);
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
155 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
156
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
157 /* Reinitializes all filters downstream from the filter given in the argument */
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
158 int af_reinit(af_instance_t* af)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
159 {
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
160 if(!af)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
161 return AF_ERROR;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
162
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
163 do{
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
164 af_data_t in; // Format of the input to current filter
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
165 int rv=0; // Return value
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
166
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
167 // Check if this is the first filter
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
168 if(!af->prev)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
169 memcpy(&in,&input,sizeof(af_data_t));
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
170 else
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
171 memcpy(&in,af->prev->data,sizeof(af_data_t));
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
172 // Reset just in case...
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
173 in.audio=NULL;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
174 in.len=0;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
175
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
176 rv = af->control(af,AF_CONTROL_REINIT,&in);
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
177 switch(rv){
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
178 case AF_OK:
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
179 break;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
180 case AF_FALSE:{ // Configuration filter is needed
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
181 af_instance_t* new = NULL;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
182 // Insert channels filter
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
183 if((af->prev?af->prev->data->nch:input.nch) != in.nch){
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
184 // Create channels filter
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
185 if(NULL == (new = af_prepend(af,"channels")))
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
186 return AF_ERROR;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
187 // Set number of output channels
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
188 if(AF_OK != (rv = new->control(new,AF_CONTROL_CHANNELS,&in.nch)))
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
189 return rv;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
190 // Initialize channels filter
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
191 if(!new->prev)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
192 memcpy(&in,&input,sizeof(af_data_t));
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
193 else
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
194 memcpy(&in,new->prev->data,sizeof(af_data_t));
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
195 if(AF_OK != (rv = new->control(new,AF_CONTROL_REINIT,&in)))
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
196 return rv;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
197 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
198 // Insert format filter
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
199 if(((af->prev?af->prev->data->format:input.format) != in.format) ||
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
200 ((af->prev?af->prev->data->bps:input.bps) != in.bps)){
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
201 // Create format filter
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
202 if(NULL == (new = af_prepend(af,"format")))
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
203 return AF_ERROR;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
204 // Set output format
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
205 if(AF_OK != (rv = new->control(new,AF_CONTROL_FORMAT,&in)))
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
206 return rv;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
207 // Initialize format filter
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
208 if(!new->prev)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
209 memcpy(&in,&input,sizeof(af_data_t));
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
210 else
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
211 memcpy(&in,new->prev->data,sizeof(af_data_t));
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
212 if(AF_OK != (rv = new->control(new,AF_CONTROL_REINIT,&in)))
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
213 return rv;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
214 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
215 if(!new) // Should _never_ happen
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
216 return AF_ERROR;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
217 af=new;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
218 break;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
219 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
220 case AF_DETACH:{ // Filter is redundant and wants to be unloaded
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
221 af_instance_t* aft=af->prev;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
222 af_remove(af);
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
223 if(aft)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
224 af=aft;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
225 else
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
226 af=first; // Restart configuration
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
227 break;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
228 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
229 default:
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
230 mp_msg(MSGT_AFILTER,MSGL_ERR,"Reinit did not work, audio filter '%s' returned error code %i\n",af->info->name,rv);
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
231 return AF_ERROR;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
232 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
233 af=af->next;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
234 }while(af);
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
235 return AF_OK;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
236 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
237
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
238 /* Find filter in the dynamic filter list using it's name This
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
239 function is used for finding already initialized filters */
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
240 af_instance_t* af_get(char* name)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
241 {
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
242 af_instance_t* af=first;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
243 while(af->next != NULL){
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
244 if(!strcmp(af->info->name,name))
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
245 return af;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
246 af=af->next;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
247 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
248 return NULL;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
249 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
250
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
251 // Uninit and remove all filters
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
252 void af_uninit()
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
253 {
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
254 while(first)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
255 af_remove(first);
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
256 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
257
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
258 /* Init read configuration and create filter list accordingly. In and
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
259 out contains the format of the current movie and the formate of the
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
260 preferred output respectively */
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
261 int af_init(af_data_t* in, af_data_t* out)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
262 {
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
263 int cfg=SLOW; // configuration type
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
264 int i=0;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
265
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
266 // Precaution in case caller is misbehaving
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
267 in->audio = out->audio = NULL;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
268 in->len = out->len = 0;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
269
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
270 // Figure out how fast the machine is
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
271 if(af_cfg.force)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
272 cfg=af_cfg.force;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
273 else{
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
274 # if defined(HAVE_SSE) || defined(HAVE_3DNOWEX)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
275 cfg=FAST;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
276 # else
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
277 cfg=SLOW;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
278 # endif
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
279 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
280
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
281 // Input and output configuration
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
282 memcpy(&input,in,sizeof(af_data_t));
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
283 memcpy(&output,out,sizeof(af_data_t));
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
284
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
285 // Check if this is the first call
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
286 if(!first){
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
287 // Add all filters in the list (if there are any)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
288 if(!af_cfg.list){
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
289 if(!af_append(first,"dummy")) // To make automatic format conversion work
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
290 return -1;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
291 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
292 else{
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
293 while(af_cfg.list[i]){
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
294 if(!af_append(last,af_cfg.list[i++]))
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
295 return -1;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
296 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
297 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
298 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
299
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
300 // Init filters
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
301 if(AF_OK != af_reinit(first))
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
302 return -1;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
303
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
304 // Check output format
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
305 if(cfg!=FORCE){
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
306 af_instance_t* af = NULL; // New filter
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
307 // Check output frequency if not OK fix with resample
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
308 if(last->data->rate!=output.rate){
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
309 if(NULL==(af=af_get("resample"))){
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
310 if(cfg==SLOW){
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
311 if(!strcmp(first->info->name,"format"))
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
312 af = af_append(first,"resample");
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
313 else
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
314 af = af_prepend(first,"resample");
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
315 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
316 else{
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
317 if(!strcmp(last->info->name,"format"))
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
318 af = af_prepend(last,"resample");
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
319 else
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
320 af = af_append(last,"resample");
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
321 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
322 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
323 // Init the new filter
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
324 if(!af || (AF_OK != af->control(af,AF_CONTROL_RESAMPLE,&output.rate)))
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
325 return -1;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
326 if(AF_OK != af_reinit(af))
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
327 return -1;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
328 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
329
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
330 // Check number of output channels fix if not OK
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
331 // If needed always inserted last -> easy to screw up other filters
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
332 if(last->data->nch!=output.nch){
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
333 if(!strcmp(last->info->name,"format"))
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
334 af = af_prepend(last,"channels");
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
335 else
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
336 af = af_append(last,"channels");
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
337 // Init the new filter
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
338 if(!af || (AF_OK != af->control(af,AF_CONTROL_CHANNELS,&output.nch)))
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
339 return -1;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
340 if(AF_OK != af_reinit(af))
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
341 return -1;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
342 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
343
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
344 // Check output format fix if not OK
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
345 if((last->data->format != output.format) || (last->data->bps != output.bps)){
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
346 if(strcmp(last->info->name,"format"))
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
347 af = af_append(last,"format");
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
348 else
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
349 af = last;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
350 // Init the new filter
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
351 if(!af ||(AF_OK != af->control(af,AF_CONTROL_FORMAT,&output)))
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
352 return -1;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
353 if(AF_OK != af_reinit(af))
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
354 return -1;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
355 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
356
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
357 // Re init again just in case
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
358 if(AF_OK != af_reinit(first))
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
359 return -1;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
360
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
361 if((last->data->format != output.format) || (last->data->bps != output.bps) ||
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
362 (last->data->nch!=output.nch) || (last->data->rate!=output.rate)){
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
363 // Something is stuffed audio out will not work
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
364 mp_msg(MSGT_AFILTER,MSGL_ERR,"Unable to setup filter system can not meet sound-card demands, please report this error on MPlayer development mailing list. \n");
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
365 af_uninit();
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
366 return -1;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
367 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
368 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
369 return 0;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
370 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
371
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
372 // Filter data chunk through the filters in the list
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
373 af_data_t* af_play(af_data_t* data)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
374 {
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
375 af_instance_t* af=first;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
376 // Iterate through all filters
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
377 do{
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
378 data=af->play(af,data);
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
379 af=af->next;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
380 }while(af);
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
381 return data;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
382 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
383
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
384 /* Helper function used to calculate the exact buffer length needed
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
385 when buffers are resized */
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
386 inline int af_lencalc(frac_t mul, int len){
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
387 register int q = len*mul.n;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
388 return q/mul.d + q%mul.d;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
389 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
390
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
391 /* Calculate how long the output from the filters will be given the
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
392 input length "len" */
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
393 int af_outputlen(int len)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
394 {
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
395 af_instance_t* af=first;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
396 frac_t mul = {1,1};
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
397 // Iterate through all filters
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
398 do{
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
399 mul.n *= af->mul.n;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
400 mul.d *= af->mul.d;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
401 af=af->next;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
402 }while(af);
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
403 return af_lencalc(mul,len);
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
404 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
405
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
406 /* Calculate how long the input to the filters should be to produce a
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
407 certain output length, i.e. the return value of this function is
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
408 the input length required to produce the output length "len". */
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
409 int af_inputlen(int len)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
410 {
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
411 af_instance_t* af=first;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
412 frac_t mul = {1,1};
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
413 // Iterate through all filters
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
414 do{
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
415 mul.d *= af->mul.n;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
416 mul.n *= af->mul.d;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
417 af=af->next;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
418 }while(af);
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
419 return af_lencalc(mul,len);
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
420 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
421
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
422 /* Helper function called by the macro with the same name this
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
423 function should not be called directly */
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
424 inline int af_resize_local_buffer(af_instance_t* af, af_data_t* data)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
425 {
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
426 // Calculate new length
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
427 register int len = af_lencalc(af->mul,data->len);
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
428 mp_msg(MSGT_AFILTER,MSGL_V,"Reallocating memory in module %s, old len = %i, new len = %i\n",af->info->name,af->data->len,len);
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
429 // If there is a buffer free it
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
430 if(af->data->audio)
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
431 free(af->data->audio);
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
432 // Create new buffer and check that it is OK
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
433 af->data->audio = malloc(len);
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
434 if(!af->data->audio){
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
435 mp_msg(MSGT_AFILTER,MSGL_ERR,"Could not allocate memory \n");
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
436 return AF_ERROR;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
437 }
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
438 af->data->len=len;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
439 return AF_OK;
d08513b9fed6 Adding new audio output filter layer libaf
anders
parents:
diff changeset
440 }