Mercurial > mplayer.hg
annotate libaf/af_volume.c @ 28511:db19e31a2c7c
Add a calc_src_dst_rects that calculates from window size, panscan etc.
which part of the video source must be scaled onto which part of the window.
Direct3D and (future) VDPAU need this, for XvMC it makes it easier to add
cropping support and Xv is changed to keep the diff to XvMC small.
author | reimar |
---|---|
date | Thu, 12 Feb 2009 17:40:53 +0000 |
parents | 72d0b1444141 |
children | 8c706ce21c6f |
rev | line source |
---|---|
28229
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24888
diff
changeset
|
1 /* |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24888
diff
changeset
|
2 * Copyright (C)2002 Anders Johansson ajh@atri.curtin.edu.au |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24888
diff
changeset
|
3 * |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24888
diff
changeset
|
4 * This file is part of MPlayer. |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24888
diff
changeset
|
5 * |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24888
diff
changeset
|
6 * MPlayer is free software; you can redistribute it and/or modify |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24888
diff
changeset
|
7 * it under the terms of the GNU General Public License as published by |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24888
diff
changeset
|
8 * the Free Software Foundation; either version 2 of the License, or |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24888
diff
changeset
|
9 * (at your option) any later version. |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24888
diff
changeset
|
10 * |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24888
diff
changeset
|
11 * MPlayer is distributed in the hope that it will be useful, |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24888
diff
changeset
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24888
diff
changeset
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24888
diff
changeset
|
14 * GNU General Public License for more details. |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24888
diff
changeset
|
15 * |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24888
diff
changeset
|
16 * You should have received a copy of the GNU General Public License along |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24888
diff
changeset
|
17 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24888
diff
changeset
|
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
72d0b1444141
Replace informal license notices by standard license header
diego
parents:
24888
diff
changeset
|
19 */ |
8607 | 20 |
7745
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
21 /* This audio filter changes the volume of the sound, and can be used |
8607 | 22 when the mixer doesn't support the PCM channel. It can handle |
7745
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
23 between 1 and 6 channels. The volume can be adjusted between -60dB |
8607 | 24 to +20dB and is set on a per channels basis. The is accessed through |
25 AF_CONTROL_VOLUME_LEVEL. | |
7745
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
26 |
8607 | 27 The filter has support for soft-clipping, it is enabled by |
7745
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
28 AF_CONTROL_VOLUME_SOFTCLIPP. It has also a probing feature which |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
29 can be used to measure the power in the audio stream, both an |
8607 | 30 instantaneous value and the maximum value can be probed. The |
7745
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
31 probing is enable by AF_CONTROL_VOLUME_PROBE_ON_OFF and is done on a |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
32 per channel basis. The result from the probing is obtained using |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
33 AF_CONTROL_VOLUME_PROBE_GET and AF_CONTROL_VOLUME_PROBE_GET_MAX. The |
8607 | 34 probed values are calculated in dB. |
7745
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
35 */ |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
36 |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
37 #include <stdio.h> |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
38 #include <stdlib.h> |
8623
440301fef3fe
Added/reordered #includes to silence warnings about "implicit declaration".
rathann
parents:
8607
diff
changeset
|
39 #include <string.h> |
7745
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
40 |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
41 #include <inttypes.h> |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
42 #include <math.h> |
8607 | 43 #include <limits.h> |
7745
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
44 |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
45 #include "af.h" |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
46 |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
47 // Data for specific instances of this filter |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
48 typedef struct af_volume_s |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
49 { |
8607 | 50 int enable[AF_NCH]; // Enable/disable / channel |
51 float pow[AF_NCH]; // Estimated power level [dB] | |
52 float max[AF_NCH]; // Max Power level [dB] | |
53 float level[AF_NCH]; // Gain level for each channel | |
54 float time; // Forgetting factor for power estimate | |
55 int soft; // Enable/disable soft clipping | |
56 int fast; // Use fix-point volume control | |
7745
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
57 }af_volume_t; |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
58 |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
59 // Initialization and runtime control |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
60 static int control(struct af_instance_s* af, int cmd, void* arg) |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
61 { |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
62 af_volume_t* s = (af_volume_t*)af->setup; |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
63 |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
64 switch(cmd){ |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
65 case AF_CONTROL_REINIT: |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
66 // Sanity check |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
67 if(!arg) return AF_ERROR; |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
68 |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
69 af->data->rate = ((af_data_t*)arg)->rate; |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
70 af->data->nch = ((af_data_t*)arg)->nch; |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
71 |
14245 | 72 if(s->fast && (((af_data_t*)arg)->format != (AF_FORMAT_FLOAT_NE))){ |
73 af->data->format = AF_FORMAT_S16_NE; | |
8607 | 74 af->data->bps = 2; |
75 } | |
76 else{ | |
77 // Cutoff set to 10Hz for forgetting factor | |
78 float x = 2.0*M_PI*15.0/(float)af->data->rate; | |
79 float t = 2.0-cos(x); | |
80 s->time = 1.0 - (t - sqrt(t*t - 1)); | |
81 af_msg(AF_MSG_DEBUG0,"[volume] Forgetting factor = %0.5f\n",s->time); | |
14245 | 82 af->data->format = AF_FORMAT_FLOAT_NE; |
8607 | 83 af->data->bps = 4; |
84 } | |
85 return af_test_output(af,(af_data_t*)arg); | |
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
|
86 case AF_CONTROL_COMMAND_LINE:{ |
14068
f1372a7d9ee9
very old 10l, discussed a long time ago but never fixed (default should be same vol, not -10 dB)
rfelker
parents:
13602
diff
changeset
|
87 float v=0.0; |
8607 | 88 float vol[AF_NCH]; |
89 int i; | |
90 sscanf((char*)arg,"%f:%i", &v, &s->soft); | |
91 for(i=0;i<AF_NCH;i++) vol[i]=v; | |
92 return control(af,AF_CONTROL_VOLUME_LEVEL | AF_CONTROL_SET, vol); | |
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
|
93 } |
8607 | 94 case AF_CONTROL_POST_CREATE: |
8868
398e3fb7c103
10l bug for float conversion control + feature fix in volume control
anders
parents:
8867
diff
changeset
|
95 s->fast = ((((af_cfg_t*)arg)->force & AF_INIT_FORMAT_MASK) == |
398e3fb7c103
10l bug for float conversion control + feature fix in volume control
anders
parents:
8867
diff
changeset
|
96 AF_INIT_FLOAT) ? 0 : 1; |
7745
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
97 return AF_OK; |
8607 | 98 case AF_CONTROL_VOLUME_ON_OFF | AF_CONTROL_SET: |
99 memcpy(s->enable,(int*)arg,AF_NCH*sizeof(int)); | |
100 return AF_OK; | |
101 case AF_CONTROL_VOLUME_ON_OFF | AF_CONTROL_GET: | |
102 memcpy((int*)arg,s->enable,AF_NCH*sizeof(int)); | |
103 return AF_OK; | |
104 case AF_CONTROL_VOLUME_SOFTCLIP | AF_CONTROL_SET: | |
105 s->soft = *(int*)arg; | |
106 return AF_OK; | |
107 case AF_CONTROL_VOLUME_SOFTCLIP | AF_CONTROL_GET: | |
108 *(int*)arg = s->soft; | |
109 return AF_OK; | |
110 case AF_CONTROL_VOLUME_LEVEL | AF_CONTROL_SET: | |
111 return af_from_dB(AF_NCH,(float*)arg,s->level,20.0,-200.0,60.0); | |
112 case AF_CONTROL_VOLUME_LEVEL | AF_CONTROL_GET: | |
113 return af_to_dB(AF_NCH,s->level,(float*)arg,20.0); | |
114 case AF_CONTROL_VOLUME_PROBE | AF_CONTROL_GET: | |
115 return af_to_dB(AF_NCH,s->pow,(float*)arg,10.0); | |
116 case AF_CONTROL_VOLUME_PROBE_MAX | AF_CONTROL_GET: | |
117 return af_to_dB(AF_NCH,s->max,(float*)arg,10.0); | |
8186 | 118 case AF_CONTROL_PRE_DESTROY:{ |
119 float m = 0.0; | |
120 int i; | |
8868
398e3fb7c103
10l bug for float conversion control + feature fix in volume control
anders
parents:
8867
diff
changeset
|
121 if(!s->fast){ |
398e3fb7c103
10l bug for float conversion control + feature fix in volume control
anders
parents:
8867
diff
changeset
|
122 for(i=0;i<AF_NCH;i++) |
398e3fb7c103
10l bug for float conversion control + feature fix in volume control
anders
parents:
8867
diff
changeset
|
123 m=max(m,s->max[i]); |
12641
61f3fce1e933
remove the latest use of log10 in favor of the better af_to_dB helper function, patch by Reimar Doffinger
alex
parents:
9043
diff
changeset
|
124 af_to_dB(1, &m, &m, 10.0); |
61f3fce1e933
remove the latest use of log10 in favor of the better af_to_dB helper function, patch by Reimar Doffinger
alex
parents:
9043
diff
changeset
|
125 af_msg(AF_MSG_INFO,"[volume] The maximum volume was %0.2fdB \n", m); |
8868
398e3fb7c103
10l bug for float conversion control + feature fix in volume control
anders
parents:
8867
diff
changeset
|
126 } |
8186 | 127 return AF_OK; |
128 } | |
7745
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
129 } |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
130 return AF_UNKNOWN; |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
131 } |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
132 |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
133 // Deallocate memory |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
134 static void uninit(struct af_instance_s* af) |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
135 { |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
136 if(af->data) |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
137 free(af->data); |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
138 if(af->setup) |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
139 free(af->setup); |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
140 } |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
141 |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
142 // Filter data through filter |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
143 static af_data_t* play(struct af_instance_s* af, af_data_t* data) |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
144 { |
8607 | 145 af_data_t* c = data; // Current working data |
146 af_volume_t* s = (af_volume_t*)af->setup; // Setup for this instance | |
147 int ch = 0; // Channel counter | |
148 register int nch = c->nch; // Number of channels | |
149 register int i = 0; | |
150 | |
151 // Basic operation volume control only (used on slow machines) | |
14245 | 152 if(af->data->format == (AF_FORMAT_S16_NE)){ |
8607 | 153 int16_t* a = (int16_t*)c->audio; // Audio data |
154 int len = c->len/2; // Number of samples | |
7745
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
155 for(ch = 0; ch < nch ; ch++){ |
8607 | 156 if(s->enable[ch]){ |
157 register int vol = (int)(255.0 * s->level[ch]); | |
158 for(i=ch;i<len;i+=nch){ | |
159 register int x = (a[i] * vol) >> 8; | |
160 a[i]=clamp(x,SHRT_MIN,SHRT_MAX); | |
7745
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
161 } |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
162 } |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
163 } |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
164 } |
8607 | 165 // Machine is fast and data is floating point |
14245 | 166 else if(af->data->format == (AF_FORMAT_FLOAT_NE)){ |
8607 | 167 float* a = (float*)c->audio; // Audio data |
168 int len = c->len/4; // Number of samples | |
169 for(ch = 0; ch < nch ; ch++){ | |
170 // Volume control (fader) | |
171 if(s->enable[ch]){ | |
172 float t = 1.0 - s->time; | |
173 for(i=ch;i<len;i+=nch){ | |
174 register float x = a[i]; | |
175 register float pow = x*x; | |
176 // Check maximum power value | |
177 if(pow > s->max[ch]) | |
178 s->max[ch] = pow; | |
179 // Set volume | |
180 x *= s->level[ch]; | |
181 // Peak meter | |
182 pow = x*x; | |
183 if(pow > s->pow[ch]) | |
184 s->pow[ch] = pow; | |
185 else | |
186 s->pow[ch] = t*s->pow[ch] + pow*s->time; // LP filter | |
187 /* Soft clipping, the sound of a dream, thanks to Jon Wattes | |
188 post to Musicdsp.org */ | |
14623 | 189 if(s->soft) |
190 x=af_softclip(x); | |
8607 | 191 // Hard clipping |
192 else | |
193 x=clamp(x,-1.0,1.0); | |
194 a[i] = x; | |
195 } | |
196 } | |
197 } | |
198 } | |
7745
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
199 return c; |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
200 } |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
201 |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
202 // Allocate memory and set function pointers |
22746
fd6f824ef894
Rename open to af_open so as not to conflict with a previous header definition.
diego
parents:
14623
diff
changeset
|
203 static int af_open(af_instance_t* af){ |
7745
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
204 int i = 0; |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
205 af->control=control; |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
206 af->uninit=uninit; |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
207 af->play=play; |
24888 | 208 af->mul=1; |
7745
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
209 af->data=calloc(1,sizeof(af_data_t)); |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
210 af->setup=calloc(1,sizeof(af_volume_t)); |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
211 if(af->data == NULL || af->setup == NULL) |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
212 return AF_ERROR; |
9043
1d75a7ecf3b8
Changing initial volume level to 0dB after loud intensive complaints
anders
parents:
8868
diff
changeset
|
213 // Enable volume control and set initial volume to 0dB. |
8607 | 214 for(i=0;i<AF_NCH;i++){ |
215 ((af_volume_t*)af->setup)->enable[i] = 1; | |
9043
1d75a7ecf3b8
Changing initial volume level to 0dB after loud intensive complaints
anders
parents:
8868
diff
changeset
|
216 ((af_volume_t*)af->setup)->level[i] = 1.0; |
8607 | 217 } |
7745
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
218 return AF_OK; |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
219 } |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
220 |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
221 // Description of this filter |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
222 af_info_t af_info_volume = { |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
223 "Volume control audio filter", |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
224 "volume", |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
225 "Anders", |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
226 "", |
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
227 AF_FLAGS_NOT_REENTRANT, |
22746
fd6f824ef894
Rename open to af_open so as not to conflict with a previous header definition.
diego
parents:
14623
diff
changeset
|
228 af_open |
7745
1d3a3dc1f488
Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff
changeset
|
229 }; |