1 /* 2 * Copyright (C) 2013 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 "audio_hw_primary" 18 /*#define LOG_NDEBUG 0*/ 19 /*#define VERY_VERY_VERBOSE_LOGGING*/ 20 #ifdef VERY_VERY_VERBOSE_LOGGING 21 #define ALOGVV ALOGV 22 #else 23 #define ALOGVV(a...) do { } while(0) 24 #endif 25 26 #define _GNU_SOURCE 27 #include <errno.h> 28 #include <pthread.h> 29 #include <stdint.h> 30 #include <sys/time.h> 31 #include <stdlib.h> 32 #include <math.h> 33 #include <dlfcn.h> 34 #include <sys/resource.h> 35 #include <sys/prctl.h> 36 37 #include <cutils/log.h> 38 #include <cutils/str_parms.h> 39 #include <cutils/atomic.h> 40 #include <cutils/sched_policy.h> 41 #include <cutils/properties.h> 42 43 #include <hardware/audio_effect.h> 44 #include <system/thread_defs.h> 45 #include <audio_effects/effect_aec.h> 46 #include <audio_effects/effect_ns.h> 47 #include "audio_hw.h" 48 49 #include "sound/compress_params.h" 50 51 #define MIXER_CTL_COMPRESS_PLAYBACK_VOLUME "Compress Playback Volume" 52 #define MIXER_CTL_HEADPHONE_JACK_SWITCH "Headphone Jack Switch" 53 #define MIXER_CTL_CODEC_VMIXER_CODEC_SWITCH "Codec VMixer Codec Switch" 54 #define MIXER_CTL_SPK_VMIXER_SPK_SWITCH "SPK VMixer SPK Switch" 55 56 /* TODO: the following PCM device profiles could be read from a config file */ 57 static struct pcm_device_profile pcm_device_playback = { 58 .config = { 59 .channels = PLAYBACK_DEFAULT_CHANNEL_COUNT, 60 .rate = PLAYBACK_DEFAULT_SAMPLING_RATE, 61 .period_size = PLAYBACK_PERIOD_SIZE, 62 .period_count = PLAYBACK_PERIOD_COUNT, 63 .format = PCM_FORMAT_S16_LE, 64 .start_threshold = PLAYBACK_START_THRESHOLD(PLAYBACK_PERIOD_SIZE, PLAYBACK_PERIOD_COUNT), 65 .stop_threshold = PLAYBACK_STOP_THRESHOLD(PLAYBACK_PERIOD_SIZE, PLAYBACK_PERIOD_COUNT), 66 .silence_threshold = 0, 67 .silence_size = UINT_MAX, 68 .avail_min = PLAYBACK_AVAILABLE_MIN, 69 }, 70 .card = SOUND_CARD, 71 .id = 9, 72 .type = PCM_PLAYBACK, 73 .devices = AUDIO_DEVICE_OUT_WIRED_HEADSET|AUDIO_DEVICE_OUT_WIRED_HEADPHONE| 74 AUDIO_DEVICE_OUT_SPEAKER, 75 }; 76 77 static struct pcm_device_profile pcm_device_capture = { 78 .config = { 79 .channels = CAPTURE_DEFAULT_CHANNEL_COUNT, 80 .rate = CAPTURE_DEFAULT_SAMPLING_RATE, 81 .period_size = CAPTURE_PERIOD_SIZE, 82 .period_count = CAPTURE_PERIOD_COUNT, 83 .format = PCM_FORMAT_S16_LE, 84 .start_threshold = CAPTURE_START_THRESHOLD, 85 .stop_threshold = 0, 86 .silence_threshold = 0, 87 .avail_min = 0, 88 }, 89 .card = SOUND_CARD, 90 .id = 0, 91 .type = PCM_CAPTURE, 92 .devices = AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_WIRED_HEADSET|AUDIO_DEVICE_IN_BACK_MIC, 93 }; 94 95 static struct pcm_device_profile pcm_device_capture_low_latency = { 96 .config = { 97 .channels = CAPTURE_DEFAULT_CHANNEL_COUNT, 98 .rate = CAPTURE_DEFAULT_SAMPLING_RATE, 99 .period_size = CAPTURE_PERIOD_SIZE_LOW_LATENCY, 100 .period_count = CAPTURE_PERIOD_COUNT_LOW_LATENCY, 101 .format = PCM_FORMAT_S16_LE, 102 .start_threshold = CAPTURE_START_THRESHOLD, 103 .stop_threshold = 0, 104 .silence_threshold = 0, 105 .avail_min = 0, 106 }, 107 .card = SOUND_CARD, 108 .id = 0, 109 .type = PCM_CAPTURE_LOW_LATENCY, 110 .devices = AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_WIRED_HEADSET|AUDIO_DEVICE_IN_BACK_MIC, 111 }; 112 113 static struct pcm_device_profile pcm_device_capture_loopback_aec = { 114 .config = { 115 .channels = CAPTURE_DEFAULT_CHANNEL_COUNT, 116 .rate = CAPTURE_DEFAULT_SAMPLING_RATE, 117 .period_size = CAPTURE_PERIOD_SIZE, 118 .period_count = CAPTURE_PERIOD_COUNT, 119 .format = PCM_FORMAT_S16_LE, 120 .start_threshold = CAPTURE_START_THRESHOLD, 121 .stop_threshold = 0, 122 .silence_threshold = 0, 123 .avail_min = 0, 124 }, 125 .card = SOUND_CARD, 126 .id = 1, 127 .type = PCM_CAPTURE, 128 .devices = SND_DEVICE_IN_LOOPBACK_AEC, 129 }; 130 131 static struct pcm_device_profile pcm_device_playback_sco = { 132 .config = { 133 .channels = SCO_DEFAULT_CHANNEL_COUNT, 134 .rate = SCO_DEFAULT_SAMPLING_RATE, 135 .period_size = SCO_PERIOD_SIZE, 136 .period_count = SCO_PERIOD_COUNT, 137 .format = PCM_FORMAT_S16_LE, 138 .start_threshold = SCO_START_THRESHOLD, 139 .stop_threshold = SCO_STOP_THRESHOLD, 140 .silence_threshold = 0, 141 .avail_min = SCO_AVAILABLE_MIN, 142 }, 143 .card = SOUND_CARD, 144 .id = 2, 145 .type = PCM_PLAYBACK, 146 .devices = 147 AUDIO_DEVICE_OUT_BLUETOOTH_SCO|AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET| 148 AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT, 149 }; 150 151 static struct pcm_device_profile pcm_device_capture_sco = { 152 .config = { 153 .channels = SCO_DEFAULT_CHANNEL_COUNT, 154 .rate = SCO_DEFAULT_SAMPLING_RATE, 155 .period_size = SCO_PERIOD_SIZE, 156 .period_count = SCO_PERIOD_COUNT, 157 .format = PCM_FORMAT_S16_LE, 158 .start_threshold = CAPTURE_START_THRESHOLD, 159 .stop_threshold = 0, 160 .silence_threshold = 0, 161 .avail_min = 0, 162 }, 163 .card = SOUND_CARD, 164 .id = 2, 165 .type = PCM_CAPTURE, 166 .devices = AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET, 167 }; 168 169 static struct pcm_device_profile pcm_device_hotword_streaming = { 170 .config = { 171 .channels = 1, 172 .rate = 16000, 173 .period_size = CAPTURE_PERIOD_SIZE, 174 .period_count = CAPTURE_PERIOD_COUNT, 175 .format = PCM_FORMAT_S16_LE, 176 .start_threshold = CAPTURE_START_THRESHOLD, 177 .stop_threshold = 0, 178 .silence_threshold = 0, 179 .avail_min = 0, 180 }, 181 .card = SOUND_CARD, 182 .id = 0, 183 .type = PCM_HOTWORD_STREAMING, 184 .devices = AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_WIRED_HEADSET|AUDIO_DEVICE_IN_BACK_MIC 185 }; 186 187 static struct pcm_device_profile * const pcm_devices[] = { 188 &pcm_device_playback, 189 &pcm_device_capture, 190 &pcm_device_capture_low_latency, 191 &pcm_device_playback_sco, 192 &pcm_device_capture_sco, 193 &pcm_device_capture_loopback_aec, 194 &pcm_device_hotword_streaming, 195 NULL, 196 }; 197 198 static const char * const use_case_table[AUDIO_USECASE_MAX] = { 199 [USECASE_AUDIO_PLAYBACK] = "playback", 200 [USECASE_AUDIO_PLAYBACK_MULTI_CH] = "playback multi-channel", 201 [USECASE_AUDIO_PLAYBACK_OFFLOAD] = "compress-offload-playback", 202 [USECASE_AUDIO_CAPTURE] = "capture", 203 [USECASE_AUDIO_CAPTURE_HOTWORD] = "capture-hotword", 204 [USECASE_VOICE_CALL] = "voice-call", 205 }; 206 207 208 #define STRING_TO_ENUM(string) { #string, string } 209 210 static unsigned int audio_device_ref_count; 211 212 static struct pcm_config pcm_config_deep_buffer = { 213 .channels = 2, 214 .rate = DEEP_BUFFER_OUTPUT_SAMPLING_RATE, 215 .period_size = DEEP_BUFFER_OUTPUT_PERIOD_SIZE, 216 .period_count = DEEP_BUFFER_OUTPUT_PERIOD_COUNT, 217 .format = PCM_FORMAT_S16_LE, 218 .start_threshold = DEEP_BUFFER_OUTPUT_PERIOD_SIZE / 4, 219 .stop_threshold = INT_MAX, 220 .avail_min = DEEP_BUFFER_OUTPUT_PERIOD_SIZE / 4, 221 }; 222 223 struct string_to_enum { 224 const char *name; 225 uint32_t value; 226 }; 227 228 static const struct string_to_enum out_channels_name_to_enum_table[] = { 229 STRING_TO_ENUM(AUDIO_CHANNEL_OUT_STEREO), 230 STRING_TO_ENUM(AUDIO_CHANNEL_OUT_5POINT1), 231 STRING_TO_ENUM(AUDIO_CHANNEL_OUT_7POINT1), 232 }; 233 234 static void dummybuf_thread_close(struct audio_device *adev); 235 236 static bool is_supported_format(audio_format_t format) 237 { 238 if (format == AUDIO_FORMAT_MP3 || 239 ((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_AAC)) 240 return true; 241 242 return false; 243 } 244 245 static int get_snd_codec_id(audio_format_t format) 246 { 247 int id = 0; 248 249 switch (format & AUDIO_FORMAT_MAIN_MASK) { 250 case AUDIO_FORMAT_MP3: 251 id = SND_AUDIOCODEC_MP3; 252 break; 253 case AUDIO_FORMAT_AAC: 254 id = SND_AUDIOCODEC_AAC; 255 break; 256 default: 257 ALOGE("%s: Unsupported audio format", __func__); 258 } 259 260 return id; 261 } 262 263 /* Array to store sound devices */ 264 static const char * const device_table[SND_DEVICE_MAX] = { 265 [SND_DEVICE_NONE] = "none", 266 /* Playback sound devices */ 267 [SND_DEVICE_OUT_HANDSET] = "handset", 268 [SND_DEVICE_OUT_SPEAKER] = "speaker", 269 [SND_DEVICE_OUT_HEADPHONES] = "headphones", 270 [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = "speaker-and-headphones", 271 [SND_DEVICE_OUT_VOICE_HANDSET] = "voice-handset", 272 [SND_DEVICE_OUT_VOICE_SPEAKER] = "voice-speaker", 273 [SND_DEVICE_OUT_VOICE_HEADPHONES] = "voice-headphones", 274 [SND_DEVICE_OUT_HDMI] = "hdmi", 275 [SND_DEVICE_OUT_SPEAKER_AND_HDMI] = "speaker-and-hdmi", 276 [SND_DEVICE_OUT_BT_SCO] = "bt-sco-headset", 277 [SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = "voice-tty-full-headphones", 278 [SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = "voice-tty-vco-headphones", 279 [SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = "voice-tty-hco-handset", 280 281 /* Capture sound devices */ 282 [SND_DEVICE_IN_HANDSET_MIC] = "handset-mic", 283 [SND_DEVICE_IN_SPEAKER_MIC] = "speaker-mic", 284 [SND_DEVICE_IN_HEADSET_MIC] = "headset-mic", 285 [SND_DEVICE_IN_HANDSET_MIC_AEC] = "handset-mic", 286 [SND_DEVICE_IN_SPEAKER_MIC_AEC] = "voice-speaker-mic", 287 [SND_DEVICE_IN_HEADSET_MIC_AEC] = "headset-mic", 288 [SND_DEVICE_IN_VOICE_SPEAKER_MIC] = "voice-speaker-mic", 289 [SND_DEVICE_IN_VOICE_HEADSET_MIC] = "voice-headset-mic", 290 [SND_DEVICE_IN_HDMI_MIC] = "hdmi-mic", 291 [SND_DEVICE_IN_BT_SCO_MIC] = "bt-sco-mic", 292 [SND_DEVICE_IN_CAMCORDER_MIC] = "camcorder-mic", 293 [SND_DEVICE_IN_VOICE_DMIC_1] = "voice-dmic-1", 294 [SND_DEVICE_IN_VOICE_SPEAKER_DMIC_1] = "voice-speaker-dmic-1", 295 [SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = "voice-tty-full-headset-mic", 296 [SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = "voice-tty-vco-handset-mic", 297 [SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = "voice-tty-hco-headset-mic", 298 [SND_DEVICE_IN_VOICE_REC_HEADSET_MIC] = "voice-rec-headset-mic", 299 [SND_DEVICE_IN_VOICE_REC_MIC] = "voice-rec-mic", 300 [SND_DEVICE_IN_VOICE_REC_DMIC_1] = "voice-rec-dmic-1", 301 [SND_DEVICE_IN_VOICE_REC_DMIC_NS_1] = "voice-rec-dmic-ns-1", 302 [SND_DEVICE_IN_LOOPBACK_AEC] = "loopback-aec", 303 }; 304 305 static struct mixer_card *adev_get_mixer_for_card(struct audio_device *adev, int card) 306 { 307 struct mixer_card *mixer_card; 308 struct listnode *node; 309 310 list_for_each(node, &adev->mixer_list) { 311 mixer_card = node_to_item(node, struct mixer_card, adev_list_node); 312 if (mixer_card->card == card) 313 return mixer_card; 314 } 315 return NULL; 316 } 317 318 static struct mixer_card *uc_get_mixer_for_card(struct audio_usecase *usecase, int card) 319 { 320 struct mixer_card *mixer_card; 321 struct listnode *node; 322 323 list_for_each(node, &usecase->mixer_list) { 324 mixer_card = node_to_item(node, struct mixer_card, uc_list_node[usecase->id]); 325 if (mixer_card->card == card) 326 return mixer_card; 327 } 328 return NULL; 329 } 330 331 static void free_mixer_list(struct audio_device *adev) 332 { 333 struct mixer_card *mixer_card; 334 struct listnode *node; 335 struct listnode *next; 336 337 list_for_each_safe(node, next, &adev->mixer_list) { 338 mixer_card = node_to_item(node, struct mixer_card, adev_list_node); 339 list_remove(node); 340 audio_route_free(mixer_card->audio_route); 341 free(mixer_card); 342 } 343 } 344 345 static int mixer_init(struct audio_device *adev) 346 { 347 int i; 348 int card; 349 int retry_num; 350 struct mixer *mixer; 351 struct audio_route *audio_route; 352 char mixer_path[PATH_MAX]; 353 struct mixer_card *mixer_card; 354 struct listnode *node; 355 356 list_init(&adev->mixer_list); 357 358 for (i = 0; pcm_devices[i] != NULL; i++) { 359 card = pcm_devices[i]->card; 360 if (adev_get_mixer_for_card(adev, card) == NULL) { 361 retry_num = 0; 362 do { 363 mixer = mixer_open(card); 364 if (mixer == NULL) { 365 if (++retry_num > RETRY_NUMBER) { 366 ALOGE("%s unable to open the mixer for--card %d, aborting.", 367 __func__, card); 368 goto error; 369 } 370 usleep(RETRY_US); 371 } 372 } while (mixer == NULL); 373 374 sprintf(mixer_path, "/system/etc/mixer_paths_%d.xml", card); 375 audio_route = audio_route_init(card, mixer_path); 376 if (!audio_route) { 377 ALOGE("%s: Failed to init audio route controls for card %d, aborting.", 378 __func__, card); 379 goto error; 380 } 381 mixer_card = calloc(1, sizeof(struct mixer_card)); 382 mixer_card->card = card; 383 mixer_card->mixer = mixer; 384 mixer_card->audio_route = audio_route; 385 list_add_tail(&adev->mixer_list, &mixer_card->adev_list_node); 386 } 387 } 388 389 return 0; 390 391 error: 392 free_mixer_list(adev); 393 return -ENODEV; 394 } 395 396 static const char *get_snd_device_name(snd_device_t snd_device) 397 { 398 const char *name = NULL; 399 400 if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) 401 name = device_table[snd_device]; 402 403 ALOGE_IF(name == NULL, "%s: invalid snd device %d", __func__, snd_device); 404 405 return name; 406 } 407 408 static const char *get_snd_device_display_name(snd_device_t snd_device) 409 { 410 const char *name = get_snd_device_name(snd_device); 411 412 if (name == NULL) 413 name = "SND DEVICE NOT FOUND"; 414 415 return name; 416 } 417 418 static struct pcm_device_profile *get_pcm_device(usecase_type_t uc_type, audio_devices_t devices) 419 { 420 int i; 421 422 devices &= ~AUDIO_DEVICE_BIT_IN; 423 for (i = 0; pcm_devices[i] != NULL; i++) { 424 if ((pcm_devices[i]->type == uc_type) && 425 (devices & pcm_devices[i]->devices)) 426 break; 427 } 428 return pcm_devices[i]; 429 } 430 431 static struct audio_usecase *get_usecase_from_id(struct audio_device *adev, 432 audio_usecase_t uc_id) 433 { 434 struct audio_usecase *usecase; 435 struct listnode *node; 436 437 list_for_each(node, &adev->usecase_list) { 438 usecase = node_to_item(node, struct audio_usecase, adev_list_node); 439 if (usecase->id == uc_id) 440 return usecase; 441 } 442 return NULL; 443 } 444 445 static struct audio_usecase *get_usecase_from_type(struct audio_device *adev, 446 usecase_type_t type) 447 { 448 struct audio_usecase *usecase; 449 struct listnode *node; 450 451 list_for_each(node, &adev->usecase_list) { 452 usecase = node_to_item(node, struct audio_usecase, adev_list_node); 453 if (usecase->type & type) 454 return usecase; 455 } 456 return NULL; 457 } 458 459 /* always called with adev lock held */ 460 static int set_voice_volume_l(struct audio_device *adev, float volume) 461 { 462 int err = 0; 463 (void)volume; 464 465 if (adev->mode == AUDIO_MODE_IN_CALL) { 466 /* TODO */ 467 } 468 return err; 469 } 470 471 472 static snd_device_t get_output_snd_device(struct audio_device *adev, audio_devices_t devices) 473 { 474 475 audio_mode_t mode = adev->mode; 476 snd_device_t snd_device = SND_DEVICE_NONE; 477 478 ALOGV("%s: enter: output devices(%#x), mode(%d)", __func__, devices, mode); 479 if (devices == AUDIO_DEVICE_NONE || 480 devices & AUDIO_DEVICE_BIT_IN) { 481 ALOGV("%s: Invalid output devices (%#x)", __func__, devices); 482 goto exit; 483 } 484 485 if (mode == AUDIO_MODE_IN_CALL) { 486 if (devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE || 487 devices & AUDIO_DEVICE_OUT_WIRED_HEADSET) { 488 if (adev->tty_mode == TTY_MODE_FULL) 489 snd_device = SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES; 490 else if (adev->tty_mode == TTY_MODE_VCO) 491 snd_device = SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES; 492 else if (adev->tty_mode == TTY_MODE_HCO) 493 snd_device = SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET; 494 else 495 snd_device = SND_DEVICE_OUT_VOICE_HEADPHONES; 496 } else if (devices & AUDIO_DEVICE_OUT_ALL_SCO) { 497 snd_device = SND_DEVICE_OUT_BT_SCO; 498 } else if (devices & AUDIO_DEVICE_OUT_SPEAKER) { 499 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER; 500 } else if (devices & AUDIO_DEVICE_OUT_EARPIECE) { 501 snd_device = SND_DEVICE_OUT_HANDSET; 502 } 503 if (snd_device != SND_DEVICE_NONE) { 504 goto exit; 505 } 506 } 507 508 if (popcount(devices) == 2) { 509 if (devices == (AUDIO_DEVICE_OUT_WIRED_HEADPHONE | 510 AUDIO_DEVICE_OUT_SPEAKER)) { 511 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES; 512 } else if (devices == (AUDIO_DEVICE_OUT_WIRED_HEADSET | 513 AUDIO_DEVICE_OUT_SPEAKER)) { 514 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES; 515 } else { 516 ALOGE("%s: Invalid combo device(%#x)", __func__, devices); 517 goto exit; 518 } 519 if (snd_device != SND_DEVICE_NONE) { 520 goto exit; 521 } 522 } 523 524 if (popcount(devices) != 1) { 525 ALOGE("%s: Invalid output devices(%#x)", __func__, devices); 526 goto exit; 527 } 528 529 if (devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE || 530 devices & AUDIO_DEVICE_OUT_WIRED_HEADSET) { 531 snd_device = SND_DEVICE_OUT_HEADPHONES; 532 } else if (devices & AUDIO_DEVICE_OUT_SPEAKER) { 533 snd_device = SND_DEVICE_OUT_SPEAKER; 534 } else if (devices & AUDIO_DEVICE_OUT_ALL_SCO) { 535 snd_device = SND_DEVICE_OUT_BT_SCO; 536 } else if (devices & AUDIO_DEVICE_OUT_EARPIECE) { 537 snd_device = SND_DEVICE_OUT_HANDSET; 538 } else { 539 ALOGE("%s: Unknown device(s) %#x", __func__, devices); 540 } 541 exit: 542 ALOGV("%s: exit: snd_device(%s)", __func__, device_table[snd_device]); 543 return snd_device; 544 } 545 546 static snd_device_t get_input_snd_device(struct audio_device *adev, audio_devices_t out_device) 547 { 548 audio_source_t source; 549 audio_mode_t mode = adev->mode; 550 audio_devices_t in_device; 551 audio_channel_mask_t channel_mask; 552 snd_device_t snd_device = SND_DEVICE_NONE; 553 struct stream_in *active_input = NULL; 554 struct audio_usecase *usecase; 555 556 usecase = get_usecase_from_type(adev, PCM_CAPTURE|VOICE_CALL); 557 if (usecase != NULL) { 558 active_input = (struct stream_in *)usecase->stream; 559 } 560 source = (active_input == NULL) ? 561 AUDIO_SOURCE_DEFAULT : active_input->source; 562 563 in_device = ((active_input == NULL) ? 564 AUDIO_DEVICE_NONE : active_input->devices) 565 & ~AUDIO_DEVICE_BIT_IN; 566 channel_mask = (active_input == NULL) ? 567 AUDIO_CHANNEL_IN_MONO : active_input->main_channels; 568 569 ALOGV("%s: enter: out_device(%#x) in_device(%#x)", 570 __func__, out_device, in_device); 571 if (mode == AUDIO_MODE_IN_CALL) { 572 if (out_device == AUDIO_DEVICE_NONE) { 573 ALOGE("%s: No output device set for voice call", __func__); 574 goto exit; 575 } 576 if (adev->tty_mode != TTY_MODE_OFF) { 577 if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE || 578 out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) { 579 switch (adev->tty_mode) { 580 case TTY_MODE_FULL: 581 snd_device = SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC; 582 break; 583 case TTY_MODE_VCO: 584 snd_device = SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC; 585 break; 586 case TTY_MODE_HCO: 587 snd_device = SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC; 588 break; 589 default: 590 ALOGE("%s: Invalid TTY mode (%#x)", __func__, adev->tty_mode); 591 } 592 goto exit; 593 } 594 } 595 if (out_device & AUDIO_DEVICE_OUT_EARPIECE || 596 out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE) { 597 snd_device = SND_DEVICE_IN_HANDSET_MIC; 598 } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) { 599 snd_device = SND_DEVICE_IN_VOICE_HEADSET_MIC; 600 } else if (out_device & AUDIO_DEVICE_OUT_ALL_SCO) { 601 snd_device = SND_DEVICE_IN_BT_SCO_MIC ; 602 } else if (out_device & AUDIO_DEVICE_OUT_SPEAKER) { 603 snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC; 604 } 605 } else if (source == AUDIO_SOURCE_CAMCORDER) { 606 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC || 607 in_device & AUDIO_DEVICE_IN_BACK_MIC) { 608 snd_device = SND_DEVICE_IN_CAMCORDER_MIC; 609 } 610 } else if (source == AUDIO_SOURCE_VOICE_RECOGNITION) { 611 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) { 612 if (adev->dualmic_config == DUALMIC_CONFIG_1) { 613 if (channel_mask == AUDIO_CHANNEL_IN_FRONT_BACK) 614 snd_device = SND_DEVICE_IN_VOICE_REC_DMIC_1; 615 else if (adev->ns_in_voice_rec) 616 snd_device = SND_DEVICE_IN_VOICE_REC_DMIC_NS_1; 617 } 618 619 if (snd_device == SND_DEVICE_NONE) { 620 snd_device = SND_DEVICE_IN_VOICE_REC_MIC; 621 } 622 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) { 623 snd_device = SND_DEVICE_IN_VOICE_REC_HEADSET_MIC; 624 } 625 } else if (source == AUDIO_SOURCE_VOICE_COMMUNICATION || source == AUDIO_SOURCE_MIC) { 626 if (out_device & AUDIO_DEVICE_OUT_SPEAKER) 627 in_device = AUDIO_DEVICE_IN_BACK_MIC; 628 if (active_input) { 629 if (active_input->enable_aec) { 630 if (in_device & AUDIO_DEVICE_IN_BACK_MIC) { 631 snd_device = SND_DEVICE_IN_SPEAKER_MIC_AEC; 632 } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) { 633 if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE) { 634 snd_device = SND_DEVICE_IN_SPEAKER_MIC_AEC; 635 } else { 636 snd_device = SND_DEVICE_IN_HANDSET_MIC_AEC; 637 } 638 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) { 639 snd_device = SND_DEVICE_IN_HEADSET_MIC_AEC; 640 } 641 } 642 /* TODO: set echo reference */ 643 } 644 } else if (source == AUDIO_SOURCE_DEFAULT) { 645 goto exit; 646 } 647 648 649 if (snd_device != SND_DEVICE_NONE) { 650 goto exit; 651 } 652 653 if (in_device != AUDIO_DEVICE_NONE && 654 !(in_device & AUDIO_DEVICE_IN_VOICE_CALL) && 655 !(in_device & AUDIO_DEVICE_IN_COMMUNICATION)) { 656 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) { 657 snd_device = SND_DEVICE_IN_HANDSET_MIC; 658 } else if (in_device & AUDIO_DEVICE_IN_BACK_MIC) { 659 snd_device = SND_DEVICE_IN_SPEAKER_MIC; 660 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) { 661 snd_device = SND_DEVICE_IN_HEADSET_MIC; 662 } else if (in_device & AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET) { 663 snd_device = SND_DEVICE_IN_BT_SCO_MIC ; 664 } else if (in_device & AUDIO_DEVICE_IN_AUX_DIGITAL) { 665 snd_device = SND_DEVICE_IN_HDMI_MIC; 666 } else { 667 ALOGE("%s: Unknown input device(s) %#x", __func__, in_device); 668 ALOGW("%s: Using default handset-mic", __func__); 669 snd_device = SND_DEVICE_IN_HANDSET_MIC; 670 } 671 } else { 672 if (out_device & AUDIO_DEVICE_OUT_EARPIECE) { 673 snd_device = SND_DEVICE_IN_HANDSET_MIC; 674 } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) { 675 snd_device = SND_DEVICE_IN_HEADSET_MIC; 676 } else if (out_device & AUDIO_DEVICE_OUT_SPEAKER) { 677 snd_device = SND_DEVICE_IN_SPEAKER_MIC; 678 } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE) { 679 snd_device = SND_DEVICE_IN_HANDSET_MIC; 680 } else if (out_device & AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET) { 681 snd_device = SND_DEVICE_IN_BT_SCO_MIC; 682 } else { 683 ALOGE("%s: Unknown output device(s) %#x", __func__, out_device); 684 ALOGW("%s: Using default handset-mic", __func__); 685 snd_device = SND_DEVICE_IN_HANDSET_MIC; 686 } 687 } 688 exit: 689 ALOGV("%s: exit: in_snd_device(%s)", __func__, device_table[snd_device]); 690 return snd_device; 691 } 692 693 static int set_hdmi_channels(struct audio_device *adev, int channel_count) 694 { 695 struct mixer_ctl *ctl; 696 const char *mixer_ctl_name = ""; 697 (void)adev; 698 (void)channel_count; 699 /* TODO */ 700 701 return 0; 702 } 703 704 static int edid_get_max_channels(struct audio_device *adev) 705 { 706 int max_channels = 2; 707 struct mixer_ctl *ctl; 708 (void)adev; 709 710 /* TODO */ 711 return max_channels; 712 } 713 714 /* Delay in Us */ 715 static int64_t render_latency(audio_usecase_t usecase) 716 { 717 (void)usecase; 718 /* TODO */ 719 return 0; 720 } 721 722 static int enable_snd_device(struct audio_device *adev, 723 struct audio_usecase *uc_info, 724 snd_device_t snd_device, 725 bool update_mixer) 726 { 727 struct mixer_card *mixer_card; 728 struct listnode *node; 729 const char *snd_device_name = get_snd_device_name(snd_device); 730 731 if (snd_device_name == NULL) 732 return -EINVAL; 733 734 if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES) { 735 ALOGD("Request to enable combo device: enable individual devices\n"); 736 enable_snd_device(adev, uc_info, SND_DEVICE_OUT_SPEAKER, update_mixer); 737 enable_snd_device(adev, uc_info, SND_DEVICE_OUT_HEADPHONES, update_mixer); 738 return 0; 739 } 740 adev->snd_dev_ref_cnt[snd_device]++; 741 if (adev->snd_dev_ref_cnt[snd_device] > 1) { 742 ALOGV("%s: snd_device(%d: %s) is already active", 743 __func__, snd_device, snd_device_name); 744 return 0; 745 } 746 747 ALOGV("%s: snd_device(%d: %s)", __func__, 748 snd_device, snd_device_name); 749 750 list_for_each(node, &uc_info->mixer_list) { 751 mixer_card = node_to_item(node, struct mixer_card, uc_list_node[uc_info->id]); 752 audio_route_apply_path(mixer_card->audio_route, snd_device_name); 753 if (update_mixer) 754 audio_route_update_mixer(mixer_card->audio_route); 755 } 756 757 return 0; 758 } 759 760 static int disable_snd_device(struct audio_device *adev, 761 struct audio_usecase *uc_info, 762 snd_device_t snd_device, 763 bool update_mixer) 764 { 765 struct mixer_card *mixer_card; 766 struct listnode *node; 767 const char *snd_device_name = get_snd_device_name(snd_device); 768 769 if (snd_device_name == NULL) 770 return -EINVAL; 771 772 if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES) { 773 ALOGD("Request to disable combo device: disable individual devices\n"); 774 disable_snd_device(adev, uc_info, SND_DEVICE_OUT_SPEAKER, update_mixer); 775 disable_snd_device(adev, uc_info, SND_DEVICE_OUT_HEADPHONES, update_mixer); 776 return 0; 777 } 778 779 if (adev->snd_dev_ref_cnt[snd_device] <= 0) { 780 ALOGE("%s: device ref cnt is already 0", __func__); 781 return -EINVAL; 782 } 783 adev->snd_dev_ref_cnt[snd_device]--; 784 if (adev->snd_dev_ref_cnt[snd_device] == 0) { 785 ALOGV("%s: snd_device(%d: %s)", __func__, 786 snd_device, snd_device_name); 787 list_for_each(node, &uc_info->mixer_list) { 788 mixer_card = node_to_item(node, struct mixer_card, uc_list_node[uc_info->id]); 789 audio_route_reset_path(mixer_card->audio_route, snd_device_name); 790 if (update_mixer) 791 audio_route_update_mixer(mixer_card->audio_route); 792 } 793 } 794 return 0; 795 } 796 797 static int select_devices(struct audio_device *adev, 798 audio_usecase_t uc_id) 799 { 800 snd_device_t out_snd_device = SND_DEVICE_NONE; 801 snd_device_t in_snd_device = SND_DEVICE_NONE; 802 struct audio_usecase *usecase = NULL; 803 struct audio_usecase *vc_usecase = NULL; 804 struct listnode *node; 805 struct stream_in *active_input = NULL; 806 struct stream_out *active_out; 807 struct mixer_card *mixer_card; 808 809 ALOGV("%s: usecase(%d)", __func__, uc_id); 810 811 if (uc_id == USECASE_AUDIO_CAPTURE_HOTWORD) 812 return 0; 813 814 usecase = get_usecase_from_type(adev, PCM_CAPTURE|VOICE_CALL); 815 if (usecase != NULL) { 816 active_input = (struct stream_in *)usecase->stream; 817 } 818 819 usecase = get_usecase_from_id(adev, uc_id); 820 if (usecase == NULL) { 821 ALOGE("%s: Could not find the usecase(%d)", __func__, uc_id); 822 return -EINVAL; 823 } 824 active_out = (struct stream_out *)usecase->stream; 825 826 if (usecase->type == VOICE_CALL) { 827 out_snd_device = get_output_snd_device(adev, active_out->devices); 828 in_snd_device = get_input_snd_device(adev, active_out->devices); 829 usecase->devices = active_out->devices; 830 } else { 831 /* 832 * If the voice call is active, use the sound devices of voice call usecase 833 * so that it would not result any device switch. All the usecases will 834 * be switched to new device when select_devices() is called for voice call 835 * usecase. 836 */ 837 if (adev->in_call) { 838 vc_usecase = get_usecase_from_id(adev, USECASE_VOICE_CALL); 839 if (usecase == NULL) { 840 ALOGE("%s: Could not find the voice call usecase", __func__); 841 } else { 842 in_snd_device = vc_usecase->in_snd_device; 843 out_snd_device = vc_usecase->out_snd_device; 844 } 845 } 846 if (usecase->type == PCM_PLAYBACK) { 847 usecase->devices = active_out->devices; 848 in_snd_device = SND_DEVICE_NONE; 849 if (out_snd_device == SND_DEVICE_NONE) { 850 out_snd_device = get_output_snd_device(adev, active_out->devices); 851 if (active_out == adev->primary_output && 852 active_input && 853 active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION) { 854 select_devices(adev, active_input->usecase); 855 } 856 } 857 } else if (usecase->type == PCM_CAPTURE) { 858 usecase->devices = ((struct stream_in *)usecase->stream)->devices; 859 out_snd_device = SND_DEVICE_NONE; 860 if (in_snd_device == SND_DEVICE_NONE) { 861 if (active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION && 862 adev->primary_output && !adev->primary_output->standby) { 863 in_snd_device = get_input_snd_device(adev, adev->primary_output->devices); 864 } else { 865 in_snd_device = get_input_snd_device(adev, AUDIO_DEVICE_NONE); 866 } 867 } 868 } 869 } 870 871 if (out_snd_device == usecase->out_snd_device && 872 in_snd_device == usecase->in_snd_device) { 873 return 0; 874 } 875 876 ALOGV("%s: out_snd_device(%d: %s) in_snd_device(%d: %s)", __func__, 877 out_snd_device, get_snd_device_display_name(out_snd_device), 878 in_snd_device, get_snd_device_display_name(in_snd_device)); 879 880 881 /* Disable current sound devices */ 882 if (usecase->out_snd_device != SND_DEVICE_NONE) { 883 pthread_mutex_lock(&adev->tfa9895_lock); 884 disable_snd_device(adev, usecase, usecase->out_snd_device, false); 885 pthread_mutex_unlock(&adev->tfa9895_lock); 886 } 887 888 if (usecase->in_snd_device != SND_DEVICE_NONE) { 889 disable_snd_device(adev, usecase, usecase->in_snd_device, false); 890 } 891 892 /* Enable new sound devices */ 893 if (out_snd_device != SND_DEVICE_NONE) { 894 enable_snd_device(adev, usecase, out_snd_device, false); 895 } 896 897 if (in_snd_device != SND_DEVICE_NONE) { 898 enable_snd_device(adev, usecase, in_snd_device, false); 899 } 900 901 list_for_each(node, &usecase->mixer_list) { 902 mixer_card = node_to_item(node, struct mixer_card, uc_list_node[usecase->id]); 903 audio_route_update_mixer(mixer_card->audio_route); 904 } 905 906 usecase->in_snd_device = in_snd_device; 907 usecase->out_snd_device = out_snd_device; 908 909 if (out_snd_device != SND_DEVICE_NONE) 910 if (usecase->devices & (AUDIO_DEVICE_OUT_WIRED_HEADSET | AUDIO_DEVICE_OUT_WIRED_HEADPHONE)) 911 if (adev->htc_acoustic_set_rt5506_amp != NULL) 912 adev->htc_acoustic_set_rt5506_amp(adev->mode, usecase->devices); 913 return 0; 914 } 915 916 917 static ssize_t read_frames(struct stream_in *in, void *buffer, ssize_t frames); 918 static int do_in_standby_l(struct stream_in *in); 919 920 #ifdef PREPROCESSING_ENABLED 921 static void get_capture_reference_delay(struct stream_in *in, 922 size_t frames __unused, 923 struct echo_reference_buffer *buffer) 924 { 925 ALOGVV("%s: enter:)", __func__); 926 927 /* read frames available in kernel driver buffer */ 928 unsigned int kernel_frames; 929 struct timespec tstamp; 930 long buf_delay; 931 long kernel_delay; 932 long delay_ns; 933 struct pcm_device *ref_device; 934 long rsmp_delay = 0; 935 936 ref_device = node_to_item(list_tail(&in->pcm_dev_list), 937 struct pcm_device, stream_list_node); 938 939 if (pcm_get_htimestamp(ref_device->pcm, &kernel_frames, &tstamp) < 0) { 940 buffer->time_stamp.tv_sec = 0; 941 buffer->time_stamp.tv_nsec = 0; 942 buffer->delay_ns = 0; 943 ALOGW("read get_capture_reference_delay(): pcm_htimestamp error"); 944 return; 945 } 946 947 /* adjust render time stamp with delay added by current driver buffer. 948 * Add the duration of current frame as we want the render time of the last 949 * sample being written. */ 950 951 kernel_delay = (long)(((int64_t)kernel_frames * 1000000000) / ref_device->pcm_profile->config.rate); 952 953 buffer->time_stamp = tstamp; 954 buffer->delay_ns = kernel_delay; 955 956 ALOGVV("get_capture_reference_delay_time_stamp Secs: [%10ld], nSecs: [%9ld], kernel_frames: [%5d]," 957 " delay_ns: [%d] , frames:[%zd]", 958 buffer->time_stamp.tv_sec , buffer->time_stamp.tv_nsec, kernel_frames, buffer->delay_ns, frames); 959 } 960 961 static void get_capture_delay(struct stream_in *in, 962 size_t frames __unused, 963 struct echo_reference_buffer *buffer) 964 { 965 ALOGVV("%s: enter:)", __func__); 966 /* read frames available in kernel driver buffer */ 967 unsigned int kernel_frames; 968 struct timespec tstamp; 969 long buf_delay; 970 long rsmp_delay; 971 long kernel_delay; 972 long delay_ns; 973 struct pcm_device *pcm_device; 974 975 pcm_device = node_to_item(list_head(&in->pcm_dev_list), 976 struct pcm_device, stream_list_node); 977 978 if (pcm_get_htimestamp(pcm_device->pcm, &kernel_frames, &tstamp) < 0) { 979 buffer->time_stamp.tv_sec = 0; 980 buffer->time_stamp.tv_nsec = 0; 981 buffer->delay_ns = 0; 982 ALOGW("read get_capture_delay(): pcm_htimestamp error"); 983 return; 984 } 985 986 /* read frames available in audio HAL input buffer 987 * add number of frames being read as we want the capture time of first sample 988 * in current buffer */ 989 /* frames in in->read_buf are at driver sampling rate while frames in in->proc_buf are 990 * at requested sampling rate */ 991 buf_delay = (long)(((int64_t)(in->read_buf_frames) * 1000000000) / in->config.rate + 992 ((int64_t)(in->proc_buf_frames) * 1000000000) / in->requested_rate ); 993 994 /* add delay introduced by resampler */ 995 rsmp_delay = 0; 996 if (in->resampler) { 997 rsmp_delay = in->resampler->delay_ns(in->resampler); 998 } 999 1000 kernel_delay = (long)(((int64_t)kernel_frames * 1000000000) / in->config.rate); 1001 1002 delay_ns = kernel_delay + buf_delay + rsmp_delay; 1003 1004 buffer->time_stamp = tstamp; 1005 buffer->delay_ns = delay_ns; 1006 ALOGVV("get_capture_delay_time_stamp Secs: [%10ld], nSecs: [%9ld], kernel_frames:[%5d]," 1007 " delay_ns: [%d], kernel_delay:[%ld], buf_delay:[%ld], rsmp_delay:[%ld], " 1008 "in->read_buf_frames:[%zd], in->proc_buf_frames:[%zd], frames:[%zd]", 1009 buffer->time_stamp.tv_sec , buffer->time_stamp.tv_nsec, kernel_frames, 1010 buffer->delay_ns, kernel_delay, buf_delay, rsmp_delay, 1011 in->read_buf_frames, in->proc_buf_frames, frames); 1012 } 1013 1014 static int32_t update_echo_reference(struct stream_in *in, size_t frames) 1015 { 1016 ALOGVV("%s: enter:), in->config.channels(%d)", __func__,in->config.channels); 1017 struct echo_reference_buffer b; 1018 b.delay_ns = 0; 1019 struct pcm_device *pcm_device; 1020 1021 pcm_device = node_to_item(list_head(&in->pcm_dev_list), 1022 struct pcm_device, stream_list_node); 1023 1024 ALOGVV("update_echo_reference, in->config.channels(%d), frames = [%zd], in->ref_buf_frames = [%zd], " 1025 "b.frame_count = [%zd]", 1026 in->config.channels, frames, in->ref_buf_frames, frames - in->ref_buf_frames); 1027 if (in->ref_buf_frames < frames) { 1028 if (in->ref_buf_size < frames) { 1029 in->ref_buf_size = frames; 1030 in->ref_buf = (int16_t *)realloc(in->ref_buf, pcm_frames_to_bytes(pcm_device->pcm, frames)); 1031 ALOG_ASSERT((in->ref_buf != NULL), 1032 "update_echo_reference() failed to reallocate ref_buf"); 1033 ALOGVV("update_echo_reference(): ref_buf %p extended to %d bytes", 1034 in->ref_buf, pcm_frames_to_bytes(pcm_device->pcm, frames)); 1035 } 1036 b.frame_count = frames - in->ref_buf_frames; 1037 b.raw = (void *)(in->ref_buf + in->ref_buf_frames * in->config.channels); 1038 1039 get_capture_delay(in, frames, &b); 1040 1041 if (in->echo_reference->read(in->echo_reference, &b) == 0) 1042 { 1043 in->ref_buf_frames += b.frame_count; 1044 ALOGVV("update_echo_reference(): in->ref_buf_frames:[%zd], " 1045 "in->ref_buf_size:[%zd], frames:[%zd], b.frame_count:[%zd]", 1046 in->ref_buf_frames, in->ref_buf_size, frames, b.frame_count); 1047 } 1048 } else 1049 ALOGW("update_echo_reference(): NOT enough frames to read ref buffer"); 1050 return b.delay_ns; 1051 } 1052 1053 static int set_preprocessor_param(effect_handle_t handle, 1054 effect_param_t *param) 1055 { 1056 uint32_t size = sizeof(int); 1057 uint32_t psize = ((param->psize - 1) / sizeof(int) + 1) * sizeof(int) + 1058 param->vsize; 1059 1060 int status = (*handle)->command(handle, 1061 EFFECT_CMD_SET_PARAM, 1062 sizeof (effect_param_t) + psize, 1063 param, 1064 &size, 1065 ¶m->status); 1066 if (status == 0) 1067 status = param->status; 1068 1069 return status; 1070 } 1071 1072 static int set_preprocessor_echo_delay(effect_handle_t handle, 1073 int32_t delay_us) 1074 { 1075 struct { 1076 effect_param_t param; 1077 uint32_t data_0; 1078 int32_t data_1; 1079 } buf; 1080 memset(&buf, 0, sizeof(buf)); 1081 1082 buf.param.psize = sizeof(uint32_t); 1083 buf.param.vsize = sizeof(uint32_t); 1084 buf.data_0 = AEC_PARAM_ECHO_DELAY; 1085 buf.data_1 = delay_us; 1086 1087 return set_preprocessor_param(handle, &buf.param); 1088 } 1089 1090 static void push_echo_reference(struct stream_in *in, size_t frames) 1091 { 1092 ALOGVV("%s: enter:)", __func__); 1093 /* read frames from echo reference buffer and update echo delay 1094 * in->ref_buf_frames is updated with frames available in in->ref_buf */ 1095 1096 int32_t delay_us = update_echo_reference(in, frames)/1000; 1097 int32_t size_in_bytes = 0; 1098 int i; 1099 audio_buffer_t buf; 1100 1101 if (in->ref_buf_frames < frames) 1102 frames = in->ref_buf_frames; 1103 1104 buf.frameCount = frames; 1105 buf.raw = in->ref_buf; 1106 1107 for (i = 0; i < in->num_preprocessors; i++) { 1108 if ((*in->preprocessors[i].effect_itfe)->process_reverse == NULL) 1109 continue; 1110 ALOGVV("%s: effect_itfe)->process_reverse() BEGIN i=(%d) ", __func__, i); 1111 (*in->preprocessors[i].effect_itfe)->process_reverse(in->preprocessors[i].effect_itfe, 1112 &buf, 1113 NULL); 1114 ALOGVV("%s: effect_itfe)->process_reverse() END i=(%d) ", __func__, i); 1115 set_preprocessor_echo_delay(in->preprocessors[i].effect_itfe, delay_us); 1116 } 1117 1118 in->ref_buf_frames -= buf.frameCount; 1119 ALOGVV("%s: in->ref_buf_frames(%zd), in->config.channels(%d) ", 1120 __func__, in->ref_buf_frames, in->config.channels); 1121 if (in->ref_buf_frames) { 1122 memcpy(in->ref_buf, 1123 in->ref_buf + buf.frameCount * in->config.channels, 1124 in->ref_buf_frames * in->config.channels * sizeof(int16_t)); 1125 } 1126 } 1127 1128 static void put_echo_reference(struct audio_device *adev, 1129 struct echo_reference_itfe *reference) 1130 { 1131 ALOGV("%s: enter:)", __func__); 1132 int32_t prev_generation = adev->echo_reference_generation; 1133 struct stream_out *out = adev->primary_output; 1134 1135 if (adev->echo_reference != NULL && 1136 reference == adev->echo_reference) { 1137 /* echo reference is taken from the low latency output stream used 1138 * for voice use cases */ 1139 adev->echo_reference = NULL; 1140 android_atomic_inc(&adev->echo_reference_generation); 1141 if (out != NULL && out->usecase == USECASE_AUDIO_PLAYBACK) { 1142 // if the primary output is in standby or did not pick the echo reference yet 1143 // we can safely get rid of it here. 1144 // otherwise, out_write() or out_standby() will detect the change in echo reference 1145 // generation and release the echo reference owned by the stream. 1146 if ((out->echo_reference_generation != prev_generation) || out->standby) 1147 release_echo_reference(reference); 1148 } else { 1149 release_echo_reference(reference); 1150 } 1151 ALOGV("release_echo_reference"); 1152 } 1153 } 1154 1155 static struct echo_reference_itfe *get_echo_reference(struct audio_device *adev, 1156 audio_format_t format __unused, 1157 uint32_t channel_count, 1158 uint32_t sampling_rate) 1159 { 1160 ALOGV("%s: enter:)", __func__); 1161 put_echo_reference(adev, adev->echo_reference); 1162 /* echo reference is taken from the low latency output stream used 1163 * for voice use cases */ 1164 if (adev->primary_output!= NULL && adev->primary_output->usecase == USECASE_AUDIO_PLAYBACK && 1165 !adev->primary_output->standby) { 1166 struct audio_stream *stream = 1167 &adev->primary_output->stream.common; 1168 uint32_t wr_channel_count = audio_channel_count_from_out_mask(stream->get_channels(stream)); 1169 uint32_t wr_sampling_rate = stream->get_sample_rate(stream); 1170 ALOGV("Calling create_echo_reference"); 1171 int status = create_echo_reference(AUDIO_FORMAT_PCM_16_BIT, 1172 channel_count, 1173 sampling_rate, 1174 AUDIO_FORMAT_PCM_16_BIT, 1175 wr_channel_count, 1176 wr_sampling_rate, 1177 &adev->echo_reference); 1178 if (status == 0) 1179 android_atomic_inc(&adev->echo_reference_generation); 1180 } 1181 return adev->echo_reference; 1182 } 1183 1184 #ifdef HW_AEC_LOOPBACK 1185 static int get_hw_echo_reference(struct stream_in *in) 1186 { 1187 struct pcm_device_profile *ref_pcm_profile; 1188 struct pcm_device *ref_device; 1189 struct audio_device *adev = in->dev; 1190 1191 in->hw_echo_reference = false; 1192 1193 if (adev->primary_output!= NULL && 1194 !adev->primary_output->standby && 1195 adev->primary_output->usecase == USECASE_AUDIO_PLAYBACK && 1196 adev->primary_output->devices == AUDIO_DEVICE_OUT_SPEAKER) { 1197 struct audio_stream *stream = &adev->primary_output->stream.common; 1198 1199 // TODO: currently there is no low latency mode for aec reference. 1200 ref_pcm_profile = get_pcm_device(PCM_CAPTURE, pcm_device_capture_loopback_aec.devices); 1201 if (ref_pcm_profile == NULL) { 1202 ALOGE("%s: Could not find PCM device id for the usecase(%d)", 1203 __func__, pcm_device_capture_loopback_aec.devices); 1204 return -EINVAL; 1205 } 1206 1207 ref_device = (struct pcm_device *)calloc(1, sizeof(struct pcm_device)); 1208 ref_device->pcm_profile = ref_pcm_profile; 1209 1210 ALOGV("%s: ref_device rate:%d, ch:%d", __func__, ref_pcm_profile->config.rate, ref_pcm_profile->config.channels); 1211 ref_device->pcm = pcm_open(ref_device->pcm_profile->card, ref_device->pcm_profile->id, PCM_IN | PCM_MONOTONIC, &ref_device->pcm_profile->config); 1212 1213 if (ref_device->pcm && !pcm_is_ready(ref_device->pcm)) { 1214 ALOGE("%s: %s", __func__, pcm_get_error(ref_device->pcm)); 1215 pcm_close(ref_device->pcm); 1216 ref_device->pcm = NULL; 1217 return -EIO; 1218 } 1219 list_add_tail(&in->pcm_dev_list, &ref_device->stream_list_node); 1220 1221 in->hw_echo_reference = true; 1222 1223 ALOGV("%s: hw_echo_reference is true", __func__); 1224 } 1225 1226 return 0; 1227 } 1228 #endif 1229 1230 static int get_playback_delay(struct stream_out *out, 1231 size_t frames, 1232 struct echo_reference_buffer *buffer) 1233 { 1234 unsigned int kernel_frames; 1235 int status; 1236 int primary_pcm = 0; 1237 struct pcm_device *pcm_device; 1238 1239 pcm_device = node_to_item(list_head(&out->pcm_dev_list), 1240 struct pcm_device, stream_list_node); 1241 1242 status = pcm_get_htimestamp(pcm_device->pcm, &kernel_frames, &buffer->time_stamp); 1243 if (status < 0) { 1244 buffer->time_stamp.tv_sec = 0; 1245 buffer->time_stamp.tv_nsec = 0; 1246 buffer->delay_ns = 0; 1247 ALOGV("get_playback_delay(): pcm_get_htimestamp error," 1248 "setting playbackTimestamp to 0"); 1249 return status; 1250 } 1251 1252 kernel_frames = pcm_get_buffer_size(pcm_device->pcm) - kernel_frames; 1253 1254 /* adjust render time stamp with delay added by current driver buffer. 1255 * Add the duration of current frame as we want the render time of the last 1256 * sample being written. */ 1257 buffer->delay_ns = (long)(((int64_t)(kernel_frames + frames)* 1000000000)/ 1258 out->config.rate); 1259 ALOGVV("get_playback_delay_time_stamp Secs: [%10ld], nSecs: [%9ld], kernel_frames: [%5u], delay_ns: [%d],", 1260 buffer->time_stamp.tv_sec, buffer->time_stamp.tv_nsec, kernel_frames, buffer->delay_ns); 1261 1262 return 0; 1263 } 1264 1265 #define GET_COMMAND_STATUS(status, fct_status, cmd_status) \ 1266 do { \ 1267 if (fct_status != 0) \ 1268 status = fct_status; \ 1269 else if (cmd_status != 0) \ 1270 status = cmd_status; \ 1271 } while(0) 1272 1273 static int in_configure_reverse(struct stream_in *in) 1274 { 1275 int32_t cmd_status; 1276 uint32_t size = sizeof(int); 1277 effect_config_t config; 1278 int32_t status = 0; 1279 int32_t fct_status = 0; 1280 int i; 1281 ALOGV("%s: enter: in->num_preprocessors(%d)", __func__, in->num_preprocessors); 1282 if (in->num_preprocessors > 0) { 1283 config.inputCfg.channels = in->main_channels; 1284 config.outputCfg.channels = in->main_channels; 1285 config.inputCfg.format = AUDIO_FORMAT_PCM_16_BIT; 1286 config.outputCfg.format = AUDIO_FORMAT_PCM_16_BIT; 1287 config.inputCfg.samplingRate = in->requested_rate; 1288 config.outputCfg.samplingRate = in->requested_rate; 1289 config.inputCfg.mask = 1290 ( EFFECT_CONFIG_SMP_RATE | EFFECT_CONFIG_CHANNELS | EFFECT_CONFIG_FORMAT ); 1291 config.outputCfg.mask = 1292 ( EFFECT_CONFIG_SMP_RATE | EFFECT_CONFIG_CHANNELS | EFFECT_CONFIG_FORMAT ); 1293 1294 for (i = 0; i < in->num_preprocessors; i++) 1295 { 1296 if ((*in->preprocessors[i].effect_itfe)->process_reverse == NULL) 1297 continue; 1298 fct_status = (*(in->preprocessors[i].effect_itfe))->command( 1299 in->preprocessors[i].effect_itfe, 1300 EFFECT_CMD_SET_CONFIG_REVERSE, 1301 sizeof(effect_config_t), 1302 &config, 1303 &size, 1304 &cmd_status); 1305 ALOGV("%s: calling EFFECT_CMD_SET_CONFIG_REVERSE",__func__); 1306 GET_COMMAND_STATUS(status, fct_status, cmd_status); 1307 } 1308 } 1309 return status; 1310 } 1311 1312 #define MAX_NUM_CHANNEL_CONFIGS 10 1313 1314 static void in_read_audio_effect_channel_configs(struct stream_in *in __unused, 1315 struct effect_info_s *effect_info) 1316 { 1317 /* size and format of the cmd are defined in hardware/audio_effect.h */ 1318 effect_handle_t effect = effect_info->effect_itfe; 1319 uint32_t cmd_size = 2 * sizeof(uint32_t); 1320 uint32_t cmd[] = { EFFECT_FEATURE_AUX_CHANNELS, MAX_NUM_CHANNEL_CONFIGS }; 1321 /* reply = status + number of configs (n) + n x channel_config_t */ 1322 uint32_t reply_size = 1323 2 * sizeof(uint32_t) + (MAX_NUM_CHANNEL_CONFIGS * sizeof(channel_config_t)); 1324 int32_t reply[reply_size]; 1325 int32_t cmd_status; 1326 1327 ALOG_ASSERT((effect_info->num_channel_configs == 0), 1328 "in_read_audio_effect_channel_configs() num_channel_configs not cleared"); 1329 ALOG_ASSERT((effect_info->channel_configs == NULL), 1330 "in_read_audio_effect_channel_configs() channel_configs not cleared"); 1331 1332 /* if this command is not supported, then the effect is supposed to return -EINVAL. 1333 * This error will be interpreted as if the effect supports the main_channels but does not 1334 * support any aux_channels */ 1335 cmd_status = (*effect)->command(effect, 1336 EFFECT_CMD_GET_FEATURE_SUPPORTED_CONFIGS, 1337 cmd_size, 1338 (void*)&cmd, 1339 &reply_size, 1340 (void*)&reply); 1341 1342 if (cmd_status != 0) { 1343 ALOGV("in_read_audio_effect_channel_configs(): " 1344 "fx->command returned %d", cmd_status); 1345 return; 1346 } 1347 1348 if (reply[0] != 0) { 1349 ALOGW("in_read_audio_effect_channel_configs(): " 1350 "command EFFECT_CMD_GET_FEATURE_SUPPORTED_CONFIGS error %d num configs %d", 1351 reply[0], (reply[0] == -ENOMEM) ? reply[1] : MAX_NUM_CHANNEL_CONFIGS); 1352 return; 1353 } 1354 1355 /* the feature is not supported */ 1356 ALOGV("in_read_audio_effect_channel_configs()(): " 1357 "Feature supported and adding %d channel configs to the list", reply[1]); 1358 effect_info->num_channel_configs = reply[1]; 1359 effect_info->channel_configs = 1360 (channel_config_t *) malloc(sizeof(channel_config_t) * reply[1]); /* n x configs */ 1361 memcpy(effect_info->channel_configs, (reply + 2), sizeof(channel_config_t) * reply[1]); 1362 } 1363 1364 1365 #define NUM_IN_AUX_CNL_CONFIGS 2 1366 static const channel_config_t in_aux_cnl_configs[NUM_IN_AUX_CNL_CONFIGS] = { 1367 { AUDIO_CHANNEL_IN_FRONT , AUDIO_CHANNEL_IN_BACK}, 1368 { AUDIO_CHANNEL_IN_STEREO , AUDIO_CHANNEL_IN_RIGHT} 1369 }; 1370 static uint32_t in_get_aux_channels(struct stream_in *in) 1371 { 1372 int i; 1373 channel_config_t new_chcfg = {0, 0}; 1374 1375 if (in->num_preprocessors == 0) 1376 return 0; 1377 1378 /* do not enable dual mic configurations when capturing from other microphones than 1379 * main or sub */ 1380 if (!(in->devices & (AUDIO_DEVICE_IN_BUILTIN_MIC | AUDIO_DEVICE_IN_BACK_MIC))) 1381 return 0; 1382 1383 /* retain most complex aux channels configuration compatible with requested main channels and 1384 * supported by audio driver and all pre processors */ 1385 for (i = 0; i < NUM_IN_AUX_CNL_CONFIGS; i++) { 1386 const channel_config_t *cur_chcfg = &in_aux_cnl_configs[i]; 1387 if (cur_chcfg->main_channels == in->main_channels) { 1388 size_t match_cnt; 1389 size_t idx_preproc; 1390 for (idx_preproc = 0, match_cnt = 0; 1391 /* no need to continue if at least one preprocessor doesn't match */ 1392 idx_preproc < (size_t)in->num_preprocessors && match_cnt == idx_preproc; 1393 idx_preproc++) { 1394 struct effect_info_s *effect_info = &in->preprocessors[idx_preproc]; 1395 size_t idx_chcfg; 1396 1397 for (idx_chcfg = 0; idx_chcfg < effect_info->num_channel_configs; idx_chcfg++) { 1398 if (memcmp(effect_info->channel_configs + idx_chcfg, 1399 cur_chcfg, 1400 sizeof(channel_config_t)) == 0) { 1401 match_cnt++; 1402 break; 1403 } 1404 } 1405 } 1406 /* if all preprocessors match, we have a candidate */ 1407 if (match_cnt == (size_t)in->num_preprocessors) { 1408 /* retain most complex aux channels configuration */ 1409 if (audio_channel_count_from_in_mask(cur_chcfg->aux_channels) > audio_channel_count_from_in_mask(new_chcfg.aux_channels)) { 1410 new_chcfg = *cur_chcfg; 1411 } 1412 } 1413 } 1414 } 1415 1416 ALOGV("in_get_aux_channels(): return %04x", new_chcfg.aux_channels); 1417 1418 return new_chcfg.aux_channels; 1419 } 1420 1421 static int in_configure_effect_channels(effect_handle_t effect, 1422 channel_config_t *channel_config) 1423 { 1424 int status = 0; 1425 int fct_status; 1426 int32_t cmd_status; 1427 uint32_t reply_size; 1428 effect_config_t config; 1429 uint32_t cmd[(sizeof(uint32_t) + sizeof(channel_config_t) - 1) / sizeof(uint32_t) + 1]; 1430 1431 ALOGV("in_configure_effect_channels(): configure effect with channels: [%04x][%04x]", 1432 channel_config->main_channels, 1433 channel_config->aux_channels); 1434 1435 config.inputCfg.mask = EFFECT_CONFIG_CHANNELS; 1436 config.outputCfg.mask = EFFECT_CONFIG_CHANNELS; 1437 reply_size = sizeof(effect_config_t); 1438 fct_status = (*effect)->command(effect, 1439 EFFECT_CMD_GET_CONFIG, 1440 0, 1441 NULL, 1442 &reply_size, 1443 &config); 1444 if (fct_status != 0) { 1445 ALOGE("in_configure_effect_channels(): EFFECT_CMD_GET_CONFIG failed"); 1446 return fct_status; 1447 } 1448 1449 config.inputCfg.channels = channel_config->main_channels | channel_config->aux_channels; 1450 config.outputCfg.channels = config.inputCfg.channels; 1451 reply_size = sizeof(uint32_t); 1452 fct_status = (*effect)->command(effect, 1453 EFFECT_CMD_SET_CONFIG, 1454 sizeof(effect_config_t), 1455 &config, 1456 &reply_size, 1457 &cmd_status); 1458 GET_COMMAND_STATUS(status, fct_status, cmd_status); 1459 1460 cmd[0] = EFFECT_FEATURE_AUX_CHANNELS; 1461 memcpy(cmd + 1, channel_config, sizeof(channel_config_t)); 1462 reply_size = sizeof(uint32_t); 1463 fct_status = (*effect)->command(effect, 1464 EFFECT_CMD_SET_FEATURE_CONFIG, 1465 sizeof(cmd), //sizeof(uint32_t) + sizeof(channel_config_t), 1466 cmd, 1467 &reply_size, 1468 &cmd_status); 1469 GET_COMMAND_STATUS(status, fct_status, cmd_status); 1470 1471 /* some implementations need to be re-enabled after a config change */ 1472 reply_size = sizeof(uint32_t); 1473 fct_status = (*effect)->command(effect, 1474 EFFECT_CMD_ENABLE, 1475 0, 1476 NULL, 1477 &reply_size, 1478 &cmd_status); 1479 GET_COMMAND_STATUS(status, fct_status, cmd_status); 1480 1481 return status; 1482 } 1483 1484 static int in_reconfigure_channels(struct stream_in *in, 1485 effect_handle_t effect, 1486 channel_config_t *channel_config, 1487 bool config_changed) { 1488 1489 int status = 0; 1490 1491 ALOGV("in_reconfigure_channels(): config_changed %d effect %p", 1492 config_changed, effect); 1493 1494 /* if config changed, reconfigure all previously added effects */ 1495 if (config_changed) { 1496 int i; 1497 ALOGV("%s: config_changed (%d)", __func__, config_changed); 1498 for (i = 0; i < in->num_preprocessors; i++) 1499 { 1500 int cur_status = in_configure_effect_channels(in->preprocessors[i].effect_itfe, 1501 channel_config); 1502 ALOGV("%s: in_configure_effect_channels i=(%d), [main_channel,aux_channel]=[%d|%d], status=%d", 1503 __func__, i, channel_config->main_channels, channel_config->aux_channels, cur_status); 1504 if (cur_status != 0) { 1505 ALOGV("in_reconfigure_channels(): error %d configuring effect " 1506 "%d with channels: [%04x][%04x]", 1507 cur_status, 1508 i, 1509 channel_config->main_channels, 1510 channel_config->aux_channels); 1511 status = cur_status; 1512 } 1513 } 1514 } else if (effect != NULL && channel_config->aux_channels) { 1515 /* if aux channels config did not change but aux channels are present, 1516 * we still need to configure the effect being added */ 1517 status = in_configure_effect_channels(effect, channel_config); 1518 } 1519 return status; 1520 } 1521 1522 static void in_update_aux_channels(struct stream_in *in, 1523 effect_handle_t effect) 1524 { 1525 uint32_t aux_channels; 1526 channel_config_t channel_config; 1527 int status; 1528 1529 aux_channels = in_get_aux_channels(in); 1530 1531 channel_config.main_channels = in->main_channels; 1532 channel_config.aux_channels = aux_channels; 1533 status = in_reconfigure_channels(in, 1534 effect, 1535 &channel_config, 1536 (aux_channels != in->aux_channels)); 1537 1538 if (status != 0) { 1539 ALOGV("in_update_aux_channels(): in_reconfigure_channels error %d", status); 1540 /* resetting aux channels configuration */ 1541 aux_channels = 0; 1542 channel_config.aux_channels = 0; 1543 in_reconfigure_channels(in, effect, &channel_config, true); 1544 } 1545 ALOGV("%s: aux_channels=%d, in->aux_channels_changed=%d", __func__, aux_channels, in->aux_channels_changed); 1546 if (in->aux_channels != aux_channels) { 1547 in->aux_channels_changed = true; 1548 in->aux_channels = aux_channels; 1549 do_in_standby_l(in); 1550 } 1551 } 1552 #endif 1553 1554 /* This function reads PCM data and: 1555 * - resample if needed 1556 * - process if pre-processors are attached 1557 * - discard unwanted channels 1558 */ 1559 static ssize_t read_and_process_frames(struct stream_in *in, void* buffer, ssize_t frames) 1560 { 1561 ssize_t frames_wr = 0; 1562 audio_buffer_t in_buf; 1563 audio_buffer_t out_buf; 1564 size_t src_channels = in->config.channels; 1565 size_t dst_channels = audio_channel_count_from_in_mask(in->main_channels); 1566 int i; 1567 void *proc_buf_out; 1568 struct pcm_device *pcm_device; 1569 bool has_additional_channels = (dst_channels != src_channels) ? true : false; 1570 #ifdef PREPROCESSING_ENABLED 1571 bool has_processing = (in->num_preprocessors != 0) ? true : false; 1572 #endif 1573 1574 /* Additional channels might be added on top of main_channels: 1575 * - aux_channels (by processing effects) 1576 * - extra channels due to HW limitations 1577 * In case of additional channels, we cannot work inplace 1578 */ 1579 if (has_additional_channels) 1580 proc_buf_out = in->proc_buf_out; 1581 else 1582 proc_buf_out = buffer; 1583 1584 if (list_empty(&in->pcm_dev_list)) { 1585 ALOGE("%s: pcm device list empty", __func__); 1586 return -EINVAL; 1587 } 1588 1589 pcm_device = node_to_item(list_head(&in->pcm_dev_list), 1590 struct pcm_device, stream_list_node); 1591 1592 #ifdef PREPROCESSING_ENABLED 1593 if (has_processing) { 1594 /* since all the processing below is done in frames and using the config.channels 1595 * as the number of channels, no changes is required in case aux_channels are present */ 1596 while (frames_wr < frames) { 1597 /* first reload enough frames at the end of process input buffer */ 1598 if (in->proc_buf_frames < (size_t)frames) { 1599 ssize_t frames_rd; 1600 if (in->proc_buf_size < (size_t)frames) { 1601 size_t size_in_bytes = pcm_frames_to_bytes(pcm_device->pcm, frames); 1602 in->proc_buf_size = (size_t)frames; 1603 in->proc_buf_in = (int16_t *)realloc(in->proc_buf_in, size_in_bytes); 1604 ALOG_ASSERT((in->proc_buf_in != NULL), 1605 "process_frames() failed to reallocate proc_buf_in"); 1606 if (has_additional_channels) { 1607 in->proc_buf_out = (int16_t *)realloc(in->proc_buf_out, size_in_bytes); 1608 ALOG_ASSERT((in->proc_buf_out != NULL), 1609 "process_frames() failed to reallocate proc_buf_out"); 1610 proc_buf_out = in->proc_buf_out; 1611 } 1612 } 1613 frames_rd = read_frames(in, 1614 in->proc_buf_in + 1615 in->proc_buf_frames * in->config.channels, 1616 frames - in->proc_buf_frames); 1617 if (frames_rd < 0) { 1618 /* Return error code */ 1619 frames_wr = frames_rd; 1620 break; 1621 } 1622 in->proc_buf_frames += frames_rd; 1623 } 1624 1625 if (in->echo_reference != NULL) { 1626 push_echo_reference(in, in->proc_buf_frames); 1627 } 1628 1629 /* in_buf.frameCount and out_buf.frameCount indicate respectively 1630 * the maximum number of frames to be consumed and produced by process() */ 1631 in_buf.frameCount = in->proc_buf_frames; 1632 in_buf.s16 = in->proc_buf_in; 1633 out_buf.frameCount = frames - frames_wr; 1634 out_buf.s16 = (int16_t *)proc_buf_out + frames_wr * in->config.channels; 1635 1636 /* FIXME: this works because of current pre processing library implementation that 1637 * does the actual process only when the last enabled effect process is called. 1638 * The generic solution is to have an output buffer for each effect and pass it as 1639 * input to the next. 1640 */ 1641 for (i = 0; i < in->num_preprocessors; i++) { 1642 (*in->preprocessors[i].effect_itfe)->process(in->preprocessors[i].effect_itfe, 1643 &in_buf, 1644 &out_buf); 1645 } 1646 1647 /* process() has updated the number of frames consumed and produced in 1648 * in_buf.frameCount and out_buf.frameCount respectively 1649 * move remaining frames to the beginning of in->proc_buf_in */ 1650 in->proc_buf_frames -= in_buf.frameCount; 1651 1652 if (in->proc_buf_frames) { 1653 memcpy(in->proc_buf_in, 1654 in->proc_buf_in + in_buf.frameCount * in->config.channels, 1655 in->proc_buf_frames * in->config.channels * sizeof(int16_t)); 1656 } 1657 1658 /* if not enough frames were passed to process(), read more and retry. */ 1659 if (out_buf.frameCount == 0) { 1660 ALOGW("No frames produced by preproc"); 1661 continue; 1662 } 1663 1664 if ((frames_wr + (ssize_t)out_buf.frameCount) <= frames) { 1665 frames_wr += out_buf.frameCount; 1666 } else { 1667 /* The effect does not comply to the API. In theory, we should never end up here! */ 1668 ALOGE("preprocessing produced too many frames: %d + %zd > %d !", 1669 (unsigned int)frames_wr, out_buf.frameCount, (unsigned int)frames); 1670 frames_wr = frames; 1671 } 1672 } 1673 } 1674 else 1675 #endif //PREPROCESSING_ENABLED 1676 { 1677 /* No processing effects attached */ 1678 if (has_additional_channels) { 1679 /* With additional channels, we cannot use original buffer */ 1680 if (in->proc_buf_size < (size_t)frames) { 1681 size_t size_in_bytes = pcm_frames_to_bytes(pcm_device->pcm, frames); 1682 in->proc_buf_size = (size_t)frames; 1683 in->proc_buf_out = (int16_t *)realloc(in->proc_buf_out, size_in_bytes); 1684 ALOG_ASSERT((in->proc_buf_out != NULL), 1685 "process_frames() failed to reallocate proc_buf_out"); 1686 proc_buf_out = in->proc_buf_out; 1687 } 1688 } 1689 frames_wr = read_frames(in, proc_buf_out, frames); 1690 } 1691 1692 /* Remove all additional channels that have been added on top of main_channels: 1693 * - aux_channels 1694 * - extra channels from HW due to HW limitations 1695 * Assumption is made that the channels are interleaved and that the main 1696 * channels are first. */ 1697 1698 if (has_additional_channels) 1699 { 1700 int16_t* src_buffer = (int16_t *)proc_buf_out; 1701 int16_t* dst_buffer = (int16_t *)buffer; 1702 1703 if (dst_channels == 1) { 1704 for (i = frames_wr; i > 0; i--) 1705 { 1706 *dst_buffer++ = *src_buffer; 1707 src_buffer += src_channels; 1708 } 1709 } else { 1710 for (i = frames_wr; i > 0; i--) 1711 { 1712 memcpy(dst_buffer, src_buffer, dst_channels*sizeof(int16_t)); 1713 dst_buffer += dst_channels; 1714 src_buffer += src_channels; 1715 } 1716 } 1717 } 1718 1719 return frames_wr; 1720 } 1721 1722 static int get_next_buffer(struct resampler_buffer_provider *buffer_provider, 1723 struct resampler_buffer* buffer) 1724 { 1725 struct stream_in *in; 1726 struct pcm_device *pcm_device; 1727 1728 if (buffer_provider == NULL || buffer == NULL) 1729 return -EINVAL; 1730 1731 in = (struct stream_in *)((char *)buffer_provider - 1732 offsetof(struct stream_in, buf_provider)); 1733 1734 if (list_empty(&in->pcm_dev_list)) { 1735 buffer->raw = NULL; 1736 buffer->frame_count = 0; 1737 in->read_status = -ENODEV; 1738 return -ENODEV; 1739 } 1740 1741 pcm_device = node_to_item(list_head(&in->pcm_dev_list), 1742 struct pcm_device, stream_list_node); 1743 1744 if (in->read_buf_frames == 0) { 1745 size_t size_in_bytes = pcm_frames_to_bytes(pcm_device->pcm, in->config.period_size); 1746 if (in->read_buf_size < in->config.period_size) { 1747 in->read_buf_size = in->config.period_size; 1748 in->read_buf = (int16_t *) realloc(in->read_buf, size_in_bytes); 1749 ALOG_ASSERT((in->read_buf != NULL), 1750 "get_next_buffer() failed to reallocate read_buf"); 1751 } 1752 1753 in->read_status = pcm_read(pcm_device->pcm, (void*)in->read_buf, size_in_bytes); 1754 1755 if (in->read_status != 0) { 1756 ALOGE("get_next_buffer() pcm_read error %d", in->read_status); 1757 buffer->raw = NULL; 1758 buffer->frame_count = 0; 1759 return in->read_status; 1760 } 1761 in->read_buf_frames = in->config.period_size; 1762 1763 #ifdef PREPROCESSING_ENABLED 1764 #ifdef HW_AEC_LOOPBACK 1765 if (in->hw_echo_reference) { 1766 struct pcm_device *temp_device = NULL; 1767 struct pcm_device *ref_device = NULL; 1768 struct listnode *node = NULL; 1769 struct echo_reference_buffer b; 1770 size_t size_hw_ref_bytes; 1771 size_t size_hw_ref_frames; 1772 int read_status = 0; 1773 1774 ref_device = node_to_item(list_tail(&in->pcm_dev_list), 1775 struct pcm_device, stream_list_node); 1776 list_for_each(node, &in->pcm_dev_list) { 1777 temp_device = node_to_item(node, struct pcm_device, stream_list_node); 1778 if (temp_device->pcm_profile->id == 1) { 1779 ref_device = temp_device; 1780 break; 1781 } 1782 } 1783 if (ref_device) { 1784 size_hw_ref_bytes = pcm_frames_to_bytes(ref_device->pcm, ref_device->pcm_profile->config.period_size); 1785 size_hw_ref_frames = ref_device->pcm_profile->config.period_size; 1786 if (in->hw_ref_buf_size < size_hw_ref_frames) { 1787 in->hw_ref_buf_size = size_hw_ref_frames; 1788 in->hw_ref_buf = (int16_t *) realloc(in->hw_ref_buf, size_hw_ref_bytes); 1789 ALOG_ASSERT((in->hw_ref_buf != NULL), 1790 "get_next_buffer() failed to reallocate hw_ref_buf"); 1791 ALOGV("get_next_buffer(): hw_ref_buf %p extended to %zd bytes", 1792 in->hw_ref_buf, size_hw_ref_bytes); 1793 } 1794 1795 read_status = pcm_read(ref_device->pcm, (void*)in->hw_ref_buf, size_hw_ref_bytes); 1796 if (read_status != 0) { 1797 ALOGE("process_frames() pcm_read error for HW reference %d", read_status); 1798 b.raw = NULL; 1799 b.frame_count = 0; 1800 } 1801 else { 1802 get_capture_reference_delay(in, size_hw_ref_frames, &b); 1803 b.raw = (void *)in->hw_ref_buf; 1804 b.frame_count = size_hw_ref_frames; 1805 if (b.delay_ns != 0) 1806 b.delay_ns = -b.delay_ns; // as this is capture delay, it needs to be subtracted from the microphone delay 1807 in->echo_reference->write(in->echo_reference, &b); 1808 } 1809 } 1810 } 1811 #endif // HW_AEC_LOOPBACK 1812 #endif // PREPROCESSING_ENABLED 1813 } 1814 1815 buffer->frame_count = (buffer->frame_count > in->read_buf_frames) ? 1816 in->read_buf_frames : buffer->frame_count; 1817 buffer->i16 = in->read_buf + (in->config.period_size - in->read_buf_frames) * 1818 in->config.channels; 1819 return in->read_status; 1820 } 1821 1822 static void release_buffer(struct resampler_buffer_provider *buffer_provider, 1823 struct resampler_buffer* buffer) 1824 { 1825 struct stream_in *in; 1826 1827 if (buffer_provider == NULL || buffer == NULL) 1828 return; 1829 1830 in = (struct stream_in *)((char *)buffer_provider - 1831 offsetof(struct stream_in, buf_provider)); 1832 1833 in->read_buf_frames -= buffer->frame_count; 1834 } 1835 1836 /* read_frames() reads frames from kernel driver, down samples to capture rate 1837 * if necessary and output the number of frames requested to the buffer specified */ 1838 static ssize_t read_frames(struct stream_in *in, void *buffer, ssize_t frames) 1839 { 1840 ssize_t frames_wr = 0; 1841 1842 struct pcm_device *pcm_device; 1843 1844 if (list_empty(&in->pcm_dev_list)) { 1845 ALOGE("%s: pcm device list empty", __func__); 1846 return -EINVAL; 1847 } 1848 1849 pcm_device = node_to_item(list_head(&in->pcm_dev_list), 1850 struct pcm_device, stream_list_node); 1851 1852 while (frames_wr < frames) { 1853 size_t frames_rd = frames - frames_wr; 1854 ALOGVV("%s: frames_rd: %zd, frames_wr: %zd, in->config.channels: %d", 1855 __func__,frames_rd,frames_wr,in->config.channels); 1856 if (in->resampler != NULL) { 1857 in->resampler->resample_from_provider(in->resampler, 1858 (int16_t *)((char *)buffer + 1859 pcm_frames_to_bytes(pcm_device->pcm, frames_wr)), 1860 &frames_rd); 1861 } else { 1862 struct resampler_buffer buf = { 1863 { raw : NULL, }, 1864 frame_count : frames_rd, 1865 }; 1866 get_next_buffer(&in->buf_provider, &buf); 1867 if (buf.raw != NULL) { 1868 memcpy((char *)buffer + 1869 pcm_frames_to_bytes(pcm_device->pcm, frames_wr), 1870 buf.raw, 1871 pcm_frames_to_bytes(pcm_device->pcm, buf.frame_count)); 1872 frames_rd = buf.frame_count; 1873 } 1874 release_buffer(&in->buf_provider, &buf); 1875 } 1876 /* in->read_status is updated by getNextBuffer() also called by 1877 * in->resampler->resample_from_provider() */ 1878 if (in->read_status != 0) 1879 return in->read_status; 1880 1881 frames_wr += frames_rd; 1882 } 1883 return frames_wr; 1884 } 1885 1886 static int in_release_pcm_devices(struct stream_in *in) 1887 { 1888 struct pcm_device *pcm_device; 1889 struct listnode *node; 1890 struct listnode *next; 1891 1892 list_for_each_safe(node, next, &in->pcm_dev_list) { 1893 pcm_device = node_to_item(node, struct pcm_device, stream_list_node); 1894 list_remove(node); 1895 free(pcm_device); 1896 } 1897 1898 return 0; 1899 } 1900 1901 static int stop_input_stream(struct stream_in *in) 1902 { 1903 struct audio_usecase *uc_info; 1904 struct audio_device *adev = in->dev; 1905 1906 adev->active_input = NULL; 1907 ALOGV("%s: enter: usecase(%d: %s)", __func__, 1908 in->usecase, use_case_table[in->usecase]); 1909 uc_info = get_usecase_from_id(adev, in->usecase); 1910 if (uc_info == NULL) { 1911 ALOGE("%s: Could not find the usecase (%d) in the list", 1912 __func__, in->usecase); 1913 return -EINVAL; 1914 } 1915 1916 /* Disable the tx device */ 1917 disable_snd_device(adev, uc_info, uc_info->in_snd_device, true); 1918 1919 list_remove(&uc_info->adev_list_node); 1920 free(uc_info); 1921 1922 if (list_empty(&in->pcm_dev_list)) { 1923 ALOGE("%s: pcm device list empty", __func__); 1924 return -EINVAL; 1925 } 1926 1927 in_release_pcm_devices(in); 1928 list_init(&in->pcm_dev_list); 1929 1930 #ifdef HW_AEC_LOOPBACK 1931 if (in->hw_echo_reference) 1932 { 1933 in->hw_echo_reference = false; 1934 } 1935 #endif 1936 1937 ALOGV("%s: exit", __func__); 1938 return 0; 1939 } 1940 1941 static int start_input_stream(struct stream_in *in) 1942 { 1943 /* Enable output device and stream routing controls */ 1944 int ret = 0; 1945 bool recreate_resampler = false; 1946 struct audio_usecase *uc_info; 1947 struct audio_device *adev = in->dev; 1948 struct pcm_device_profile *pcm_profile; 1949 struct pcm_device *pcm_device; 1950 1951 ALOGV("%s: enter: usecase(%d)", __func__, in->usecase); 1952 adev->active_input = in; 1953 pcm_profile = get_pcm_device(in->usecase_type, in->devices); 1954 if (pcm_profile == NULL) { 1955 ALOGE("%s: Could not find PCM device id for the usecase(%d)", 1956 __func__, in->usecase); 1957 ret = -EINVAL; 1958 goto error_config; 1959 } 1960 1961 uc_info = (struct audio_usecase *)calloc(1, sizeof(struct audio_usecase)); 1962 uc_info->id = in->usecase; 1963 uc_info->type = PCM_CAPTURE; 1964 uc_info->stream = (struct audio_stream *)in; 1965 uc_info->devices = in->devices; 1966 uc_info->in_snd_device = SND_DEVICE_NONE; 1967 uc_info->out_snd_device = SND_DEVICE_NONE; 1968 1969 pcm_device = (struct pcm_device *)calloc(1, sizeof(struct pcm_device)); 1970 pcm_device->pcm_profile = pcm_profile; 1971 list_init(&in->pcm_dev_list); 1972 list_add_tail(&in->pcm_dev_list, &pcm_device->stream_list_node); 1973 1974 list_init(&uc_info->mixer_list); 1975 list_add_tail(&uc_info->mixer_list, 1976 &adev_get_mixer_for_card(adev, 1977 pcm_device->pcm_profile->card)->uc_list_node[uc_info->id]); 1978 1979 list_add_tail(&adev->usecase_list, &uc_info->adev_list_node); 1980 1981 select_devices(adev, in->usecase); 1982 1983 /* Config should be updated as profile can be changed between different calls 1984 * to this function: 1985 * - Trigger resampler creation 1986 * - Config needs to be updated */ 1987 if (in->config.rate != pcm_profile->config.rate) { 1988 recreate_resampler = true; 1989 } 1990 in->config = pcm_profile->config; 1991 1992 #ifdef PREPROCESSING_ENABLED 1993 if (in->aux_channels_changed) { 1994 in->config.channels = audio_channel_count_from_in_mask(in->main_channels | in->aux_channels); 1995 recreate_resampler = true; 1996 } 1997 #endif 1998 1999 if (in->requested_rate != in->config.rate) { 2000 recreate_resampler = true; 2001 } 2002 2003 if (recreate_resampler) { 2004 if (in->resampler) { 2005 release_resampler(in->resampler); 2006 in->resampler = NULL; 2007 } 2008 in->buf_provider.get_next_buffer = get_next_buffer; 2009 in->buf_provider.release_buffer = release_buffer; 2010 ret = create_resampler(in->config.rate, 2011 in->requested_rate, 2012 in->config.channels, 2013 RESAMPLER_QUALITY_DEFAULT, 2014 &in->buf_provider, 2015 &in->resampler); 2016 } 2017 2018 #ifdef PREPROCESSING_ENABLED 2019 if (in->enable_aec && in->echo_reference == NULL) { 2020 in->echo_reference = get_echo_reference(adev, 2021 AUDIO_FORMAT_PCM_16_BIT, 2022 audio_channel_count_from_in_mask(in->main_channels), 2023 in->requested_rate 2024 ); 2025 } 2026 2027 #ifdef HW_AEC_LOOPBACK 2028 if (in->enable_aec) { 2029 ret = get_hw_echo_reference(in); 2030 if (ret!=0) 2031 goto error_open; 2032 2033 /* force ref buffer reallocation */ 2034 in->hw_ref_buf_size = 0; 2035 } 2036 #endif 2037 #endif 2038 2039 /* Open the PCM device. 2040 * The HW is limited to support only the default pcm_profile settings. 2041 * As such a change in aux_channels will not have an effect. 2042 */ 2043 ALOGV("%s: Opening PCM device card_id(%d) device_id(%d), channels %d, smp rate %d format %d, \ 2044 period_size %d", __func__, pcm_device->pcm_profile->card, pcm_device->pcm_profile->id, 2045 pcm_device->pcm_profile->config.channels,pcm_device->pcm_profile->config.rate, 2046 pcm_device->pcm_profile->config.format, pcm_device->pcm_profile->config.period_size); 2047 2048 if (pcm_profile->type == PCM_HOTWORD_STREAMING) { 2049 if (!adev->sound_trigger_open_for_streaming) { 2050 ALOGE("%s: No handle to sound trigger HAL", __func__); 2051 ret = -EIO; 2052 goto error_open; 2053 } 2054 pcm_device->pcm = NULL; 2055 pcm_device->sound_trigger_handle = adev->sound_trigger_open_for_streaming(); 2056 if (pcm_device->sound_trigger_handle <= 0) { 2057 ALOGE("%s: Failed to open DSP for streaming", __func__); 2058 ret = -EIO; 2059 goto error_open; 2060 } 2061 ALOGV("Opened DSP successfully"); 2062 } else { 2063 pcm_device->sound_trigger_handle = 0; 2064 pcm_device->pcm = pcm_open(pcm_device->pcm_profile->card, pcm_device->pcm_profile->id, 2065 PCM_IN | PCM_MONOTONIC, &pcm_device->pcm_profile->config); 2066 2067 if (pcm_device->pcm && !pcm_is_ready(pcm_device->pcm)) { 2068 ALOGE("%s: %s", __func__, pcm_get_error(pcm_device->pcm)); 2069 pcm_close(pcm_device->pcm); 2070 pcm_device->pcm = NULL; 2071 ret = -EIO; 2072 goto error_open; 2073 } 2074 } 2075 2076 /* force read and proc buffer reallocation in case of frame size or 2077 * channel count change */ 2078 in->proc_buf_frames = 0; 2079 in->proc_buf_size = 0; 2080 in->read_buf_size = 0; 2081 in->read_buf_frames = 0; 2082 2083 /* if no supported sample rate is available, use the resampler */ 2084 if (in->resampler) { 2085 in->resampler->reset(in->resampler); 2086 } 2087 2088 ALOGV("%s: exit", __func__); 2089 return ret; 2090 2091 error_open: 2092 if (in->resampler) { 2093 release_resampler(in->resampler); 2094 in->resampler = NULL; 2095 } 2096 stop_input_stream(in); 2097 2098 error_config: 2099 ALOGD("%s: exit: status(%d)", __func__, ret); 2100 adev->active_input = NULL; 2101 return ret; 2102 } 2103 2104 void lock_input_stream(struct stream_in *in) 2105 { 2106 pthread_mutex_lock(&in->pre_lock); 2107 pthread_mutex_lock(&in->lock); 2108 pthread_mutex_unlock(&in->pre_lock); 2109 } 2110 2111 void lock_output_stream(struct stream_out *out) 2112 { 2113 pthread_mutex_lock(&out->pre_lock); 2114 pthread_mutex_lock(&out->lock); 2115 pthread_mutex_unlock(&out->pre_lock); 2116 } 2117 2118 2119 /* must be called with out->lock locked */ 2120 static int send_offload_cmd_l(struct stream_out* out, int command) 2121 { 2122 struct offload_cmd *cmd = (struct offload_cmd *)calloc(1, sizeof(struct offload_cmd)); 2123 2124 ALOGVV("%s %d", __func__, command); 2125 2126 cmd->cmd = command; 2127 list_add_tail(&out->offload_cmd_list, &cmd->node); 2128 pthread_cond_signal(&out->offload_cond); 2129 return 0; 2130 } 2131 2132 /* must be called iwth out->lock locked */ 2133 static void stop_compressed_output_l(struct stream_out *out) 2134 { 2135 out->send_new_metadata = 1; 2136 if (out->compr != NULL) { 2137 compress_stop(out->compr); 2138 while (out->offload_thread_blocked) { 2139 pthread_cond_wait(&out->cond, &out->lock); 2140 } 2141 } 2142 } 2143 2144 static void *offload_thread_loop(void *context) 2145 { 2146 struct stream_out *out = (struct stream_out *) context; 2147 struct listnode *item; 2148 2149 setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_AUDIO); 2150 set_sched_policy(0, SP_FOREGROUND); 2151 prctl(PR_SET_NAME, (unsigned long)"Offload Callback", 0, 0, 0); 2152 2153 ALOGV("%s", __func__); 2154 lock_output_stream(out); 2155 for (;;) { 2156 struct offload_cmd *cmd = NULL; 2157 stream_callback_event_t event; 2158 bool send_callback = false; 2159 2160 ALOGVV("%s offload_cmd_list %d out->offload_state %d", 2161 __func__, list_empty(&out->offload_cmd_list), 2162 out->offload_state); 2163 if (list_empty(&out->offload_cmd_list)) { 2164 ALOGV("%s SLEEPING", __func__); 2165 pthread_cond_wait(&out->offload_cond, &out->lock); 2166 ALOGV("%s RUNNING", __func__); 2167 continue; 2168 } 2169 2170 item = list_head(&out->offload_cmd_list); 2171 cmd = node_to_item(item, struct offload_cmd, node); 2172 list_remove(item); 2173 2174 ALOGVV("%s STATE %d CMD %d out->compr %p", 2175 __func__, out->offload_state, cmd->cmd, out->compr); 2176 2177 if (cmd->cmd == OFFLOAD_CMD_EXIT) { 2178 free(cmd); 2179 break; 2180 } 2181 2182 if (out->compr == NULL) { 2183 ALOGE("%s: Compress handle is NULL", __func__); 2184 pthread_cond_signal(&out->cond); 2185 continue; 2186 } 2187 out->offload_thread_blocked = true; 2188 pthread_mutex_unlock(&out->lock); 2189 send_callback = false; 2190 switch(cmd->cmd) { 2191 case OFFLOAD_CMD_WAIT_FOR_BUFFER: 2192 compress_wait(out->compr, -1); 2193 send_callback = true; 2194 event = STREAM_CBK_EVENT_WRITE_READY; 2195 break; 2196 case OFFLOAD_CMD_PARTIAL_DRAIN: 2197 compress_next_track(out->compr); 2198 compress_partial_drain(out->compr); 2199 send_callback = true; 2200 event = STREAM_CBK_EVENT_DRAIN_READY; 2201 break; 2202 case OFFLOAD_CMD_DRAIN: 2203 compress_drain(out->compr); 2204 send_callback = true; 2205 event = STREAM_CBK_EVENT_DRAIN_READY; 2206 break; 2207 default: 2208 ALOGE("%s unknown command received: %d", __func__, cmd->cmd); 2209 break; 2210 } 2211 lock_output_stream(out); 2212 out->offload_thread_blocked = false; 2213 pthread_cond_signal(&out->cond); 2214 if (send_callback) { 2215 out->offload_callback(event, NULL, out->offload_cookie); 2216 } 2217 free(cmd); 2218 } 2219 2220 pthread_cond_signal(&out->cond); 2221 while (!list_empty(&out->offload_cmd_list)) { 2222 item = list_head(&out->offload_cmd_list); 2223 list_remove(item); 2224 free(node_to_item(item, struct offload_cmd, node)); 2225 } 2226 pthread_mutex_unlock(&out->lock); 2227 2228 return NULL; 2229 } 2230 2231 static int create_offload_callback_thread(struct stream_out *out) 2232 { 2233 pthread_cond_init(&out->offload_cond, (const pthread_condattr_t *) NULL); 2234 list_init(&out->offload_cmd_list); 2235 pthread_create(&out->offload_thread, (const pthread_attr_t *) NULL, 2236 offload_thread_loop, out); 2237 return 0; 2238 } 2239 2240 static int destroy_offload_callback_thread(struct stream_out *out) 2241 { 2242 lock_output_stream(out); 2243 send_offload_cmd_l(out, OFFLOAD_CMD_EXIT); 2244 2245 pthread_mutex_unlock(&out->lock); 2246 pthread_join(out->offload_thread, (void **) NULL); 2247 pthread_cond_destroy(&out->offload_cond); 2248 2249 return 0; 2250 } 2251 2252 static int uc_release_pcm_devices(struct audio_usecase *usecase) 2253 { 2254 struct stream_out *out = (struct stream_out *)usecase->stream; 2255 struct pcm_device *pcm_device; 2256 struct listnode *node; 2257 struct listnode *next; 2258 2259 list_for_each_safe(node, next, &out->pcm_dev_list) { 2260 pcm_device = node_to_item(node, struct pcm_device, stream_list_node); 2261 list_remove(node); 2262 free(pcm_device); 2263 } 2264 list_init(&usecase->mixer_list); 2265 2266 return 0; 2267 } 2268 2269 static int uc_select_pcm_devices(struct audio_usecase *usecase) 2270 2271 { 2272 struct stream_out *out = (struct stream_out *)usecase->stream; 2273 struct pcm_device *pcm_device; 2274 struct pcm_device_profile *pcm_profile; 2275 struct mixer_card *mixer_card; 2276 audio_devices_t devices = usecase->devices; 2277 2278 list_init(&usecase->mixer_list); 2279 list_init(&out->pcm_dev_list); 2280 2281 while ((pcm_profile = get_pcm_device(usecase->type, devices)) != NULL) { 2282 pcm_device = calloc(1, sizeof(struct pcm_device)); 2283 pcm_device->pcm_profile = pcm_profile; 2284 list_add_tail(&out->pcm_dev_list, &pcm_device->stream_list_node); 2285 mixer_card = uc_get_mixer_for_card(usecase, pcm_profile->card); 2286 if (mixer_card == NULL) { 2287 mixer_card = adev_get_mixer_for_card(out->dev, pcm_profile->card); 2288 list_add_tail(&usecase->mixer_list, &mixer_card->uc_list_node[usecase->id]); 2289 } 2290 devices &= ~pcm_profile->devices; 2291 } 2292 2293 return 0; 2294 } 2295 2296 static int out_close_pcm_devices(struct stream_out *out) 2297 { 2298 struct pcm_device *pcm_device; 2299 struct listnode *node; 2300 struct audio_device *adev = out->dev; 2301 2302 list_for_each(node, &out->pcm_dev_list) { 2303 pcm_device = node_to_item(node, struct pcm_device, stream_list_node); 2304 if (pcm_device->sound_trigger_handle > 0) { 2305 adev->sound_trigger_close_for_streaming(pcm_device->sound_trigger_handle); 2306 pcm_device->sound_trigger_handle = 0; 2307 } 2308 if (pcm_device->pcm) { 2309 pcm_close(pcm_device->pcm); 2310 pcm_device->pcm = NULL; 2311 } 2312 if (pcm_device->resampler) { 2313 release_resampler(pcm_device->resampler); 2314 pcm_device->resampler = NULL; 2315 } 2316 if (pcm_device->res_buffer) { 2317 free(pcm_device->res_buffer); 2318 pcm_device->res_buffer = NULL; 2319 } 2320 } 2321 2322 return 0; 2323 } 2324 2325 static int out_open_pcm_devices(struct stream_out *out) 2326 { 2327 struct pcm_device *pcm_device; 2328 struct listnode *node; 2329 int ret = 0; 2330 2331 list_for_each(node, &out->pcm_dev_list) { 2332 pcm_device = node_to_item(node, struct pcm_device, stream_list_node); 2333 ALOGV("%s: Opening PCM device card_id(%d) device_id(%d)", 2334 __func__, pcm_device->pcm_profile->card, pcm_device->pcm_profile->id); 2335 2336 pcm_device->pcm = pcm_open(pcm_device->pcm_profile->card, pcm_device->pcm_profile->id, 2337 PCM_OUT | PCM_MONOTONIC, &pcm_device->pcm_profile->config); 2338 2339 if (pcm_device->pcm && !pcm_is_ready(pcm_device->pcm)) { 2340 ALOGE("%s: %s", __func__, pcm_get_error(pcm_device->pcm)); 2341 pcm_device->pcm = NULL; 2342 ret = -EIO; 2343 goto error_open; 2344 } 2345 /* 2346 * If the stream rate differs from the PCM rate, we need to 2347 * create a resampler. 2348 */ 2349 if (out->sample_rate != pcm_device->pcm_profile->config.rate) { 2350 ALOGV("%s: create_resampler(), pcm_device_card(%d), pcm_device_id(%d), \ 2351 out_rate(%d), device_rate(%d)",__func__, 2352 pcm_device->pcm_profile->card, pcm_device->pcm_profile->id, 2353 out->sample_rate, pcm_device->pcm_profile->config.rate); 2354 ret = create_resampler(out->sample_rate, 2355 pcm_device->pcm_profile->config.rate, 2356 audio_channel_count_from_out_mask(out->channel_mask), 2357 RESAMPLER_QUALITY_DEFAULT, 2358 NULL, 2359 &pcm_device->resampler); 2360 pcm_device->res_byte_count = 0; 2361 pcm_device->res_buffer = NULL; 2362 } 2363 } 2364 return ret; 2365 2366 error_open: 2367 out_close_pcm_devices(out); 2368 return ret; 2369 } 2370 2371 static int disable_output_path_l(struct stream_out *out) 2372 { 2373 struct audio_device *adev = out->dev; 2374 struct audio_usecase *uc_info; 2375 2376 uc_info = get_usecase_from_id(adev, out->usecase); 2377 if (uc_info == NULL) { 2378 ALOGE("%s: Could not find the usecase (%d) in the list", 2379 __func__, out->usecase); 2380 return -EINVAL; 2381 } 2382 disable_snd_device(adev, uc_info, uc_info->out_snd_device, true); 2383 uc_release_pcm_devices(uc_info); 2384 list_remove(&uc_info->adev_list_node); 2385 free(uc_info); 2386 2387 return 0; 2388 } 2389 2390 static void enable_output_path_l(struct stream_out *out) 2391 { 2392 struct audio_device *adev = out->dev; 2393 struct audio_usecase *uc_info; 2394 2395 uc_info = (struct audio_usecase *)calloc(1, sizeof(struct audio_usecase)); 2396 uc_info->id = out->usecase; 2397 uc_info->type = PCM_PLAYBACK; 2398 uc_info->stream = (struct audio_stream *)out; 2399 uc_info->devices = out->devices; 2400 uc_info->in_snd_device = SND_DEVICE_NONE; 2401 uc_info->out_snd_device = SND_DEVICE_NONE; 2402 uc_select_pcm_devices(uc_info); 2403 2404 list_add_tail(&adev->usecase_list, &uc_info->adev_list_node); 2405 select_devices(adev, out->usecase); 2406 } 2407 2408 static int stop_output_stream(struct stream_out *out) 2409 { 2410 int ret = 0; 2411 struct audio_device *adev = out->dev; 2412 bool do_disable = true; 2413 2414 ALOGV("%s: enter: usecase(%d: %s)", __func__, 2415 out->usecase, use_case_table[out->usecase]); 2416 2417 if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD && 2418 adev->offload_fx_stop_output != NULL) { 2419 adev->offload_fx_stop_output(out->handle); 2420 2421 if (out->offload_state == OFFLOAD_STATE_PAUSED || 2422 out->offload_state == OFFLOAD_STATE_PAUSED_FLUSHED) 2423 do_disable = false; 2424 out->offload_state = OFFLOAD_STATE_IDLE; 2425 } 2426 if (do_disable) 2427 ret = disable_output_path_l(out); 2428 2429 ALOGV("%s: exit: status(%d)", __func__, ret); 2430 return ret; 2431 } 2432 2433 static int start_output_stream(struct stream_out *out) 2434 { 2435 int ret = 0; 2436 struct audio_device *adev = out->dev; 2437 2438 ALOGV("%s: enter: usecase(%d: %s) devices(%#x) channels(%d)", 2439 __func__, out->usecase, use_case_table[out->usecase], out->devices, out->config.channels); 2440 2441 enable_output_path_l(out); 2442 2443 if (out->usecase != USECASE_AUDIO_PLAYBACK_OFFLOAD) { 2444 out->compr = NULL; 2445 ret = out_open_pcm_devices(out); 2446 if (ret != 0) 2447 goto error_open; 2448 #ifdef PREPROCESSING_ENABLED 2449 out->echo_reference = NULL; 2450 out->echo_reference_generation = adev->echo_reference_generation; 2451 if (adev->echo_reference != NULL) 2452 out->echo_reference = adev->echo_reference; 2453 #endif 2454 } else { 2455 out->compr = compress_open(COMPRESS_CARD, COMPRESS_DEVICE, 2456 COMPRESS_IN, &out->compr_config); 2457 if (out->compr && !is_compress_ready(out->compr)) { 2458 ALOGE("%s: %s", __func__, compress_get_error(out->compr)); 2459 compress_close(out->compr); 2460 out->compr = NULL; 2461 ret = -EIO; 2462 goto error_open; 2463 } 2464 if (out->offload_callback) 2465 compress_nonblock(out->compr, out->non_blocking); 2466 2467 if (adev->offload_fx_start_output != NULL) 2468 adev->offload_fx_start_output(out->handle); 2469 } 2470 ALOGV("%s: exit", __func__); 2471 return 0; 2472 error_open: 2473 stop_output_stream(out); 2474 error_config: 2475 return ret; 2476 } 2477 2478 static int stop_voice_call(struct audio_device *adev) 2479 { 2480 struct audio_usecase *uc_info; 2481 2482 ALOGV("%s: enter", __func__); 2483 adev->in_call = false; 2484 2485 /* TODO: implement voice call stop */ 2486 2487 uc_info = get_usecase_from_id(adev, USECASE_VOICE_CALL); 2488 if (uc_info == NULL) { 2489 ALOGE("%s: Could not find the usecase (%d) in the list", 2490 __func__, USECASE_VOICE_CALL); 2491 return -EINVAL; 2492 } 2493 2494 disable_snd_device(adev, uc_info, uc_info->out_snd_device, false); 2495 disable_snd_device(adev, uc_info, uc_info->in_snd_device, true); 2496 2497 uc_release_pcm_devices(uc_info); 2498 list_remove(&uc_info->adev_list_node); 2499 free(uc_info); 2500 2501 ALOGV("%s: exit", __func__); 2502 return 0; 2503 } 2504 2505 /* always called with adev lock held */ 2506 static int start_voice_call(struct audio_device *adev) 2507 { 2508 struct audio_usecase *uc_info; 2509 2510 ALOGV("%s: enter", __func__); 2511 2512 uc_info = (struct audio_usecase *)calloc(1, sizeof(struct audio_usecase)); 2513 uc_info->id = USECASE_VOICE_CALL; 2514 uc_info->type = VOICE_CALL; 2515 uc_info->stream = (struct audio_stream *)adev->primary_output; 2516 uc_info->devices = adev->primary_output->devices; 2517 uc_info->in_snd_device = SND_DEVICE_NONE; 2518 uc_info->out_snd_device = SND_DEVICE_NONE; 2519 2520 uc_select_pcm_devices(uc_info); 2521 2522 list_add_tail(&adev->usecase_list, &uc_info->adev_list_node); 2523 2524 select_devices(adev, USECASE_VOICE_CALL); 2525 2526 2527 /* TODO: implement voice call start */ 2528 2529 /* set cached volume */ 2530 set_voice_volume_l(adev, adev->voice_volume); 2531 2532 adev->in_call = true; 2533 ALOGV("%s: exit", __func__); 2534 return 0; 2535 } 2536 2537 static int check_input_parameters(uint32_t sample_rate, 2538 audio_format_t format, 2539 int channel_count) 2540 { 2541 if (format != AUDIO_FORMAT_PCM_16_BIT) return -EINVAL; 2542 2543 if ((channel_count < 1) || (channel_count > 2)) return -EINVAL; 2544 2545 switch (sample_rate) { 2546 case 8000: 2547 case 11025: 2548 case 12000: 2549 case 16000: 2550 case 22050: 2551 case 24000: 2552 case 32000: 2553 case 44100: 2554 case 48000: 2555 break; 2556 default: 2557 return -EINVAL; 2558 } 2559 2560 return 0; 2561 } 2562 2563 static size_t get_input_buffer_size(uint32_t sample_rate, 2564 audio_format_t format, 2565 int channel_count, 2566 usecase_type_t usecase_type, 2567 audio_devices_t devices) 2568 { 2569 size_t size = 0; 2570 struct pcm_device_profile *pcm_profile; 2571 2572 if (check_input_parameters(sample_rate, format, channel_count) != 0) 2573 return 0; 2574 2575 pcm_profile = get_pcm_device(usecase_type, devices); 2576 if (pcm_profile == NULL) 2577 return 0; 2578 2579 /* 2580 * take resampling into account and return the closest majoring 2581 * multiple of 16 frames, as audioflinger expects audio buffers to 2582 * be a multiple of 16 frames 2583 */ 2584 size = (pcm_profile->config.period_size * sample_rate) / pcm_profile->config.rate; 2585 size = ((size + 15) / 16) * 16; 2586 2587 return (size * channel_count * audio_bytes_per_sample(format)); 2588 2589 } 2590 2591 static uint32_t out_get_sample_rate(const struct audio_stream *stream) 2592 { 2593 struct stream_out *out = (struct stream_out *)stream; 2594 2595 return out->sample_rate; 2596 } 2597 2598 static int out_set_sample_rate(struct audio_stream *stream, uint32_t rate) 2599 { 2600 (void)stream; 2601 (void)rate; 2602 return -ENOSYS; 2603 } 2604 2605 static size_t out_get_buffer_size(const struct audio_stream *stream) 2606 { 2607 struct stream_out *out = (struct stream_out *)stream; 2608 2609 if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) { 2610 return out->compr_config.fragment_size; 2611 } 2612 2613 return out->config.period_size * 2614 audio_stream_out_frame_size((const struct audio_stream_out *)stream); 2615 } 2616 2617 static uint32_t out_get_channels(const struct audio_stream *stream) 2618 { 2619 struct stream_out *out = (struct stream_out *)stream; 2620 2621 return out->channel_mask; 2622 } 2623 2624 static audio_format_t out_get_format(const struct audio_stream *stream) 2625 { 2626 struct stream_out *out = (struct stream_out *)stream; 2627 2628 return out->format; 2629 } 2630 2631 static int out_set_format(struct audio_stream *stream, audio_format_t format) 2632 { 2633 (void)stream; 2634 (void)format; 2635 return -ENOSYS; 2636 } 2637 2638 static int do_out_standby_l(struct stream_out *out) 2639 { 2640 struct audio_device *adev = out->dev; 2641 int status = 0; 2642 2643 out->standby = true; 2644 if (out->usecase != USECASE_AUDIO_PLAYBACK_OFFLOAD) { 2645 out_close_pcm_devices(out); 2646 #ifdef PREPROCESSING_ENABLED 2647 /* stop writing to echo reference */ 2648 if (out->echo_reference != NULL) { 2649 out->echo_reference->write(out->echo_reference, NULL); 2650 if (out->echo_reference_generation != adev->echo_reference_generation) { 2651 ALOGV("%s: release_echo_reference %p", __func__, out->echo_reference); 2652 release_echo_reference(out->echo_reference); 2653 out->echo_reference_generation = adev->echo_reference_generation; 2654 } 2655 out->echo_reference = NULL; 2656 } 2657 #endif 2658 } else { 2659 stop_compressed_output_l(out); 2660 out->gapless_mdata.encoder_delay = 0; 2661 out->gapless_mdata.encoder_padding = 0; 2662 if (out->compr != NULL) { 2663 compress_close(out->compr); 2664 out->compr = NULL; 2665 } 2666 } 2667 status = stop_output_stream(out); 2668 2669 return status; 2670 } 2671 2672 static int out_standby(struct audio_stream *stream) 2673 { 2674 struct stream_out *out = (struct stream_out *)stream; 2675 struct audio_device *adev = out->dev; 2676 2677 ALOGV("%s: enter: usecase(%d: %s)", __func__, 2678 out->usecase, use_case_table[out->usecase]); 2679 lock_output_stream(out); 2680 if (!out->standby) { 2681 pthread_mutex_lock(&adev->lock); 2682 do_out_standby_l(out); 2683 pthread_mutex_unlock(&adev->lock); 2684 } 2685 pthread_mutex_unlock(&out->lock); 2686 ALOGV("%s: exit", __func__); 2687 return 0; 2688 } 2689 2690 static int out_dump(const struct audio_stream *stream, int fd) 2691 { 2692 (void)stream; 2693 (void)fd; 2694 2695 return 0; 2696 } 2697 2698 static int parse_compress_metadata(struct stream_out *out, struct str_parms *parms) 2699 { 2700 int ret = 0; 2701 char value[32]; 2702 struct compr_gapless_mdata tmp_mdata; 2703 2704 if (!out || !parms) { 2705 return -EINVAL; 2706 } 2707 2708 ret = str_parms_get_str(parms, AUDIO_OFFLOAD_CODEC_DELAY_SAMPLES, value, sizeof(value)); 2709 if (ret >= 0) { 2710 tmp_mdata.encoder_delay = atoi(value); /* what is a good limit check? */ 2711 } else { 2712 return -EINVAL; 2713 } 2714 2715 ret = str_parms_get_str(parms, AUDIO_OFFLOAD_CODEC_PADDING_SAMPLES, value, sizeof(value)); 2716 if (ret >= 0) { 2717 tmp_mdata.encoder_padding = atoi(value); 2718 } else { 2719 return -EINVAL; 2720 } 2721 2722 out->gapless_mdata = tmp_mdata; 2723 out->send_new_metadata = 1; 2724 ALOGV("%s new encoder delay %u and padding %u", __func__, 2725 out->gapless_mdata.encoder_delay, out->gapless_mdata.encoder_padding); 2726 2727 return 0; 2728 } 2729 2730 2731 static int out_set_parameters(struct audio_stream *stream, const char *kvpairs) 2732 { 2733 struct stream_out *out = (struct stream_out *)stream; 2734 struct audio_device *adev = out->dev; 2735 struct audio_usecase *usecase; 2736 struct listnode *node; 2737 struct str_parms *parms; 2738 char value[32]; 2739 int ret, val = 0; 2740 struct audio_usecase *uc_info; 2741 bool do_standby = false; 2742 struct pcm_device *pcm_device; 2743 struct pcm_device_profile *pcm_profile; 2744 #ifdef PREPROCESSING_ENABLED 2745 struct stream_in *in = NULL; /* if non-NULL, then force input to standby */ 2746 #endif 2747 2748 ALOGD("%s: enter: usecase(%d: %s) kvpairs: %s out->devices(%d) adev->mode(%d)", 2749 __func__, out->usecase, use_case_table[out->usecase], kvpairs, out->devices, adev->mode); 2750 parms = str_parms_create_str(kvpairs); 2751 ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_ROUTING, value, sizeof(value)); 2752 if (ret >= 0) { 2753 val = atoi(value); 2754 pthread_mutex_lock(&adev->lock_inputs); 2755 lock_output_stream(out); 2756 pthread_mutex_lock(&adev->lock); 2757 #ifdef PREPROCESSING_ENABLED 2758 if (((int)out->devices != val) && (val != 0) && (!out->standby) && 2759 (out->usecase == USECASE_AUDIO_PLAYBACK)) { 2760 /* reset active input: 2761 * - to attach the echo reference 2762 * - because a change in output device may change mic settings */ 2763 if (adev->active_input && (adev->active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION || 2764 adev->active_input->source == AUDIO_SOURCE_MIC)) { 2765 in = adev->active_input; 2766 } 2767 } 2768 #endif 2769 if (val != 0) { 2770 out->devices = val; 2771 2772 if (!out->standby) { 2773 uc_info = get_usecase_from_id(adev, out->usecase); 2774 if (uc_info == NULL) { 2775 ALOGE("%s: Could not find the usecase (%d) in the list", 2776 __func__, out->usecase); 2777 } else { 2778 list_for_each(node, &out->pcm_dev_list) { 2779 pcm_device = node_to_item(node, struct pcm_device, stream_list_node); 2780 if ((pcm_device->pcm_profile->devices & val) == 0) 2781 do_standby = true; 2782 val &= ~pcm_device->pcm_profile->devices; 2783 } 2784 if (val != 0) 2785 do_standby = true; 2786 } 2787 if (do_standby) 2788 do_out_standby_l(out); 2789 else { 2790 if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) { 2791 uc_info = get_usecase_from_id(adev, USECASE_AUDIO_PLAYBACK); 2792 if (uc_info == NULL) { 2793 ALOGE("%s: Could not find the usecase (%d) in the list", 2794 __func__, USECASE_AUDIO_PLAYBACK); 2795 } 2796 if (uc_info != NULL && uc_info->out_snd_device == SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES) { 2797 ALOGD("Out_set_param: spk+headset enabled\n"); 2798 disable_snd_device(adev, uc_info, SND_DEVICE_OUT_SPEAKER, true); 2799 uc_info->out_snd_device = SND_DEVICE_OUT_HEADPHONES; 2800 } 2801 } 2802 select_devices(adev, out->usecase); 2803 } 2804 } 2805 2806 if ((adev->mode == AUDIO_MODE_IN_CALL) && !adev->in_call && 2807 (out == adev->primary_output)) { 2808 start_voice_call(adev); 2809 } else if ((adev->mode == AUDIO_MODE_IN_CALL) && adev->in_call && 2810 (out == adev->primary_output)) { 2811 select_devices(adev, USECASE_VOICE_CALL); 2812 } 2813 } 2814 2815 if ((adev->mode == AUDIO_MODE_NORMAL) && adev->in_call && 2816 (out == adev->primary_output)) { 2817 stop_voice_call(adev); 2818 } 2819 pthread_mutex_unlock(&adev->lock); 2820 pthread_mutex_unlock(&out->lock); 2821 #ifdef PREPROCESSING_ENABLED 2822 if (in) { 2823 /* The lock on adev->lock_inputs prevents input stream from being closed */ 2824 lock_input_stream(in); 2825 pthread_mutex_lock(&adev->lock); 2826 LOG_ALWAYS_FATAL_IF(in != adev->active_input); 2827 do_in_standby_l(in); 2828 pthread_mutex_unlock(&adev->lock); 2829 pthread_mutex_unlock(&in->lock); 2830 } 2831 #endif 2832 pthread_mutex_unlock(&adev->lock_inputs); 2833 } 2834 2835 if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) { 2836 parse_compress_metadata(out, parms); 2837 } 2838 2839 str_parms_destroy(parms); 2840 2841 if (ret > 0) 2842 ret = 0; 2843 ALOGV("%s: exit: code(%d)", __func__, ret); 2844 return ret; 2845 } 2846 2847 static char* out_get_parameters(const struct audio_stream *stream, const char *keys) 2848 { 2849 struct stream_out *out = (struct stream_out *)stream; 2850 struct str_parms *query = str_parms_create_str(keys); 2851 char *str; 2852 char value[256]; 2853 struct str_parms *reply = str_parms_create(); 2854 size_t i, j; 2855 int ret; 2856 bool first = true; 2857 ALOGV("%s: enter: keys - %s", __func__, keys); 2858 ret = str_parms_get_str(query, AUDIO_PARAMETER_STREAM_SUP_CHANNELS, value, sizeof(value)); 2859 if (ret >= 0) { 2860 value[0] = '\0'; 2861 i = 0; 2862 while (out->supported_channel_masks[i] != 0) { 2863 for (j = 0; j < ARRAY_SIZE(out_channels_name_to_enum_table); j++) { 2864 if (out_channels_name_to_enum_table[j].value == out->supported_channel_masks[i]) { 2865 if (!first) { 2866 strcat(value, "|"); 2867 } 2868 strcat(value, out_channels_name_to_enum_table[j].name); 2869 first = false; 2870 break; 2871 } 2872 } 2873 i++; 2874 } 2875 str_parms_add_str(reply, AUDIO_PARAMETER_STREAM_SUP_CHANNELS, value); 2876 str = str_parms_to_str(reply); 2877 } else { 2878 str = strdup(keys); 2879 } 2880 str_parms_destroy(query); 2881 str_parms_destroy(reply); 2882 ALOGV("%s: exit: returns - %s", __func__, str); 2883 return str; 2884 } 2885 2886 static uint32_t out_get_latency(const struct audio_stream_out *stream) 2887 { 2888 struct stream_out *out = (struct stream_out *)stream; 2889 2890 if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) 2891 return COMPRESS_OFFLOAD_PLAYBACK_LATENCY; 2892 2893 return (out->config.period_count * out->config.period_size * 1000) / 2894 (out->config.rate); 2895 } 2896 2897 static int out_set_volume(struct audio_stream_out *stream, float left, 2898 float right) 2899 { 2900 struct stream_out *out = (struct stream_out *)stream; 2901 struct audio_device *adev = out->dev; 2902 int offload_volume[2];//For stereo 2903 2904 if (out->usecase == USECASE_AUDIO_PLAYBACK_MULTI_CH) { 2905 /* only take left channel into account: the API is for stereo anyway */ 2906 out->muted = (left == 0.0f); 2907 return 0; 2908 } else if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) { 2909 struct mixer_ctl *ctl; 2910 struct mixer *mixer = NULL; 2911 2912 offload_volume[0] = (int)(left * COMPRESS_PLAYBACK_VOLUME_MAX); 2913 offload_volume[1] = (int)(right * COMPRESS_PLAYBACK_VOLUME_MAX); 2914 2915 mixer = mixer_open(MIXER_CARD); 2916 if (!mixer) { 2917 ALOGE("%s unable to open the mixer for card %d, aborting.", 2918 __func__, MIXER_CARD); 2919 return -EINVAL; 2920 } 2921 ctl = mixer_get_ctl_by_name(mixer, MIXER_CTL_COMPRESS_PLAYBACK_VOLUME); 2922 if (!ctl) { 2923 ALOGE("%s: Could not get ctl for mixer cmd - %s", 2924 __func__, MIXER_CTL_COMPRESS_PLAYBACK_VOLUME); 2925 mixer_close(mixer); 2926 return -EINVAL; 2927 } 2928 ALOGD("out_set_volume set offload volume (%f, %f)", left, right); 2929 mixer_ctl_set_array(ctl, offload_volume, 2930 sizeof(offload_volume)/sizeof(offload_volume[0])); 2931 mixer_close(mixer); 2932 return 0; 2933 } 2934 2935 return -ENOSYS; 2936 } 2937 2938 static void *tfa9895_config_thread(void *context) 2939 { 2940 ALOGD("%s: enter", __func__); 2941 pthread_detach(pthread_self()); 2942 struct audio_device *adev = (struct audio_device *)context; 2943 pthread_mutex_lock(&adev->tfa9895_lock); 2944 adev->tfa9895_init = 2945 adev->htc_acoustic_set_amp_mode(adev->mode, AUDIO_DEVICE_OUT_SPEAKER, 0, 0, false); 2946 if (!adev->tfa9895_init) { 2947 ALOGE("set_amp_mode failed, need to re-config again"); 2948 adev->tfa9895_mode_change |= 0x1; 2949 } 2950 ALOGI("@@##tfa9895_config_thread Done!! tfa9895_mode_change=%d", adev->tfa9895_mode_change); 2951 pthread_mutex_unlock(&adev->tfa9895_lock); 2952 dummybuf_thread_close(adev); 2953 return NULL; 2954 } 2955 2956 static int fast_set_affinity(pid_t tid) { 2957 cpu_set_t cpu_set; 2958 int cpu_num; 2959 const char *irq_procfs = "/proc/asound/irq_affinity"; 2960 FILE *fp; 2961 2962 if ((fp = fopen(irq_procfs, "r")) == NULL) { 2963 ALOGW("Procfs node %s not found", irq_procfs); 2964 return -1; 2965 } 2966 2967 if (fscanf(fp, "%d", &cpu_num) != 1) { 2968 ALOGW("Couldn't read CPU id from procfs node %s", irq_procfs); 2969 fclose(fp); 2970 return -1; 2971 } 2972 fclose(fp); 2973 2974 CPU_ZERO(&cpu_set); 2975 CPU_SET(cpu_num, &cpu_set); 2976 return sched_setaffinity(tid, sizeof(cpu_set), &cpu_set); 2977 } 2978 2979 static ssize_t out_write(struct audio_stream_out *stream, const void *buffer, 2980 size_t bytes) 2981 { 2982 struct stream_out *out = (struct stream_out *)stream; 2983 struct audio_device *adev = out->dev; 2984 ssize_t ret = 0; 2985 struct pcm_device *pcm_device; 2986 struct listnode *node; 2987 size_t frame_size = audio_stream_out_frame_size(stream); 2988 size_t frames_wr = 0, frames_rq = 0; 2989 unsigned char *data = NULL; 2990 struct pcm_config config; 2991 #ifdef PREPROCESSING_ENABLED 2992 size_t in_frames = bytes / frame_size; 2993 size_t out_frames = in_frames; 2994 struct stream_in *in = NULL; 2995 #endif 2996 pid_t tid; 2997 int err; 2998 2999 lock_output_stream(out); 3000 3001 if (out->usecase == USECASE_AUDIO_PLAYBACK && !out->is_fastmixer_affinity_set) { 3002 tid = gettid(); 3003 err = fast_set_affinity(tid); 3004 if (err < 0) { 3005 ALOGW("Couldn't set affinity for tid %d; error %d", tid, err); 3006 } 3007 out->is_fastmixer_affinity_set = true; 3008 } 3009 3010 if (out->standby) { 3011 #ifdef PREPROCESSING_ENABLED 3012 pthread_mutex_unlock(&out->lock); 3013 /* Prevent input stream from being closed */ 3014 pthread_mutex_lock(&adev->lock_inputs); 3015 lock_output_stream(out); 3016 if (!out->standby) { 3017 pthread_mutex_unlock(&adev->lock_inputs); 3018 goto false_alarm; 3019 } 3020 #endif 3021 pthread_mutex_lock(&adev->lock); 3022 ret = start_output_stream(out); 3023 /* ToDo: If use case is compress offload should return 0 */ 3024 if (ret != 0) { 3025 pthread_mutex_unlock(&adev->lock); 3026 #ifdef PREPROCESSING_ENABLED 3027 pthread_mutex_unlock(&adev->lock_inputs); 3028 #endif 3029 goto exit; 3030 } 3031 out->standby = false; 3032 3033 #ifdef PREPROCESSING_ENABLED 3034 /* A change in output device may change the microphone selection */ 3035 if (adev->active_input && 3036 (adev->active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION || 3037 adev->active_input->source == AUDIO_SOURCE_MIC)) { 3038 in = adev->active_input; 3039 ALOGV("%s: enter:) force_input_standby true", __func__); 3040 } 3041 #endif 3042 pthread_mutex_unlock(&adev->lock); 3043 #ifdef PREPROCESSING_ENABLED 3044 if (!in) { 3045 /* Leave mutex locked iff in != NULL */ 3046 pthread_mutex_unlock(&adev->lock_inputs); 3047 } 3048 #endif 3049 } 3050 false_alarm: 3051 3052 if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) { 3053 ALOGVV("%s: writing buffer (%d bytes) to compress device", __func__, bytes); 3054 3055 if (out->offload_state == OFFLOAD_STATE_PAUSED_FLUSHED) { 3056 ALOGV("start offload write from pause state"); 3057 pthread_mutex_lock(&adev->lock); 3058 enable_output_path_l(out); 3059 pthread_mutex_unlock(&adev->lock); 3060 } 3061 3062 if (out->send_new_metadata) { 3063 ALOGVV("send new gapless metadata"); 3064 compress_set_gapless_metadata(out->compr, &out->gapless_mdata); 3065 out->send_new_metadata = 0; 3066 } 3067 3068 ret = compress_write(out->compr, buffer, bytes); 3069 ALOGVV("%s: writing buffer (%d bytes) to compress device returned %d", __func__, bytes, ret); 3070 if (ret >= 0 && ret < (ssize_t)bytes) { 3071 send_offload_cmd_l(out, OFFLOAD_CMD_WAIT_FOR_BUFFER); 3072 } 3073 if (out->offload_state != OFFLOAD_STATE_PLAYING) { 3074 compress_start(out->compr); 3075 out->offload_state = OFFLOAD_STATE_PLAYING; 3076 } 3077 pthread_mutex_unlock(&out->lock); 3078 #ifdef PREPROCESSING_ENABLED 3079 if (in) { 3080 /* This mutex was left locked iff in != NULL */ 3081 pthread_mutex_unlock(&adev->lock_inputs); 3082 } 3083 #endif 3084 return ret; 3085 } else { 3086 #ifdef PREPROCESSING_ENABLED 3087 if (android_atomic_acquire_load(&adev->echo_reference_generation) 3088 != out->echo_reference_generation) { 3089 pthread_mutex_lock(&adev->lock); 3090 if (out->echo_reference != NULL) { 3091 ALOGV("%s: release_echo_reference %p", __func__, out->echo_reference); 3092 release_echo_reference(out->echo_reference); 3093 } 3094 // note that adev->echo_reference_generation here can be different from the one 3095 // tested above but it doesn't matter as we now have the adev mutex and it is consistent 3096 // with what has been set by get_echo_reference() or put_echo_reference() 3097 out->echo_reference_generation = adev->echo_reference_generation; 3098 out->echo_reference = adev->echo_reference; 3099 ALOGV("%s: update echo reference generation %d", __func__, 3100 out->echo_reference_generation); 3101 pthread_mutex_unlock(&adev->lock); 3102 } 3103 #endif 3104 3105 if (out->muted) 3106 memset((void *)buffer, 0, bytes); 3107 list_for_each(node, &out->pcm_dev_list) { 3108 pcm_device = node_to_item(node, struct pcm_device, stream_list_node); 3109 if (pcm_device->resampler) { 3110 if (bytes * pcm_device->pcm_profile->config.rate / out->sample_rate + frame_size 3111 > pcm_device->res_byte_count) { 3112 pcm_device->res_byte_count = 3113 bytes * pcm_device->pcm_profile->config.rate / out->sample_rate + frame_size; 3114 pcm_device->res_buffer = 3115 realloc(pcm_device->res_buffer, pcm_device->res_byte_count); 3116 ALOGV("%s: resampler res_byte_count = %zu", __func__, 3117 pcm_device->res_byte_count); 3118 } 3119 frames_rq = bytes / frame_size; 3120 frames_wr = pcm_device->res_byte_count / frame_size; 3121 ALOGVV("%s: resampler request frames = %d frame_size = %d", 3122 __func__, frames_rq, frame_size); 3123 pcm_device->resampler->resample_from_input(pcm_device->resampler, 3124 (int16_t *)buffer, &frames_rq, (int16_t *)pcm_device->res_buffer, &frames_wr); 3125 ALOGVV("%s: resampler output frames_= %d", __func__, frames_wr); 3126 } 3127 if (pcm_device->pcm) { 3128 #ifdef PREPROCESSING_ENABLED 3129 if (out->echo_reference != NULL && pcm_device->pcm_profile->devices != SND_DEVICE_OUT_SPEAKER) { 3130 struct echo_reference_buffer b; 3131 b.raw = (void *)buffer; 3132 b.frame_count = in_frames; 3133 3134 get_playback_delay(out, out_frames, &b); 3135 out->echo_reference->write(out->echo_reference, &b); 3136 } 3137 #endif 3138 if (adev->tfa9895_mode_change == 0x1) { 3139 if (out->devices & AUDIO_DEVICE_OUT_SPEAKER) { 3140 pthread_mutex_lock(&adev->tfa9895_lock); 3141 data = (unsigned char *) 3142 calloc(pcm_frames_to_bytes(pcm_device->pcm, out->config.period_size), 3143 sizeof(unsigned char)); 3144 if (data) { 3145 int i; 3146 3147 // reopen pcm with stop_threshold = INT_MAX/2 3148 memcpy(&config, &pcm_device->pcm_profile->config, 3149 sizeof(struct pcm_config)); 3150 config.stop_threshold = INT_MAX/2; 3151 3152 if (pcm_device->pcm) 3153 pcm_close(pcm_device->pcm); 3154 3155 for (i = 0; i < RETRY_NUMBER; i++) { 3156 pcm_device->pcm = pcm_open(pcm_device->pcm_profile->card, 3157 pcm_device->pcm_profile->id, 3158 PCM_OUT | PCM_MONOTONIC, &config); 3159 if (pcm_device->pcm != NULL && pcm_is_ready(pcm_device->pcm)) 3160 break; 3161 else 3162 usleep(10000); 3163 } 3164 if (i >= RETRY_NUMBER) 3165 ALOGE("%s: failed to reopen pcm device", __func__); 3166 3167 if (pcm_device->pcm) { 3168 for (i = out->config.period_count; i > 0; i--) 3169 pcm_write(pcm_device->pcm, (void *)data, 3170 pcm_frames_to_bytes(pcm_device->pcm, 3171 out->config.period_size)); 3172 /* TODO: Hold on 100 ms and wait i2s signal ready 3173 before giving dsp related i2c commands */ 3174 usleep(100000); 3175 adev->tfa9895_mode_change &= ~0x1; 3176 ALOGD("@@##checking - 2: tfa9895_config_thread: " 3177 "adev->tfa9895_mode_change=%d", adev->tfa9895_mode_change); 3178 adev->tfa9895_init = 3179 adev->htc_acoustic_set_amp_mode( 3180 adev->mode, AUDIO_DEVICE_OUT_SPEAKER, 0, 0, false); 3181 } 3182 free(data); 3183 3184 // reopen pcm with normal stop_threshold 3185 if (pcm_device->pcm) 3186 pcm_close(pcm_device->pcm); 3187 3188 for (i = 0; i < RETRY_NUMBER; i++) { 3189 pcm_device->pcm = pcm_open(pcm_device->pcm_profile->card, 3190 pcm_device->pcm_profile->id, 3191 PCM_OUT | PCM_MONOTONIC, &pcm_device->pcm_profile->config); 3192 if (pcm_device->pcm != NULL && pcm_is_ready(pcm_device->pcm)) 3193 break; 3194 else 3195 usleep(10000); 3196 } 3197 if (i >= RETRY_NUMBER) { 3198 ALOGE("%s: failed to reopen pcm device, error return", __func__); 3199 pthread_mutex_unlock(&adev->tfa9895_lock); 3200 pthread_mutex_unlock(&out->lock); 3201 return -1; 3202 } 3203 } 3204 } 3205 pthread_mutex_unlock(&adev->tfa9895_lock); 3206 } 3207 ALOGVV("%s: writing buffer (%d bytes) to pcm device", __func__, bytes); 3208 if (pcm_device->resampler && pcm_device->res_buffer) 3209 pcm_device->status = 3210 pcm_write(pcm_device->pcm, (void *)pcm_device->res_buffer, 3211 frames_wr * frame_size); 3212 else 3213 pcm_device->status = pcm_write(pcm_device->pcm, (void *)buffer, bytes); 3214 if (pcm_device->status != 0) 3215 ret = pcm_device->status; 3216 } 3217 } 3218 if (ret == 0) 3219 out->written += bytes / (out->config.channels * sizeof(short)); 3220 } 3221 3222 exit: 3223 pthread_mutex_unlock(&out->lock); 3224 3225 if (ret != 0) { 3226 list_for_each(node, &out->pcm_dev_list) { 3227 pcm_device = node_to_item(node, struct pcm_device, stream_list_node); 3228 if (pcm_device->pcm && pcm_device->status != 0) 3229 ALOGE("%s: error %zd - %s", __func__, ret, pcm_get_error(pcm_device->pcm)); 3230 } 3231 out_standby(&out->stream.common); 3232 usleep(bytes * 1000000 / audio_stream_out_frame_size(stream) / 3233 out_get_sample_rate(&out->stream.common)); 3234 } 3235 3236 #ifdef PREPROCESSING_ENABLED 3237 if (in) { 3238 /* The lock on adev->lock_inputs prevents input stream from being closed */ 3239 lock_input_stream(in); 3240 pthread_mutex_lock(&adev->lock); 3241 LOG_ALWAYS_FATAL_IF(in != adev->active_input); 3242 do_in_standby_l(in); 3243 pthread_mutex_unlock(&adev->lock); 3244 pthread_mutex_unlock(&in->lock); 3245 /* This mutex was left locked iff in != NULL */ 3246 pthread_mutex_unlock(&adev->lock_inputs); 3247 } 3248 #endif 3249 3250 return bytes; 3251 } 3252 3253 static int out_get_render_position(const struct audio_stream_out *stream, 3254 uint32_t *dsp_frames) 3255 { 3256 struct stream_out *out = (struct stream_out *)stream; 3257 *dsp_frames = 0; 3258 if ((out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) && (dsp_frames != NULL)) { 3259 lock_output_stream(out); 3260 if (out->compr != NULL) { 3261 compress_get_tstamp(out->compr, (unsigned long *)dsp_frames, 3262 &out->sample_rate); 3263 ALOGVV("%s rendered frames %d sample_rate %d", 3264 __func__, *dsp_frames, out->sample_rate); 3265 } 3266 pthread_mutex_unlock(&out->lock); 3267 return 0; 3268 } else 3269 return -EINVAL; 3270 } 3271 3272 static int out_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect) 3273 { 3274 (void)stream; 3275 (void)effect; 3276 return 0; 3277 } 3278 3279 static int out_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect) 3280 { 3281 (void)stream; 3282 (void)effect; 3283 return 0; 3284 } 3285 3286 static int out_get_next_write_timestamp(const struct audio_stream_out *stream, 3287 int64_t *timestamp) 3288 { 3289 (void)stream; 3290 (void)timestamp; 3291 return -EINVAL; 3292 } 3293 3294 static int out_get_presentation_position(const struct audio_stream_out *stream, 3295 uint64_t *frames, struct timespec *timestamp) 3296 { 3297 struct stream_out *out = (struct stream_out *)stream; 3298 int ret = -1; 3299 unsigned long dsp_frames; 3300 3301 lock_output_stream(out); 3302 3303 if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) { 3304 if (out->compr != NULL) { 3305 compress_get_tstamp(out->compr, &dsp_frames, 3306 &out->sample_rate); 3307 ALOGVV("%s rendered frames %ld sample_rate %d", 3308 __func__, dsp_frames, out->sample_rate); 3309 *frames = dsp_frames; 3310 ret = 0; 3311 /* this is the best we can do */ 3312 clock_gettime(CLOCK_MONOTONIC, timestamp); 3313 } 3314 } else { 3315 /* FIXME: which device to read from? */ 3316 if (!list_empty(&out->pcm_dev_list)) { 3317 unsigned int avail; 3318 struct pcm_device *pcm_device = node_to_item(list_head(&out->pcm_dev_list), 3319 struct pcm_device, stream_list_node); 3320 3321 if (pcm_get_htimestamp(pcm_device->pcm, &avail, timestamp) == 0) { 3322 size_t kernel_buffer_size = out->config.period_size * out->config.period_count; 3323 int64_t signed_frames = out->written - kernel_buffer_size + avail; 3324 /* This adjustment accounts for buffering after app processor. 3325 It is based on estimated DSP latency per use case, rather than exact. */ 3326 signed_frames -= 3327 (render_latency(out->usecase) * out->sample_rate / 1000000LL); 3328 3329 /* It would be unusual for this value to be negative, but check just in case ... */ 3330 if (signed_frames >= 0) { 3331 *frames = signed_frames; 3332 ret = 0; 3333 } 3334 } 3335 } 3336 } 3337 3338 pthread_mutex_unlock(&out->lock); 3339 3340 return ret; 3341 } 3342 3343 static int out_set_callback(struct audio_stream_out *stream, 3344 stream_callback_t callback, void *cookie) 3345 { 3346 struct stream_out *out = (struct stream_out *)stream; 3347 3348 ALOGV("%s", __func__); 3349 lock_output_stream(out); 3350 out->offload_callback = callback; 3351 out->offload_cookie = cookie; 3352 pthread_mutex_unlock(&out->lock); 3353 return 0; 3354 } 3355 3356 static int out_pause(struct audio_stream_out* stream) 3357 { 3358 struct stream_out *out = (struct stream_out *)stream; 3359 int status = -ENOSYS; 3360 ALOGV("%s", __func__); 3361 if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) { 3362 lock_output_stream(out); 3363 if (out->compr != NULL && out->offload_state == OFFLOAD_STATE_PLAYING) { 3364 status = compress_pause(out->compr); 3365 out->offload_state = OFFLOAD_STATE_PAUSED; 3366 pthread_mutex_lock(&out->dev->lock); 3367 status = disable_output_path_l(out); 3368 pthread_mutex_unlock(&out->dev->lock); 3369 } 3370 pthread_mutex_unlock(&out->lock); 3371 } 3372 return status; 3373 } 3374 3375 static int out_resume(struct audio_stream_out* stream) 3376 { 3377 struct stream_out *out = (struct stream_out *)stream; 3378 int status = -ENOSYS; 3379 ALOGV("%s", __func__); 3380 if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) { 3381 status = 0; 3382 lock_output_stream(out); 3383 if (out->compr != NULL && out->offload_state == OFFLOAD_STATE_PAUSED) { 3384 pthread_mutex_lock(&out->dev->lock); 3385 enable_output_path_l(out); 3386 pthread_mutex_unlock(&out->dev->lock); 3387 status = compress_resume(out->compr); 3388 out->offload_state = OFFLOAD_STATE_PLAYING; 3389 } 3390 pthread_mutex_unlock(&out->lock); 3391 } 3392 return status; 3393 } 3394 3395 static int out_drain(struct audio_stream_out* stream, audio_drain_type_t type ) 3396 { 3397 struct stream_out *out = (struct stream_out *)stream; 3398 int status = -ENOSYS; 3399 ALOGV("%s", __func__); 3400 if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) { 3401 lock_output_stream(out); 3402 if (type == AUDIO_DRAIN_EARLY_NOTIFY) 3403 status = send_offload_cmd_l(out, OFFLOAD_CMD_PARTIAL_DRAIN); 3404 else 3405 status = send_offload_cmd_l(out, OFFLOAD_CMD_DRAIN); 3406 pthread_mutex_unlock(&out->lock); 3407 } 3408 return status; 3409 } 3410 3411 static int out_flush(struct audio_stream_out* stream) 3412 { 3413 struct stream_out *out = (struct stream_out *)stream; 3414 ALOGV("%s", __func__); 3415 if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) { 3416 lock_output_stream(out); 3417 if (out->offload_state == OFFLOAD_STATE_PLAYING) { 3418 ALOGE("out_flush() called in wrong state %d", out->offload_state); 3419 pthread_mutex_unlock(&out->lock); 3420 return -ENOSYS; 3421 } 3422 if (out->offload_state == OFFLOAD_STATE_PAUSED) { 3423 stop_compressed_output_l(out); 3424 out->offload_state = OFFLOAD_STATE_PAUSED_FLUSHED; 3425 } 3426 pthread_mutex_unlock(&out->lock); 3427 return 0; 3428 } 3429 return -ENOSYS; 3430 } 3431 3432 /** audio_stream_in implementation **/ 3433 static uint32_t in_get_sample_rate(const struct audio_stream *stream) 3434 { 3435 struct stream_in *in = (struct stream_in *)stream; 3436 3437 return in->requested_rate; 3438 } 3439 3440 static int in_set_sample_rate(struct audio_stream *stream, uint32_t rate) 3441 { 3442 (void)stream; 3443 (void)rate; 3444 return -ENOSYS; 3445 } 3446 3447 static uint32_t in_get_channels(const struct audio_stream *stream) 3448 { 3449 struct stream_in *in = (struct stream_in *)stream; 3450 3451 return in->main_channels; 3452 } 3453 3454 static audio_format_t in_get_format(const struct audio_stream *stream) 3455 { 3456 (void)stream; 3457 return AUDIO_FORMAT_PCM_16_BIT; 3458 } 3459 3460 static int in_set_format(struct audio_stream *stream, audio_format_t format) 3461 { 3462 (void)stream; 3463 (void)format; 3464 3465 return -ENOSYS; 3466 } 3467 3468 static size_t in_get_buffer_size(const struct audio_stream *stream) 3469 { 3470 struct stream_in *in = (struct stream_in *)stream; 3471 3472 return get_input_buffer_size(in->requested_rate, 3473 in_get_format(stream), 3474 audio_channel_count_from_in_mask(in->main_channels), 3475 in->usecase_type, 3476 in->devices); 3477 } 3478 3479 static int in_close_pcm_devices(struct stream_in *in) 3480 { 3481 struct pcm_device *pcm_device; 3482 struct listnode *node; 3483 struct audio_device *adev = in->dev; 3484 3485 list_for_each(node, &in->pcm_dev_list) { 3486 pcm_device = node_to_item(node, struct pcm_device, stream_list_node); 3487 if (pcm_device) { 3488 if (pcm_device->pcm) 3489 pcm_close(pcm_device->pcm); 3490 pcm_device->pcm = NULL; 3491 if (pcm_device->sound_trigger_handle > 0) 3492 adev->sound_trigger_close_for_streaming(pcm_device->sound_trigger_handle); 3493 pcm_device->sound_trigger_handle = 0; 3494 } 3495 } 3496 return 0; 3497 } 3498 3499 3500 /* must be called with stream and hw device mutex locked */ 3501 static int do_in_standby_l(struct stream_in *in) 3502 { 3503 int status = 0; 3504 3505 #ifdef PREPROCESSING_ENABLED 3506 struct audio_device *adev = in->dev; 3507 #endif 3508 if (!in->standby) { 3509 3510 in_close_pcm_devices(in); 3511 3512 #ifdef PREPROCESSING_ENABLED 3513 if (in->echo_reference != NULL) { 3514 /* stop reading from echo reference */ 3515 in->echo_reference->read(in->echo_reference, NULL); 3516 put_echo_reference(adev, in->echo_reference); 3517 in->echo_reference = NULL; 3518 } 3519 #ifdef HW_AEC_LOOPBACK 3520 if (in->hw_echo_reference) 3521 { 3522 if (in->hw_ref_buf) { 3523 free(in->hw_ref_buf); 3524 in->hw_ref_buf = NULL; 3525 } 3526 } 3527 #endif // HW_AEC_LOOPBACK 3528 #endif // PREPROCESSING_ENABLED 3529 3530 status = stop_input_stream(in); 3531 3532 if (in->read_buf) { 3533 free(in->read_buf); 3534 in->read_buf = NULL; 3535 } 3536 3537 in->standby = 1; 3538 } 3539 return 0; 3540 } 3541 3542 // called with adev->lock_inputs locked 3543 static int in_standby_l(struct stream_in *in) 3544 { 3545 struct audio_device *adev = in->dev; 3546 int status = 0; 3547 lock_input_stream(in); 3548 if (!in->standby) { 3549 pthread_mutex_lock(&adev->lock); 3550 status = do_in_standby_l(in); 3551 pthread_mutex_unlock(&adev->lock); 3552 } 3553 pthread_mutex_unlock(&in->lock); 3554 return status; 3555 } 3556 3557 static int in_standby(struct audio_stream *stream) 3558 { 3559 struct stream_in *in = (struct stream_in *)stream; 3560 struct audio_device *adev = in->dev; 3561 int status; 3562 ALOGV("%s: enter", __func__); 3563 pthread_mutex_lock(&adev->lock_inputs); 3564 status = in_standby_l(in); 3565 pthread_mutex_unlock(&adev->lock_inputs); 3566 ALOGV("%s: exit: status(%d)", __func__, status); 3567 return status; 3568 } 3569 3570 static int in_dump(const struct audio_stream *stream, int fd) 3571 { 3572 (void)stream; 3573 (void)fd; 3574 3575 return 0; 3576 } 3577 3578 static int in_set_parameters(struct audio_stream *stream, const char *kvpairs) 3579 { 3580 struct stream_in *in = (struct stream_in *)stream; 3581 struct audio_device *adev = in->dev; 3582 struct str_parms *parms; 3583 char *str; 3584 char value[32]; 3585 int ret, val = 0; 3586 struct audio_usecase *uc_info; 3587 bool do_standby = false; 3588 struct listnode *node; 3589 struct pcm_device *pcm_device; 3590 struct pcm_device_profile *pcm_profile; 3591 3592 ALOGV("%s: enter: kvpairs=%s", __func__, kvpairs); 3593 parms = str_parms_create_str(kvpairs); 3594 3595 ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_INPUT_SOURCE, value, sizeof(value)); 3596 3597 pthread_mutex_lock(&adev->lock_inputs); 3598 lock_input_stream(in); 3599 pthread_mutex_lock(&adev->lock); 3600 if (ret >= 0) { 3601 val = atoi(value); 3602 /* no audio source uses val == 0 */ 3603 if (((int)in->source != val) && (val != 0)) { 3604 in->source = val; 3605 } 3606 } 3607 3608 ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_ROUTING, value, sizeof(value)); 3609 if (ret >= 0) { 3610 val = atoi(value); 3611 if (((int)in->devices != val) && (val != 0)) { 3612 in->devices = val; 3613 /* If recording is in progress, change the tx device to new device */ 3614 if (!in->standby) { 3615 uc_info = get_usecase_from_id(adev, in->usecase); 3616 if (uc_info == NULL) { 3617 ALOGE("%s: Could not find the usecase (%d) in the list", 3618 __func__, in->usecase); 3619 } else { 3620 if (list_empty(&in->pcm_dev_list)) 3621 ALOGE("%s: pcm device list empty", __func__); 3622 else { 3623 pcm_device = node_to_item(list_head(&in->pcm_dev_list), 3624 struct pcm_device, stream_list_node); 3625 if ((pcm_device->pcm_profile->devices & val & ~AUDIO_DEVICE_BIT_IN) == 0) { 3626 do_standby = true; 3627 } 3628 } 3629 } 3630 if (do_standby) { 3631 ret = do_in_standby_l(in); 3632 } else 3633 ret = select_devices(adev, in->usecase); 3634 } 3635 } 3636 } 3637 pthread_mutex_unlock(&adev->lock); 3638 pthread_mutex_unlock(&in->lock); 3639 pthread_mutex_unlock(&adev->lock_inputs); 3640 str_parms_destroy(parms); 3641 3642 if (ret > 0) 3643 ret = 0; 3644 3645 ALOGV("%s: exit: status(%d)", __func__, ret); 3646 return ret; 3647 } 3648 3649 static char* in_get_parameters(const struct audio_stream *stream, 3650 const char *keys) 3651 { 3652 (void)stream; 3653 (void)keys; 3654 3655 return strdup(""); 3656 } 3657 3658 static int in_set_gain(struct audio_stream_in *stream, float gain) 3659 { 3660 (void)stream; 3661 (void)gain; 3662 3663 return 0; 3664 } 3665 3666 static ssize_t read_bytes_from_dsp(struct stream_in *in, void* buffer, 3667 size_t bytes) 3668 { 3669 struct pcm_device *pcm_device; 3670 struct audio_device *adev = in->dev; 3671 3672 pcm_device = node_to_item(list_head(&in->pcm_dev_list), 3673 struct pcm_device, stream_list_node); 3674 3675 if (pcm_device->sound_trigger_handle > 0) 3676 return adev->sound_trigger_read_samples(pcm_device->sound_trigger_handle, buffer, bytes); 3677 else 3678 return 0; 3679 } 3680 3681 static ssize_t in_read(struct audio_stream_in *stream, void *buffer, 3682 size_t bytes) 3683 { 3684 struct stream_in *in = (struct stream_in *)stream; 3685 struct audio_device *adev = in->dev; 3686 ssize_t frames = -1; 3687 int ret = -1; 3688 int read_and_process_successful = false; 3689 3690 size_t frames_rq = bytes / audio_stream_in_frame_size(stream); 3691 pid_t tid; 3692 int err; 3693 3694 /* no need to acquire adev->lock_inputs because API contract prevents a close */ 3695 lock_input_stream(in); 3696 3697 if (in->usecase == USECASE_AUDIO_CAPTURE && !in->is_fastcapture_affinity_set) { 3698 tid = gettid(); 3699 err = fast_set_affinity(tid); 3700 if (err < 0) { 3701 ALOGW("Couldn't set affinity for tid %d; error %d", tid, err); 3702 } 3703 in->is_fastcapture_affinity_set = true; 3704 } 3705 3706 if (in->standby) { 3707 pthread_mutex_unlock(&in->lock); 3708 pthread_mutex_lock(&adev->lock_inputs); 3709 lock_input_stream(in); 3710 if (!in->standby) { 3711 pthread_mutex_unlock(&adev->lock_inputs); 3712 goto false_alarm; 3713 } 3714 pthread_mutex_lock(&adev->lock); 3715 ret = start_input_stream(in); 3716 pthread_mutex_unlock(&adev->lock); 3717 pthread_mutex_unlock(&adev->lock_inputs); 3718 if (ret != 0) { 3719 goto exit; 3720 } 3721 in->standby = 0; 3722 } 3723 false_alarm: 3724 3725 if (!list_empty(&in->pcm_dev_list)) { 3726 if (in->usecase == USECASE_AUDIO_CAPTURE_HOTWORD) { 3727 bytes = read_bytes_from_dsp(in, buffer, bytes); 3728 if (bytes > 0) 3729 read_and_process_successful = true; 3730 } else { 3731 /* 3732 * Read PCM and: 3733 * - resample if needed 3734 * - process if pre-processors are attached 3735 * - discard unwanted channels 3736 */ 3737 frames = read_and_process_frames(in, buffer, frames_rq); 3738 if (frames >= 0) 3739 read_and_process_successful = true; 3740 } 3741 } 3742 3743 /* 3744 * Instead of writing zeroes here, we could trust the hardware 3745 * to always provide zeroes when muted. 3746 */ 3747 if (read_and_process_successful == true && adev->mic_mute) 3748 memset(buffer, 0, bytes); 3749 3750 exit: 3751 pthread_mutex_unlock(&in->lock); 3752 3753 if (read_and_process_successful == false) { 3754 in_standby(&in->stream.common); 3755 ALOGV("%s: read failed - sleeping for buffer duration", __func__); 3756 usleep(bytes * 1000000 / audio_stream_in_frame_size(stream) / 3757 in->requested_rate); 3758 } 3759 return bytes; 3760 } 3761 3762 static uint32_t in_get_input_frames_lost(struct audio_stream_in *stream) 3763 { 3764 (void)stream; 3765 3766 return 0; 3767 } 3768 3769 static int add_remove_audio_effect(const struct audio_stream *stream, 3770 effect_handle_t effect, 3771 bool enable) 3772 { 3773 struct stream_in *in = (struct stream_in *)stream; 3774 struct audio_device *adev = in->dev; 3775 int status = 0; 3776 effect_descriptor_t desc; 3777 #ifdef PREPROCESSING_ENABLED 3778 int i; 3779 #endif 3780 status = (*effect)->get_descriptor(effect, &desc); 3781 if (status != 0) 3782 return status; 3783 3784 ALOGI("add_remove_audio_effect(), effect type: %08x, enable: %d ", desc.type.timeLow, enable); 3785 3786 pthread_mutex_lock(&adev->lock_inputs); 3787 lock_input_stream(in); 3788 pthread_mutex_lock(&in->dev->lock); 3789 #ifndef PREPROCESSING_ENABLED 3790 if ((in->source == AUDIO_SOURCE_VOICE_COMMUNICATION) && 3791 in->enable_aec != enable && 3792 (memcmp(&desc.type, FX_IID_AEC, sizeof(effect_uuid_t)) == 0)) { 3793 in->enable_aec = enable; 3794 if (!in->standby) 3795 select_devices(in->dev, in->usecase); 3796 } 3797 #else 3798 if ( (in->num_preprocessors > MAX_PREPROCESSORS) && (enable == true) ) { 3799 status = -ENOSYS; 3800 goto exit; 3801 } 3802 if ( enable == true ) { 3803 in->preprocessors[in->num_preprocessors].effect_itfe = effect; 3804 /* add the supported channel of the effect in the channel_configs */ 3805 in_read_audio_effect_channel_configs(in, &in->preprocessors[in->num_preprocessors]); 3806 in->num_preprocessors ++; 3807 /* check compatibility between main channel supported and possible auxiliary channels */ 3808 in_update_aux_channels(in, effect);//wesley crash 3809 in->aux_channels_changed = true; 3810 } else { 3811 /* if ( enable == false ) */ 3812 if (in->num_preprocessors <= 0) { 3813 status = -ENOSYS; 3814 goto exit; 3815 } 3816 status = -EINVAL; 3817 for (i=0; i < in->num_preprocessors; i++) { 3818 if (status == 0) { /* status == 0 means an effect was removed from a previous slot */ 3819 in->preprocessors[i - 1].effect_itfe = in->preprocessors[i].effect_itfe; 3820 in->preprocessors[i - 1].channel_configs = in->preprocessors[i].channel_configs; 3821 in->preprocessors[i - 1].num_channel_configs = 3822 in->preprocessors[i].num_channel_configs; 3823 ALOGV("add_remove_audio_effect moving fx from %d to %d", i, i-1); 3824 continue; 3825 } 3826 if ( in->preprocessors[i].effect_itfe == effect ) { 3827 ALOGV("add_remove_audio_effect found fx at index %d", i); 3828 free(in->preprocessors[i].channel_configs); 3829 status = 0; 3830 } 3831 } 3832 if (status != 0) 3833 goto exit; 3834 in->num_preprocessors--; 3835 /* if we remove one effect, at least the last proproc should be reset */ 3836 in->preprocessors[in->num_preprocessors].num_channel_configs = 0; 3837 in->preprocessors[in->num_preprocessors].effect_itfe = NULL; 3838 in->preprocessors[in->num_preprocessors].channel_configs = NULL; 3839 in->aux_channels_changed = false; 3840 ALOGV("%s: enable(%d), in->aux_channels_changed(%d)", __func__, enable, in->aux_channels_changed); 3841 } 3842 ALOGI("%s: num_preprocessors = %d", __func__, in->num_preprocessors); 3843 3844 if ( memcmp(&desc.type, FX_IID_AEC, sizeof(effect_uuid_t)) == 0) { 3845 in->enable_aec = enable; 3846 ALOGV("add_remove_audio_effect(), FX_IID_AEC, enable: %d", enable); 3847 if (!in->standby) { 3848 select_devices(in->dev, in->usecase); 3849 do_in_standby_l(in); 3850 } 3851 if (in->enable_aec == true) { 3852 in_configure_reverse(in); 3853 } 3854 } 3855 exit: 3856 #endif 3857 ALOGW_IF(status != 0, "add_remove_audio_effect() error %d", status); 3858 pthread_mutex_unlock(&in->dev->lock); 3859 pthread_mutex_unlock(&in->lock); 3860 pthread_mutex_unlock(&adev->lock_inputs); 3861 return status; 3862 } 3863 3864 static int in_add_audio_effect(const struct audio_stream *stream, 3865 effect_handle_t effect) 3866 { 3867 ALOGV("%s: effect %p", __func__, effect); 3868 return add_remove_audio_effect(stream, effect, true); 3869 } 3870 3871 static int in_remove_audio_effect(const struct audio_stream *stream, 3872 effect_handle_t effect) 3873 { 3874 ALOGV("%s: effect %p", __func__, effect); 3875 return add_remove_audio_effect(stream, effect, false); 3876 } 3877 3878 static int adev_open_output_stream(struct audio_hw_device *dev, 3879 audio_io_handle_t handle, 3880 audio_devices_t devices, 3881 audio_output_flags_t flags, 3882 struct audio_config *config, 3883 struct audio_stream_out **stream_out, 3884 const char *address __unused) 3885 { 3886 struct audio_device *adev = (struct audio_device *)dev; 3887 struct stream_out *out; 3888 int i, ret; 3889 struct pcm_device_profile *pcm_profile; 3890 3891 ALOGV("%s: enter: sample_rate(%d) channel_mask(%#x) devices(%#x) flags(%#x)", 3892 __func__, config->sample_rate, config->channel_mask, devices, flags); 3893 *stream_out = NULL; 3894 out = (struct stream_out *)calloc(1, sizeof(struct stream_out)); 3895 3896 if (devices == AUDIO_DEVICE_NONE) 3897 devices = AUDIO_DEVICE_OUT_SPEAKER; 3898 3899 out->flags = flags; 3900 out->devices = devices; 3901 out->dev = adev; 3902 out->format = config->format; 3903 out->sample_rate = config->sample_rate; 3904 out->channel_mask = AUDIO_CHANNEL_OUT_STEREO; 3905 out->supported_channel_masks[0] = AUDIO_CHANNEL_OUT_STEREO; 3906 out->handle = handle; 3907 3908 pcm_profile = get_pcm_device(PCM_PLAYBACK, devices); 3909 if (pcm_profile == NULL) { 3910 ret = -EINVAL; 3911 goto error_open; 3912 } 3913 out->config = pcm_profile->config; 3914 3915 /* Init use case and pcm_config */ 3916 if (out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) { 3917 if (config->offload_info.version != AUDIO_INFO_INITIALIZER.version || 3918 config->offload_info.size != AUDIO_INFO_INITIALIZER.size) { 3919 ALOGE("%s: Unsupported Offload information", __func__); 3920 ret = -EINVAL; 3921 goto error_open; 3922 } 3923 if (!is_supported_format(config->offload_info.format)) { 3924 ALOGE("%s: Unsupported audio format", __func__); 3925 ret = -EINVAL; 3926 goto error_open; 3927 } 3928 3929 out->compr_config.codec = (struct snd_codec *) 3930 calloc(1, sizeof(struct snd_codec)); 3931 3932 out->usecase = USECASE_AUDIO_PLAYBACK_OFFLOAD; 3933 if (config->offload_info.channel_mask) 3934 out->channel_mask = config->offload_info.channel_mask; 3935 else if (config->channel_mask) 3936 out->channel_mask = config->channel_mask; 3937 out->format = config->offload_info.format; 3938 out->sample_rate = config->offload_info.sample_rate; 3939 3940 out->stream.set_callback = out_set_callback; 3941 out->stream.pause = out_pause; 3942 out->stream.resume = out_resume; 3943 out->stream.drain = out_drain; 3944 out->stream.flush = out_flush; 3945 3946 out->compr_config.codec->id = 3947 get_snd_codec_id(config->offload_info.format); 3948 out->compr_config.fragment_size = COMPRESS_OFFLOAD_FRAGMENT_SIZE; 3949 out->compr_config.fragments = COMPRESS_OFFLOAD_NUM_FRAGMENTS; 3950 out->compr_config.codec->sample_rate = config->offload_info.sample_rate; 3951 out->compr_config.codec->bit_rate = 3952 config->offload_info.bit_rate; 3953 out->compr_config.codec->ch_in = 3954 audio_channel_count_from_out_mask(config->channel_mask); 3955 out->compr_config.codec->ch_out = out->compr_config.codec->ch_in; 3956 3957 if (flags & AUDIO_OUTPUT_FLAG_NON_BLOCKING) 3958 out->non_blocking = 1; 3959 3960 out->send_new_metadata = 1; 3961 create_offload_callback_thread(out); 3962 out->offload_state = OFFLOAD_STATE_IDLE; 3963 3964 ALOGV("%s: offloaded output offload_info version %04x bit rate %d", 3965 __func__, config->offload_info.version, 3966 config->offload_info.bit_rate); 3967 } else if (out->flags & (AUDIO_OUTPUT_FLAG_DEEP_BUFFER)) { 3968 out->usecase = USECASE_AUDIO_PLAYBACK_DEEP_BUFFER; 3969 out->config = pcm_config_deep_buffer; 3970 out->sample_rate = out->config.rate; 3971 ALOGD("%s: use AUDIO_PLAYBACK_DEEP_BUFFER",__func__); 3972 } else { 3973 out->usecase = USECASE_AUDIO_PLAYBACK; 3974 out->sample_rate = out->config.rate; 3975 } 3976 3977 if (flags & AUDIO_OUTPUT_FLAG_PRIMARY) { 3978 if (adev->primary_output == NULL) 3979 adev->primary_output = out; 3980 else { 3981 ALOGE("%s: Primary output is already opened", __func__); 3982 ret = -EEXIST; 3983 goto error_open; 3984 } 3985 } 3986 3987 /* Check if this usecase is already existing */ 3988 pthread_mutex_lock(&adev->lock); 3989 if (get_usecase_from_id(adev, out->usecase) != NULL) { 3990 ALOGE("%s: Usecase (%d) is already present", __func__, out->usecase); 3991 pthread_mutex_unlock(&adev->lock); 3992 ret = -EEXIST; 3993 goto error_open; 3994 } 3995 pthread_mutex_unlock(&adev->lock); 3996 3997 out->stream.common.get_sample_rate = out_get_sample_rate; 3998 out->stream.common.set_sample_rate = out_set_sample_rate; 3999 out->stream.common.get_buffer_size = out_get_buffer_size; 4000 out->stream.common.get_channels = out_get_channels; 4001 out->stream.common.get_format = out_get_format; 4002 out->stream.common.set_format = out_set_format; 4003 out->stream.common.standby = out_standby; 4004 out->stream.common.dump = out_dump; 4005 out->stream.common.set_parameters = out_set_parameters; 4006 out->stream.common.get_parameters = out_get_parameters; 4007 out->stream.common.add_audio_effect = out_add_audio_effect; 4008 out->stream.common.remove_audio_effect = out_remove_audio_effect; 4009 out->stream.get_latency = out_get_latency; 4010 out->stream.set_volume = out_set_volume; 4011 out->stream.write = out_write; 4012 out->stream.get_render_position = out_get_render_position; 4013 out->stream.get_next_write_timestamp = out_get_next_write_timestamp; 4014 out->stream.get_presentation_position = out_get_presentation_position; 4015 4016 out->standby = 1; 4017 /* out->muted = false; by calloc() */ 4018 /* out->written = 0; by calloc() */ 4019 4020 pthread_mutex_init(&out->lock, (const pthread_mutexattr_t *) NULL); 4021 pthread_mutex_init(&out->pre_lock, (const pthread_mutexattr_t *) NULL); 4022 pthread_cond_init(&out->cond, (const pthread_condattr_t *) NULL); 4023 4024 config->format = out->stream.common.get_format(&out->stream.common); 4025 config->channel_mask = out->stream.common.get_channels(&out->stream.common); 4026 config->sample_rate = out->stream.common.get_sample_rate(&out->stream.common); 4027 4028 out->is_fastmixer_affinity_set = false; 4029 4030 *stream_out = &out->stream; 4031 ALOGV("%s: exit", __func__); 4032 return 0; 4033 4034 error_open: 4035 free(out); 4036 *stream_out = NULL; 4037 ALOGD("%s: exit: ret %d", __func__, ret); 4038 return ret; 4039 } 4040 4041 static void adev_close_output_stream(struct audio_hw_device *dev, 4042 struct audio_stream_out *stream) 4043 { 4044 struct stream_out *out = (struct stream_out *)stream; 4045 struct audio_device *adev = out->dev; 4046 (void)dev; 4047 4048 ALOGV("%s: enter", __func__); 4049 out_standby(&stream->common); 4050 if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) { 4051 destroy_offload_callback_thread(out); 4052 4053 if (out->compr_config.codec != NULL) 4054 free(out->compr_config.codec); 4055 } 4056 pthread_cond_destroy(&out->cond); 4057 pthread_mutex_destroy(&out->lock); 4058 free(stream); 4059 ALOGV("%s: exit", __func__); 4060 } 4061 4062 static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs) 4063 { 4064 struct audio_device *adev = (struct audio_device *)dev; 4065 struct str_parms *parms; 4066 char *str; 4067 char value[32]; 4068 int val; 4069 int ret; 4070 4071 ALOGV("%s: enter: %s", __func__, kvpairs); 4072 4073 parms = str_parms_create_str(kvpairs); 4074 ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_TTY_MODE, value, sizeof(value)); 4075 if (ret >= 0) { 4076 int tty_mode; 4077 4078 if (strcmp(value, AUDIO_PARAMETER_VALUE_TTY_OFF) == 0) 4079 tty_mode = TTY_MODE_OFF; 4080 else if (strcmp(value, AUDIO_PARAMETER_VALUE_TTY_VCO) == 0) 4081 tty_mode = TTY_MODE_VCO; 4082 else if (strcmp(value, AUDIO_PARAMETER_VALUE_TTY_HCO) == 0) 4083 tty_mode = TTY_MODE_HCO; 4084 else if (strcmp(value, AUDIO_PARAMETER_VALUE_TTY_FULL) == 0) 4085 tty_mode = TTY_MODE_FULL; 4086 else 4087 return -EINVAL; 4088 4089 pthread_mutex_lock(&adev->lock); 4090 if (tty_mode != adev->tty_mode) { 4091 adev->tty_mode = tty_mode; 4092 if (adev->in_call) 4093 select_devices(adev, USECASE_VOICE_CALL); 4094 } 4095 pthread_mutex_unlock(&adev->lock); 4096 } 4097 4098 ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_BT_NREC, value, sizeof(value)); 4099 if (ret >= 0) { 4100 /* When set to false, HAL should disable EC and NS 4101 * But it is currently not supported. 4102 */ 4103 if (strcmp(value, AUDIO_PARAMETER_VALUE_ON) == 0) 4104 adev->bluetooth_nrec = true; 4105 else 4106 adev->bluetooth_nrec = false; 4107 } 4108 4109 ret = str_parms_get_str(parms, "screen_state", value, sizeof(value)); 4110 if (ret >= 0) { 4111 if (strcmp(value, AUDIO_PARAMETER_VALUE_ON) == 0) 4112 adev->screen_off = false; 4113 else 4114 adev->screen_off = true; 4115 } 4116 4117 ret = str_parms_get_int(parms, "rotation", &val); 4118 if (ret >= 0) { 4119 bool reverse_speakers = false; 4120 switch(val) { 4121 /* FIXME: note that the code below assumes that the speakers are in the correct placement 4122 relative to the user when the device is rotated 90deg from its default rotation. This 4123 assumption is device-specific, not platform-specific like this code. */ 4124 case 270: 4125 reverse_speakers = true; 4126 break; 4127 case 0: 4128 case 90: 4129 case 180: 4130 break; 4131 default: 4132 ALOGE("%s: unexpected rotation of %d", __func__, val); 4133 } 4134 pthread_mutex_lock(&adev->lock); 4135 if (adev->speaker_lr_swap != reverse_speakers) { 4136 adev->speaker_lr_swap = reverse_speakers; 4137 /* only update the selected device if there is active pcm playback */ 4138 struct audio_usecase *usecase; 4139 struct listnode *node; 4140 list_for_each(node, &adev->usecase_list) { 4141 usecase = node_to_item(node, struct audio_usecase, adev_list_node); 4142 if (usecase->type == PCM_PLAYBACK) { 4143 select_devices(adev, usecase->id); 4144 if (adev->htc_acoustic_spk_reverse) 4145 adev->htc_acoustic_spk_reverse(adev->speaker_lr_swap); 4146 break; 4147 } 4148 } 4149 } 4150 pthread_mutex_unlock(&adev->lock); 4151 } 4152 4153 str_parms_destroy(parms); 4154 4155 if (ret > 0) 4156 ret = 0; 4157 4158 ALOGV("%s: exit with code(%d)", __func__, ret); 4159 return ret; 4160 } 4161 4162 static char* adev_get_parameters(const struct audio_hw_device *dev, 4163 const char *keys) 4164 { 4165 (void)dev; 4166 (void)keys; 4167 4168 return strdup(""); 4169 } 4170 4171 static int adev_init_check(const struct audio_hw_device *dev) 4172 { 4173 (void)dev; 4174 4175 return 0; 4176 } 4177 4178 static int adev_set_voice_volume(struct audio_hw_device *dev, float volume) 4179 { 4180 int ret = 0; 4181 struct audio_device *adev = (struct audio_device *)dev; 4182 pthread_mutex_lock(&adev->lock); 4183 /* cache volume */ 4184 adev->voice_volume = volume; 4185 ret = set_voice_volume_l(adev, adev->voice_volume); 4186 pthread_mutex_unlock(&adev->lock); 4187 return ret; 4188 } 4189 4190 static int adev_set_master_volume(struct audio_hw_device *dev, float volume) 4191 { 4192 (void)dev; 4193 (void)volume; 4194 4195 return -ENOSYS; 4196 } 4197 4198 static int adev_get_master_volume(struct audio_hw_device *dev, 4199 float *volume) 4200 { 4201 (void)dev; 4202 (void)volume; 4203 4204 return -ENOSYS; 4205 } 4206 4207 static int adev_set_master_mute(struct audio_hw_device *dev, bool muted) 4208 { 4209 (void)dev; 4210 (void)muted; 4211 4212 return -ENOSYS; 4213 } 4214 4215 static int adev_get_master_mute(struct audio_hw_device *dev, bool *muted) 4216 { 4217 (void)dev; 4218 (void)muted; 4219 4220 return -ENOSYS; 4221 } 4222 4223 static int adev_set_mode(struct audio_hw_device *dev, audio_mode_t mode) 4224 { 4225 struct audio_device *adev = (struct audio_device *)dev; 4226 4227 pthread_mutex_lock(&adev->lock); 4228 if (adev->mode != mode) { 4229 ALOGI("%s mode = %d", __func__, mode); 4230 adev->mode = mode; 4231 pthread_mutex_lock(&adev->tfa9895_lock); 4232 adev->tfa9895_mode_change |= 0x1; 4233 pthread_mutex_unlock(&adev->tfa9895_lock); 4234 } 4235 pthread_mutex_unlock(&adev->lock); 4236 return 0; 4237 } 4238 4239 static int adev_set_mic_mute(struct audio_hw_device *dev, bool state) 4240 { 4241 struct audio_device *adev = (struct audio_device *)dev; 4242 int err = 0; 4243 4244 pthread_mutex_lock(&adev->lock); 4245 adev->mic_mute = state; 4246 4247 if (adev->mode == AUDIO_MODE_IN_CALL) { 4248 /* TODO */ 4249 } 4250 4251 pthread_mutex_unlock(&adev->lock); 4252 return err; 4253 } 4254 4255 static int adev_get_mic_mute(const struct audio_hw_device *dev, bool *state) 4256 { 4257 struct audio_device *adev = (struct audio_device *)dev; 4258 4259 *state = adev->mic_mute; 4260 4261 return 0; 4262 } 4263 4264 static size_t adev_get_input_buffer_size(const struct audio_hw_device *dev, 4265 const struct audio_config *config) 4266 { 4267 (void)dev; 4268 4269 /* NOTE: we default to built in mic which may cause a mismatch between what we 4270 * report here and the actual buffer size 4271 */ 4272 return get_input_buffer_size(config->sample_rate, 4273 config->format, 4274 audio_channel_count_from_in_mask(config->channel_mask), 4275 PCM_CAPTURE /* usecase_type */, 4276 AUDIO_DEVICE_IN_BUILTIN_MIC); 4277 } 4278 4279 static int adev_open_input_stream(struct audio_hw_device *dev, 4280 audio_io_handle_t handle __unused, 4281 audio_devices_t devices, 4282 struct audio_config *config, 4283 struct audio_stream_in **stream_in, 4284 audio_input_flags_t flags, 4285 const char *address __unused, 4286 audio_source_t source) 4287 { 4288 struct audio_device *adev = (struct audio_device *)dev; 4289 struct stream_in *in; 4290 struct pcm_device_profile *pcm_profile; 4291 4292 ALOGV("%s: enter", __func__); 4293 4294 *stream_in = NULL; 4295 if (check_input_parameters(config->sample_rate, config->format, 4296 audio_channel_count_from_in_mask(config->channel_mask)) != 0) 4297 return -EINVAL; 4298 4299 usecase_type_t usecase_type = source == AUDIO_SOURCE_HOTWORD ? 4300 PCM_HOTWORD_STREAMING : flags & AUDIO_INPUT_FLAG_FAST ? 4301 PCM_CAPTURE_LOW_LATENCY : PCM_CAPTURE; 4302 pcm_profile = get_pcm_device(usecase_type, devices); 4303 if (pcm_profile == NULL && usecase_type == PCM_CAPTURE_LOW_LATENCY) { 4304 // a low latency profile may not exist for that device, fall back 4305 // to regular capture. the MixerThread automatically changes 4306 // to non-fast capture based on the buffer size. 4307 flags &= ~AUDIO_INPUT_FLAG_FAST; 4308 usecase_type = PCM_CAPTURE; 4309 pcm_profile = get_pcm_device(usecase_type, devices); 4310 } 4311 if (pcm_profile == NULL) 4312 return -EINVAL; 4313 4314 in = (struct stream_in *)calloc(1, sizeof(struct stream_in)); 4315 4316 in->stream.common.get_sample_rate = in_get_sample_rate; 4317 in->stream.common.set_sample_rate = in_set_sample_rate; 4318 in->stream.common.get_buffer_size = in_get_buffer_size; 4319 in->stream.common.get_channels = in_get_channels; 4320 in->stream.common.get_format = in_get_format; 4321 in->stream.common.set_format = in_set_format; 4322 in->stream.common.standby = in_standby; 4323 in->stream.common.dump = in_dump; 4324 in->stream.common.set_parameters = in_set_parameters; 4325 in->stream.common.get_parameters = in_get_parameters; 4326 in->stream.common.add_audio_effect = in_add_audio_effect; 4327 in->stream.common.remove_audio_effect = in_remove_audio_effect; 4328 in->stream.set_gain = in_set_gain; 4329 in->stream.read = in_read; 4330 in->stream.get_input_frames_lost = in_get_input_frames_lost; 4331 4332 in->devices = devices; 4333 in->source = source; 4334 in->dev = adev; 4335 in->standby = 1; 4336 in->main_channels = config->channel_mask; 4337 in->requested_rate = config->sample_rate; 4338 if (config->sample_rate != CAPTURE_DEFAULT_SAMPLING_RATE) 4339 flags = flags & ~AUDIO_INPUT_FLAG_FAST; 4340 in->input_flags = flags; 4341 /* HW codec is limited to default channels. No need to update with 4342 * requested channels */ 4343 in->config = pcm_profile->config; 4344 4345 /* Update config params with the requested sample rate and channels */ 4346 if (source == AUDIO_SOURCE_HOTWORD) { 4347 in->usecase = USECASE_AUDIO_CAPTURE_HOTWORD; 4348 } else { 4349 in->usecase = USECASE_AUDIO_CAPTURE; 4350 } 4351 in->usecase_type = usecase_type; 4352 4353 pthread_mutex_init(&in->lock, (const pthread_mutexattr_t *) NULL); 4354 pthread_mutex_init(&in->pre_lock, (const pthread_mutexattr_t *) NULL); 4355 4356 in->is_fastcapture_affinity_set = false; 4357 4358 *stream_in = &in->stream; 4359 ALOGV("%s: exit", __func__); 4360 return 0; 4361 } 4362 4363 static void adev_close_input_stream(struct audio_hw_device *dev, 4364 struct audio_stream_in *stream) 4365 { 4366 struct audio_device *adev = (struct audio_device *)dev; 4367 struct stream_in *in = (struct stream_in*)stream; 4368 ALOGV("%s", __func__); 4369 4370 /* prevent concurrent out_set_parameters, or out_write from standby */ 4371 pthread_mutex_lock(&adev->lock_inputs); 4372 4373 #ifdef PREPROCESSING_ENABLED 4374 int i; 4375 4376 for (i=0; i<in->num_preprocessors; i++) { 4377 free(in->preprocessors[i].channel_configs); 4378 } 4379 4380 if (in->read_buf) { 4381 free(in->read_buf); 4382 in->read_buf = NULL; 4383 } 4384 4385 if (in->proc_buf_in) { 4386 free(in->proc_buf_in); 4387 in->proc_buf_in = NULL; 4388 } 4389 4390 if (in->proc_buf_out) { 4391 free(in->proc_buf_out); 4392 in->proc_buf_out = NULL; 4393 } 4394 4395 if (in->ref_buf) { 4396 free(in->ref_buf); 4397 in->ref_buf = NULL; 4398 } 4399 4400 if (in->resampler) { 4401 release_resampler(in->resampler); 4402 in->resampler = NULL; 4403 } 4404 #endif 4405 4406 in_standby_l(in); 4407 free(stream); 4408 4409 pthread_mutex_unlock(&adev->lock_inputs); 4410 4411 return; 4412 } 4413 4414 static int adev_dump(const audio_hw_device_t *device, int fd) 4415 { 4416 (void)device; 4417 (void)fd; 4418 4419 return 0; 4420 } 4421 4422 static int adev_close(hw_device_t *device) 4423 { 4424 struct audio_device *adev = (struct audio_device *)device; 4425 audio_device_ref_count--; 4426 free(adev->snd_dev_ref_cnt); 4427 free_mixer_list(adev); 4428 free(device); 4429 return 0; 4430 } 4431 4432 static void *dummybuf_thread(void *context) 4433 { 4434 ALOGD("%s: enter", __func__); 4435 pthread_detach(pthread_self()); 4436 struct audio_device *adev = (struct audio_device *)context; 4437 struct pcm_config config; 4438 struct mixer *mixer = NULL; 4439 struct mixer_ctl *ctl; 4440 unsigned char *data = NULL; 4441 struct pcm *pcm = NULL; 4442 struct pcm_device_profile *profile = NULL; 4443 audio_devices_t dummybuf_thread_devices = adev->dummybuf_thread_devices; 4444 4445 pthread_mutex_lock(&adev->dummybuf_thread_lock); 4446 4447 memset(&config, 0, sizeof(struct pcm_config)); 4448 4449 profile = &pcm_device_playback; 4450 4451 memcpy(&config, &profile->config, sizeof(struct pcm_config)); 4452 /* Use large value for stop_threshold so that automatic 4453 trigger for stop is avoided, when this thread fails to write data */ 4454 config.stop_threshold = INT_MAX/2; 4455 pcm = pcm_open(profile->card, profile->id, 4456 (PCM_OUT | PCM_MONOTONIC), &config); 4457 if (pcm != NULL && !pcm_is_ready(pcm)) { 4458 ALOGE("pcm_open: card=%d, id=%d is not ready", profile->card, profile->id); 4459 pcm_close(pcm); 4460 pcm = NULL; 4461 } else { 4462 ALOGD("pcm_open: card=%d, id=%d", profile->card, profile->id); 4463 } 4464 4465 mixer = mixer_open(profile->card); 4466 if (mixer) { 4467 if (dummybuf_thread_devices == AUDIO_DEVICE_OUT_WIRED_HEADPHONE) { 4468 ctl = mixer_get_ctl_by_name(mixer, MIXER_CTL_HEADPHONE_JACK_SWITCH); 4469 if (ctl != NULL) 4470 mixer_ctl_set_value(ctl, 0, 1); 4471 else { 4472 ALOGE("Invalid mixer control: name(%s): skip dummy thread", MIXER_CTL_HEADPHONE_JACK_SWITCH); 4473 goto exit; 4474 } 4475 4476 ctl = mixer_get_ctl_by_name(mixer, MIXER_CTL_CODEC_VMIXER_CODEC_SWITCH); 4477 if (ctl != NULL) 4478 mixer_ctl_set_value(ctl, 0, 1); 4479 else { 4480 ALOGE("Invalid mixer control: name(%s): skip dummy thread", MIXER_CTL_CODEC_VMIXER_CODEC_SWITCH); 4481 goto exit; 4482 } 4483 } else { 4484 ctl = mixer_get_ctl_by_name(mixer, MIXER_CTL_SPK_VMIXER_SPK_SWITCH); 4485 if (ctl != NULL) 4486 mixer_ctl_set_value(ctl, 0, 1); 4487 else { 4488 ALOGE("Invalid mixer control: name(%s): skip dummy thread", MIXER_CTL_SPK_VMIXER_SPK_SWITCH); 4489 goto exit; 4490 } 4491 } 4492 } 4493 4494 while (1) { 4495 if (pcm) { 4496 if (data == NULL) 4497 data = (unsigned char *)calloc(DEEP_BUFFER_OUTPUT_PERIOD_SIZE * 8, 4498 sizeof(unsigned char)); 4499 if (data) { 4500 pcm_write(pcm, (void *)data, DEEP_BUFFER_OUTPUT_PERIOD_SIZE * 8); 4501 adev->dummybuf_thread_active = 1; 4502 } else { 4503 ALOGD("%s: cant open a buffer, retry to open it", __func__); 4504 } 4505 } else { 4506 ALOGD("%s: cant open a output deep stream, retry to open it", __func__); 4507 pcm = pcm_open(profile->card, profile->id, 4508 (PCM_OUT | PCM_MONOTONIC), &config); 4509 if (pcm != NULL && !pcm_is_ready(pcm)) { 4510 ALOGE("pcm_open: card=%d, id=%d is not ready", profile->card, profile->id); 4511 pcm_close(pcm); 4512 pcm = NULL; 4513 } else { 4514 ALOGD("pcm_open: card=%d, id=%d", profile->card, profile->id); 4515 } 4516 } 4517 4518 if (adev->dummybuf_thread_cancel || adev->dummybuf_thread_timeout-- <= 0) { 4519 adev->dummybuf_thread_cancel = 0; 4520 break; 4521 } 4522 4523 pthread_mutex_unlock(&adev->dummybuf_thread_lock); 4524 usleep(3000); 4525 pthread_mutex_lock(&adev->dummybuf_thread_lock); 4526 } 4527 4528 exit: 4529 adev->dummybuf_thread_active = 0; 4530 if (mixer) { 4531 if (dummybuf_thread_devices == AUDIO_DEVICE_OUT_WIRED_HEADPHONE) { 4532 ctl = mixer_get_ctl_by_name(mixer, MIXER_CTL_HEADPHONE_JACK_SWITCH); 4533 if (ctl != NULL) 4534 mixer_ctl_set_value(ctl, 0, 0); 4535 ctl = mixer_get_ctl_by_name(mixer, MIXER_CTL_CODEC_VMIXER_CODEC_SWITCH); 4536 if (ctl != NULL) 4537 mixer_ctl_set_value(ctl, 0, 0); 4538 } else { 4539 ctl = mixer_get_ctl_by_name(mixer, MIXER_CTL_SPK_VMIXER_SPK_SWITCH); 4540 if (ctl != NULL) 4541 mixer_ctl_set_value(ctl, 0, 0); 4542 } 4543 mixer_close(mixer); 4544 } 4545 if (pcm) { 4546 pcm_close(pcm); 4547 pcm = NULL; 4548 } 4549 pthread_mutex_unlock(&adev->dummybuf_thread_lock); 4550 4551 if (data) 4552 free(data); 4553 4554 return NULL; 4555 } 4556 4557 static void dummybuf_thread_open(struct audio_device *adev) 4558 { 4559 adev->dummybuf_thread_timeout = 6000; /* in 18 sec */ 4560 adev->dummybuf_thread_cancel = 0; 4561 adev->dummybuf_thread_active = 0; 4562 pthread_mutex_init(&adev->dummybuf_thread_lock, (const pthread_mutexattr_t *) NULL); 4563 if (!adev->dummybuf_thread) 4564 pthread_create(&adev->dummybuf_thread, (const pthread_attr_t *) NULL, dummybuf_thread, adev); 4565 } 4566 4567 static void dummybuf_thread_close(struct audio_device *adev) 4568 { 4569 ALOGD("%s: enter", __func__); 4570 int retry_cnt = 20; 4571 4572 if (adev->dummybuf_thread == 0) 4573 return; 4574 4575 pthread_mutex_lock(&adev->dummybuf_thread_lock); 4576 adev->dummybuf_thread_cancel = 1; 4577 pthread_mutex_unlock(&adev->dummybuf_thread_lock); 4578 4579 while (retry_cnt > 0) { 4580 pthread_mutex_lock(&adev->dummybuf_thread_lock); 4581 if (adev->dummybuf_thread_active == 0) { 4582 pthread_mutex_unlock(&adev->dummybuf_thread_lock); 4583 break; 4584 } 4585 pthread_mutex_unlock(&adev->dummybuf_thread_lock); 4586 retry_cnt--; 4587 usleep(1000); 4588 } 4589 4590 pthread_join(adev->dummybuf_thread, (void **) NULL); 4591 pthread_mutex_destroy(&adev->dummybuf_thread_lock); 4592 adev->dummybuf_thread = 0; 4593 } 4594 4595 /* This returns true if the input parameter looks at all plausible as a low latency period size, 4596 * or false otherwise. A return value of true doesn't mean the value is guaranteed to work, 4597 * just that it _might_ work. 4598 */ 4599 static bool period_size_is_plausible_for_low_latency(int period_size) 4600 { 4601 switch (period_size) { 4602 case 64: 4603 case 96: 4604 case 128: 4605 case 192: 4606 case 256: 4607 return true; 4608 default: 4609 return false; 4610 } 4611 } 4612 4613 static int adev_open(const hw_module_t *module, const char *name, 4614 hw_device_t **device) 4615 { 4616 struct audio_device *adev; 4617 int retry_count = 0; 4618 4619 ALOGD("%s: enter", __func__); 4620 if (strcmp(name, AUDIO_HARDWARE_INTERFACE) != 0) return -EINVAL; 4621 4622 adev = calloc(1, sizeof(struct audio_device)); 4623 4624 adev->device.common.tag = HARDWARE_DEVICE_TAG; 4625 adev->device.common.version = AUDIO_DEVICE_API_VERSION_2_0; 4626 adev->device.common.module = (struct hw_module_t *)module; 4627 adev->device.common.close = adev_close; 4628 4629 adev->device.init_check = adev_init_check; 4630 adev->device.set_voice_volume = adev_set_voice_volume; 4631 adev->device.set_master_volume = adev_set_master_volume; 4632 adev->device.get_master_volume = adev_get_master_volume; 4633 adev->device.set_master_mute = adev_set_master_mute; 4634 adev->device.get_master_mute = adev_get_master_mute; 4635 adev->device.set_mode = adev_set_mode; 4636 adev->device.set_mic_mute = adev_set_mic_mute; 4637 adev->device.get_mic_mute = adev_get_mic_mute; 4638 adev->device.set_parameters = adev_set_parameters; 4639 adev->device.get_parameters = adev_get_parameters; 4640 adev->device.get_input_buffer_size = adev_get_input_buffer_size; 4641 adev->device.open_output_stream = adev_open_output_stream; 4642 adev->device.close_output_stream = adev_close_output_stream; 4643 adev->device.open_input_stream = adev_open_input_stream; 4644 adev->device.close_input_stream = adev_close_input_stream; 4645 adev->device.dump = adev_dump; 4646 4647 /* Set the default route before the PCM stream is opened */ 4648 adev->mode = AUDIO_MODE_NORMAL; 4649 adev->active_input = NULL; 4650 adev->primary_output = NULL; 4651 adev->voice_volume = 1.0f; 4652 adev->tty_mode = TTY_MODE_OFF; 4653 adev->bluetooth_nrec = true; 4654 adev->in_call = false; 4655 /* adev->cur_hdmi_channels = 0; by calloc() */ 4656 adev->snd_dev_ref_cnt = calloc(SND_DEVICE_MAX, sizeof(int)); 4657 4658 adev->dualmic_config = DUALMIC_CONFIG_NONE; 4659 adev->ns_in_voice_rec = false; 4660 4661 list_init(&adev->usecase_list); 4662 4663 if (mixer_init(adev) != 0) { 4664 free(adev->snd_dev_ref_cnt); 4665 free(adev); 4666 ALOGE("%s: Failed to init, aborting.", __func__); 4667 *device = NULL; 4668 return -EINVAL; 4669 } 4670 4671 if (access(OFFLOAD_FX_LIBRARY_PATH, R_OK) == 0) { 4672 adev->offload_fx_lib = dlopen(OFFLOAD_FX_LIBRARY_PATH, RTLD_NOW); 4673 if (adev->offload_fx_lib == NULL) { 4674 ALOGE("%s: DLOPEN failed for %s", __func__, OFFLOAD_FX_LIBRARY_PATH); 4675 } else { 4676 ALOGV("%s: DLOPEN successful for %s", __func__, OFFLOAD_FX_LIBRARY_PATH); 4677 adev->offload_fx_start_output = 4678 (int (*)(audio_io_handle_t))dlsym(adev->offload_fx_lib, 4679 "visualizer_hal_start_output"); 4680 adev->offload_fx_stop_output = 4681 (int (*)(audio_io_handle_t))dlsym(adev->offload_fx_lib, 4682 "visualizer_hal_stop_output"); 4683 } 4684 } 4685 4686 if (access(HTC_ACOUSTIC_LIBRARY_PATH, R_OK) == 0) { 4687 adev->htc_acoustic_lib = dlopen(HTC_ACOUSTIC_LIBRARY_PATH, RTLD_NOW); 4688 if (adev->htc_acoustic_lib == NULL) { 4689 ALOGE("%s: DLOPEN failed for %s", __func__, HTC_ACOUSTIC_LIBRARY_PATH); 4690 } else { 4691 ALOGV("%s: DLOPEN successful for %s", __func__, HTC_ACOUSTIC_LIBRARY_PATH); 4692 adev->htc_acoustic_init_rt5506 = 4693 (int (*)())dlsym(adev->htc_acoustic_lib, 4694 "init_rt5506"); 4695 adev->htc_acoustic_set_rt5506_amp = 4696 (int (*)(int, int))dlsym(adev->htc_acoustic_lib, 4697 "set_rt5506_amp"); 4698 adev->htc_acoustic_set_amp_mode = 4699 (int (*)(int , int, int, int, bool))dlsym(adev->htc_acoustic_lib, 4700 "set_amp_mode"); 4701 adev->htc_acoustic_spk_reverse = 4702 (int (*)(bool))dlsym(adev->htc_acoustic_lib, 4703 "spk_reverse"); 4704 if (adev->htc_acoustic_spk_reverse) 4705 adev->htc_acoustic_spk_reverse(adev->speaker_lr_swap); 4706 } 4707 } 4708 4709 if (access(SOUND_TRIGGER_HAL_LIBRARY_PATH, R_OK) == 0) { 4710 adev->sound_trigger_lib = dlopen(SOUND_TRIGGER_HAL_LIBRARY_PATH, RTLD_NOW); 4711 if (adev->sound_trigger_lib == NULL) { 4712 ALOGE("%s: DLOPEN failed for %s", __func__, SOUND_TRIGGER_HAL_LIBRARY_PATH); 4713 } else { 4714 ALOGV("%s: DLOPEN successful for %s", __func__, SOUND_TRIGGER_HAL_LIBRARY_PATH); 4715 adev->sound_trigger_open_for_streaming = 4716 (int (*)(void))dlsym(adev->sound_trigger_lib, 4717 "sound_trigger_open_for_streaming"); 4718 adev->sound_trigger_read_samples = 4719 (size_t (*)(int, void *, size_t))dlsym(adev->sound_trigger_lib, 4720 "sound_trigger_read_samples"); 4721 adev->sound_trigger_close_for_streaming = 4722 (int (*)(int))dlsym(adev->sound_trigger_lib, 4723 "sound_trigger_close_for_streaming"); 4724 if (!adev->sound_trigger_open_for_streaming || 4725 !adev->sound_trigger_read_samples || 4726 !adev->sound_trigger_close_for_streaming) { 4727 4728 ALOGE("%s: Error grabbing functions in %s", __func__, SOUND_TRIGGER_HAL_LIBRARY_PATH); 4729 adev->sound_trigger_open_for_streaming = 0; 4730 adev->sound_trigger_read_samples = 0; 4731 adev->sound_trigger_close_for_streaming = 0; 4732 } 4733 } 4734 } 4735 4736 4737 *device = &adev->device.common; 4738 4739 if (adev->htc_acoustic_init_rt5506 != NULL) 4740 adev->htc_acoustic_init_rt5506(); 4741 4742 if (audio_device_ref_count == 0) { 4743 /* For HS GPIO initial config */ 4744 adev->dummybuf_thread_devices = AUDIO_DEVICE_OUT_WIRED_HEADPHONE; 4745 dummybuf_thread_open(adev); 4746 retry_count = RETRY_NUMBER; 4747 while (retry_count-- > 0) { 4748 pthread_mutex_lock(&adev->dummybuf_thread_lock); 4749 if (adev->dummybuf_thread_active != 0) { 4750 pthread_mutex_unlock(&adev->dummybuf_thread_lock); 4751 break; 4752 } 4753 pthread_mutex_unlock(&adev->dummybuf_thread_lock); 4754 usleep(10000); 4755 } 4756 dummybuf_thread_close(adev); 4757 4758 /* For NXP DSP config */ 4759 if (adev->htc_acoustic_set_amp_mode) { 4760 pthread_t th; 4761 adev->dummybuf_thread_devices = AUDIO_DEVICE_OUT_SPEAKER; 4762 dummybuf_thread_open(adev); 4763 pthread_mutex_lock(&adev->dummybuf_thread_lock); 4764 retry_count = RETRY_NUMBER; 4765 while (retry_count-- > 0) { 4766 if (adev->dummybuf_thread_active) { 4767 break; 4768 } 4769 pthread_mutex_unlock(&adev->dummybuf_thread_lock); 4770 usleep(10000); 4771 pthread_mutex_lock(&adev->dummybuf_thread_lock); 4772 } 4773 if (adev->dummybuf_thread_active) { 4774 usleep(10000); /* tfa9895 spk amp need more than 1ms i2s signal before giving dsp related i2c commands*/ 4775 if (pthread_create(&th, NULL, tfa9895_config_thread, (void* )adev) != 0) { 4776 ALOGE("@@##THREAD_FADE_IN_UPPER_SPEAKER thread create fail"); 4777 } 4778 } 4779 pthread_mutex_unlock(&adev->dummybuf_thread_lock); 4780 /* Then, dummybuf_thread_close() is called by tfa9895_config_thread() */ 4781 } 4782 } 4783 audio_device_ref_count++; 4784 4785 char value[PROPERTY_VALUE_MAX]; 4786 if (property_get("audio_hal.period_size", value, NULL) > 0) { 4787 int trial = atoi(value); 4788 if (period_size_is_plausible_for_low_latency(trial)) { 4789 4790 pcm_device_playback.config.period_size = trial; 4791 pcm_device_playback.config.start_threshold = 4792 PLAYBACK_START_THRESHOLD(trial, PLAYBACK_PERIOD_COUNT); 4793 pcm_device_playback.config.stop_threshold = 4794 PLAYBACK_STOP_THRESHOLD(trial, PLAYBACK_PERIOD_COUNT); 4795 4796 pcm_device_capture_low_latency.config.period_size = trial; 4797 } 4798 } 4799 4800 ALOGV("%s: exit", __func__); 4801 return 0; 4802 } 4803 4804 static struct hw_module_methods_t hal_module_methods = { 4805 .open = adev_open, 4806 }; 4807 4808 struct audio_module HAL_MODULE_INFO_SYM = { 4809 .common = { 4810 .tag = HARDWARE_MODULE_TAG, 4811 .module_api_version = AUDIO_MODULE_API_VERSION_0_1, 4812 .hal_api_version = HARDWARE_HAL_API_VERSION, 4813 .id = AUDIO_HARDWARE_MODULE_ID, 4814 .name = "NVIDIA Tegra Audio HAL", 4815 .author = "The Android Open Source Project", 4816 .methods = &hal_module_methods, 4817 }, 4818 }; 4819