Home | History | Annotate | Download | only in server
      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