annotate libao2/pl_volnorm.c @ 9278:caea8ed36b48

The reason why mplayer crashes (in some cases) when using x11 output and -wid (>0) parameter is this: Mplayer by default creates a colormap using DirectColor visual. If the window given to mplayer uses TrueColor visual there will be an error when mplayer sets the colormap for the window. This patch modifies mplayer to use TrueColor visual if the window given to mplayer uses TrueColor. Another solution is to make sure that the window given to mplayer is created using DirectColor visual if it is supported by the display. Jouni Tulkki <jitulkki@cc.hut.fi>
author arpi
date Tue, 04 Feb 2003 18:31:44 +0000
parents 46d21c0f36aa
children 12b1790038b0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4941
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
1 /* Normalizer plugin
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
2 *
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
3 * Limitations:
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
4 * - only AFMT_S16_LE supported
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
5 * - no parameters yet => tweak the values by editing the #defines
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
6 *
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
7 * License: GPLv2
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
8 * Author: pl <p_l@gmx.fr> (c) 2002 and beyond...
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
9 *
5025
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
10 * Sources: some ideas from volnorm plugin for xmms
4941
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
11 *
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
12 * */
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
13
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
14 #define PLUGIN
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
15
5025
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
16 /* Values for AVG:
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
17 * 1: uses a 1 value memory and coefficients new=a*old+b*cur (with a+b=1)
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
18 *
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
19 * 2: uses several samples to smooth the variations (standard weighted mean
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
20 * on past samples)
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
21 *
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
22 * */
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
23 #define AVG 1
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
24
4941
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
25 #include <stdio.h>
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
26 #include <stdlib.h>
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
27 #include <inttypes.h>
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
28 #include <math.h> // for sqrt()
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
29
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
30 #include "audio_out.h"
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
31 #include "audio_plugin.h"
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
32 #include "audio_plugin_internal.h"
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
33 #include "afmt.h"
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
34
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
35 static ao_info_t info = {
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
36 "Volume normalizer",
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
37 "volnorm",
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
38 "pl <p_l@gmx.fr>",
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
39 ""
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
40 };
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
41
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
42 LIBAO_PLUGIN_EXTERN(volnorm)
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
43
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
44 // mul is the value by which the samples are scaled
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
45 // and has to be in [MUL_MIN, MUL_MAX]
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
46 #define MUL_INIT 1.0
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
47 #define MUL_MIN 0.1
5025
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
48 #define MUL_MAX 5.0
4941
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
49 static float mul;
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
50
5025
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
51
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
52 #if AVG==1
4941
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
53 // "history" value of the filter
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
54 static float lastavg;
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
55
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
56 // SMOOTH_* must be in ]0.0, 1.0[
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
57 // The new value accounts for SMOOTH_MUL in the value and history
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
58 #define SMOOTH_MUL 0.06
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
59 #define SMOOTH_LASTAVG 0.06
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
60
5025
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
61
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
62 #elif AVG==2
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
63 // Size of the memory array
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
64 // FIXME: should depend on the frequency of the data (should be a few seconds)
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
65 #define NSAMPLES 128
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
66
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
67 // Indicates where to write (in 0..NSAMPLES-1)
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
68 static int idx;
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
69 // The array
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
70 static struct {
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
71 float avg; // average level of the sample
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
72 int32_t len; // sample size (weight)
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
73 } mem[NSAMPLES];
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
74
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
75 // If summing all the mem[].len is lower than MIN_SAMPLE_SIZE bytes, then we
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
76 // choose to ignore the computed value as it's not significant enough
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
77 // FIXME: should depend on the frequency of the data (0.5s maybe)
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
78 #define MIN_SAMPLE_SIZE 32000
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
79
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
80 #else
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
81 // Kab00m !
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
82 #error "Unknown AVG"
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
83 #endif
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
84
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
85
4943
511e8d8117e9 proper bsd fix & preventive fix for other archs w/o INT_MAX
pl
parents: 4942
diff changeset
86 // Some limits
511e8d8117e9 proper bsd fix & preventive fix for other archs w/o INT_MAX
pl
parents: 4942
diff changeset
87 #define MIN_S16 -32768
511e8d8117e9 proper bsd fix & preventive fix for other archs w/o INT_MAX
pl
parents: 4942
diff changeset
88 #define MAX_S16 32767
511e8d8117e9 proper bsd fix & preventive fix for other archs w/o INT_MAX
pl
parents: 4942
diff changeset
89
5025
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
90 // "Ideal" level
4943
511e8d8117e9 proper bsd fix & preventive fix for other archs w/o INT_MAX
pl
parents: 4942
diff changeset
91 #define MID_S16 (MAX_S16 * 0.25)
4941
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
92
5025
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
93 // Silence level
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
94 // FIXME: should be relative to the level of the samples
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
95 #define SIL_S16 (MAX_S16 * 0.01)
4941
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
96
5025
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
97
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
98 // Local data
4941
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
99 static struct {
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
100 int inuse; // This plugin is in use TRUE, FALSE
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
101 int format; // sample fomat
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
102 } pl_volnorm = {0, 0};
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
103
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
104
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
105 // minimal interface
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
106 static int control(int cmd,int arg){
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
107 switch(cmd){
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
108 case AOCONTROL_PLUGIN_SET_LEN:
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
109 return CONTROL_OK;
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
110 }
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
111 return CONTROL_UNKNOWN;
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
112 }
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
113
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
114 // minimal interface
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
115 // open & setup audio device
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
116 // return: 1=success 0=fail
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
117 static int init(){
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
118 switch(ao_plugin_data.format){
8741
46d21c0f36aa (nicer) endianness fix for every plugin except pl_format
colin
parents: 8218
diff changeset
119 case(AFMT_S16_NE):
4941
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
120 break;
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
121 default:
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
122 fprintf(stderr,"[pl_volnorm] Audio format not yet supported.\n");
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
123 return 0;
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
124 }
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
125
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
126 pl_volnorm.format = ao_plugin_data.format;
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
127 pl_volnorm.inuse = 1;
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
128
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
129 reset();
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
130
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
131 printf("[pl_volnorm] Normalizer plugin in use.\n");
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
132 return 1;
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
133 }
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
134
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
135 // close plugin
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
136 static void uninit(){
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
137 pl_volnorm.inuse=0;
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
138 }
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
139
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
140 // empty buffers
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
141 static void reset(){
5025
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
142 int i;
4941
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
143 mul = MUL_INIT;
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
144 switch(ao_plugin_data.format) {
8741
46d21c0f36aa (nicer) endianness fix for every plugin except pl_format
colin
parents: 8218
diff changeset
145 case(AFMT_S16_NE):
5025
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
146 #if AVG==1
4941
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
147 lastavg = MID_S16;
5025
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
148 #elif AVG==2
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
149 for(i=0; i < NSAMPLES; ++i) {
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
150 mem[i].len = 0;
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
151 mem[i].avg = 0;
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
152 }
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
153 idx = 0;
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
154 #endif
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
155
4941
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
156 break;
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
157 default:
5025
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
158 fprintf(stderr,"[pl_volnorm] internal inconsistency - bugreport !\n");
4941
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
159 *(char *) 0 = 0;
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
160 }
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
161 }
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
162
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
163 // processes 'ao_plugin_data.len' bytes of 'data'
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
164 // called for every block of data
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
165 static int play(){
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
166
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
167 switch(pl_volnorm.format){
8741
46d21c0f36aa (nicer) endianness fix for every plugin except pl_format
colin
parents: 8218
diff changeset
168 case(AFMT_S16_NE): {
4941
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
169 #define CLAMP(x,m,M) do { if ((x)<(m)) (x) = (m); else if ((x)>(M)) (x) = (M); } while(0)
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
170
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
171 int16_t* data=(int16_t*)ao_plugin_data.data;
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
172 int len=ao_plugin_data.len / 2; // 16 bits samples
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
173
5025
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
174 int32_t i, tmp;
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
175 float curavg, newavg;
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
176
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
177 #if AVG==1
4941
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
178 float neededmul;
5025
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
179 #elif AVG==2
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
180 float avg;
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
181 int32_t totallen;
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
182 #endif
4941
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
183
5025
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
184 // Evaluate current samples average level
4941
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
185 curavg = 0.0;
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
186 for (i = 0; i < len ; ++i) {
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
187 tmp = data[i];
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
188 curavg += tmp * tmp;
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
189 }
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
190 curavg = sqrt(curavg / (float) len);
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
191
5025
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
192 // Evaluate an adequate 'mul' coefficient based on previous state, current
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
193 // samples level, etc
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
194 #if AVG==1
4941
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
195 if (curavg > SIL_S16) {
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
196 neededmul = MID_S16 / ( curavg * mul);
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
197 mul = (1.0 - SMOOTH_MUL) * mul + SMOOTH_MUL * neededmul;
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
198
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
199 // Clamp the mul coefficient
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
200 CLAMP(mul, MUL_MIN, MUL_MAX);
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
201 }
5025
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
202 #elif AVG==2
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
203 avg = 0.0;
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
204 totallen = 0;
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
205
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
206 for (i = 0; i < NSAMPLES; ++i) {
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
207 avg += mem[i].avg * (float) mem[i].len;
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
208 totallen += mem[i].len;
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
209 }
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
210
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
211 if (totallen > MIN_SAMPLE_SIZE) {
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
212 avg /= (float) totallen;
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
213 if (avg >= SIL_S16) {
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
214 mul = (float) MID_S16 / avg;
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
215 CLAMP(mul, MUL_MIN, MUL_MAX);
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
216 }
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
217 }
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
218 #endif
4941
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
219
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
220 // Scale & clamp the samples
5025
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
221 for (i = 0; i < len ; ++i) {
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
222 tmp = mul * data[i];
4943
511e8d8117e9 proper bsd fix & preventive fix for other archs w/o INT_MAX
pl
parents: 4942
diff changeset
223 CLAMP(tmp, MIN_S16, MAX_S16);
4941
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
224 data[i] = tmp;
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
225 }
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
226
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
227 // Evaluation of newavg (not 100% accurate because of values clamping)
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
228 newavg = mul * curavg;
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
229
5025
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
230 // Stores computed values for future smoothing
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
231 #if AVG==1
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
232 lastavg = (1.0 - SMOOTH_LASTAVG) * lastavg + SMOOTH_LASTAVG * newavg;
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
233 //printf("\rmul=%02.1f ", mul);
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
234 #elif AVG==2
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
235 mem[idx].len = len;
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
236 mem[idx].avg = newavg;
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
237 idx = (idx + 1) % NSAMPLES;
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
238 //printf("\rmul=%02.1f (%04dKiB) ", mul, totallen/1024);
4941
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
239 #endif
5025
6d8971d55e40 new smoothing method ('#define AVG 2' to enable'n'test it)
pl
parents: 4943
diff changeset
240 //fflush(stdout);
4941
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
241
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
242 break;
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
243 }
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
244 default:
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
245 return 0;
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
246 }
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
247 return 1;
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
248
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
249 }
9a468a190c4c volume normalizer plugin support
pl
parents:
diff changeset
250