annotate libaf/af_volume.c @ 33441:d494a6d78677

Use int as type, there is no reason to use char which also causes issues since it may be either signed or unsigned.
author reimar
date Mon, 30 May 2011 21:16:37 +0000
parents 8fa2f43cb760
children a93891202051
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
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
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
22 when the mixer doesn't support the PCM channel. It can handle
29826
4eae69f3f4f4 Add support for 8 channel audio.
tack
parents: 29263
diff changeset
23 between 1 and AF_NCH channels. The volume can be adjusted between -60dB
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
24 to +20dB and is set on a per channels basis. The is accessed through
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
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
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
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
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
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
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
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>
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
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
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
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
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
50 int enable[AF_NCH]; // Enable/disable / channel
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
51 float pow[AF_NCH]; // Estimated power level [dB]
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
52 float max[AF_NCH]; // Max Power level [dB]
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
53 float level[AF_NCH]; // Gain level for each channel
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
54 float time; // Forgetting factor for power estimate
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
55 int soft; // Enable/disable soft clipping
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
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 {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
62 af_volume_t* s = (af_volume_t*)af->setup;
7745
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;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
68
7745
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;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
71
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14068
diff changeset
72 if(s->fast && (((af_data_t*)arg)->format != (AF_FORMAT_FLOAT_NE))){
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14068
diff changeset
73 af->data->format = AF_FORMAT_S16_NE;
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
74 af->data->bps = 2;
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
75 }
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
76 else{
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
77 // Cutoff set to 10Hz for forgetting factor
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
78 float x = 2.0*M_PI*15.0/(float)af->data->rate;
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
79 float t = 2.0-cos(x);
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
80 s->time = 1.0 - (t - sqrt(t*t - 1));
29049
8c706ce21c6f Remove af_msg special-casing API in libaf.
bircoph
parents: 28229
diff changeset
81 mp_msg(MSGT_AFILTER, MSGL_DBG2, "[volume] Forgetting factor = %0.5f\n",s->time);
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14068
diff changeset
82 af->data->format = AF_FORMAT_FLOAT_NE;
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
83 af->data->bps = 4;
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
84 }
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
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
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
88 float vol[AF_NCH];
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
89 int i;
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
90 sscanf((char*)arg,"%f:%i", &v, &s->soft);
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
91 for(i=0;i<AF_NCH;i++) vol[i]=v;
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
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 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
94 case AF_CONTROL_POST_CREATE:
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
95 s->fast = ((((af_cfg_t*)arg)->force & AF_INIT_FORMAT_MASK) ==
8868
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
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
98 case AF_CONTROL_VOLUME_ON_OFF | AF_CONTROL_SET:
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
99 memcpy(s->enable,(int*)arg,AF_NCH*sizeof(int));
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
100 return AF_OK;
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
101 case AF_CONTROL_VOLUME_ON_OFF | AF_CONTROL_GET:
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
102 memcpy((int*)arg,s->enable,AF_NCH*sizeof(int));
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
103 return AF_OK;
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
104 case AF_CONTROL_VOLUME_SOFTCLIP | AF_CONTROL_SET:
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
105 s->soft = *(int*)arg;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
106 return AF_OK;
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
107 case AF_CONTROL_VOLUME_SOFTCLIP | AF_CONTROL_GET:
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
108 *(int*)arg = s->soft;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
109 return AF_OK;
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
110 case AF_CONTROL_VOLUME_LEVEL | AF_CONTROL_SET:
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
111 return af_from_dB(AF_NCH,(float*)arg,s->level,20.0,-200.0,60.0);
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
112 case AF_CONTROL_VOLUME_LEVEL | AF_CONTROL_GET:
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
113 return af_to_dB(AF_NCH,s->level,(float*)arg,20.0);
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
114 case AF_CONTROL_VOLUME_PROBE | AF_CONTROL_GET:
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
115 return af_to_dB(AF_NCH,s->pow,(float*)arg,10.0);
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
116 case AF_CONTROL_VOLUME_PROBE_MAX | AF_CONTROL_GET:
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
117 return af_to_dB(AF_NCH,s->max,(float*)arg,10.0);
8186
b56fd4b1738d Printing of max volume on exit
anders
parents: 8167
diff changeset
118 case AF_CONTROL_PRE_DESTROY:{
b56fd4b1738d Printing of max volume on exit
anders
parents: 8167
diff changeset
119 float m = 0.0;
b56fd4b1738d Printing of max volume on exit
anders
parents: 8167
diff changeset
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);
29049
8c706ce21c6f Remove af_msg special-casing API in libaf.
bircoph
parents: 28229
diff changeset
125 mp_msg(MSGT_AFILTER, MSGL_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
b56fd4b1738d Printing of max volume on exit
anders
parents: 8167
diff changeset
127 return AF_OK;
b56fd4b1738d Printing of max volume on exit
anders
parents: 8167
diff changeset
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
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
133 // Deallocate memory
7745
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 free(af->data);
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
137 free(af->setup);
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
138 }
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
139
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
140 // Filter data through filter
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
141 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
142 {
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
143 af_data_t* c = data; // Current working data
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
144 af_volume_t* s = (af_volume_t*)af->setup; // Setup for this instance
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
145 int ch = 0; // Channel counter
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
146 register int nch = c->nch; // Number of channels
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
147 register int i = 0;
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
148
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
149 // Basic operation volume control only (used on slow machines)
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14068
diff changeset
150 if(af->data->format == (AF_FORMAT_S16_NE)){
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
151 int16_t* a = (int16_t*)c->audio; // Audio data
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
152 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
153 for(ch = 0; ch < nch ; ch++){
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
154 if(s->enable[ch]){
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
155 register int vol = (int)(255.0 * s->level[ch]);
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
156 for(i=ch;i<len;i+=nch){
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
157 register int x = (a[i] * vol) >> 8;
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
158 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
159 }
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
160 }
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 }
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
163 // Machine is fast and data is floating point
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
164 else if(af->data->format == (AF_FORMAT_FLOAT_NE)){
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
165 float* a = (float*)c->audio; // Audio data
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
166 int len = c->len/4; // Number of samples
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
167 for(ch = 0; ch < nch ; ch++){
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
168 // Volume control (fader)
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
169 if(s->enable[ch]){
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
170 float t = 1.0 - s->time;
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
171 for(i=ch;i<len;i+=nch){
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
172 register float x = a[i];
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
173 register float pow = x*x;
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
174 // Check maximum power value
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
175 if(pow > s->max[ch])
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
176 s->max[ch] = pow;
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
177 // Set volume
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
178 x *= s->level[ch];
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
179 // Peak meter
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
180 pow = x*x;
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
181 if(pow > s->pow[ch])
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
182 s->pow[ch] = pow;
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
183 else
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
184 s->pow[ch] = t*s->pow[ch] + pow*s->time; // LP filter
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
185 /* Soft clipping, the sound of a dream, thanks to Jon Wattes
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
186 post to Musicdsp.org */
14623
108fcc2e5d01 using af_softclip
alex
parents: 14245
diff changeset
187 if(s->soft)
108fcc2e5d01 using af_softclip
alex
parents: 14245
diff changeset
188 x=af_softclip(x);
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
189 // Hard clipping
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
190 else
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
191 x=clamp(x,-1.0,1.0);
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
192 a[i] = x;
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
193 }
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
194 }
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
195 }
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
196 }
7745
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
197 return c;
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
198 }
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
199
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
200 // 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
201 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
202 int i = 0;
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
203 af->control=control;
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
204 af->uninit=uninit;
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
205 af->play=play;
24888
b2402b4f0afa libaf: change filter input/output ratio calculations
uau
parents: 22748
diff changeset
206 af->mul=1;
7745
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
207 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
208 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
209 if(af->data == NULL || af->setup == NULL)
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
210 return AF_ERROR;
9043
1d75a7ecf3b8 Changing initial volume level to 0dB after loud intensive complaints
anders
parents: 8868
diff changeset
211 // Enable volume control and set initial volume to 0dB.
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
212 for(i=0;i<AF_NCH;i++){
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
213 ((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
214 ((af_volume_t*)af->setup)->level[i] = 1.0;
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
215 }
7745
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
216 return AF_OK;
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
217 }
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
218
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
219 // Description of this filter
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
220 af_info_t af_info_volume = {
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
221 "Volume control audio filter",
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
222 "volume",
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
223 "Anders",
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
224 "",
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
225 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
226 af_open
7745
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
227 };