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. */
13const 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
117float *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