Branch data Line data Source code
1 : : /***
2 : : This file is part of PulseAudio.
3 : :
4 : : PulseAudio is free software; you can redistribute it and/or modify
5 : : it under the terms of the GNU Lesser General Public License as published
6 : : by the Free Software Foundation; either version 2.1 of the License,
7 : : or (at your option) any later version.
8 : :
9 : : PulseAudio is distributed in the hope that it will be useful, but
10 : : WITHOUT ANY WARRANTY; without even the implied warranty of
11 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 : : General Public License for more details.
13 : :
14 : : You should have received a copy of the GNU Lesser General Public License
15 : : along with PulseAudio; if not, write to the Free Software
16 : : Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
17 : : USA.
18 : : ***/
19 : :
20 : : #ifdef HAVE_CONFIG_H
21 : : #include <config.h>
22 : : #endif
23 : :
24 : : #include <stdio.h>
25 : : #include <math.h>
26 : :
27 : : #include <pulse/volume.h>
28 : :
29 : : #include <pulsecore/log.h>
30 : : #include <pulsecore/macro.h>
31 : :
32 : 1 : int main(int argc, char *argv[]) {
33 : : pa_volume_t v;
34 : : pa_cvolume cv;
35 : : float b;
36 : : pa_channel_map map;
37 : 1 : pa_volume_t md = 0;
38 : 1 : unsigned mdn = 0;
39 : :
40 [ - + ]: 1 : if (!getenv("MAKE_CHECK"))
41 : 0 : pa_log_set_level(PA_LOG_DEBUG);
42 : :
43 : 1 : pa_log("Attenuation of sample 1 against 32767: %g dB", 20.0*log10(1.0/32767.0));
44 : 1 : pa_log("Smallest possible attenuation > 0 applied to 32767: %li", lrint(32767.0*pa_sw_volume_to_linear(1)));
45 : :
46 [ + + ]: 514 : for (v = PA_VOLUME_MUTED; v <= PA_VOLUME_NORM*2; v += 256) {
47 : :
48 : 513 : double dB = pa_sw_volume_to_dB(v);
49 : 513 : double f = pa_sw_volume_to_linear(v);
50 : :
51 : 513 : pa_log_debug("Volume: %3i; percent: %i%%; decibel %0.2f; linear = %0.2f; volume(decibel): %3i; volume(linear): %3i",
52 : : v, (v*100)/PA_VOLUME_NORM, dB, f, pa_sw_volume_from_dB(dB), pa_sw_volume_from_linear(f));
53 : : }
54 : :
55 [ + + ]: 514 : for (v = PA_VOLUME_MUTED; v <= PA_VOLUME_NORM*2; v += 256) {
56 : : char s[PA_CVOLUME_SNPRINT_MAX], t[PA_SW_CVOLUME_SNPRINT_DB_MAX];
57 : :
58 : 513 : pa_cvolume_set(&cv, 2, v);
59 : :
60 : 513 : pa_log_debug("Volume: %3i [%s] [%s]", v, pa_cvolume_snprint(s, sizeof(s), &cv), pa_sw_cvolume_snprint_dB(t, sizeof(t), &cv));
61 : : }
62 : :
63 : 1 : map.channels = cv.channels = 2;
64 : 1 : map.map[0] = PA_CHANNEL_POSITION_LEFT;
65 : 1 : map.map[1] = PA_CHANNEL_POSITION_RIGHT;
66 : :
67 [ + + ]: 34 : for (cv.values[0] = PA_VOLUME_MUTED; cv.values[0] <= PA_VOLUME_NORM*2; cv.values[0] += 4096)
68 [ + + ]: 1122 : for (cv.values[1] = PA_VOLUME_MUTED; cv.values[1] <= PA_VOLUME_NORM*2; cv.values[1] += 4096) {
69 : : char s[PA_CVOLUME_SNPRINT_MAX];
70 : :
71 : 1089 : pa_log_debug("Volume: [%s]; balance: %2.1f", pa_cvolume_snprint(s, sizeof(s), &cv), pa_cvolume_get_balance(&cv, &map));
72 : : }
73 : :
74 [ + + ]: 33 : for (cv.values[0] = PA_VOLUME_MUTED+4096; cv.values[0] <= PA_VOLUME_NORM*2; cv.values[0] += 4096)
75 [ + + ]: 1088 : for (cv.values[1] = PA_VOLUME_MUTED; cv.values[1] <= PA_VOLUME_NORM*2; cv.values[1] += 4096)
76 [ + + ]: 12672 : for (b = -1.0f; b <= 1.0f; b += 0.2f) {
77 : : char s[PA_CVOLUME_SNPRINT_MAX];
78 : : pa_cvolume r;
79 : : float k;
80 : :
81 : 11616 : pa_log_debug("Before: volume: [%s]; balance: %2.1f", pa_cvolume_snprint(s, sizeof(s), &cv), pa_cvolume_get_balance(&cv, &map));
82 : :
83 : 11616 : r = cv;
84 : 11616 : pa_cvolume_set_balance(&r, &map,b);
85 : :
86 : 11616 : k = pa_cvolume_get_balance(&r, &map);
87 [ + - ][ + - ]: 11616 : pa_log_debug("After: volume: [%s]; balance: %2.1f (intended: %2.1f) %s", pa_cvolume_snprint(s, sizeof(s), &r), k, b, k < b-.05 || k > b+.5 ? "MISMATCH" : "");
88 : : }
89 : :
90 [ + + ]: 2572 : for (v = PA_VOLUME_MUTED; v <= PA_VOLUME_NORM*2; v += 51) {
91 : :
92 : 2571 : double l = pa_sw_volume_to_linear(v);
93 : 2571 : pa_volume_t k = pa_sw_volume_from_linear(l);
94 : 2571 : double db = pa_sw_volume_to_dB(v);
95 : 2571 : pa_volume_t r = pa_sw_volume_from_dB(db);
96 : : pa_volume_t w;
97 : :
98 [ - + ]: 2571 : pa_assert(k == v);
99 [ + - ]: 2571 : pa_assert(r == v);
100 : :
101 [ + + ]: 9111624 : for (w = PA_VOLUME_MUTED; w < PA_VOLUME_NORM*2; w += 37) {
102 : :
103 : 9109053 : double t = pa_sw_volume_to_linear(w);
104 : 9109053 : double db2 = pa_sw_volume_to_dB(w);
105 : : pa_volume_t p, p1, p2;
106 : : double q, qq;
107 : :
108 : 9109053 : p = pa_sw_volume_multiply(v, w);
109 : 9109053 : qq = db + db2;
110 : 9109053 : p2 = pa_sw_volume_from_dB(qq);
111 : 9109053 : q = l*t;
112 : 9109053 : p1 = pa_sw_volume_from_linear(q);
113 : :
114 [ - + ][ # # ]: 9109053 : if (p2 > p && p2 - p > md)
115 : 0 : md = p2 - p;
116 [ + + ][ + + ]: 9109053 : if (p2 < p && p - p2 > md)
117 : 1 : md = p - p2;
118 [ - + ][ # # ]: 9109053 : if (p1 > p && p1 - p > md)
119 : 0 : md = p1 - p;
120 [ + + ][ - + ]: 9109053 : if (p1 < p && p - p1 > md)
121 : 0 : md = p - p1;
122 : :
123 [ + + ]: 9109053 : if (p1 != p || p2 != p)
124 : 251 : mdn++;
125 : : }
126 : : }
127 : :
128 : 1 : pa_log("max deviation: %lu n=%lu", (unsigned long) md, (unsigned long) mdn);
129 : :
130 [ - + ]: 1 : pa_assert(md <= 1);
131 [ - + ]: 1 : pa_assert(mdn <= 251);
132 : :
133 : : return 0;
134 : : }
|