1 /* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
2 * Use of this source code is governed by a BSD-style license that can be
3 * found in the LICENSE file.
4 */
5
6 #include <stddef.h>
7 #include <stdlib.h>
8
9 #include "cras_volume_curve.h"
10 #include "softvol_curve.h"
11
12 /* This is a ramp that increases 0.5dB per step, for a total range of 50dB. */
13 const float softvol_scalers[101] = {
14 0.003162, /* volume 0 */
15 0.003350,
16 0.003548,
17 0.003758,
18 0.003981,
19 0.004217,
20 0.004467,
21 0.004732,
22 0.005012,
23 0.005309,
24 0.005623,
25 0.005957,
26 0.006310,
27 0.006683,
28 0.007079,
29 0.007499,
30 0.007943,
31 0.008414,
32 0.008913,
33 0.009441,
34 0.010000,
35 0.010593,
36 0.011220,
37 0.011885,
38 0.012589,
39 0.013335,
40 0.014125,
41 0.014962,
42 0.015849,
43 0.016788,
44 0.017783,
45 0.018836,
46 0.019953,
47 0.021135,
48 0.022387,
49 0.023714,
50 0.025119,
51 0.026607,
52 0.028184,
53 0.029854,
54 0.031623,
55 0.033497,
56 0.035481,
57 0.037584,
58 0.039811,
59 0.042170,
60 0.044668,
61 0.047315,
62 0.050119,
63 0.053088,
64 0.056234,
65 0.059566,
66 0.063096,
67 0.066834,
68 0.070795,
69 0.074989,
70 0.079433,
71 0.084140,
72 0.089125,
73 0.094406,
74 0.100000,
75 0.105925,
76 0.112202,
77 0.118850,
78 0.125893,
79 0.133352,
80 0.141254,
81 0.149624,
82 0.158489,
83 0.167880,
84 0.177828,
85 0.188365,
86 0.199526,
87 0.211349,
88 0.223872,
89 0.237137,
90 0.251189,
91 0.266073,
92 0.281838,
93 0.298538,
94 0.316228,
95 0.334965,
96 0.354813,
97 0.375837,
98 0.398107,
99 0.421697,
100 0.446684,
101 0.473151,
102 0.501187,
103 0.530884,
104 0.562341,
105 0.595662,
106 0.630957,
107 0.668344,
108 0.707946,
109 0.749894,
110 0.794328,
111 0.841395,
112 0.891251,
113 0.944061,
114 1.000000, /* volume 100 */
115 };
116
softvol_build_from_curve(const struct cras_volume_curve * curve)117 float *softvol_build_from_curve(const struct cras_volume_curve *curve)
118 {
119 float *scalers;
120 unsigned int volume;
121
122 if (!curve)
123 return NULL;
124
125 scalers = (float *)malloc(NUM_VOLUME_STEPS * sizeof(float));
126 if (!scalers)
127 return NULL;
128
129 /* When software volume is used, it is assumed all volume curve values
130 * are relative to 0 dBFS when converting to scale. If a positive dBFS
131 * value is specified in curve config, it will be treated as invalid
132 * and clip to 1.0 in scale.
133 */
134 for (volume = 0; volume <= MAX_VOLUME; volume++) {
135 scalers[volume] = convert_softvol_scaler_from_dB(
136 curve->get_dBFS(curve, volume));
137 if (scalers[volume] > 1.0)
138 scalers[volume] = 1.0;
139 }
140
141 return scalers;
142 }
143