• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #define LOG_TAG "offload_effect_api"
18 //#define LOG_NDEBUG 0
19 
20 #include <stdbool.h>
21 #include <cutils/log.h>
22 #include <tinyalsa/asoundlib.h>
23 #include <sound/audio_effects.h>
24 
25 #include "effect_api.h"
26 
27 #define ARRAY_SIZE(array) (sizeof array / sizeof array[0])
28 
29 #define OFFLOAD_PRESET_START_OFFSET_FOR_OPENSL 19
30 const int map_eq_opensl_preset_2_offload_preset[] = {
31     OFFLOAD_PRESET_START_OFFSET_FOR_OPENSL,   /* Normal Preset */
32     OFFLOAD_PRESET_START_OFFSET_FOR_OPENSL+1, /* Classical Preset */
33     OFFLOAD_PRESET_START_OFFSET_FOR_OPENSL+2, /* Dance Preset */
34     OFFLOAD_PRESET_START_OFFSET_FOR_OPENSL+3, /* Flat Preset */
35     OFFLOAD_PRESET_START_OFFSET_FOR_OPENSL+4, /* Folk Preset */
36     OFFLOAD_PRESET_START_OFFSET_FOR_OPENSL+5, /* Heavy Metal Preset */
37     OFFLOAD_PRESET_START_OFFSET_FOR_OPENSL+6, /* Hip Hop Preset */
38     OFFLOAD_PRESET_START_OFFSET_FOR_OPENSL+7, /* Jazz Preset */
39     OFFLOAD_PRESET_START_OFFSET_FOR_OPENSL+8, /* Pop Preset */
40     OFFLOAD_PRESET_START_OFFSET_FOR_OPENSL+9, /* Rock Preset */
41     OFFLOAD_PRESET_START_OFFSET_FOR_OPENSL+10 /* FX Booster */
42 };
43 
44 const int map_reverb_opensl_preset_2_offload_preset
45                   [NUM_OSL_REVERB_PRESETS_SUPPORTED][2] = {
46     {1, 15},
47     {2, 16},
48     {3, 17},
49     {4, 18},
50     {5, 3},
51     {6, 20}
52 };
53 
offload_update_mixer_and_effects_ctl(int card,int device_id,struct mixer * mixer,struct mixer_ctl * ctl)54 int offload_update_mixer_and_effects_ctl(int card, int device_id,
55                                          struct mixer *mixer,
56                                          struct mixer_ctl *ctl)
57 {
58     char mixer_string[128];
59 
60     snprintf(mixer_string, sizeof(mixer_string),
61              "%s %d", "Audio Effects Config", device_id);
62     ALOGV("%s: mixer_string: %s", __func__, mixer_string);
63     mixer = mixer_open(card);
64     if (!mixer) {
65         ALOGE("Failed to open mixer");
66         ctl = NULL;
67         return -EINVAL;
68     } else {
69         ctl = mixer_get_ctl_by_name(mixer, mixer_string);
70         if (!ctl) {
71             ALOGE("mixer_get_ctl_by_name failed");
72             mixer_close(mixer);
73             mixer = NULL;
74             return -EINVAL;
75         }
76     }
77     ALOGV("mixer: %p, ctl: %p", mixer, ctl);
78     return 0;
79 }
80 
offload_close_mixer(struct mixer * mixer)81 void offload_close_mixer(struct mixer *mixer)
82 {
83     mixer_close(mixer);
84 }
85 
offload_bassboost_set_device(struct bass_boost_params * bassboost,uint32_t device)86 void offload_bassboost_set_device(struct bass_boost_params *bassboost,
87                                   uint32_t device)
88 {
89     ALOGV("%s", __func__);
90     bassboost->device = device;
91 }
92 
offload_bassboost_set_enable_flag(struct bass_boost_params * bassboost,bool enable)93 void offload_bassboost_set_enable_flag(struct bass_boost_params *bassboost,
94                                        bool enable)
95 {
96     ALOGV("%s", __func__);
97     bassboost->enable_flag = enable;
98 }
99 
offload_bassboost_get_enable_flag(struct bass_boost_params * bassboost)100 int offload_bassboost_get_enable_flag(struct bass_boost_params *bassboost)
101 {
102     ALOGV("%s", __func__);
103     return bassboost->enable_flag;
104 }
105 
offload_bassboost_set_strength(struct bass_boost_params * bassboost,int strength)106 void offload_bassboost_set_strength(struct bass_boost_params *bassboost,
107                                     int strength)
108 {
109     ALOGV("%s", __func__);
110     bassboost->strength = strength;
111 }
112 
offload_bassboost_set_mode(struct bass_boost_params * bassboost,int mode)113 void offload_bassboost_set_mode(struct bass_boost_params *bassboost,
114                                 int mode)
115 {
116     ALOGV("%s", __func__);
117     bassboost->mode = mode;
118 }
119 
offload_bassboost_send_params(struct mixer_ctl * ctl,struct bass_boost_params * bassboost,unsigned param_send_flags)120 int offload_bassboost_send_params(struct mixer_ctl *ctl,
121                                   struct bass_boost_params *bassboost,
122                                   unsigned param_send_flags)
123 {
124     int param_values[128] = {0};
125     int *p_param_values = param_values;
126 
127     ALOGV("%s", __func__);
128     *p_param_values++ = BASS_BOOST_MODULE;
129     *p_param_values++ = bassboost->device;
130     *p_param_values++ = 0; /* num of commands*/
131     if (param_send_flags & OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG) {
132         *p_param_values++ = BASS_BOOST_ENABLE;
133         *p_param_values++ = CONFIG_SET;
134         *p_param_values++ = 0; /* start offset if param size if greater than 128  */
135         *p_param_values++ = BASS_BOOST_ENABLE_PARAM_LEN;
136         *p_param_values++ = bassboost->enable_flag;
137         param_values[2] += 1;
138     }
139     if (param_send_flags & OFFLOAD_SEND_BASSBOOST_STRENGTH) {
140         *p_param_values++ = BASS_BOOST_STRENGTH;
141         *p_param_values++ = CONFIG_SET;
142         *p_param_values++ = 0; /* start offset if param size if greater than 128  */
143         *p_param_values++ = BASS_BOOST_STRENGTH_PARAM_LEN;
144         *p_param_values++ = bassboost->strength;
145         param_values[2] += 1;
146     }
147     if (param_send_flags & OFFLOAD_SEND_BASSBOOST_MODE) {
148         *p_param_values++ = BASS_BOOST_MODE;
149         *p_param_values++ = CONFIG_SET;
150         *p_param_values++ = 0; /* start offset if param size if greater than 128  */
151         *p_param_values++ = BASS_BOOST_MODE_PARAM_LEN;
152         *p_param_values++ = bassboost->mode;
153         param_values[2] += 1;
154     }
155 
156     if (param_values[2] && ctl)
157         mixer_ctl_set_array(ctl, param_values, ARRAY_SIZE(param_values));
158 
159     return 0;
160 }
161 
offload_virtualizer_set_device(struct virtualizer_params * virtualizer,uint32_t device)162 void offload_virtualizer_set_device(struct virtualizer_params *virtualizer,
163                                     uint32_t device)
164 {
165     ALOGV("%s", __func__);
166     virtualizer->device = device;
167 }
168 
offload_virtualizer_set_enable_flag(struct virtualizer_params * virtualizer,bool enable)169 void offload_virtualizer_set_enable_flag(struct virtualizer_params *virtualizer,
170                                          bool enable)
171 {
172     ALOGV("%s", __func__);
173     virtualizer->enable_flag = enable;
174 }
175 
offload_virtualizer_get_enable_flag(struct virtualizer_params * virtualizer)176 int offload_virtualizer_get_enable_flag(struct virtualizer_params *virtualizer)
177 {
178     ALOGV("%s", __func__);
179     return virtualizer->enable_flag;
180 }
181 
offload_virtualizer_set_strength(struct virtualizer_params * virtualizer,int strength)182 void offload_virtualizer_set_strength(struct virtualizer_params *virtualizer,
183                                       int strength)
184 {
185     ALOGV("%s", __func__);
186     virtualizer->strength = strength;
187 }
188 
offload_virtualizer_set_out_type(struct virtualizer_params * virtualizer,int out_type)189 void offload_virtualizer_set_out_type(struct virtualizer_params *virtualizer,
190                                       int out_type)
191 {
192     ALOGV("%s", __func__);
193     virtualizer->out_type = out_type;
194 }
195 
offload_virtualizer_set_gain_adjust(struct virtualizer_params * virtualizer,int gain_adjust)196 void offload_virtualizer_set_gain_adjust(struct virtualizer_params *virtualizer,
197                                          int gain_adjust)
198 {
199     ALOGV("%s", __func__);
200     virtualizer->gain_adjust = gain_adjust;
201 }
202 
offload_virtualizer_send_params(struct mixer_ctl * ctl,struct virtualizer_params * virtualizer,unsigned param_send_flags)203 int offload_virtualizer_send_params(struct mixer_ctl *ctl,
204                                     struct virtualizer_params *virtualizer,
205                                     unsigned param_send_flags)
206 {
207     int param_values[128] = {0};
208     int *p_param_values = param_values;
209 
210     ALOGV("%s", __func__);
211     *p_param_values++ = VIRTUALIZER_MODULE;
212     *p_param_values++ = virtualizer->device;
213     *p_param_values++ = 0; /* num of commands*/
214     if (param_send_flags & OFFLOAD_SEND_VIRTUALIZER_ENABLE_FLAG) {
215         *p_param_values++ = VIRTUALIZER_ENABLE;
216         *p_param_values++ = CONFIG_SET;
217         *p_param_values++ = 0; /* start offset if param size if greater than 128  */
218         *p_param_values++ = VIRTUALIZER_ENABLE_PARAM_LEN;
219         *p_param_values++ = virtualizer->enable_flag;
220         param_values[2] += 1;
221     }
222     if (param_send_flags & OFFLOAD_SEND_VIRTUALIZER_STRENGTH) {
223         *p_param_values++ = VIRTUALIZER_STRENGTH;
224         *p_param_values++ = CONFIG_SET;
225         *p_param_values++ = 0; /* start offset if param size if greater than 128  */
226         *p_param_values++ = VIRTUALIZER_STRENGTH_PARAM_LEN;
227         *p_param_values++ = virtualizer->strength;
228         param_values[2] += 1;
229     }
230     if (param_send_flags & OFFLOAD_SEND_VIRTUALIZER_OUT_TYPE) {
231         *p_param_values++ = VIRTUALIZER_OUT_TYPE;
232         *p_param_values++ = CONFIG_SET;
233         *p_param_values++ = 0; /* start offset if param size if greater than 128  */
234         *p_param_values++ = VIRTUALIZER_OUT_TYPE_PARAM_LEN;
235         *p_param_values++ = virtualizer->out_type;
236         param_values[2] += 1;
237     }
238     if (param_send_flags & OFFLOAD_SEND_VIRTUALIZER_GAIN_ADJUST) {
239         *p_param_values++ = VIRTUALIZER_GAIN_ADJUST;
240         *p_param_values++ = CONFIG_SET;
241         *p_param_values++ = 0; /* start offset if param size if greater than 128  */
242         *p_param_values++ = VIRTUALIZER_GAIN_ADJUST_PARAM_LEN;
243         *p_param_values++ = virtualizer->gain_adjust;
244         param_values[2] += 1;
245     }
246 
247     if (param_values[2] && ctl)
248         mixer_ctl_set_array(ctl, param_values, ARRAY_SIZE(param_values));
249 
250     return 0;
251 }
252 
offload_eq_set_device(struct eq_params * eq,uint32_t device)253 void offload_eq_set_device(struct eq_params *eq, uint32_t device)
254 {
255     ALOGV("%s", __func__);
256     eq->device = device;
257 }
258 
offload_eq_set_enable_flag(struct eq_params * eq,bool enable)259 void offload_eq_set_enable_flag(struct eq_params *eq, bool enable)
260 {
261     ALOGV("%s", __func__);
262     eq->enable_flag = enable;
263 }
264 
offload_eq_get_enable_flag(struct eq_params * eq)265 int offload_eq_get_enable_flag(struct eq_params *eq)
266 {
267     ALOGV("%s", __func__);
268     return eq->enable_flag;
269 }
270 
offload_eq_set_preset(struct eq_params * eq,int preset)271 void offload_eq_set_preset(struct eq_params *eq, int preset)
272 {
273     ALOGV("%s", __func__);
274     eq->config.preset_id = preset;
275     eq->config.eq_pregain = Q27_UNITY;
276 }
277 
offload_eq_set_bands_level(struct eq_params * eq,int num_bands,const uint16_t * band_freq_list,int * band_gain_list)278 void offload_eq_set_bands_level(struct eq_params *eq, int num_bands,
279                                 const uint16_t *band_freq_list,
280                                 int *band_gain_list)
281 {
282     int i;
283     ALOGV("%s", __func__);
284     eq->config.num_bands = num_bands;
285     for (i=0; i<num_bands; i++) {
286         eq->per_band_cfg[i].band_idx = i;
287         eq->per_band_cfg[i].filter_type = EQ_BAND_BOOST;
288         eq->per_band_cfg[i].freq_millihertz = band_freq_list[i] * 1000;
289         eq->per_band_cfg[i].gain_millibels = band_gain_list[i] * 100;
290         eq->per_band_cfg[i].quality_factor = Q8_UNITY;
291     }
292 }
293 
offload_eq_send_params(struct mixer_ctl * ctl,struct eq_params * eq,unsigned param_send_flags)294 int offload_eq_send_params(struct mixer_ctl *ctl, struct eq_params *eq,
295                            unsigned param_send_flags)
296 {
297     int param_values[128] = {0};
298     int *p_param_values = param_values;
299     uint32_t i;
300 
301     ALOGV("%s", __func__);
302     if (eq->config.preset_id < -1 ) {
303         ALOGV("No Valid preset to set");
304         return 0;
305     }
306     *p_param_values++ = EQ_MODULE;
307     *p_param_values++ = eq->device;
308     *p_param_values++ = 0; /* num of commands*/
309     if (param_send_flags & OFFLOAD_SEND_EQ_ENABLE_FLAG) {
310         *p_param_values++ = EQ_ENABLE;
311         *p_param_values++ = CONFIG_SET;
312         *p_param_values++ = 0; /* start offset if param size if greater than 128  */
313         *p_param_values++ = EQ_ENABLE_PARAM_LEN;
314         *p_param_values++ = eq->enable_flag;
315         param_values[2] += 1;
316     }
317     if (param_send_flags & OFFLOAD_SEND_EQ_PRESET) {
318         *p_param_values++ = EQ_CONFIG;
319         *p_param_values++ = CONFIG_SET;
320         *p_param_values++ = 0; /* start offset if param size if greater than 128  */
321         *p_param_values++ = EQ_CONFIG_PARAM_LEN;
322         *p_param_values++ = eq->config.eq_pregain;
323         *p_param_values++ =
324                      map_eq_opensl_preset_2_offload_preset[eq->config.preset_id];
325         *p_param_values++ = 0;
326         param_values[2] += 1;
327     }
328     if (param_send_flags & OFFLOAD_SEND_EQ_BANDS_LEVEL) {
329         *p_param_values++ = EQ_CONFIG;
330         *p_param_values++ = CONFIG_SET;
331         *p_param_values++ = 0; /* start offset if param size if greater than 128  */
332         *p_param_values++ = EQ_CONFIG_PARAM_LEN +
333                             eq->config.num_bands * EQ_CONFIG_PER_BAND_PARAM_LEN;
334         *p_param_values++ = eq->config.eq_pregain;
335         *p_param_values++ = CUSTOM_OPENSL_PRESET;
336         *p_param_values++ = eq->config.num_bands;
337         for (i=0; i<eq->config.num_bands; i++) {
338             *p_param_values++ = eq->per_band_cfg[i].band_idx;
339             *p_param_values++ = eq->per_band_cfg[i].filter_type;
340 	    *p_param_values++ = eq->per_band_cfg[i].freq_millihertz;
341             *p_param_values++ = eq->per_band_cfg[i].gain_millibels;
342             *p_param_values++ = eq->per_band_cfg[i].quality_factor;
343         }
344         param_values[2] += 1;
345     }
346 
347     if (param_values[2] && ctl)
348         mixer_ctl_set_array(ctl, param_values, ARRAY_SIZE(param_values));
349 
350     return 0;
351 }
352 
offload_reverb_set_device(struct reverb_params * reverb,uint32_t device)353 void offload_reverb_set_device(struct reverb_params *reverb, uint32_t device)
354 {
355     ALOGV("%s", __func__);
356     reverb->device = device;
357 }
358 
offload_reverb_set_enable_flag(struct reverb_params * reverb,bool enable)359 void offload_reverb_set_enable_flag(struct reverb_params *reverb, bool enable)
360 {
361     ALOGV("%s", __func__);
362     reverb->enable_flag = enable;
363 }
364 
offload_reverb_get_enable_flag(struct reverb_params * reverb)365 int offload_reverb_get_enable_flag(struct reverb_params *reverb)
366 {
367     ALOGV("%s", __func__);
368     return reverb->enable_flag;
369 }
370 
offload_reverb_set_mode(struct reverb_params * reverb,int mode)371 void offload_reverb_set_mode(struct reverb_params *reverb, int mode)
372 {
373     ALOGV("%s", __func__);
374     reverb->mode = mode;
375 }
376 
offload_reverb_set_preset(struct reverb_params * reverb,int preset)377 void offload_reverb_set_preset(struct reverb_params *reverb, int preset)
378 {
379     ALOGV("%s", __func__);
380     if (preset && (preset <= NUM_OSL_REVERB_PRESETS_SUPPORTED))
381         reverb->preset = map_reverb_opensl_preset_2_offload_preset[preset-1][1];
382 }
383 
offload_reverb_set_wet_mix(struct reverb_params * reverb,int wet_mix)384 void offload_reverb_set_wet_mix(struct reverb_params *reverb, int wet_mix)
385 {
386     ALOGV("%s", __func__);
387     reverb->wet_mix = wet_mix;
388 }
389 
offload_reverb_set_gain_adjust(struct reverb_params * reverb,int gain_adjust)390 void offload_reverb_set_gain_adjust(struct reverb_params *reverb,
391                                     int gain_adjust)
392 {
393     ALOGV("%s", __func__);
394     reverb->gain_adjust = gain_adjust;
395 }
396 
offload_reverb_set_room_level(struct reverb_params * reverb,int room_level)397 void offload_reverb_set_room_level(struct reverb_params *reverb, int room_level)
398 {
399     ALOGV("%s", __func__);
400     reverb->room_level = room_level;
401 }
402 
offload_reverb_set_room_hf_level(struct reverb_params * reverb,int room_hf_level)403 void offload_reverb_set_room_hf_level(struct reverb_params *reverb,
404                                       int room_hf_level)
405 {
406     ALOGV("%s", __func__);
407     reverb->room_hf_level = room_hf_level;
408 }
409 
offload_reverb_set_decay_time(struct reverb_params * reverb,int decay_time)410 void offload_reverb_set_decay_time(struct reverb_params *reverb, int decay_time)
411 {
412     ALOGV("%s", __func__);
413     reverb->decay_time = decay_time;
414 }
415 
offload_reverb_set_decay_hf_ratio(struct reverb_params * reverb,int decay_hf_ratio)416 void offload_reverb_set_decay_hf_ratio(struct reverb_params *reverb,
417                                        int decay_hf_ratio)
418 {
419     ALOGV("%s", __func__);
420     reverb->decay_hf_ratio = decay_hf_ratio;
421 }
422 
offload_reverb_set_reflections_level(struct reverb_params * reverb,int reflections_level)423 void offload_reverb_set_reflections_level(struct reverb_params *reverb,
424                                           int reflections_level)
425 {
426     ALOGV("%s", __func__);
427     reverb->reflections_level = reflections_level;
428 }
429 
offload_reverb_set_reflections_delay(struct reverb_params * reverb,int reflections_delay)430 void offload_reverb_set_reflections_delay(struct reverb_params *reverb,
431                                           int reflections_delay)
432 {
433     ALOGV("%s", __func__);
434     reverb->reflections_delay = reflections_delay;
435 }
436 
offload_reverb_set_reverb_level(struct reverb_params * reverb,int reverb_level)437 void offload_reverb_set_reverb_level(struct reverb_params *reverb,
438                                      int reverb_level)
439 {
440     ALOGV("%s", __func__);
441     reverb->level = reverb_level;
442 }
443 
offload_reverb_set_delay(struct reverb_params * reverb,int delay)444 void offload_reverb_set_delay(struct reverb_params *reverb, int delay)
445 {
446     ALOGV("%s", __func__);
447     reverb->delay = delay;
448 }
449 
offload_reverb_set_diffusion(struct reverb_params * reverb,int diffusion)450 void offload_reverb_set_diffusion(struct reverb_params *reverb, int diffusion)
451 {
452     ALOGV("%s", __func__);
453     reverb->diffusion = diffusion;
454 }
455 
offload_reverb_set_density(struct reverb_params * reverb,int density)456 void offload_reverb_set_density(struct reverb_params *reverb, int density)
457 {
458     ALOGV("%s", __func__);
459     reverb->density = density;
460 }
461 
offload_reverb_send_params(struct mixer_ctl * ctl,struct reverb_params * reverb,unsigned param_send_flags)462 int offload_reverb_send_params(struct mixer_ctl *ctl,
463                                struct reverb_params *reverb,
464                                unsigned param_send_flags)
465 {
466     int param_values[128] = {0};
467     int *p_param_values = param_values;
468 
469     ALOGV("%s", __func__);
470     *p_param_values++ = REVERB_MODULE;
471     *p_param_values++ = reverb->device;
472     *p_param_values++ = 0; /* num of commands*/
473 
474     if (param_send_flags & OFFLOAD_SEND_REVERB_ENABLE_FLAG) {
475         *p_param_values++ = REVERB_ENABLE;
476         *p_param_values++ = CONFIG_SET;
477         *p_param_values++ = 0; /* start offset if param size if greater than 128  */
478         *p_param_values++ = REVERB_ENABLE_PARAM_LEN;
479         *p_param_values++ = reverb->enable_flag;
480         param_values[2] += 1;
481     }
482     if (param_send_flags & OFFLOAD_SEND_REVERB_MODE) {
483         *p_param_values++ = REVERB_MODE;
484         *p_param_values++ = CONFIG_SET;
485         *p_param_values++ = 0; /* start offset if param size if greater than 128  */
486         *p_param_values++ = REVERB_MODE_PARAM_LEN;
487         *p_param_values++ = reverb->mode;
488         param_values[2] += 1;
489     }
490     if (param_send_flags & OFFLOAD_SEND_REVERB_PRESET) {
491         *p_param_values++ = REVERB_PRESET;
492         *p_param_values++ = CONFIG_SET;
493         *p_param_values++ = 0; /* start offset if param size if greater than 128  */
494         *p_param_values++ = REVERB_PRESET_PARAM_LEN;
495         *p_param_values++ = reverb->preset;
496         param_values[2] += 1;
497     }
498     if (param_send_flags & OFFLOAD_SEND_REVERB_WET_MIX) {
499         *p_param_values++ = REVERB_WET_MIX;
500         *p_param_values++ = CONFIG_SET;
501         *p_param_values++ = 0; /* start offset if param size if greater than 128  */
502         *p_param_values++ = REVERB_WET_MIX_PARAM_LEN;
503         *p_param_values++ = reverb->wet_mix;
504         param_values[2] += 1;
505     }
506     if (param_send_flags & OFFLOAD_SEND_REVERB_GAIN_ADJUST) {
507         *p_param_values++ = REVERB_GAIN_ADJUST;
508         *p_param_values++ = CONFIG_SET;
509         *p_param_values++ = 0; /* start offset if param size if greater than 128  */
510         *p_param_values++ = REVERB_GAIN_ADJUST_PARAM_LEN;
511         *p_param_values++ = reverb->gain_adjust;
512         param_values[2] += 1;
513     }
514     if (param_send_flags & OFFLOAD_SEND_REVERB_ROOM_LEVEL) {
515         *p_param_values++ = REVERB_ROOM_LEVEL;
516         *p_param_values++ = CONFIG_SET;
517         *p_param_values++ = 0; /* start offset if param size if greater than 128  */
518         *p_param_values++ = REVERB_ROOM_LEVEL_PARAM_LEN;
519         *p_param_values++ = reverb->room_level;
520         param_values[2] += 1;
521     }
522     if (param_send_flags & OFFLOAD_SEND_REVERB_ROOM_HF_LEVEL) {
523         *p_param_values++ = REVERB_ROOM_HF_LEVEL;
524         *p_param_values++ = CONFIG_SET;
525         *p_param_values++ = 0; /* start offset if param size if greater than 128  */
526         *p_param_values++ = REVERB_ROOM_HF_LEVEL_PARAM_LEN;
527         *p_param_values++ = reverb->room_hf_level;
528         param_values[2] += 1;
529     }
530     if (param_send_flags & OFFLOAD_SEND_REVERB_DECAY_TIME) {
531         *p_param_values++ = REVERB_DECAY_TIME;
532         *p_param_values++ = CONFIG_SET;
533         *p_param_values++ = 0; /* start offset if param size if greater than 128  */
534         *p_param_values++ = REVERB_DECAY_TIME_PARAM_LEN;
535         *p_param_values++ = reverb->decay_time;
536         param_values[2] += 1;
537     }
538     if (param_send_flags & OFFLOAD_SEND_REVERB_DECAY_HF_RATIO) {
539         *p_param_values++ = REVERB_DECAY_HF_RATIO;
540         *p_param_values++ = CONFIG_SET;
541         *p_param_values++ = 0; /* start offset if param size if greater than 128  */
542         *p_param_values++ = REVERB_DECAY_HF_RATIO_PARAM_LEN;
543         *p_param_values++ = reverb->decay_hf_ratio;
544         param_values[2] += 1;
545     }
546     if (param_send_flags & OFFLOAD_SEND_REVERB_REFLECTIONS_LEVEL) {
547         *p_param_values++ = REVERB_REFLECTIONS_LEVEL;
548         *p_param_values++ = CONFIG_SET;
549         *p_param_values++ = 0; /* start offset if param size if greater than 128  */
550         *p_param_values++ = REVERB_REFLECTIONS_LEVEL_PARAM_LEN;
551         *p_param_values++ = reverb->reflections_level;
552         param_values[2] += 1;
553     }
554     if (param_send_flags & OFFLOAD_SEND_REVERB_REFLECTIONS_DELAY) {
555         *p_param_values++ = REVERB_REFLECTIONS_DELAY;
556         *p_param_values++ = CONFIG_SET;
557         *p_param_values++ = 0; /* start offset if param size if greater than 128  */
558         *p_param_values++ = REVERB_REFLECTIONS_DELAY_PARAM_LEN;
559         *p_param_values++ = reverb->reflections_delay;
560         param_values[2] += 1;
561     }
562     if (param_send_flags & OFFLOAD_SEND_REVERB_LEVEL) {
563         *p_param_values++ = REVERB_LEVEL;
564         *p_param_values++ = CONFIG_SET;
565         *p_param_values++ = 0; /* start offset if param size if greater than 128  */
566         *p_param_values++ = REVERB_LEVEL_PARAM_LEN;
567         *p_param_values++ = reverb->level;
568         param_values[2] += 1;
569     }
570     if (param_send_flags & OFFLOAD_SEND_REVERB_DELAY) {
571         *p_param_values++ = REVERB_DELAY;
572         *p_param_values++ = CONFIG_SET;
573         *p_param_values++ = 0; /* start offset if param size if greater than 128  */
574         *p_param_values++ = REVERB_DELAY_PARAM_LEN;
575         *p_param_values++ = reverb->delay;
576         param_values[2] += 1;
577     }
578     if (param_send_flags & OFFLOAD_SEND_REVERB_DIFFUSION) {
579         *p_param_values++ = REVERB_DIFFUSION;
580         *p_param_values++ = CONFIG_SET;
581         *p_param_values++ = 0; /* start offset if param size if greater than 128  */
582         *p_param_values++ = REVERB_DIFFUSION_PARAM_LEN;
583         *p_param_values++ = reverb->diffusion;
584         param_values[2] += 1;
585     }
586     if (param_send_flags & OFFLOAD_SEND_REVERB_DENSITY) {
587         *p_param_values++ = REVERB_DENSITY;
588         *p_param_values++ = CONFIG_SET;
589         *p_param_values++ = 0; /* start offset if param size if greater than 128  */
590         *p_param_values++ = REVERB_DENSITY_PARAM_LEN;
591         *p_param_values++ = reverb->density;
592         param_values[2] += 1;
593     }
594 
595     if (param_values[2] && ctl)
596         mixer_ctl_set_array(ctl, param_values, ARRAY_SIZE(param_values));
597 
598     return 0;
599 }
600