annotate libaf/af_volume.c @ 35429:3a9048421524

Create new header file gui.h. This is for declarations and definitions used throughout the GUI which are internal ones and thus shall not appear in interface.h.
author ib
date Fri, 30 Nov 2012 11:14:30 +0000
parents a93891202051
children 2f815fdd521c
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
34174
a93891202051 Add missing mp_msg.h #includes, remove some unnecessary ones.
diego
parents: 32537
diff changeset
45 #include "mp_msg.h"
7745
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
46 #include "af.h"
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
47
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
48 // Data for specific instances of this filter
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
49 typedef struct af_volume_s
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
50 {
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
51 int enable[AF_NCH]; // Enable/disable / channel
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
52 float pow[AF_NCH]; // Estimated power level [dB]
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
53 float max[AF_NCH]; // Max Power level [dB]
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
54 float level[AF_NCH]; // Gain level for each channel
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
55 float time; // Forgetting factor for power estimate
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
56 int soft; // Enable/disable soft clipping
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
57 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
58 }af_volume_t;
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
59
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
60 // Initialization and runtime control
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
61 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
62 {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
63 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
64
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
65 switch(cmd){
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
66 case AF_CONTROL_REINIT:
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
67 // Sanity check
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
68 if(!arg) return AF_ERROR;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
69
7745
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
70 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
71 af->data->nch = ((af_data_t*)arg)->nch;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
72
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14068
diff changeset
73 if(s->fast && (((af_data_t*)arg)->format != (AF_FORMAT_FLOAT_NE))){
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14068
diff changeset
74 af->data->format = AF_FORMAT_S16_NE;
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
75 af->data->bps = 2;
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
76 }
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
77 else{
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
78 // Cutoff set to 10Hz for forgetting factor
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
79 float x = 2.0*M_PI*15.0/(float)af->data->rate;
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
80 float t = 2.0-cos(x);
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
81 s->time = 1.0 - (t - sqrt(t*t - 1));
29049
8c706ce21c6f Remove af_msg special-casing API in libaf.
bircoph
parents: 28229
diff changeset
82 mp_msg(MSGT_AFILTER, MSGL_DBG2, "[volume] Forgetting factor = %0.5f\n",s->time);
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14068
diff changeset
83 af->data->format = AF_FORMAT_FLOAT_NE;
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
84 af->data->bps = 4;
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
85 }
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
86 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
87 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
88 float v=0.0;
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
89 float vol[AF_NCH];
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
90 int i;
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
91 sscanf((char*)arg,"%f:%i", &v, &s->soft);
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
92 for(i=0;i<AF_NCH;i++) vol[i]=v;
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
93 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
94 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
95 case AF_CONTROL_POST_CREATE:
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
96 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
97 AF_INIT_FLOAT) ? 0 : 1;
7745
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
98 return AF_OK;
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
99 case AF_CONTROL_VOLUME_ON_OFF | AF_CONTROL_SET:
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
100 memcpy(s->enable,(int*)arg,AF_NCH*sizeof(int));
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
101 return AF_OK;
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
102 case AF_CONTROL_VOLUME_ON_OFF | AF_CONTROL_GET:
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
103 memcpy((int*)arg,s->enable,AF_NCH*sizeof(int));
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
104 return AF_OK;
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
105 case AF_CONTROL_VOLUME_SOFTCLIP | AF_CONTROL_SET:
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
106 s->soft = *(int*)arg;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
107 return AF_OK;
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
108 case AF_CONTROL_VOLUME_SOFTCLIP | AF_CONTROL_GET:
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
109 *(int*)arg = s->soft;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
110 return AF_OK;
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
111 case AF_CONTROL_VOLUME_LEVEL | AF_CONTROL_SET:
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
112 return af_from_dB(AF_NCH,(float*)arg,s->level,20.0,-200.0,60.0);
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
113 case AF_CONTROL_VOLUME_LEVEL | AF_CONTROL_GET:
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
114 return af_to_dB(AF_NCH,s->level,(float*)arg,20.0);
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
115 case AF_CONTROL_VOLUME_PROBE | AF_CONTROL_GET:
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
116 return af_to_dB(AF_NCH,s->pow,(float*)arg,10.0);
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
117 case AF_CONTROL_VOLUME_PROBE_MAX | AF_CONTROL_GET:
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
118 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
119 case AF_CONTROL_PRE_DESTROY:{
b56fd4b1738d Printing of max volume on exit
anders
parents: 8167
diff changeset
120 float m = 0.0;
b56fd4b1738d Printing of max volume on exit
anders
parents: 8167
diff changeset
121 int i;
8868
398e3fb7c103 10l bug for float conversion control + feature fix in volume control
anders
parents: 8867
diff changeset
122 if(!s->fast){
398e3fb7c103 10l bug for float conversion control + feature fix in volume control
anders
parents: 8867
diff changeset
123 for(i=0;i<AF_NCH;i++)
398e3fb7c103 10l bug for float conversion control + feature fix in volume control
anders
parents: 8867
diff changeset
124 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
125 af_to_dB(1, &m, &m, 10.0);
29049
8c706ce21c6f Remove af_msg special-casing API in libaf.
bircoph
parents: 28229
diff changeset
126 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
127 }
8186
b56fd4b1738d Printing of max volume on exit
anders
parents: 8167
diff changeset
128 return AF_OK;
b56fd4b1738d Printing of max volume on exit
anders
parents: 8167
diff changeset
129 }
7745
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
130 }
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
131 return AF_UNKNOWN;
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
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
134 // Deallocate memory
7745
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
135 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
136 {
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 free(af->setup);
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
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
141 // Filter data through filter
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
142 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
143 {
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
144 af_data_t* c = data; // Current working data
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
145 af_volume_t* s = (af_volume_t*)af->setup; // Setup for this instance
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
146 int ch = 0; // Channel counter
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
147 register int nch = c->nch; // Number of channels
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
148 register int i = 0;
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
149
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
150 // Basic operation volume control only (used on slow machines)
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14068
diff changeset
151 if(af->data->format == (AF_FORMAT_S16_NE)){
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
152 int16_t* a = (int16_t*)c->audio; // Audio data
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
153 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
154 for(ch = 0; ch < nch ; ch++){
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
155 if(s->enable[ch]){
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
156 register int vol = (int)(255.0 * s->level[ch]);
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
157 for(i=ch;i<len;i+=nch){
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
158 register int x = (a[i] * vol) >> 8;
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
159 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
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 }
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
163 }
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
164 // Machine is fast and data is floating point
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
165 else if(af->data->format == (AF_FORMAT_FLOAT_NE)){
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
166 float* a = (float*)c->audio; // Audio data
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
167 int len = c->len/4; // Number of samples
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
168 for(ch = 0; ch < nch ; ch++){
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
169 // Volume control (fader)
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
170 if(s->enable[ch]){
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
171 float t = 1.0 - s->time;
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
172 for(i=ch;i<len;i+=nch){
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
173 register float x = a[i];
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29049
diff changeset
174 register float pow = x*x;
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
175 // Check maximum power value
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
176 if(pow > s->max[ch])
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
177 s->max[ch] = pow;
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
178 // Set volume
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
179 x *= s->level[ch];
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
180 // Peak meter
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
181 pow = x*x;
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
182 if(pow > s->pow[ch])
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
183 s->pow[ch] = pow;
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
184 else
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
185 s->pow[ch] = t*s->pow[ch] + pow*s->time; // LP filter
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
186 /* Soft clipping, the sound of a dream, thanks to Jon Wattes
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
187 post to Musicdsp.org */
14623
108fcc2e5d01 using af_softclip
alex
parents: 14245
diff changeset
188 if(s->soft)
108fcc2e5d01 using af_softclip
alex
parents: 14245
diff changeset
189 x=af_softclip(x);
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
190 // Hard clipping
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
191 else
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
192 x=clamp(x,-1.0,1.0);
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
193 a[i] = x;
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 }
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
197 }
7745
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
198 return c;
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
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
201 // 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
202 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
203 int i = 0;
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
204 af->control=control;
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
205 af->uninit=uninit;
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
206 af->play=play;
24888
b2402b4f0afa libaf: change filter input/output ratio calculations
uau
parents: 22748
diff changeset
207 af->mul=1;
7745
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
208 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
209 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
210 if(af->data == NULL || af->setup == NULL)
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
211 return AF_ERROR;
9043
1d75a7ecf3b8 Changing initial volume level to 0dB after loud intensive complaints
anders
parents: 8868
diff changeset
212 // Enable volume control and set initial volume to 0dB.
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
213 for(i=0;i<AF_NCH;i++){
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
214 ((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
215 ((af_volume_t*)af->setup)->level[i] = 1.0;
8607
d6f40a06867b Changes includes:
anders
parents: 8186
diff changeset
216 }
7745
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
217 return AF_OK;
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
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
220 // Description of this filter
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
221 af_info_t af_info_volume = {
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
222 "Volume control audio filter",
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
223 "volume",
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
224 "Anders",
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
225 "",
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
226 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
227 af_open
7745
1d3a3dc1f488 Adding volume control and moving control() call parameters to a seperate file
anders
parents:
diff changeset
228 };