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