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 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