|
| 1 | +// SPDX-License-Identifier: BSD-3-Clause |
| 2 | +// |
| 3 | +// Copyright(c) 2023 Intel Corporation. All rights reserved. |
| 4 | + |
| 5 | +#include <sof/audio/aria/aria.h> |
| 6 | +#include <ipc4/aria.h> |
| 7 | + |
| 8 | +#ifdef ARIA_GENERIC |
| 9 | + |
| 10 | +inline void aria_algo_calc_gain(struct comp_dev *dev, size_t gain_idx, |
| 11 | + int32_t *__restrict data, const size_t src_size) |
| 12 | +{ |
| 13 | + struct aria_data *cd = comp_get_drvdata(dev); |
| 14 | + int32_t max_data = 0; |
| 15 | + int64_t gain; |
| 16 | + |
| 17 | + for (size_t i = 0; i < src_size; ++i) |
| 18 | + max_data = MAX(max_data, ABS(data[i])); |
| 19 | + |
| 20 | + gain = 1ULL << (cd->att + 32); |
| 21 | + if (max_data > (0x7fffffff >> cd->att) && max_data != 0) |
| 22 | + gain = (0x7fffffffULL << 32) / max_data; |
| 23 | + |
| 24 | + cd->gains[gain_idx] = gain; |
| 25 | +} |
| 26 | + |
| 27 | +void aria_algo_get_data(struct comp_dev *dev, int32_t *__restrict data, size_t size) |
| 28 | +{ |
| 29 | + struct aria_data *cd = comp_get_drvdata(dev); |
| 30 | + size_t smpl_groups, ii; |
| 31 | + int64_t step, sample; |
| 32 | + // do linear approximation between points gain_begin and gain_end |
| 33 | + int64_t gain_begin = cd->gains[(cd->gain_state + 2) % ARIA_MAX_GAIN_STATES]; |
| 34 | + int64_t gain_end = cd->gains[(cd->gain_state + 3) % ARIA_MAX_GAIN_STATES]; |
| 35 | + |
| 36 | + for (size_t i = 1; i < ARIA_MAX_GAIN_STATES - 1; ++i) { |
| 37 | + if (cd->gains[(cd->gain_state + i + 2) % ARIA_MAX_GAIN_STATES] < gain_begin) |
| 38 | + gain_begin = cd->gains[(cd->gain_state + i + 2) % ARIA_MAX_GAIN_STATES]; |
| 39 | + if (cd->gains[(cd->gain_state + i + 3) % ARIA_MAX_GAIN_STATES] < gain_end) |
| 40 | + gain_end = cd->gains[(cd->gain_state + i + 3) % ARIA_MAX_GAIN_STATES]; |
| 41 | + } |
| 42 | + smpl_groups = size / cd->chan_cnt; |
| 43 | + step = (gain_end - gain_begin) / smpl_groups; |
| 44 | + |
| 45 | + for (size_t idx = 0, gain = gain_begin, offset = 0; |
| 46 | + idx < smpl_groups; |
| 47 | + ++idx, gain += step, offset += cd->chan_cnt) { |
| 48 | + ii = (cd->buff_pos + offset) % cd->buff_size; |
| 49 | + for (size_t ch = 0; ch < cd->chan_cnt; ++ch) { |
| 50 | + sample = cd->data[ii + ch]; |
| 51 | + data[offset + ch] = (sample * gain) >> 32; |
| 52 | + } |
| 53 | + } |
| 54 | + cd->gain_state = (cd->gain_state + 1) % ARIA_MAX_GAIN_STATES; |
| 55 | +} |
| 56 | +#endif |
0 commit comments