1 /* 2 * Copyright (C) 2015 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 #include <errno.h> 27 #include <pthread.h> 28 #include <stdint.h> 29 #include <sys/time.h> 30 #include <stdlib.h> 31 #include <math.h> 32 #include <dlfcn.h> 33 #include <sys/resource.h> 34 #include <sys/prctl.h> 35 36 #include <cutils/log.h> 37 #include <cutils/str_parms.h> 38 #include <cutils/properties.h> 39 #include <cutils/atomic.h> 40 #include <cutils/sched_policy.h> 41 42 #include <hardware/audio_effect.h> 43 #include <system/thread_defs.h> 44 #include <audio_effects/effect_aec.h> 45 #include <audio_effects/effect_ns.h> 46 #include <audio_utils/channels.h> 47 #include "audio_hw.h" 48 #include "cras_dsp.h" 49 50 /* TODO: the following PCM device profiles could be read from a config file */ 51 struct pcm_device_profile pcm_device_playback_hs = { 52 .config = { 53 .channels = PLAYBACK_DEFAULT_CHANNEL_COUNT, 54 .rate = PLAYBACK_DEFAULT_SAMPLING_RATE, 55 .period_size = PLAYBACK_PERIOD_SIZE, 56 .period_count = PLAYBACK_PERIOD_COUNT, 57 .format = PCM_FORMAT_S16_LE, 58 .start_threshold = PLAYBACK_START_THRESHOLD, 59 .stop_threshold = PLAYBACK_STOP_THRESHOLD, 60 .silence_threshold = 0, 61 .avail_min = PLAYBACK_AVAILABLE_MIN, 62 }, 63 .card = SOUND_CARD, 64 .id = 1, 65 .device = 0, 66 .type = PCM_PLAYBACK, 67 .devices = AUDIO_DEVICE_OUT_WIRED_HEADSET|AUDIO_DEVICE_OUT_WIRED_HEADPHONE, 68 .dsp_name = "invert_lr", 69 }; 70 71 struct pcm_device_profile pcm_device_capture = { 72 .config = { 73 .channels = CAPTURE_DEFAULT_CHANNEL_COUNT, 74 .rate = CAPTURE_DEFAULT_SAMPLING_RATE, 75 .period_size = CAPTURE_PERIOD_SIZE, 76 .period_count = CAPTURE_PERIOD_COUNT, 77 .format = PCM_FORMAT_S16_LE, 78 .start_threshold = CAPTURE_START_THRESHOLD, 79 .stop_threshold = 0, 80 .silence_threshold = 0, 81 .avail_min = 0, 82 }, 83 .card = SOUND_CARD, 84 .id = 2, 85 .device = 0, 86 .type = PCM_CAPTURE, 87 .devices = AUDIO_DEVICE_IN_BUILTIN_MIC|AUDIO_DEVICE_IN_WIRED_HEADSET|AUDIO_DEVICE_IN_BACK_MIC, 88 }; 89 90 struct pcm_device_profile pcm_device_capture_loopback_aec = { 91 .config = { 92 .channels = CAPTURE_DEFAULT_CHANNEL_COUNT, 93 .rate = CAPTURE_DEFAULT_SAMPLING_RATE, 94 .period_size = CAPTURE_PERIOD_SIZE, 95 .period_count = CAPTURE_PERIOD_COUNT, 96 .format = PCM_FORMAT_S16_LE, 97 .start_threshold = CAPTURE_START_THRESHOLD, 98 .stop_threshold = 0, 99 .silence_threshold = 0, 100 .avail_min = 0, 101 }, 102 .card = SOUND_CARD, 103 .id = 3, 104 .device = 1, 105 .type = PCM_CAPTURE, 106 .devices = SND_DEVICE_IN_LOOPBACK_AEC, 107 }; 108 109 struct pcm_device_profile pcm_device_playback_spk_and_headset = { 110 .config = { 111 .channels = PLAYBACK_DEFAULT_CHANNEL_COUNT, 112 .rate = PLAYBACK_DEFAULT_SAMPLING_RATE, 113 .period_size = PLAYBACK_PERIOD_SIZE, 114 .period_count = PLAYBACK_PERIOD_COUNT, 115 .format = PCM_FORMAT_S16_LE, 116 .start_threshold = PLAYBACK_START_THRESHOLD, 117 .stop_threshold = PLAYBACK_STOP_THRESHOLD, 118 .silence_threshold = 0, 119 .avail_min = PLAYBACK_AVAILABLE_MIN, 120 }, 121 .card = SOUND_CARD, 122 .id = 4, 123 .device = 0, 124 .type = PCM_PLAYBACK, 125 .devices = AUDIO_DEVICE_OUT_SPEAKER|AUDIO_DEVICE_OUT_WIRED_HEADSET|AUDIO_DEVICE_OUT_WIRED_HEADPHONE, 126 .dsp_name = "speaker_eq", 127 }; 128 129 struct pcm_device_profile pcm_device_playback_spk = { 130 .config = { 131 .channels = PLAYBACK_DEFAULT_CHANNEL_COUNT, 132 .rate = PLAYBACK_DEFAULT_SAMPLING_RATE, 133 .period_size = PLAYBACK_PERIOD_SIZE, 134 .period_count = PLAYBACK_PERIOD_COUNT, 135 .format = PCM_FORMAT_S16_LE, 136 .start_threshold = PLAYBACK_START_THRESHOLD, 137 .stop_threshold = PLAYBACK_STOP_THRESHOLD, 138 .silence_threshold = 0, 139 .avail_min = PLAYBACK_AVAILABLE_MIN, 140 }, 141 .card = SOUND_CARD, 142 .id = 5, 143 .device = 0, 144 .type = PCM_PLAYBACK, 145 .devices = AUDIO_DEVICE_OUT_SPEAKER, 146 .dsp_name = "speaker_eq", 147 }; 148 149 static struct pcm_device_profile pcm_device_hotword_streaming = { 150 .config = { 151 .channels = 1, 152 .rate = 16000, 153 .period_size = CAPTURE_PERIOD_SIZE, 154 .period_count = CAPTURE_PERIOD_COUNT, 155 .format = PCM_FORMAT_S16_LE, 156 .start_threshold = CAPTURE_START_THRESHOLD, 157 .stop_threshold = 0, 158 .silence_threshold = 0, 159 .avail_min = 0, 160 }, 161 .card = SOUND_CARD, 162 .id = 0, 163 .type = PCM_HOTWORD_STREAMING, 164 .devices = AUDIO_DEVICE_IN_BUILTIN_MIC | 165 AUDIO_DEVICE_IN_WIRED_HEADSET | 166 AUDIO_DEVICE_IN_BACK_MIC, 167 }; 168 169 struct pcm_device_profile *pcm_devices[] = { 170 &pcm_device_playback_hs, 171 &pcm_device_capture, 172 &pcm_device_playback_spk, 173 &pcm_device_capture_loopback_aec, 174 &pcm_device_playback_spk_and_headset, 175 &pcm_device_hotword_streaming, 176 NULL, 177 }; 178 179 static const char * const use_case_table[AUDIO_USECASE_MAX] = { 180 [USECASE_AUDIO_PLAYBACK] = "playback", 181 [USECASE_AUDIO_PLAYBACK_MULTI_CH] = "playback multi-channel", 182 [USECASE_AUDIO_CAPTURE] = "capture", 183 [USECASE_AUDIO_CAPTURE_HOTWORD] = "capture-hotword", 184 [USECASE_VOICE_CALL] = "voice-call", 185 }; 186 187 188 #define STRING_TO_ENUM(string) { #string, string } 189 190 struct pcm_config pcm_config_deep_buffer = { 191 .channels = 2, 192 .rate = DEEP_BUFFER_OUTPUT_SAMPLING_RATE, 193 .period_size = DEEP_BUFFER_OUTPUT_PERIOD_SIZE, 194 .period_count = DEEP_BUFFER_OUTPUT_PERIOD_COUNT, 195 .format = PCM_FORMAT_S16_LE, 196 .start_threshold = DEEP_BUFFER_OUTPUT_PERIOD_SIZE / 4, 197 .stop_threshold = INT_MAX, 198 .avail_min = DEEP_BUFFER_OUTPUT_PERIOD_SIZE / 4, 199 }; 200 201 struct string_to_enum { 202 const char *name; 203 uint32_t value; 204 }; 205 206 static const struct string_to_enum out_channels_name_to_enum_table[] = { 207 STRING_TO_ENUM(AUDIO_CHANNEL_OUT_STEREO), 208 STRING_TO_ENUM(AUDIO_CHANNEL_OUT_5POINT1), 209 STRING_TO_ENUM(AUDIO_CHANNEL_OUT_7POINT1), 210 }; 211 212 static bool is_supported_format(audio_format_t format) 213 { 214 if (format == AUDIO_FORMAT_MP3 || 215 ((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_AAC)) 216 return true; 217 218 return false; 219 } 220 221 static int get_snd_codec_id(audio_format_t format) 222 { 223 int id = 0; 224 225 switch (format & AUDIO_FORMAT_MAIN_MASK) { 226 default: 227 ALOGE("%s: Unsupported audio format", __func__); 228 } 229 230 return id; 231 } 232 233 /* Array to store sound devices */ 234 static const char * const device_table[SND_DEVICE_MAX] = { 235 [SND_DEVICE_NONE] = "none", 236 /* Playback sound devices */ 237 [SND_DEVICE_OUT_HANDSET] = "handset", 238 [SND_DEVICE_OUT_SPEAKER] = "speaker", 239 [SND_DEVICE_OUT_HEADPHONES] = "headphones", 240 [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = "speaker-and-headphones", 241 [SND_DEVICE_OUT_VOICE_HANDSET] = "voice-handset", 242 [SND_DEVICE_OUT_VOICE_SPEAKER] = "voice-speaker", 243 [SND_DEVICE_OUT_VOICE_HEADPHONES] = "voice-headphones", 244 [SND_DEVICE_OUT_HDMI] = "hdmi", 245 [SND_DEVICE_OUT_SPEAKER_AND_HDMI] = "speaker-and-hdmi", 246 [SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = "voice-tty-full-headphones", 247 [SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = "voice-tty-vco-headphones", 248 [SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = "voice-tty-hco-handset", 249 250 /* Capture sound devices */ 251 [SND_DEVICE_IN_HANDSET_MIC] = "handset-mic", 252 [SND_DEVICE_IN_SPEAKER_MIC] = "speaker-mic", 253 [SND_DEVICE_IN_HEADSET_MIC] = "headset-mic", 254 [SND_DEVICE_IN_HANDSET_MIC_AEC] = "handset-mic", 255 [SND_DEVICE_IN_SPEAKER_MIC_AEC] = "voice-speaker-mic", 256 [SND_DEVICE_IN_HEADSET_MIC_AEC] = "headset-mic", 257 [SND_DEVICE_IN_VOICE_SPEAKER_MIC] = "voice-speaker-mic", 258 [SND_DEVICE_IN_VOICE_HEADSET_MIC] = "voice-headset-mic", 259 [SND_DEVICE_IN_HDMI_MIC] = "hdmi-mic", 260 [SND_DEVICE_IN_CAMCORDER_MIC] = "camcorder-mic", 261 [SND_DEVICE_IN_VOICE_DMIC_1] = "voice-dmic-1", 262 [SND_DEVICE_IN_VOICE_SPEAKER_DMIC_1] = "voice-speaker-dmic-1", 263 [SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = "voice-tty-full-headset-mic", 264 [SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = "voice-tty-vco-handset-mic", 265 [SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = "voice-tty-hco-headset-mic", 266 [SND_DEVICE_IN_VOICE_REC_HEADSET_MIC] = "voice-rec-headset-mic", 267 [SND_DEVICE_IN_VOICE_REC_MIC] = "voice-rec-mic", 268 [SND_DEVICE_IN_VOICE_REC_DMIC_1] = "voice-rec-dmic-1", 269 [SND_DEVICE_IN_VOICE_REC_DMIC_NS_1] = "voice-rec-dmic-ns-1", 270 [SND_DEVICE_IN_LOOPBACK_AEC] = "loopback-aec", 271 }; 272 273 struct mixer_card *adev_get_mixer_for_card(struct audio_device *adev, int card) 274 { 275 struct mixer_card *mixer_card; 276 struct listnode *node; 277 278 list_for_each(node, &adev->mixer_list) { 279 mixer_card = node_to_item(node, struct mixer_card, adev_list_node); 280 if (mixer_card->card == card) 281 return mixer_card; 282 } 283 return NULL; 284 } 285 286 struct mixer_card *uc_get_mixer_for_card(struct audio_usecase *usecase, int card) 287 { 288 struct mixer_card *mixer_card; 289 struct listnode *node; 290 291 list_for_each(node, &usecase->mixer_list) { 292 mixer_card = node_to_item(node, struct mixer_card, uc_list_node[usecase->id]); 293 if (mixer_card->card == card) 294 return mixer_card; 295 } 296 return NULL; 297 } 298 299 void free_mixer_list(struct audio_device *adev) 300 { 301 struct mixer_card *mixer_card; 302 struct listnode *node; 303 struct listnode *next; 304 305 list_for_each_safe(node, next, &adev->mixer_list) { 306 mixer_card = node_to_item(node, struct mixer_card, adev_list_node); 307 list_remove(node); 308 audio_route_free(mixer_card->audio_route); 309 free(mixer_card); 310 } 311 } 312 313 int mixer_init(struct audio_device *adev) 314 { 315 int i; 316 int card; 317 int retry_num; 318 struct mixer *mixer; 319 struct audio_route *audio_route; 320 char mixer_path[PATH_MAX]; 321 struct mixer_card *mixer_card; 322 struct listnode *node; 323 324 list_init(&adev->mixer_list); 325 326 for (i = 0; pcm_devices[i] != NULL; i++) { 327 card = pcm_devices[i]->card; 328 if (adev_get_mixer_for_card(adev, card) == NULL) { 329 retry_num = 0; 330 do { 331 mixer = mixer_open(card); 332 if (mixer == NULL) { 333 if (++retry_num > RETRY_NUMBER) { 334 ALOGE("%s unable to open the mixer for--card %d, aborting.", 335 __func__, card); 336 goto error; 337 } 338 usleep(RETRY_US); 339 } 340 } while (mixer == NULL); 341 342 sprintf(mixer_path, "/system/etc/mixer_paths_%d.xml", card); 343 audio_route = audio_route_init(card, mixer_path); 344 if (!audio_route) { 345 ALOGE("%s: Failed to init audio route controls for card %d, aborting.", 346 __func__, card); 347 goto error; 348 } 349 mixer_card = calloc(1, sizeof(struct mixer_card)); 350 mixer_card->card = card; 351 mixer_card->mixer = mixer; 352 mixer_card->audio_route = audio_route; 353 list_add_tail(&adev->mixer_list, &mixer_card->adev_list_node); 354 } 355 } 356 357 return 0; 358 359 error: 360 free_mixer_list(adev); 361 return -ENODEV; 362 } 363 364 const char *get_snd_device_name(snd_device_t snd_device) 365 { 366 const char *name = NULL; 367 368 if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) 369 name = device_table[snd_device]; 370 371 ALOGE_IF(name == NULL, "%s: invalid snd device %d", __func__, snd_device); 372 373 return name; 374 } 375 376 const char *get_snd_device_display_name(snd_device_t snd_device) 377 { 378 const char *name = get_snd_device_name(snd_device); 379 380 if (name == NULL) 381 name = "SND DEVICE NOT FOUND"; 382 383 return name; 384 } 385 386 struct pcm_device_profile *get_pcm_device(usecase_type_t uc_type, audio_devices_t devices) 387 { 388 int i; 389 390 devices &= ~AUDIO_DEVICE_BIT_IN; 391 392 if (!devices) 393 return NULL; 394 395 for (i = 0; pcm_devices[i] != NULL; i++) { 396 if ((pcm_devices[i]->type == uc_type) && 397 (devices & pcm_devices[i]->devices) == devices) 398 return pcm_devices[i]; 399 } 400 401 return NULL; 402 } 403 404 static struct audio_usecase *get_usecase_from_id(struct audio_device *adev, 405 audio_usecase_t uc_id) 406 { 407 struct audio_usecase *usecase; 408 struct listnode *node; 409 410 list_for_each(node, &adev->usecase_list) { 411 usecase = node_to_item(node, struct audio_usecase, adev_list_node); 412 if (usecase->id == uc_id) 413 return usecase; 414 } 415 return NULL; 416 } 417 418 static struct audio_usecase *get_usecase_from_type(struct audio_device *adev, 419 usecase_type_t type) 420 { 421 struct audio_usecase *usecase; 422 struct listnode *node; 423 424 list_for_each(node, &adev->usecase_list) { 425 usecase = node_to_item(node, struct audio_usecase, adev_list_node); 426 if (usecase->type & type) 427 return usecase; 428 } 429 return NULL; 430 } 431 432 /* always called with adev lock held */ 433 static int set_voice_volume_l(struct audio_device *adev, float volume) 434 { 435 int err = 0; 436 (void)volume; 437 438 if (adev->mode == AUDIO_MODE_IN_CALL) { 439 /* TODO */ 440 } 441 return err; 442 } 443 444 445 snd_device_t get_output_snd_device(struct audio_device *adev, audio_devices_t devices) 446 { 447 448 audio_mode_t mode = adev->mode; 449 snd_device_t snd_device = SND_DEVICE_NONE; 450 451 ALOGV("%s: enter: output devices(%#x), mode(%d)", __func__, devices, mode); 452 if (devices == AUDIO_DEVICE_NONE || 453 devices & AUDIO_DEVICE_BIT_IN) { 454 ALOGV("%s: Invalid output devices (%#x)", __func__, devices); 455 goto exit; 456 } 457 458 if (mode == AUDIO_MODE_IN_CALL) { 459 if (devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE || 460 devices & AUDIO_DEVICE_OUT_WIRED_HEADSET) { 461 if (adev->tty_mode == TTY_MODE_FULL) 462 snd_device = SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES; 463 else if (adev->tty_mode == TTY_MODE_VCO) 464 snd_device = SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES; 465 else if (adev->tty_mode == TTY_MODE_HCO) 466 snd_device = SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET; 467 else 468 snd_device = SND_DEVICE_OUT_VOICE_HEADPHONES; 469 } else if (devices & AUDIO_DEVICE_OUT_SPEAKER) { 470 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER; 471 } else if (devices & AUDIO_DEVICE_OUT_EARPIECE) { 472 snd_device = SND_DEVICE_OUT_HANDSET; 473 } 474 if (snd_device != SND_DEVICE_NONE) { 475 goto exit; 476 } 477 } 478 479 if (popcount(devices) == 2) { 480 if (devices == (AUDIO_DEVICE_OUT_WIRED_HEADPHONE | 481 AUDIO_DEVICE_OUT_SPEAKER)) { 482 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES; 483 } else if (devices == (AUDIO_DEVICE_OUT_WIRED_HEADSET | 484 AUDIO_DEVICE_OUT_SPEAKER)) { 485 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES; 486 } else { 487 ALOGE("%s: Invalid combo device(%#x)", __func__, devices); 488 goto exit; 489 } 490 if (snd_device != SND_DEVICE_NONE) { 491 goto exit; 492 } 493 } 494 495 if (popcount(devices) != 1) { 496 ALOGE("%s: Invalid output devices(%#x)", __func__, devices); 497 goto exit; 498 } 499 500 if (devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE || 501 devices & AUDIO_DEVICE_OUT_WIRED_HEADSET) { 502 snd_device = SND_DEVICE_OUT_HEADPHONES; 503 } else if (devices & AUDIO_DEVICE_OUT_SPEAKER) { 504 snd_device = SND_DEVICE_OUT_SPEAKER; 505 } else if (devices & AUDIO_DEVICE_OUT_EARPIECE) { 506 snd_device = SND_DEVICE_OUT_HANDSET; 507 } else { 508 ALOGE("%s: Unknown device(s) %#x", __func__, devices); 509 } 510 exit: 511 ALOGV("%s: exit: snd_device(%s)", __func__, device_table[snd_device]); 512 return snd_device; 513 } 514 515 snd_device_t get_input_snd_device(struct audio_device *adev, audio_devices_t out_device) 516 { 517 audio_source_t source; 518 audio_mode_t mode = adev->mode; 519 audio_devices_t in_device; 520 audio_channel_mask_t channel_mask; 521 snd_device_t snd_device = SND_DEVICE_NONE; 522 struct stream_in *active_input = NULL; 523 struct audio_usecase *usecase; 524 525 usecase = get_usecase_from_type(adev, PCM_CAPTURE|VOICE_CALL); 526 if (usecase != NULL) { 527 active_input = (struct stream_in *)usecase->stream; 528 } 529 source = (active_input == NULL) ? 530 AUDIO_SOURCE_DEFAULT : active_input->source; 531 532 in_device = ((active_input == NULL) ? 533 AUDIO_DEVICE_NONE : active_input->devices) 534 & ~AUDIO_DEVICE_BIT_IN; 535 channel_mask = (active_input == NULL) ? 536 AUDIO_CHANNEL_IN_MONO : active_input->main_channels; 537 538 ALOGV("%s: enter: out_device(%#x) in_device(%#x)", 539 __func__, out_device, in_device); 540 if (mode == AUDIO_MODE_IN_CALL) { 541 if (out_device == AUDIO_DEVICE_NONE) { 542 ALOGE("%s: No output device set for voice call", __func__); 543 goto exit; 544 } 545 if (adev->tty_mode != TTY_MODE_OFF) { 546 if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE || 547 out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) { 548 switch (adev->tty_mode) { 549 case TTY_MODE_FULL: 550 snd_device = SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC; 551 break; 552 case TTY_MODE_VCO: 553 snd_device = SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC; 554 break; 555 case TTY_MODE_HCO: 556 snd_device = SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC; 557 break; 558 default: 559 ALOGE("%s: Invalid TTY mode (%#x)", __func__, adev->tty_mode); 560 } 561 goto exit; 562 } 563 } 564 if (out_device & AUDIO_DEVICE_OUT_EARPIECE || 565 out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE) { 566 snd_device = SND_DEVICE_IN_HANDSET_MIC; 567 } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) { 568 snd_device = SND_DEVICE_IN_VOICE_HEADSET_MIC; 569 } else if (out_device & AUDIO_DEVICE_OUT_SPEAKER) { 570 snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC; 571 } 572 } else if (source == AUDIO_SOURCE_CAMCORDER) { 573 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC || 574 in_device & AUDIO_DEVICE_IN_BACK_MIC) { 575 snd_device = SND_DEVICE_IN_CAMCORDER_MIC; 576 } 577 } else if (source == AUDIO_SOURCE_VOICE_RECOGNITION) { 578 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) { 579 if (adev->dualmic_config == DUALMIC_CONFIG_1) { 580 if (channel_mask == AUDIO_CHANNEL_IN_FRONT_BACK) 581 snd_device = SND_DEVICE_IN_VOICE_REC_DMIC_1; 582 else if (adev->ns_in_voice_rec) 583 snd_device = SND_DEVICE_IN_VOICE_REC_DMIC_NS_1; 584 } 585 586 if (snd_device == SND_DEVICE_NONE) { 587 snd_device = SND_DEVICE_IN_VOICE_REC_MIC; 588 } 589 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) { 590 snd_device = SND_DEVICE_IN_VOICE_REC_HEADSET_MIC; 591 } 592 } else if (source == AUDIO_SOURCE_VOICE_COMMUNICATION || source == AUDIO_SOURCE_MIC) { 593 if (out_device & AUDIO_DEVICE_OUT_SPEAKER) 594 in_device = AUDIO_DEVICE_IN_BACK_MIC; 595 if (active_input) { 596 if (active_input->enable_aec) { 597 if (in_device & AUDIO_DEVICE_IN_BACK_MIC) { 598 snd_device = SND_DEVICE_IN_SPEAKER_MIC_AEC; 599 } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) { 600 if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE) { 601 snd_device = SND_DEVICE_IN_SPEAKER_MIC_AEC; 602 } else { 603 snd_device = SND_DEVICE_IN_HANDSET_MIC_AEC; 604 } 605 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) { 606 snd_device = SND_DEVICE_IN_HEADSET_MIC_AEC; 607 } 608 } 609 /* TODO: set echo reference */ 610 } 611 } else if (source == AUDIO_SOURCE_DEFAULT) { 612 goto exit; 613 } 614 615 616 if (snd_device != SND_DEVICE_NONE) { 617 goto exit; 618 } 619 620 if (in_device != AUDIO_DEVICE_NONE && 621 !(in_device & AUDIO_DEVICE_IN_VOICE_CALL) && 622 !(in_device & AUDIO_DEVICE_IN_COMMUNICATION)) { 623 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) { 624 snd_device = SND_DEVICE_IN_HANDSET_MIC; 625 } else if (in_device & AUDIO_DEVICE_IN_BACK_MIC) { 626 snd_device = SND_DEVICE_IN_SPEAKER_MIC; 627 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) { 628 snd_device = SND_DEVICE_IN_HEADSET_MIC; 629 } else if (in_device & AUDIO_DEVICE_IN_AUX_DIGITAL) { 630 snd_device = SND_DEVICE_IN_HDMI_MIC; 631 } else { 632 ALOGE("%s: Unknown input device(s) %#x", __func__, in_device); 633 ALOGW("%s: Using default handset-mic", __func__); 634 snd_device = SND_DEVICE_IN_HANDSET_MIC; 635 } 636 } else { 637 if (out_device & AUDIO_DEVICE_OUT_EARPIECE) { 638 snd_device = SND_DEVICE_IN_HANDSET_MIC; 639 } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) { 640 snd_device = SND_DEVICE_IN_HEADSET_MIC; 641 } else if (out_device & AUDIO_DEVICE_OUT_SPEAKER) { 642 snd_device = SND_DEVICE_IN_SPEAKER_MIC; 643 } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE) { 644 snd_device = SND_DEVICE_IN_HANDSET_MIC; 645 } else { 646 ALOGE("%s: Unknown output device(s) %#x", __func__, out_device); 647 ALOGW("%s: Using default handset-mic", __func__); 648 snd_device = SND_DEVICE_IN_HANDSET_MIC; 649 } 650 } 651 exit: 652 ALOGV("%s: exit: in_snd_device(%s)", __func__, device_table[snd_device]); 653 return snd_device; 654 } 655 656 int set_hdmi_channels(struct audio_device *adev, int channel_count) 657 { 658 struct mixer_ctl *ctl; 659 const char *mixer_ctl_name = ""; 660 (void)adev; 661 (void)channel_count; 662 /* TODO */ 663 664 return 0; 665 } 666 667 int edid_get_max_channels(struct audio_device *adev) 668 { 669 int max_channels = 2; 670 struct mixer_ctl *ctl; 671 (void)adev; 672 673 /* TODO */ 674 return max_channels; 675 } 676 677 /* Delay in Us */ 678 int64_t render_latency(audio_usecase_t usecase) 679 { 680 (void)usecase; 681 /* TODO */ 682 return 0; 683 } 684 685 static int enable_snd_device(struct audio_device *adev, 686 struct audio_usecase *uc_info, 687 snd_device_t snd_device, 688 bool update_mixer) 689 { 690 struct mixer_card *mixer_card; 691 struct listnode *node; 692 const char *snd_device_name = get_snd_device_name(snd_device); 693 694 if (snd_device_name == NULL) 695 return -EINVAL; 696 697 adev->snd_dev_ref_cnt[snd_device]++; 698 if (adev->snd_dev_ref_cnt[snd_device] > 1) { 699 ALOGV("%s: snd_device(%d: %s) is already active", 700 __func__, snd_device, snd_device_name); 701 return 0; 702 } 703 704 ALOGV("%s: snd_device(%d: %s)", __func__, 705 snd_device, snd_device_name); 706 707 list_for_each(node, &uc_info->mixer_list) { 708 mixer_card = node_to_item(node, struct mixer_card, uc_list_node[uc_info->id]); 709 audio_route_apply_path(mixer_card->audio_route, snd_device_name); 710 if (update_mixer) 711 audio_route_update_mixer(mixer_card->audio_route); 712 } 713 714 return 0; 715 } 716 717 static int disable_snd_device(struct audio_device *adev, 718 struct audio_usecase *uc_info, 719 snd_device_t snd_device, 720 bool update_mixer) 721 { 722 struct mixer_card *mixer_card; 723 struct listnode *node; 724 const char *snd_device_name = get_snd_device_name(snd_device); 725 726 if (snd_device_name == NULL) 727 return -EINVAL; 728 729 if (adev->snd_dev_ref_cnt[snd_device] <= 0) { 730 ALOGE("%s: device ref cnt is already 0", __func__); 731 return -EINVAL; 732 } 733 adev->snd_dev_ref_cnt[snd_device]--; 734 if (adev->snd_dev_ref_cnt[snd_device] == 0) { 735 ALOGV("%s: snd_device(%d: %s)", __func__, 736 snd_device, snd_device_name); 737 list_for_each(node, &uc_info->mixer_list) { 738 mixer_card = node_to_item(node, struct mixer_card, uc_list_node[uc_info->id]); 739 audio_route_reset_path(mixer_card->audio_route, snd_device_name); 740 if (update_mixer) 741 audio_route_update_mixer(mixer_card->audio_route); 742 } 743 } 744 return 0; 745 } 746 747 static int select_devices(struct audio_device *adev, 748 audio_usecase_t uc_id) 749 { 750 snd_device_t out_snd_device = SND_DEVICE_NONE; 751 snd_device_t in_snd_device = SND_DEVICE_NONE; 752 struct audio_usecase *usecase = NULL; 753 struct audio_usecase *vc_usecase = NULL; 754 struct listnode *node; 755 struct stream_in *active_input = NULL; 756 struct stream_out *active_out; 757 struct mixer_card *mixer_card; 758 759 ALOGV("%s: usecase(%d)", __func__, uc_id); 760 761 if (uc_id == USECASE_AUDIO_CAPTURE_HOTWORD) 762 return 0; 763 764 usecase = get_usecase_from_type(adev, PCM_CAPTURE|VOICE_CALL); 765 if (usecase != NULL) { 766 active_input = (struct stream_in *)usecase->stream; 767 } 768 769 usecase = get_usecase_from_id(adev, uc_id); 770 if (usecase == NULL) { 771 ALOGE("%s: Could not find the usecase(%d)", __func__, uc_id); 772 return -EINVAL; 773 } 774 active_out = (struct stream_out *)usecase->stream; 775 776 if (usecase->type == VOICE_CALL) { 777 out_snd_device = get_output_snd_device(adev, active_out->devices); 778 in_snd_device = get_input_snd_device(adev, active_out->devices); 779 usecase->devices = active_out->devices; 780 } else { 781 /* 782 * If the voice call is active, use the sound devices of voice call usecase 783 * so that it would not result any device switch. All the usecases will 784 * be switched to new device when select_devices() is called for voice call 785 * usecase. 786 */ 787 if (adev->in_call) { 788 vc_usecase = get_usecase_from_id(adev, USECASE_VOICE_CALL); 789 if (usecase == NULL) { 790 ALOGE("%s: Could not find the voice call usecase", __func__); 791 } else { 792 in_snd_device = vc_usecase->in_snd_device; 793 out_snd_device = vc_usecase->out_snd_device; 794 } 795 } 796 if (usecase->type == PCM_PLAYBACK) { 797 usecase->devices = active_out->devices; 798 in_snd_device = SND_DEVICE_NONE; 799 if (out_snd_device == SND_DEVICE_NONE) { 800 out_snd_device = get_output_snd_device(adev, active_out->devices); 801 if (active_out == adev->primary_output && 802 active_input && 803 active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION) { 804 select_devices(adev, active_input->usecase); 805 } 806 } 807 } else if (usecase->type == PCM_CAPTURE) { 808 usecase->devices = ((struct stream_in *)usecase->stream)->devices; 809 out_snd_device = SND_DEVICE_NONE; 810 if (in_snd_device == SND_DEVICE_NONE) { 811 if (active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION && 812 adev->primary_output && !adev->primary_output->standby) { 813 in_snd_device = get_input_snd_device(adev, adev->primary_output->devices); 814 } else { 815 in_snd_device = get_input_snd_device(adev, AUDIO_DEVICE_NONE); 816 } 817 } 818 } 819 } 820 821 if (out_snd_device == usecase->out_snd_device && 822 in_snd_device == usecase->in_snd_device) { 823 return 0; 824 } 825 826 ALOGV("%s: out_snd_device(%d: %s) in_snd_device(%d: %s)", __func__, 827 out_snd_device, get_snd_device_display_name(out_snd_device), 828 in_snd_device, get_snd_device_display_name(in_snd_device)); 829 830 831 /* Disable current sound devices */ 832 if (usecase->out_snd_device != SND_DEVICE_NONE) { 833 disable_snd_device(adev, usecase, usecase->out_snd_device, false); 834 } 835 836 if (usecase->in_snd_device != SND_DEVICE_NONE) { 837 disable_snd_device(adev, usecase, usecase->in_snd_device, false); 838 } 839 840 /* Enable new sound devices */ 841 if (out_snd_device != SND_DEVICE_NONE) { 842 enable_snd_device(adev, usecase, out_snd_device, false); 843 } 844 845 if (in_snd_device != SND_DEVICE_NONE) { 846 enable_snd_device(adev, usecase, in_snd_device, false); 847 } 848 849 list_for_each(node, &usecase->mixer_list) { 850 mixer_card = node_to_item(node, struct mixer_card, uc_list_node[usecase->id]); 851 audio_route_update_mixer(mixer_card->audio_route); 852 } 853 854 usecase->in_snd_device = in_snd_device; 855 usecase->out_snd_device = out_snd_device; 856 857 return 0; 858 } 859 860 static ssize_t read_frames(struct stream_in *in, void *buffer, ssize_t frames); 861 static int do_in_standby_l(struct stream_in *in); 862 static audio_format_t in_get_format(const struct audio_stream *stream); 863 864 #ifdef PREPROCESSING_ENABLED 865 static int get_command_status(int status, int fct_status, uint32_t cmd_status) { 866 if (fct_status != 0) 867 status = fct_status; 868 else if (cmd_status != 0) 869 status = cmd_status; 870 return status; 871 } 872 873 static uint32_t in_get_aux_channels(struct stream_in *in) 874 { 875 if (in->num_preprocessors == 0) 876 return 0; 877 878 /* do not enable quad mic configurations when capturing from other 879 * microphones than main */ 880 if (!(in->devices & AUDIO_DEVICE_IN_BUILTIN_MIC & ~AUDIO_DEVICE_BIT_IN)) 881 return 0; 882 883 return AUDIO_CHANNEL_INDEX_MASK_4; 884 } 885 886 static int in_configure_effect_channels(effect_handle_t effect, 887 channel_config_t *channel_config) 888 { 889 int status = 0; 890 int fct_status; 891 int32_t cmd_status; 892 uint32_t reply_size; 893 effect_config_t config; 894 uint32_t cmd[(sizeof(uint32_t) + sizeof(channel_config_t) - 1) / sizeof(uint32_t) + 1]; 895 896 ALOGV("in_configure_effect_channels(): configure effect with channels: [%04x][%04x]", 897 channel_config->main_channels, 898 channel_config->aux_channels); 899 900 config.inputCfg.mask = EFFECT_CONFIG_CHANNELS; 901 config.outputCfg.mask = EFFECT_CONFIG_CHANNELS; 902 reply_size = sizeof(effect_config_t); 903 fct_status = (*effect)->command(effect, 904 EFFECT_CMD_GET_CONFIG, 905 0, 906 NULL, 907 &reply_size, 908 &config); 909 if (fct_status != 0) { 910 ALOGE("in_configure_effect_channels(): EFFECT_CMD_GET_CONFIG failed"); 911 return fct_status; 912 } 913 914 config.inputCfg.channels = channel_config->aux_channels; 915 config.outputCfg.channels = config.inputCfg.channels; 916 reply_size = sizeof(uint32_t); 917 fct_status = (*effect)->command(effect, 918 EFFECT_CMD_SET_CONFIG, 919 sizeof(effect_config_t), 920 &config, 921 &reply_size, 922 &cmd_status); 923 status = get_command_status(status, fct_status, cmd_status); 924 if (status != 0) { 925 ALOGE("in_configure_effect_channels(): EFFECT_CMD_SET_CONFIG failed"); 926 return status; 927 } 928 929 /* some implementations need to be re-enabled after a config change */ 930 reply_size = sizeof(uint32_t); 931 fct_status = (*effect)->command(effect, 932 EFFECT_CMD_ENABLE, 933 0, 934 NULL, 935 &reply_size, 936 &cmd_status); 937 status = get_command_status(status, fct_status, cmd_status); 938 if (status != 0) { 939 ALOGE("in_configure_effect_channels(): EFFECT_CMD_ENABLE failed"); 940 return status; 941 } 942 943 return status; 944 } 945 946 static int in_reconfigure_channels(struct stream_in *in, 947 effect_handle_t effect, 948 channel_config_t *channel_config, 949 bool config_changed) { 950 951 int status = 0; 952 953 ALOGV("in_reconfigure_channels(): config_changed %d effect %p", 954 config_changed, effect); 955 956 /* if config changed, reconfigure all previously added effects */ 957 if (config_changed) { 958 int i; 959 ALOGV("%s: config_changed (%d)", __func__, config_changed); 960 for (i = 0; i < in->num_preprocessors; i++) { 961 int cur_status = in_configure_effect_channels(in->preprocessors[i].effect_itfe, 962 channel_config); 963 ALOGV("%s: in_configure_effect_channels i=(%d), [main_channel,aux_channel]=[%d|%d], status=%d", 964 __func__, i, channel_config->main_channels, channel_config->aux_channels, cur_status); 965 if (cur_status != 0) { 966 ALOGV("in_reconfigure_channels(): error %d configuring effect " 967 "%d with channels: [%04x][%04x]", 968 cur_status, 969 i, 970 channel_config->main_channels, 971 channel_config->aux_channels); 972 status = cur_status; 973 } 974 } 975 } else if (effect != NULL && channel_config->aux_channels) { 976 /* if aux channels config did not change but aux channels are present, 977 * we still need to configure the effect being added */ 978 status = in_configure_effect_channels(effect, channel_config); 979 } 980 return status; 981 } 982 983 static void in_update_aux_channels(struct stream_in *in, 984 effect_handle_t effect) 985 { 986 uint32_t aux_channels; 987 channel_config_t channel_config; 988 int status; 989 990 aux_channels = in_get_aux_channels(in); 991 992 channel_config.main_channels = in->main_channels; 993 channel_config.aux_channels = aux_channels; 994 status = in_reconfigure_channels(in, 995 effect, 996 &channel_config, 997 (aux_channels != in->aux_channels)); 998 999 if (status != 0) { 1000 ALOGV("in_update_aux_channels(): in_reconfigure_channels error %d", status); 1001 /* resetting aux channels configuration */ 1002 aux_channels = 0; 1003 channel_config.aux_channels = 0; 1004 in_reconfigure_channels(in, effect, &channel_config, true); 1005 } 1006 ALOGV("%s: aux_channels=%d, in->aux_channels_changed=%d", __func__, aux_channels, in->aux_channels_changed); 1007 if (in->aux_channels != aux_channels) { 1008 in->aux_channels_changed = true; 1009 in->aux_channels = aux_channels; 1010 do_in_standby_l(in); 1011 } 1012 } 1013 #endif 1014 1015 /* This function reads PCM data and: 1016 * - resample if needed 1017 * - process if pre-processors are attached 1018 * - discard unwanted channels 1019 */ 1020 static ssize_t read_and_process_frames(struct audio_stream_in *stream, void* buffer, ssize_t frames_num) 1021 { 1022 struct stream_in *in = (struct stream_in *)stream; 1023 ssize_t frames_wr = 0; /* Number of frames actually read */ 1024 size_t bytes_per_sample = audio_bytes_per_sample(stream->common.get_format(&stream->common)); 1025 void *proc_buf_out = buffer; 1026 #ifdef PREPROCESSING_ENABLED 1027 audio_buffer_t in_buf; 1028 audio_buffer_t out_buf; 1029 int i; 1030 bool has_processing = in->num_preprocessors != 0; 1031 #endif 1032 /* Additional channels might be added on top of main_channels: 1033 * - aux_channels (by processing effects) 1034 * - extra channels due to HW limitations 1035 * In case of additional channels, we cannot work inplace 1036 */ 1037 size_t src_channels = in->config.channels; 1038 size_t dst_channels = audio_channel_count_from_in_mask(in->main_channels); 1039 bool channel_remapping_needed = (dst_channels != src_channels); 1040 size_t src_buffer_size = frames_num * src_channels * bytes_per_sample; 1041 1042 #ifdef PREPROCESSING_ENABLED 1043 if (has_processing) { 1044 /* since all the processing below is done in frames and using the config.channels 1045 * as the number of channels, no changes is required in case aux_channels are present */ 1046 while (frames_wr < frames_num) { 1047 /* first reload enough frames at the end of process input buffer */ 1048 if (in->proc_buf_frames < (size_t)frames_num) { 1049 ssize_t frames_rd; 1050 if (in->proc_buf_size < (size_t)frames_num) { 1051 in->proc_buf_size = (size_t)frames_num; 1052 in->proc_buf_in = realloc(in->proc_buf_in, src_buffer_size); 1053 ALOG_ASSERT((in->proc_buf_in != NULL), 1054 "process_frames() failed to reallocate proc_buf_in"); 1055 if (channel_remapping_needed) { 1056 in->proc_buf_out = realloc(in->proc_buf_out, src_buffer_size); 1057 ALOG_ASSERT((in->proc_buf_out != NULL), 1058 "process_frames() failed to reallocate proc_buf_out"); 1059 proc_buf_out = in->proc_buf_out; 1060 } 1061 } 1062 frames_rd = read_frames(in, 1063 in->proc_buf_in + 1064 in->proc_buf_frames * src_channels * bytes_per_sample, 1065 frames_num - in->proc_buf_frames); 1066 if (frames_rd < 0) { 1067 /* Return error code */ 1068 frames_wr = frames_rd; 1069 break; 1070 } 1071 in->proc_buf_frames += frames_rd; 1072 } 1073 1074 /* in_buf.frameCount and out_buf.frameCount indicate respectively 1075 * the maximum number of frames to be consumed and produced by process() */ 1076 in_buf.frameCount = in->proc_buf_frames; 1077 in_buf.s16 = in->proc_buf_in; 1078 out_buf.frameCount = frames_num - frames_wr; 1079 out_buf.s16 = (int16_t *)proc_buf_out + frames_wr * in->config.channels; 1080 1081 /* FIXME: this works because of current pre processing library implementation that 1082 * does the actual process only when the last enabled effect process is called. 1083 * The generic solution is to have an output buffer for each effect and pass it as 1084 * input to the next. 1085 */ 1086 for (i = 0; i < in->num_preprocessors; i++) { 1087 (*in->preprocessors[i].effect_itfe)->process(in->preprocessors[i].effect_itfe, 1088 &in_buf, 1089 &out_buf); 1090 } 1091 1092 /* process() has updated the number of frames consumed and produced in 1093 * in_buf.frameCount and out_buf.frameCount respectively 1094 * move remaining frames to the beginning of in->proc_buf_in */ 1095 in->proc_buf_frames -= in_buf.frameCount; 1096 1097 if (in->proc_buf_frames) { 1098 memcpy(in->proc_buf_in, 1099 in->proc_buf_in + in_buf.frameCount * src_channels * bytes_per_sample, 1100 in->proc_buf_frames * in->config.channels * audio_bytes_per_sample(in_get_format(in))); 1101 } 1102 1103 /* if not enough frames were passed to process(), read more and retry. */ 1104 if (out_buf.frameCount == 0) { 1105 ALOGW("No frames produced by preproc"); 1106 continue; 1107 } 1108 1109 if ((frames_wr + (ssize_t)out_buf.frameCount) <= frames_num) { 1110 frames_wr += out_buf.frameCount; 1111 } else { 1112 /* The effect does not comply to the API. In theory, we should never end up here! */ 1113 ALOGE("preprocessing produced too many frames: %d + %zd > %d !", 1114 (unsigned int)frames_wr, out_buf.frameCount, (unsigned int)frames_num); 1115 frames_wr = frames_num; 1116 } 1117 } 1118 } 1119 else 1120 #endif //PREPROCESSING_ENABLED 1121 { 1122 /* No processing effects attached */ 1123 if (channel_remapping_needed) { 1124 /* With additional channels, we cannot use original buffer */ 1125 if (in->proc_buf_size < src_buffer_size) { 1126 in->proc_buf_size = src_buffer_size; 1127 in->proc_buf_out = realloc(in->proc_buf_out, src_buffer_size); 1128 ALOG_ASSERT((in->proc_buf_out != NULL), 1129 "process_frames() failed to reallocate proc_buf_out"); 1130 } 1131 proc_buf_out = in->proc_buf_out; 1132 } 1133 frames_wr = read_frames(in, proc_buf_out, frames_num); 1134 ALOG_ASSERT(frames_wr <= frames_num, "read more frames than requested"); 1135 } 1136 1137 if (channel_remapping_needed) { 1138 size_t ret = adjust_channels(proc_buf_out, src_channels, buffer, dst_channels, 1139 bytes_per_sample, frames_wr * src_channels * bytes_per_sample); 1140 ALOG_ASSERT(ret == (frames_wr * dst_channels * bytes_per_sample)); 1141 } 1142 1143 return frames_wr; 1144 } 1145 1146 static int get_next_buffer(struct resampler_buffer_provider *buffer_provider, 1147 struct resampler_buffer* buffer) 1148 { 1149 struct stream_in *in; 1150 struct pcm_device *pcm_device; 1151 1152 if (buffer_provider == NULL || buffer == NULL) 1153 return -EINVAL; 1154 1155 in = (struct stream_in *)((char *)buffer_provider - 1156 offsetof(struct stream_in, buf_provider)); 1157 1158 if (list_empty(&in->pcm_dev_list)) { 1159 buffer->raw = NULL; 1160 buffer->frame_count = 0; 1161 in->read_status = -ENODEV; 1162 return -ENODEV; 1163 } 1164 1165 pcm_device = node_to_item(list_head(&in->pcm_dev_list), 1166 struct pcm_device, stream_list_node); 1167 1168 if (in->read_buf_frames == 0) { 1169 size_t size_in_bytes = pcm_frames_to_bytes(pcm_device->pcm, in->config.period_size); 1170 if (in->read_buf_size < in->config.period_size) { 1171 in->read_buf_size = in->config.period_size; 1172 in->read_buf = (int16_t *) realloc(in->read_buf, size_in_bytes); 1173 ALOG_ASSERT((in->read_buf != NULL), 1174 "get_next_buffer() failed to reallocate read_buf"); 1175 } 1176 1177 in->read_status = pcm_read(pcm_device->pcm, (void*)in->read_buf, size_in_bytes); 1178 1179 if (in->read_status != 0) { 1180 ALOGE("get_next_buffer() pcm_read error %d", in->read_status); 1181 buffer->raw = NULL; 1182 buffer->frame_count = 0; 1183 return in->read_status; 1184 } 1185 in->read_buf_frames = in->config.period_size; 1186 } 1187 1188 buffer->frame_count = (buffer->frame_count > in->read_buf_frames) ? 1189 in->read_buf_frames : buffer->frame_count; 1190 buffer->i16 = in->read_buf + (in->config.period_size - in->read_buf_frames) * 1191 in->config.channels; 1192 return in->read_status; 1193 } 1194 1195 static void release_buffer(struct resampler_buffer_provider *buffer_provider, 1196 struct resampler_buffer* buffer) 1197 { 1198 struct stream_in *in; 1199 1200 if (buffer_provider == NULL || buffer == NULL) 1201 return; 1202 1203 in = (struct stream_in *)((char *)buffer_provider - 1204 offsetof(struct stream_in, buf_provider)); 1205 1206 in->read_buf_frames -= buffer->frame_count; 1207 } 1208 1209 /* read_frames() reads frames from kernel driver, down samples to capture rate 1210 * if necessary and output the number of frames requested to the buffer specified */ 1211 static ssize_t read_frames(struct stream_in *in, void *buffer, ssize_t frames) 1212 { 1213 ssize_t frames_wr = 0; 1214 1215 struct pcm_device *pcm_device; 1216 1217 if (list_empty(&in->pcm_dev_list)) { 1218 ALOGE("%s: pcm device list empty", __func__); 1219 return -EINVAL; 1220 } 1221 1222 pcm_device = node_to_item(list_head(&in->pcm_dev_list), 1223 struct pcm_device, stream_list_node); 1224 1225 while (frames_wr < frames) { 1226 size_t frames_rd = frames - frames_wr; 1227 ALOGVV("%s: frames_rd: %zd, frames_wr: %zd, in->config.channels: %d", 1228 __func__,frames_rd,frames_wr,in->config.channels); 1229 if (in->resampler != NULL) { 1230 in->resampler->resample_from_provider(in->resampler, 1231 (int16_t *)((char *)buffer + 1232 pcm_frames_to_bytes(pcm_device->pcm, frames_wr)), 1233 &frames_rd); 1234 } else { 1235 struct resampler_buffer buf = { 1236 { raw : NULL, }, 1237 frame_count : frames_rd, 1238 }; 1239 get_next_buffer(&in->buf_provider, &buf); 1240 if (buf.raw != NULL) { 1241 memcpy((char *)buffer + 1242 pcm_frames_to_bytes(pcm_device->pcm, frames_wr), 1243 buf.raw, 1244 pcm_frames_to_bytes(pcm_device->pcm, buf.frame_count)); 1245 frames_rd = buf.frame_count; 1246 } 1247 release_buffer(&in->buf_provider, &buf); 1248 } 1249 /* in->read_status is updated by getNextBuffer() also called by 1250 * in->resampler->resample_from_provider() */ 1251 if (in->read_status != 0) 1252 return in->read_status; 1253 1254 frames_wr += frames_rd; 1255 } 1256 return frames_wr; 1257 } 1258 1259 static int in_release_pcm_devices(struct stream_in *in) 1260 { 1261 struct pcm_device *pcm_device; 1262 struct listnode *node; 1263 struct listnode *next; 1264 1265 list_for_each_safe(node, next, &in->pcm_dev_list) { 1266 pcm_device = node_to_item(node, struct pcm_device, stream_list_node); 1267 list_remove(node); 1268 free(pcm_device); 1269 } 1270 1271 return 0; 1272 } 1273 1274 static int stop_input_stream(struct stream_in *in) 1275 { 1276 struct audio_usecase *uc_info; 1277 struct audio_device *adev = in->dev; 1278 1279 adev->active_input = NULL; 1280 ALOGV("%s: enter: usecase(%d: %s)", __func__, 1281 in->usecase, use_case_table[in->usecase]); 1282 uc_info = get_usecase_from_id(adev, in->usecase); 1283 if (uc_info == NULL) { 1284 ALOGE("%s: Could not find the usecase (%d) in the list", 1285 __func__, in->usecase); 1286 return -EINVAL; 1287 } 1288 1289 /* Disable the tx device */ 1290 disable_snd_device(adev, uc_info, uc_info->in_snd_device, true); 1291 1292 list_remove(&uc_info->adev_list_node); 1293 free(uc_info); 1294 1295 if (list_empty(&in->pcm_dev_list)) { 1296 ALOGE("%s: pcm device list empty", __func__); 1297 return -EINVAL; 1298 } 1299 1300 in_release_pcm_devices(in); 1301 list_init(&in->pcm_dev_list); 1302 1303 return 0; 1304 } 1305 1306 int start_input_stream(struct stream_in *in) 1307 { 1308 /* Enable output device and stream routing controls */ 1309 int ret = 0; 1310 bool recreate_resampler = false; 1311 struct audio_usecase *uc_info; 1312 struct audio_device *adev = in->dev; 1313 struct pcm_device_profile *pcm_profile; 1314 struct pcm_device *pcm_device; 1315 1316 ALOGV("%s: enter: usecase(%d)", __func__, in->usecase); 1317 adev->active_input = in; 1318 pcm_profile = get_pcm_device(in->usecase_type, in->devices); 1319 if (pcm_profile == NULL) { 1320 ALOGE("%s: Could not find PCM device id for the usecase(%d)", 1321 __func__, in->usecase); 1322 ret = -EINVAL; 1323 goto error_config; 1324 } 1325 1326 if (in->input_flags & AUDIO_INPUT_FLAG_FAST) { 1327 ALOGV("%s: change capture period size to low latency size %d", 1328 __func__, CAPTURE_PERIOD_SIZE_LOW_LATENCY); 1329 pcm_profile->config.period_size = CAPTURE_PERIOD_SIZE_LOW_LATENCY; 1330 } 1331 1332 uc_info = (struct audio_usecase *)calloc(1, sizeof(struct audio_usecase)); 1333 uc_info->id = in->usecase; 1334 uc_info->type = PCM_CAPTURE; 1335 uc_info->stream = (struct audio_stream *)in; 1336 uc_info->devices = in->devices; 1337 uc_info->in_snd_device = SND_DEVICE_NONE; 1338 uc_info->out_snd_device = SND_DEVICE_NONE; 1339 1340 pcm_device = (struct pcm_device *)calloc(1, sizeof(struct pcm_device)); 1341 pcm_device->pcm_profile = pcm_profile; 1342 list_init(&in->pcm_dev_list); 1343 list_add_tail(&in->pcm_dev_list, &pcm_device->stream_list_node); 1344 1345 list_init(&uc_info->mixer_list); 1346 list_add_tail(&uc_info->mixer_list, 1347 &adev_get_mixer_for_card(adev, 1348 pcm_device->pcm_profile->card)->uc_list_node[uc_info->id]); 1349 1350 list_add_tail(&adev->usecase_list, &uc_info->adev_list_node); 1351 1352 select_devices(adev, in->usecase); 1353 1354 /* Config should be updated as profile can be changed between different calls 1355 * to this function: 1356 * - Trigger resampler creation 1357 * - Config needs to be updated */ 1358 if (in->config.rate != pcm_profile->config.rate) { 1359 recreate_resampler = true; 1360 } 1361 in->config = pcm_profile->config; 1362 1363 #ifdef PREPROCESSING_ENABLED 1364 if (in->aux_channels_changed) { 1365 in->config.channels = audio_channel_count_from_in_mask(in->aux_channels); 1366 recreate_resampler = true; 1367 } 1368 #endif 1369 1370 if (in->requested_rate != in->config.rate) { 1371 recreate_resampler = true; 1372 } 1373 1374 if (recreate_resampler) { 1375 if (in->resampler) { 1376 release_resampler(in->resampler); 1377 in->resampler = NULL; 1378 } 1379 in->buf_provider.get_next_buffer = get_next_buffer; 1380 in->buf_provider.release_buffer = release_buffer; 1381 ret = create_resampler(in->config.rate, 1382 in->requested_rate, 1383 in->config.channels, 1384 RESAMPLER_QUALITY_DEFAULT, 1385 &in->buf_provider, 1386 &in->resampler); 1387 } 1388 1389 /* Open the PCM device. 1390 * The HW is limited to support only the default pcm_profile settings. 1391 * As such a change in aux_channels will not have an effect. 1392 */ 1393 ALOGV("%s: Opening PCM device card_id(%d) device_id(%d), channels %d, smp rate %d format %d, \ 1394 period_size %d", __func__, pcm_device->pcm_profile->card, pcm_device->pcm_profile->device, 1395 pcm_device->pcm_profile->config.channels,pcm_device->pcm_profile->config.rate, 1396 pcm_device->pcm_profile->config.format, pcm_device->pcm_profile->config.period_size); 1397 1398 if (pcm_profile->type == PCM_HOTWORD_STREAMING) { 1399 if (!adev->sound_trigger_open_for_streaming) { 1400 ALOGE("%s: No handle to sound trigger HAL", __func__); 1401 ret = -EIO; 1402 goto error_open; 1403 } 1404 pcm_device->pcm = NULL; 1405 pcm_device->sound_trigger_handle = 1406 adev->sound_trigger_open_for_streaming(); 1407 if (pcm_device->sound_trigger_handle <= 0) { 1408 ALOGE("%s: Failed to open DSP for streaming", __func__); 1409 ret = -EIO; 1410 goto error_open; 1411 } 1412 ALOGV("Opened DSP successfully"); 1413 } else { 1414 pcm_device->sound_trigger_handle = 0; 1415 pcm_device->pcm = pcm_open(pcm_device->pcm_profile->card, 1416 pcm_device->pcm_profile->device, 1417 PCM_IN | PCM_MONOTONIC, 1418 &pcm_device->pcm_profile->config); 1419 if (pcm_device->pcm && !pcm_is_ready(pcm_device->pcm)) { 1420 ALOGE("%s: %s", __func__, pcm_get_error(pcm_device->pcm)); 1421 pcm_close(pcm_device->pcm); 1422 pcm_device->pcm = NULL; 1423 ret = -EIO; 1424 goto error_open; 1425 } 1426 } 1427 1428 /* force read and proc buffer reallocation in case of frame size or 1429 * channel count change */ 1430 #ifdef PREPROCESSING_ENABLED 1431 in->proc_buf_frames = 0; 1432 #endif 1433 in->proc_buf_size = 0; 1434 in->read_buf_size = 0; 1435 in->read_buf_frames = 0; 1436 1437 /* if no supported sample rate is available, use the resampler */ 1438 if (in->resampler) { 1439 in->resampler->reset(in->resampler); 1440 } 1441 1442 ALOGV("%s: exit", __func__); 1443 return ret; 1444 1445 error_open: 1446 if (in->resampler) { 1447 release_resampler(in->resampler); 1448 in->resampler = NULL; 1449 } 1450 stop_input_stream(in); 1451 1452 error_config: 1453 ALOGV("%s: exit: status(%d)", __func__, ret); 1454 adev->active_input = NULL; 1455 return ret; 1456 } 1457 1458 static void lock_input_stream(struct stream_in *in) 1459 { 1460 pthread_mutex_lock(&in->pre_lock); 1461 pthread_mutex_lock(&in->lock); 1462 pthread_mutex_unlock(&in->pre_lock); 1463 } 1464 1465 static void lock_output_stream(struct stream_out *out) 1466 { 1467 pthread_mutex_lock(&out->pre_lock); 1468 pthread_mutex_lock(&out->lock); 1469 pthread_mutex_unlock(&out->pre_lock); 1470 } 1471 1472 static int uc_release_pcm_devices(struct audio_usecase *usecase) 1473 { 1474 struct stream_out *out = (struct stream_out *)usecase->stream; 1475 struct pcm_device *pcm_device; 1476 struct listnode *node; 1477 struct listnode *next; 1478 1479 list_for_each_safe(node, next, &out->pcm_dev_list) { 1480 pcm_device = node_to_item(node, struct pcm_device, stream_list_node); 1481 list_remove(node); 1482 free(pcm_device); 1483 } 1484 list_init(&usecase->mixer_list); 1485 1486 return 0; 1487 } 1488 1489 static int uc_select_pcm_devices(struct audio_usecase *usecase) 1490 1491 { 1492 struct stream_out *out = (struct stream_out *)usecase->stream; 1493 struct pcm_device *pcm_device; 1494 struct pcm_device_profile *pcm_profile; 1495 struct mixer_card *mixer_card; 1496 audio_devices_t devices = usecase->devices; 1497 1498 list_init(&usecase->mixer_list); 1499 list_init(&out->pcm_dev_list); 1500 1501 pcm_profile = get_pcm_device(usecase->type, devices); 1502 if (pcm_profile) { 1503 pcm_device = calloc(1, sizeof(struct pcm_device)); 1504 pcm_device->pcm_profile = pcm_profile; 1505 list_add_tail(&out->pcm_dev_list, &pcm_device->stream_list_node); 1506 mixer_card = uc_get_mixer_for_card(usecase, pcm_profile->card); 1507 if (mixer_card == NULL) { 1508 mixer_card = adev_get_mixer_for_card(out->dev, pcm_profile->card); 1509 list_add_tail(&usecase->mixer_list, &mixer_card->uc_list_node[usecase->id]); 1510 } 1511 devices &= ~pcm_profile->devices; 1512 } else { 1513 ALOGE("usecase type=%d, devices=%d did not find exact match", 1514 usecase->type, devices); 1515 } 1516 1517 return 0; 1518 } 1519 1520 static int out_close_pcm_devices(struct stream_out *out) 1521 { 1522 struct pcm_device *pcm_device; 1523 struct listnode *node; 1524 struct audio_device *adev = out->dev; 1525 1526 list_for_each(node, &out->pcm_dev_list) { 1527 pcm_device = node_to_item(node, struct pcm_device, stream_list_node); 1528 if (pcm_device->sound_trigger_handle > 0) { 1529 adev->sound_trigger_close_for_streaming( 1530 pcm_device->sound_trigger_handle); 1531 pcm_device->sound_trigger_handle = 0; 1532 } 1533 if (pcm_device->pcm) { 1534 pcm_close(pcm_device->pcm); 1535 pcm_device->pcm = NULL; 1536 } 1537 if (pcm_device->resampler) { 1538 release_resampler(pcm_device->resampler); 1539 pcm_device->resampler = NULL; 1540 } 1541 if (pcm_device->res_buffer) { 1542 free(pcm_device->res_buffer); 1543 pcm_device->res_buffer = NULL; 1544 } 1545 if (pcm_device->dsp_context) { 1546 cras_dsp_context_free(pcm_device->dsp_context); 1547 pcm_device->dsp_context = NULL; 1548 } 1549 } 1550 1551 return 0; 1552 } 1553 1554 static int out_open_pcm_devices(struct stream_out *out) 1555 { 1556 struct pcm_device *pcm_device; 1557 struct listnode *node; 1558 struct audio_device *adev = out->dev; 1559 int ret = 0; 1560 1561 list_for_each(node, &out->pcm_dev_list) { 1562 pcm_device = node_to_item(node, struct pcm_device, stream_list_node); 1563 ALOGV("%s: Opening PCM device card_id(%d) device_id(%d)", 1564 __func__, pcm_device->pcm_profile->card, pcm_device->pcm_profile->device); 1565 1566 if (pcm_device->pcm_profile->dsp_name) { 1567 pcm_device->dsp_context = cras_dsp_context_new(pcm_device->pcm_profile->config.rate, 1568 (adev->mode == AUDIO_MODE_IN_CALL || adev->mode == AUDIO_MODE_IN_COMMUNICATION) 1569 ? "voice-comm" : "playback"); 1570 if (pcm_device->dsp_context) { 1571 cras_dsp_set_variable(pcm_device->dsp_context, "dsp_name", 1572 pcm_device->pcm_profile->dsp_name); 1573 cras_dsp_load_pipeline(pcm_device->dsp_context); 1574 } 1575 } 1576 1577 pcm_device->pcm = pcm_open(pcm_device->pcm_profile->card, pcm_device->pcm_profile->device, 1578 PCM_OUT | PCM_MONOTONIC, &pcm_device->pcm_profile->config); 1579 1580 if (pcm_device->pcm && !pcm_is_ready(pcm_device->pcm)) { 1581 ALOGE("%s: %s", __func__, pcm_get_error(pcm_device->pcm)); 1582 pcm_device->pcm = NULL; 1583 ret = -EIO; 1584 goto error_open; 1585 } 1586 /* 1587 * If the stream rate differs from the PCM rate, we need to 1588 * create a resampler. 1589 */ 1590 if (out->sample_rate != pcm_device->pcm_profile->config.rate) { 1591 ALOGV("%s: create_resampler(), pcm_device_card(%d), pcm_device_id(%d), \ 1592 out_rate(%d), device_rate(%d)",__func__, 1593 pcm_device->pcm_profile->card, pcm_device->pcm_profile->device, 1594 out->sample_rate, pcm_device->pcm_profile->config.rate); 1595 ret = create_resampler(out->sample_rate, 1596 pcm_device->pcm_profile->config.rate, 1597 audio_channel_count_from_out_mask(out->channel_mask), 1598 RESAMPLER_QUALITY_DEFAULT, 1599 NULL, 1600 &pcm_device->resampler); 1601 pcm_device->res_byte_count = 0; 1602 pcm_device->res_buffer = NULL; 1603 } 1604 } 1605 return ret; 1606 1607 error_open: 1608 out_close_pcm_devices(out); 1609 return ret; 1610 } 1611 1612 static int disable_output_path_l(struct stream_out *out) 1613 { 1614 struct audio_device *adev = out->dev; 1615 struct audio_usecase *uc_info; 1616 1617 uc_info = get_usecase_from_id(adev, out->usecase); 1618 if (uc_info == NULL) { 1619 ALOGE("%s: Could not find the usecase (%d) in the list", 1620 __func__, out->usecase); 1621 return -EINVAL; 1622 } 1623 disable_snd_device(adev, uc_info, uc_info->out_snd_device, true); 1624 uc_release_pcm_devices(uc_info); 1625 list_remove(&uc_info->adev_list_node); 1626 free(uc_info); 1627 1628 return 0; 1629 } 1630 1631 static void enable_output_path_l(struct stream_out *out) 1632 { 1633 struct audio_device *adev = out->dev; 1634 struct audio_usecase *uc_info; 1635 1636 uc_info = (struct audio_usecase *)calloc(1, sizeof(struct audio_usecase)); 1637 uc_info->id = out->usecase; 1638 uc_info->type = PCM_PLAYBACK; 1639 uc_info->stream = (struct audio_stream *)out; 1640 uc_info->devices = out->devices; 1641 uc_info->in_snd_device = SND_DEVICE_NONE; 1642 uc_info->out_snd_device = SND_DEVICE_NONE; 1643 uc_select_pcm_devices(uc_info); 1644 1645 list_add_tail(&adev->usecase_list, &uc_info->adev_list_node); 1646 1647 select_devices(adev, out->usecase); 1648 } 1649 1650 static int stop_output_stream(struct stream_out *out) 1651 { 1652 int ret = 0; 1653 struct audio_device *adev = out->dev; 1654 bool do_disable = true; 1655 1656 ALOGV("%s: enter: usecase(%d: %s)", __func__, 1657 out->usecase, use_case_table[out->usecase]); 1658 1659 ret = disable_output_path_l(out); 1660 1661 ALOGV("%s: exit: status(%d)", __func__, ret); 1662 return ret; 1663 } 1664 1665 int start_output_stream(struct stream_out *out) 1666 { 1667 int ret = 0; 1668 struct audio_device *adev = out->dev; 1669 1670 ALOGV("%s: enter: usecase(%d: %s) devices(%#x) channels(%d)", 1671 __func__, out->usecase, use_case_table[out->usecase], out->devices, out->config.channels); 1672 1673 enable_output_path_l(out); 1674 1675 ret = out_open_pcm_devices(out); 1676 if (ret != 0) 1677 goto error_open; 1678 ALOGV("%s: exit", __func__); 1679 return 0; 1680 error_open: 1681 stop_output_stream(out); 1682 return ret; 1683 } 1684 1685 static int stop_voice_call(struct audio_device *adev) 1686 { 1687 struct audio_usecase *uc_info; 1688 1689 ALOGV("%s: enter", __func__); 1690 adev->in_call = false; 1691 1692 /* TODO: implement voice call stop */ 1693 1694 uc_info = get_usecase_from_id(adev, USECASE_VOICE_CALL); 1695 if (uc_info == NULL) { 1696 ALOGE("%s: Could not find the usecase (%d) in the list", 1697 __func__, USECASE_VOICE_CALL); 1698 return -EINVAL; 1699 } 1700 1701 disable_snd_device(adev, uc_info, uc_info->out_snd_device, false); 1702 disable_snd_device(adev, uc_info, uc_info->in_snd_device, true); 1703 1704 uc_release_pcm_devices(uc_info); 1705 list_remove(&uc_info->adev_list_node); 1706 free(uc_info); 1707 1708 ALOGV("%s: exit", __func__); 1709 return 0; 1710 } 1711 1712 /* always called with adev lock held */ 1713 static int start_voice_call(struct audio_device *adev) 1714 { 1715 struct audio_usecase *uc_info; 1716 1717 ALOGV("%s: enter", __func__); 1718 1719 uc_info = (struct audio_usecase *)calloc(1, sizeof(struct audio_usecase)); 1720 uc_info->id = USECASE_VOICE_CALL; 1721 uc_info->type = VOICE_CALL; 1722 uc_info->stream = (struct audio_stream *)adev->primary_output; 1723 uc_info->devices = adev->primary_output->devices; 1724 uc_info->in_snd_device = SND_DEVICE_NONE; 1725 uc_info->out_snd_device = SND_DEVICE_NONE; 1726 1727 uc_select_pcm_devices(uc_info); 1728 1729 list_add_tail(&adev->usecase_list, &uc_info->adev_list_node); 1730 1731 select_devices(adev, USECASE_VOICE_CALL); 1732 1733 1734 /* TODO: implement voice call start */ 1735 1736 /* set cached volume */ 1737 set_voice_volume_l(adev, adev->voice_volume); 1738 1739 adev->in_call = true; 1740 ALOGV("%s: exit", __func__); 1741 return 0; 1742 } 1743 1744 static int check_input_parameters(uint32_t sample_rate, 1745 audio_format_t format, 1746 int channel_count) 1747 { 1748 if (format != AUDIO_FORMAT_PCM_16_BIT) return -EINVAL; 1749 1750 if ((channel_count < 1) || (channel_count > 4)) return -EINVAL; 1751 1752 switch (sample_rate) { 1753 case 8000: 1754 case 11025: 1755 case 12000: 1756 case 16000: 1757 case 22050: 1758 case 24000: 1759 case 32000: 1760 case 44100: 1761 case 48000: 1762 break; 1763 default: 1764 return -EINVAL; 1765 } 1766 1767 return 0; 1768 } 1769 1770 static size_t get_input_buffer_size(uint32_t sample_rate, 1771 audio_format_t format, 1772 int channel_count, 1773 usecase_type_t usecase_type, 1774 audio_devices_t devices) 1775 { 1776 size_t size = 0; 1777 struct pcm_device_profile *pcm_profile; 1778 1779 if (check_input_parameters(sample_rate, format, channel_count) != 0) 1780 return 0; 1781 1782 pcm_profile = get_pcm_device(usecase_type, devices); 1783 if (pcm_profile == NULL) 1784 return 0; 1785 1786 /* 1787 * take resampling into account and return the closest majoring 1788 * multiple of 16 frames, as audioflinger expects audio buffers to 1789 * be a multiple of 16 frames 1790 */ 1791 size = (pcm_profile->config.period_size * sample_rate) / pcm_profile->config.rate; 1792 size = ((size + 15) / 16) * 16; 1793 1794 return (size * channel_count * audio_bytes_per_sample(format)); 1795 1796 } 1797 1798 static uint32_t out_get_sample_rate(const struct audio_stream *stream) 1799 { 1800 struct stream_out *out = (struct stream_out *)stream; 1801 1802 return out->sample_rate; 1803 } 1804 1805 static int out_set_sample_rate(struct audio_stream *stream, uint32_t rate) 1806 { 1807 (void)stream; 1808 (void)rate; 1809 return -ENOSYS; 1810 } 1811 1812 static size_t out_get_buffer_size(const struct audio_stream *stream) 1813 { 1814 struct stream_out *out = (struct stream_out *)stream; 1815 1816 return out->config.period_size * 1817 audio_stream_out_frame_size((const struct audio_stream_out *)stream); 1818 } 1819 1820 static uint32_t out_get_channels(const struct audio_stream *stream) 1821 { 1822 struct stream_out *out = (struct stream_out *)stream; 1823 1824 return out->channel_mask; 1825 } 1826 1827 static audio_format_t out_get_format(const struct audio_stream *stream) 1828 { 1829 struct stream_out *out = (struct stream_out *)stream; 1830 1831 return out->format; 1832 } 1833 1834 static int out_set_format(struct audio_stream *stream, audio_format_t format) 1835 { 1836 (void)stream; 1837 (void)format; 1838 return -ENOSYS; 1839 } 1840 1841 static int do_out_standby_l(struct stream_out *out) 1842 { 1843 struct audio_device *adev = out->dev; 1844 int status = 0; 1845 1846 out->standby = true; 1847 out_close_pcm_devices(out); 1848 status = stop_output_stream(out); 1849 1850 return status; 1851 } 1852 1853 static int out_standby(struct audio_stream *stream) 1854 { 1855 struct stream_out *out = (struct stream_out *)stream; 1856 struct audio_device *adev = out->dev; 1857 1858 ALOGV("%s: enter: usecase(%d: %s)", __func__, 1859 out->usecase, use_case_table[out->usecase]); 1860 lock_output_stream(out); 1861 if (!out->standby) { 1862 pthread_mutex_lock(&adev->lock); 1863 do_out_standby_l(out); 1864 pthread_mutex_unlock(&adev->lock); 1865 } 1866 pthread_mutex_unlock(&out->lock); 1867 ALOGV("%s: exit", __func__); 1868 return 0; 1869 } 1870 1871 static int out_dump(const struct audio_stream *stream, int fd) 1872 { 1873 (void)stream; 1874 (void)fd; 1875 1876 return 0; 1877 } 1878 1879 static int out_set_parameters(struct audio_stream *stream, const char *kvpairs) 1880 { 1881 struct stream_out *out = (struct stream_out *)stream; 1882 struct audio_device *adev = out->dev; 1883 struct audio_usecase *usecase; 1884 struct listnode *node; 1885 struct str_parms *parms; 1886 char value[32]; 1887 int ret, val = 0; 1888 struct audio_usecase *uc_info; 1889 bool do_standby = false; 1890 struct pcm_device *pcm_device; 1891 struct pcm_device_profile *pcm_profile; 1892 #ifdef PREPROCESSING_ENABLED 1893 struct stream_in *in = NULL; /* if non-NULL, then force input to standby */ 1894 #endif 1895 1896 ALOGV("%s: enter: usecase(%d: %s) kvpairs: %s out->devices(%d) adev->mode(%d)", 1897 __func__, out->usecase, use_case_table[out->usecase], kvpairs, out->devices, adev->mode); 1898 parms = str_parms_create_str(kvpairs); 1899 ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_ROUTING, value, sizeof(value)); 1900 if (ret >= 0) { 1901 val = atoi(value); 1902 pthread_mutex_lock(&adev->lock_inputs); 1903 lock_output_stream(out); 1904 pthread_mutex_lock(&adev->lock); 1905 #ifdef PREPROCESSING_ENABLED 1906 if (((int)out->devices != val) && (val != 0) && (!out->standby) && 1907 (out->usecase == USECASE_AUDIO_PLAYBACK)) { 1908 /* reset active input: 1909 * - to attach the echo reference 1910 * - because a change in output device may change mic settings */ 1911 if (adev->active_input && (adev->active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION || 1912 adev->active_input->source == AUDIO_SOURCE_MIC)) { 1913 in = adev->active_input; 1914 } 1915 } 1916 #endif 1917 if (val != 0) { 1918 out->devices = val; 1919 1920 if (!out->standby) { 1921 uc_info = get_usecase_from_id(adev, out->usecase); 1922 if (uc_info == NULL) { 1923 ALOGE("%s: Could not find the usecase (%d) in the list", 1924 __func__, out->usecase); 1925 } else { 1926 list_for_each(node, &out->pcm_dev_list) { 1927 pcm_device = node_to_item(node, struct pcm_device, stream_list_node); 1928 if ((pcm_device->pcm_profile->devices & val) == 0) 1929 do_standby = true; 1930 val &= ~pcm_device->pcm_profile->devices; 1931 } 1932 if (val != 0) 1933 do_standby = true; 1934 } 1935 if (do_standby) 1936 do_out_standby_l(out); 1937 else 1938 select_devices(adev, out->usecase); 1939 } 1940 1941 if ((adev->mode == AUDIO_MODE_IN_CALL) && !adev->in_call && 1942 (out == adev->primary_output)) { 1943 start_voice_call(adev); 1944 } else if ((adev->mode == AUDIO_MODE_IN_CALL) && adev->in_call && 1945 (out == adev->primary_output)) { 1946 select_devices(adev, USECASE_VOICE_CALL); 1947 } 1948 } 1949 1950 if ((adev->mode == AUDIO_MODE_NORMAL) && adev->in_call && 1951 (out == adev->primary_output)) { 1952 stop_voice_call(adev); 1953 } 1954 pthread_mutex_unlock(&adev->lock); 1955 pthread_mutex_unlock(&out->lock); 1956 #ifdef PREPROCESSING_ENABLED 1957 if (in) { 1958 /* The lock on adev->lock_inputs prevents input stream from being closed */ 1959 lock_input_stream(in); 1960 pthread_mutex_lock(&adev->lock); 1961 LOG_ALWAYS_FATAL_IF(in != adev->active_input); 1962 do_in_standby_l(in); 1963 pthread_mutex_unlock(&adev->lock); 1964 pthread_mutex_unlock(&in->lock); 1965 } 1966 #endif 1967 pthread_mutex_unlock(&adev->lock_inputs); 1968 } 1969 1970 str_parms_destroy(parms); 1971 ALOGV("%s: exit: code(%d)", __func__, ret); 1972 return ret; 1973 } 1974 1975 static char* out_get_parameters(const struct audio_stream *stream, const char *keys) 1976 { 1977 struct stream_out *out = (struct stream_out *)stream; 1978 struct str_parms *query = str_parms_create_str(keys); 1979 char *str; 1980 char value[256]; 1981 struct str_parms *reply = str_parms_create(); 1982 size_t i, j; 1983 int ret; 1984 bool first = true; 1985 ALOGV("%s: enter: keys - %s", __func__, keys); 1986 ret = str_parms_get_str(query, AUDIO_PARAMETER_STREAM_SUP_CHANNELS, value, sizeof(value)); 1987 if (ret >= 0) { 1988 value[0] = '\0'; 1989 i = 0; 1990 while (out->supported_channel_masks[i] != 0) { 1991 for (j = 0; j < ARRAY_SIZE(out_channels_name_to_enum_table); j++) { 1992 if (out_channels_name_to_enum_table[j].value == out->supported_channel_masks[i]) { 1993 if (!first) { 1994 strcat(value, "|"); 1995 } 1996 strcat(value, out_channels_name_to_enum_table[j].name); 1997 first = false; 1998 break; 1999 } 2000 } 2001 i++; 2002 } 2003 str_parms_add_str(reply, AUDIO_PARAMETER_STREAM_SUP_CHANNELS, value); 2004 str = str_parms_to_str(reply); 2005 } else { 2006 str = strdup(keys); 2007 } 2008 str_parms_destroy(query); 2009 str_parms_destroy(reply); 2010 ALOGV("%s: exit: returns - %s", __func__, str); 2011 return str; 2012 } 2013 2014 static uint32_t out_get_latency(const struct audio_stream_out *stream) 2015 { 2016 struct stream_out *out = (struct stream_out *)stream; 2017 2018 return (out->config.period_count * out->config.period_size * 1000) / 2019 (out->config.rate); 2020 } 2021 2022 static int out_set_volume(struct audio_stream_out *stream, float left, 2023 float right) 2024 { 2025 struct stream_out *out = (struct stream_out *)stream; 2026 struct audio_device *adev = out->dev; 2027 (void)right; 2028 2029 if (out->usecase == USECASE_AUDIO_PLAYBACK_MULTI_CH) { 2030 /* only take left channel into account: the API is for stereo anyway */ 2031 out->muted = (left == 0.0f); 2032 return 0; 2033 } 2034 2035 return -ENOSYS; 2036 } 2037 2038 /* Applies the DSP to the samples for the iodev if applicable. */ 2039 static void apply_dsp(struct pcm_device *iodev, uint8_t *buf, size_t frames) 2040 { 2041 struct cras_dsp_context *ctx; 2042 struct pipeline *pipeline; 2043 2044 ctx = iodev->dsp_context; 2045 if (!ctx) 2046 return; 2047 2048 pipeline = cras_dsp_get_pipeline(ctx); 2049 if (!pipeline) 2050 return; 2051 2052 cras_dsp_pipeline_apply(pipeline, 2053 buf, 2054 frames); 2055 2056 cras_dsp_put_pipeline(ctx); 2057 } 2058 2059 static ssize_t out_write(struct audio_stream_out *stream, const void *buffer, 2060 size_t bytes) 2061 { 2062 struct stream_out *out = (struct stream_out *)stream; 2063 struct audio_device *adev = out->dev; 2064 ssize_t ret = 0; 2065 struct pcm_device *pcm_device; 2066 struct listnode *node; 2067 size_t frame_size = audio_stream_out_frame_size(stream); 2068 size_t frames_wr = 0, frames_rq = 0; 2069 unsigned char *data = NULL; 2070 struct pcm_config config; 2071 #ifdef PREPROCESSING_ENABLED 2072 size_t in_frames = bytes / frame_size; 2073 size_t out_frames = in_frames; 2074 struct stream_in *in = NULL; 2075 #endif 2076 2077 lock_output_stream(out); 2078 if (out->standby) { 2079 #ifdef PREPROCESSING_ENABLED 2080 pthread_mutex_unlock(&out->lock); 2081 /* Prevent input stream from being closed */ 2082 pthread_mutex_lock(&adev->lock_inputs); 2083 lock_output_stream(out); 2084 if (!out->standby) { 2085 pthread_mutex_unlock(&adev->lock_inputs); 2086 goto false_alarm; 2087 } 2088 #endif 2089 pthread_mutex_lock(&adev->lock); 2090 ret = start_output_stream(out); 2091 if (ret != 0) { 2092 pthread_mutex_unlock(&adev->lock); 2093 #ifdef PREPROCESSING_ENABLED 2094 pthread_mutex_unlock(&adev->lock_inputs); 2095 #endif 2096 goto exit; 2097 } 2098 out->standby = false; 2099 2100 #ifdef PREPROCESSING_ENABLED 2101 /* A change in output device may change the microphone selection */ 2102 if (adev->active_input && 2103 (adev->active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION || 2104 adev->active_input->source == AUDIO_SOURCE_MIC)) { 2105 in = adev->active_input; 2106 ALOGV("%s: enter: force_input_standby true", __func__); 2107 } 2108 #endif 2109 pthread_mutex_unlock(&adev->lock); 2110 #ifdef PREPROCESSING_ENABLED 2111 if (!in) { 2112 /* Leave mutex locked iff in != NULL */ 2113 pthread_mutex_unlock(&adev->lock_inputs); 2114 } 2115 #endif 2116 } 2117 false_alarm: 2118 2119 if (out->muted) 2120 memset((void *)buffer, 0, bytes); 2121 list_for_each(node, &out->pcm_dev_list) { 2122 pcm_device = node_to_item(node, struct pcm_device, stream_list_node); 2123 if (pcm_device->resampler) { 2124 if (bytes * pcm_device->pcm_profile->config.rate / out->sample_rate + frame_size 2125 > pcm_device->res_byte_count) { 2126 pcm_device->res_byte_count = 2127 bytes * pcm_device->pcm_profile->config.rate / out->sample_rate + frame_size; 2128 pcm_device->res_buffer = 2129 realloc(pcm_device->res_buffer, pcm_device->res_byte_count); 2130 ALOGV("%s: resampler res_byte_count = %zu", __func__, 2131 pcm_device->res_byte_count); 2132 } 2133 frames_rq = bytes / frame_size; 2134 frames_wr = pcm_device->res_byte_count / frame_size; 2135 ALOGVV("%s: resampler request frames = %zu frame_size = %zu", 2136 __func__, frames_rq, frame_size); 2137 pcm_device->resampler->resample_from_input(pcm_device->resampler, 2138 (int16_t *)buffer, &frames_rq, (int16_t *)pcm_device->res_buffer, &frames_wr); 2139 ALOGVV("%s: resampler output frames_= %zu", __func__, frames_wr); 2140 } 2141 if (pcm_device->pcm) { 2142 size_t src_channels = audio_channel_count_from_out_mask(out->channel_mask); 2143 size_t dst_channels = pcm_device->pcm_profile->config.channels; 2144 bool channel_remapping_needed = (dst_channels != src_channels); 2145 unsigned audio_bytes; 2146 const void *audio_data; 2147 2148 ALOGVV("%s: writing buffer (%zd bytes) to pcm device", __func__, bytes); 2149 if (pcm_device->resampler && pcm_device->res_buffer) { 2150 audio_data = pcm_device->res_buffer; 2151 audio_bytes = frames_wr * frame_size; 2152 } else { 2153 audio_data = buffer; 2154 audio_bytes = bytes; 2155 } 2156 2157 /* 2158 * This can only be S16_LE stereo because of the supported formats, 2159 * 4 bytes per frame. 2160 */ 2161 apply_dsp(pcm_device, audio_data, audio_bytes/4); 2162 2163 if (channel_remapping_needed) { 2164 const void *remapped_audio_data; 2165 size_t dest_buffer_size = audio_bytes * dst_channels / src_channels; 2166 size_t new_size; 2167 size_t bytes_per_sample = audio_bytes_per_sample(stream->common.get_format(&stream->common)); 2168 2169 /* With additional channels, we cannot use original buffer */ 2170 if (out->proc_buf_size < dest_buffer_size) { 2171 out->proc_buf_size = dest_buffer_size; 2172 out->proc_buf_out = realloc(out->proc_buf_out, dest_buffer_size); 2173 ALOG_ASSERT((out->proc_buf_out != NULL), 2174 "out_write() failed to reallocate proc_buf_out"); 2175 } 2176 new_size = adjust_channels(audio_data, src_channels, out->proc_buf_out, dst_channels, 2177 bytes_per_sample, audio_bytes); 2178 ALOG_ASSERT(new_size == dest_buffer_size); 2179 audio_data = out->proc_buf_out; 2180 audio_bytes = dest_buffer_size; 2181 } 2182 2183 pcm_device->status = pcm_write(pcm_device->pcm, audio_data, audio_bytes); 2184 if (pcm_device->status != 0) 2185 ret = pcm_device->status; 2186 } 2187 } 2188 if (ret == 0) 2189 out->written += bytes / frame_size; 2190 2191 exit: 2192 pthread_mutex_unlock(&out->lock); 2193 2194 if (ret != 0) { 2195 list_for_each(node, &out->pcm_dev_list) { 2196 pcm_device = node_to_item(node, struct pcm_device, stream_list_node); 2197 if (pcm_device->pcm && pcm_device->status != 0) 2198 ALOGE("%s: error %zd - %s", __func__, ret, pcm_get_error(pcm_device->pcm)); 2199 } 2200 out_standby(&out->stream.common); 2201 usleep(bytes * 1000000 / audio_stream_out_frame_size(stream) / 2202 out_get_sample_rate(&out->stream.common)); 2203 } 2204 2205 #ifdef PREPROCESSING_ENABLED 2206 if (in) { 2207 /* The lock on adev->lock_inputs prevents input stream from being closed */ 2208 lock_input_stream(in); 2209 pthread_mutex_lock(&adev->lock); 2210 LOG_ALWAYS_FATAL_IF(in != adev->active_input); 2211 do_in_standby_l(in); 2212 pthread_mutex_unlock(&adev->lock); 2213 pthread_mutex_unlock(&in->lock); 2214 /* This mutex was left locked iff in != NULL */ 2215 pthread_mutex_unlock(&adev->lock_inputs); 2216 } 2217 #endif 2218 2219 return bytes; 2220 } 2221 2222 static int out_get_render_position(const struct audio_stream_out *stream, 2223 uint32_t *dsp_frames) 2224 { 2225 (void)stream; 2226 *dsp_frames = 0; 2227 return -EINVAL; 2228 } 2229 2230 static int out_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect) 2231 { 2232 (void)stream; 2233 (void)effect; 2234 return 0; 2235 } 2236 2237 static int out_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect) 2238 { 2239 (void)stream; 2240 (void)effect; 2241 return 0; 2242 } 2243 2244 static int out_get_next_write_timestamp(const struct audio_stream_out *stream, 2245 int64_t *timestamp) 2246 { 2247 (void)stream; 2248 (void)timestamp; 2249 return -EINVAL; 2250 } 2251 2252 static int out_get_presentation_position(const struct audio_stream_out *stream, 2253 uint64_t *frames, struct timespec *timestamp) 2254 { 2255 struct stream_out *out = (struct stream_out *)stream; 2256 int ret = -1; 2257 unsigned long dsp_frames; 2258 2259 lock_output_stream(out); 2260 2261 /* FIXME: which device to read from? */ 2262 if (!list_empty(&out->pcm_dev_list)) { 2263 unsigned int avail; 2264 struct pcm_device *pcm_device = node_to_item(list_head(&out->pcm_dev_list), 2265 struct pcm_device, stream_list_node); 2266 2267 if (pcm_get_htimestamp(pcm_device->pcm, &avail, timestamp) == 0) { 2268 size_t kernel_buffer_size = out->config.period_size * out->config.period_count; 2269 int64_t signed_frames = out->written - kernel_buffer_size + avail; 2270 /* This adjustment accounts for buffering after app processor. 2271 It is based on estimated DSP latency per use case, rather than exact. */ 2272 signed_frames -= 2273 (render_latency(out->usecase) * out->sample_rate / 1000000LL); 2274 2275 /* It would be unusual for this value to be negative, but check just in case ... */ 2276 if (signed_frames >= 0) { 2277 *frames = signed_frames; 2278 ret = 0; 2279 } 2280 } 2281 } 2282 2283 pthread_mutex_unlock(&out->lock); 2284 2285 return ret; 2286 } 2287 2288 /** audio_stream_in implementation **/ 2289 static uint32_t in_get_sample_rate(const struct audio_stream *stream) 2290 { 2291 struct stream_in *in = (struct stream_in *)stream; 2292 2293 return in->requested_rate; 2294 } 2295 2296 static int in_set_sample_rate(struct audio_stream *stream, uint32_t rate) 2297 { 2298 (void)stream; 2299 (void)rate; 2300 return -ENOSYS; 2301 } 2302 2303 static uint32_t in_get_channels(const struct audio_stream *stream) 2304 { 2305 struct stream_in *in = (struct stream_in *)stream; 2306 2307 return in->main_channels; 2308 } 2309 2310 static audio_format_t in_get_format(const struct audio_stream *stream) 2311 { 2312 (void)stream; 2313 return AUDIO_FORMAT_PCM_16_BIT; 2314 } 2315 2316 static int in_set_format(struct audio_stream *stream, audio_format_t format) 2317 { 2318 (void)stream; 2319 (void)format; 2320 2321 return -ENOSYS; 2322 } 2323 2324 static size_t in_get_buffer_size(const struct audio_stream *stream) 2325 { 2326 struct stream_in *in = (struct stream_in *)stream; 2327 2328 return get_input_buffer_size(in->requested_rate, 2329 in_get_format(stream), 2330 audio_channel_count_from_in_mask(in->main_channels), 2331 in->usecase_type, 2332 in->devices); 2333 } 2334 2335 static int in_close_pcm_devices(struct stream_in *in) 2336 { 2337 struct pcm_device *pcm_device; 2338 struct listnode *node; 2339 struct audio_device *adev = in->dev; 2340 2341 list_for_each(node, &in->pcm_dev_list) { 2342 pcm_device = node_to_item(node, struct pcm_device, stream_list_node); 2343 if (pcm_device) { 2344 if (pcm_device->pcm) 2345 pcm_close(pcm_device->pcm); 2346 pcm_device->pcm = NULL; 2347 if (pcm_device->sound_trigger_handle > 0) 2348 adev->sound_trigger_close_for_streaming( 2349 pcm_device->sound_trigger_handle); 2350 pcm_device->sound_trigger_handle = 0; 2351 } 2352 } 2353 return 0; 2354 } 2355 2356 2357 /* must be called with stream and hw device mutex locked */ 2358 static int do_in_standby_l(struct stream_in *in) 2359 { 2360 int status = 0; 2361 2362 if (!in->standby) { 2363 2364 in_close_pcm_devices(in); 2365 2366 status = stop_input_stream(in); 2367 2368 if (in->read_buf) { 2369 free(in->read_buf); 2370 in->read_buf = NULL; 2371 } 2372 2373 in->standby = 1; 2374 } 2375 return 0; 2376 } 2377 2378 // called with adev->lock_inputs locked 2379 static int in_standby_l(struct stream_in *in) 2380 { 2381 struct audio_device *adev = in->dev; 2382 int status = 0; 2383 lock_input_stream(in); 2384 if (!in->standby) { 2385 pthread_mutex_lock(&adev->lock); 2386 status = do_in_standby_l(in); 2387 pthread_mutex_unlock(&adev->lock); 2388 } 2389 pthread_mutex_unlock(&in->lock); 2390 return status; 2391 } 2392 2393 static int in_standby(struct audio_stream *stream) 2394 { 2395 struct stream_in *in = (struct stream_in *)stream; 2396 struct audio_device *adev = in->dev; 2397 int status; 2398 ALOGV("%s: enter", __func__); 2399 pthread_mutex_lock(&adev->lock_inputs); 2400 status = in_standby_l(in); 2401 pthread_mutex_unlock(&adev->lock_inputs); 2402 ALOGV("%s: exit: status(%d)", __func__, status); 2403 return status; 2404 } 2405 2406 static int in_dump(const struct audio_stream *stream, int fd) 2407 { 2408 (void)stream; 2409 (void)fd; 2410 2411 return 0; 2412 } 2413 2414 static int in_set_parameters(struct audio_stream *stream, const char *kvpairs) 2415 { 2416 struct stream_in *in = (struct stream_in *)stream; 2417 struct audio_device *adev = in->dev; 2418 struct str_parms *parms; 2419 char *str; 2420 char value[32]; 2421 int ret, val = 0; 2422 struct audio_usecase *uc_info; 2423 bool do_standby = false; 2424 struct listnode *node; 2425 struct pcm_device *pcm_device; 2426 struct pcm_device_profile *pcm_profile; 2427 2428 ALOGV("%s: enter: kvpairs=%s", __func__, kvpairs); 2429 parms = str_parms_create_str(kvpairs); 2430 2431 ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_INPUT_SOURCE, value, sizeof(value)); 2432 2433 pthread_mutex_lock(&adev->lock_inputs); 2434 lock_input_stream(in); 2435 pthread_mutex_lock(&adev->lock); 2436 if (ret >= 0) { 2437 val = atoi(value); 2438 /* no audio source uses val == 0 */ 2439 if (((int)in->source != val) && (val != 0)) { 2440 in->source = val; 2441 } 2442 } 2443 2444 ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_ROUTING, value, sizeof(value)); 2445 if (ret >= 0) { 2446 val = atoi(value); 2447 if (((int)in->devices != val) && (val != 0)) { 2448 in->devices = val; 2449 /* If recording is in progress, change the tx device to new device */ 2450 if (!in->standby) { 2451 uc_info = get_usecase_from_id(adev, in->usecase); 2452 if (uc_info == NULL) { 2453 ALOGE("%s: Could not find the usecase (%d) in the list", 2454 __func__, in->usecase); 2455 } else { 2456 if (list_empty(&in->pcm_dev_list)) 2457 ALOGE("%s: pcm device list empty", __func__); 2458 else { 2459 pcm_device = node_to_item(list_head(&in->pcm_dev_list), 2460 struct pcm_device, stream_list_node); 2461 if ((pcm_device->pcm_profile->devices & val & ~AUDIO_DEVICE_BIT_IN) == 0) { 2462 do_standby = true; 2463 } 2464 } 2465 } 2466 if (do_standby) { 2467 ret = do_in_standby_l(in); 2468 } else 2469 ret = select_devices(adev, in->usecase); 2470 } 2471 } 2472 } 2473 pthread_mutex_unlock(&adev->lock); 2474 pthread_mutex_unlock(&in->lock); 2475 pthread_mutex_unlock(&adev->lock_inputs); 2476 str_parms_destroy(parms); 2477 2478 if (ret > 0) 2479 ret = 0; 2480 2481 return ret; 2482 } 2483 2484 static char* in_get_parameters(const struct audio_stream *stream, 2485 const char *keys) 2486 { 2487 (void)stream; 2488 (void)keys; 2489 2490 return strdup(""); 2491 } 2492 2493 static int in_set_gain(struct audio_stream_in *stream, float gain) 2494 { 2495 (void)stream; 2496 (void)gain; 2497 2498 return 0; 2499 } 2500 2501 static ssize_t read_bytes_from_dsp(struct stream_in *in, void* buffer, 2502 size_t bytes) 2503 { 2504 struct pcm_device *pcm_device; 2505 struct audio_device *adev = in->dev; 2506 2507 pcm_device = node_to_item(list_head(&in->pcm_dev_list), 2508 struct pcm_device, stream_list_node); 2509 2510 if (pcm_device->sound_trigger_handle > 0) 2511 return adev->sound_trigger_read_samples( 2512 pcm_device->sound_trigger_handle, buffer, bytes); 2513 else 2514 return 0; 2515 } 2516 2517 static ssize_t in_read(struct audio_stream_in *stream, void *buffer, 2518 size_t bytes) 2519 { 2520 struct stream_in *in = (struct stream_in *)stream; 2521 struct audio_device *adev = in->dev; 2522 ssize_t frames = -1; 2523 int ret = -1; 2524 int read_and_process_successful = false; 2525 2526 size_t frames_rq = bytes / audio_stream_in_frame_size(stream); 2527 2528 /* no need to acquire adev->lock_inputs because API contract prevents a close */ 2529 lock_input_stream(in); 2530 if (in->standby) { 2531 pthread_mutex_unlock(&in->lock); 2532 pthread_mutex_lock(&adev->lock_inputs); 2533 lock_input_stream(in); 2534 if (!in->standby) { 2535 pthread_mutex_unlock(&adev->lock_inputs); 2536 goto false_alarm; 2537 } 2538 pthread_mutex_lock(&adev->lock); 2539 ret = start_input_stream(in); 2540 pthread_mutex_unlock(&adev->lock); 2541 pthread_mutex_unlock(&adev->lock_inputs); 2542 if (ret != 0) { 2543 goto exit; 2544 } 2545 in->standby = 0; 2546 } 2547 false_alarm: 2548 2549 if (!list_empty(&in->pcm_dev_list)) { 2550 if (in->usecase == USECASE_AUDIO_CAPTURE_HOTWORD) { 2551 bytes = read_bytes_from_dsp(in, buffer, bytes); 2552 if (bytes > 0) 2553 read_and_process_successful = true; 2554 } else { 2555 /* 2556 * Read PCM and: 2557 * - resample if needed 2558 * - process if pre-processors are attached 2559 * - discard unwanted channels 2560 */ 2561 frames = read_and_process_frames(stream, buffer, frames_rq); 2562 if (frames >= 0) 2563 read_and_process_successful = true; 2564 } 2565 } 2566 2567 /* 2568 * Instead of writing zeroes here, we could trust the hardware 2569 * to always provide zeroes when muted. 2570 */ 2571 if (read_and_process_successful == true && adev->mic_mute) 2572 memset(buffer, 0, bytes); 2573 2574 exit: 2575 pthread_mutex_unlock(&in->lock); 2576 2577 if (read_and_process_successful == false) { 2578 in_standby(&in->stream.common); 2579 ALOGV("%s: read failed - sleeping for buffer duration", __func__); 2580 usleep(bytes * 1000000 / audio_stream_in_frame_size(stream) / 2581 in->requested_rate); 2582 } 2583 return bytes; 2584 } 2585 2586 static uint32_t in_get_input_frames_lost(struct audio_stream_in *stream) 2587 { 2588 (void)stream; 2589 2590 return 0; 2591 } 2592 2593 static int add_remove_audio_effect(const struct audio_stream *stream, 2594 effect_handle_t effect, 2595 bool enable) 2596 { 2597 struct stream_in *in = (struct stream_in *)stream; 2598 struct audio_device *adev = in->dev; 2599 int status = 0; 2600 effect_descriptor_t desc; 2601 #ifdef PREPROCESSING_ENABLED 2602 int i; 2603 #endif 2604 status = (*effect)->get_descriptor(effect, &desc); 2605 if (status != 0) 2606 return status; 2607 2608 ALOGI("add_remove_audio_effect(), effect type: %08x, enable: %d ", desc.type.timeLow, enable); 2609 2610 pthread_mutex_lock(&adev->lock_inputs); 2611 lock_input_stream(in); 2612 pthread_mutex_lock(&in->dev->lock); 2613 #ifndef PREPROCESSING_ENABLED 2614 if ((in->source == AUDIO_SOURCE_VOICE_COMMUNICATION) && 2615 in->enable_aec != enable && 2616 (memcmp(&desc.type, FX_IID_AEC, sizeof(effect_uuid_t)) == 0)) { 2617 in->enable_aec = enable; 2618 if (!in->standby) 2619 select_devices(in->dev, in->usecase); 2620 } 2621 #else 2622 if (enable) { 2623 if (in->num_preprocessors >= MAX_PREPROCESSORS) { 2624 status = -ENOSYS; 2625 goto exit; 2626 } 2627 in->preprocessors[in->num_preprocessors].effect_itfe = effect; 2628 in->num_preprocessors ++; 2629 /* check compatibility between main channel supported and possible auxiliary channels */ 2630 in_update_aux_channels(in, effect);//wesley crash 2631 in->aux_channels_changed = true; 2632 } else { 2633 /* if ( enable == false ) */ 2634 if (in->num_preprocessors <= 0) { 2635 status = -ENOSYS; 2636 goto exit; 2637 } 2638 status = -EINVAL; 2639 for (i = 0; i < in->num_preprocessors && status != 0; i++) { 2640 if ( in->preprocessors[i].effect_itfe == effect ) { 2641 ALOGV("add_remove_audio_effect found fx at index %d", i); 2642 free(in->preprocessors[i].channel_configs); 2643 in->num_preprocessors--; 2644 memcpy(in->preprocessors + i, 2645 in->preprocessors + i + 1, 2646 (in->num_preprocessors - i) * sizeof(in->preprocessors[0])); 2647 memset(in->preprocessors + in->num_preprocessors, 2648 0, 2649 sizeof(in->preprocessors[0])); 2650 status = 0; 2651 } 2652 } 2653 if (status != 0) 2654 goto exit; 2655 in->aux_channels_changed = false; 2656 ALOGV("%s: enable(%d), in->aux_channels_changed(%d)", 2657 __func__, enable, in->aux_channels_changed); 2658 } 2659 ALOGI("%s: num_preprocessors = %d", __func__, in->num_preprocessors); 2660 2661 exit: 2662 #endif 2663 ALOGW_IF(status != 0, "add_remove_audio_effect() error %d", status); 2664 pthread_mutex_unlock(&in->dev->lock); 2665 pthread_mutex_unlock(&in->lock); 2666 pthread_mutex_unlock(&adev->lock_inputs); 2667 return status; 2668 } 2669 2670 static int in_add_audio_effect(const struct audio_stream *stream, 2671 effect_handle_t effect) 2672 { 2673 ALOGV("%s: effect %p", __func__, effect); 2674 return add_remove_audio_effect(stream, effect, true /* enabled */); 2675 } 2676 2677 static int in_remove_audio_effect(const struct audio_stream *stream, 2678 effect_handle_t effect) 2679 { 2680 ALOGV("%s: effect %p", __func__, effect); 2681 return add_remove_audio_effect(stream, effect, false /* disabled */); 2682 } 2683 2684 static int adev_open_output_stream(struct audio_hw_device *dev, 2685 audio_io_handle_t handle, 2686 audio_devices_t devices, 2687 audio_output_flags_t flags, 2688 struct audio_config *config, 2689 struct audio_stream_out **stream_out, 2690 const char *address __unused) 2691 { 2692 struct audio_device *adev = (struct audio_device *)dev; 2693 struct stream_out *out; 2694 int i, ret; 2695 struct pcm_device_profile *pcm_profile; 2696 2697 ALOGV("%s: enter: sample_rate(%d) channel_mask(%#x) devices(%#x) flags(%#x)", 2698 __func__, config->sample_rate, config->channel_mask, devices, flags); 2699 *stream_out = NULL; 2700 out = (struct stream_out *)calloc(1, sizeof(struct stream_out)); 2701 2702 if (devices == AUDIO_DEVICE_NONE) 2703 devices = AUDIO_DEVICE_OUT_SPEAKER; 2704 2705 out->flags = flags; 2706 out->devices = devices; 2707 out->dev = adev; 2708 out->format = config->format; 2709 out->sample_rate = config->sample_rate; 2710 out->channel_mask = AUDIO_CHANNEL_OUT_STEREO; 2711 out->supported_channel_masks[0] = AUDIO_CHANNEL_OUT_STEREO; 2712 out->handle = handle; 2713 2714 pcm_profile = get_pcm_device(PCM_PLAYBACK, devices); 2715 if (pcm_profile == NULL) { 2716 ret = -EINVAL; 2717 goto error_open; 2718 } 2719 out->config = pcm_profile->config; 2720 2721 /* Init use case and pcm_config */ 2722 if (out->flags & (AUDIO_OUTPUT_FLAG_DEEP_BUFFER)) { 2723 out->usecase = USECASE_AUDIO_PLAYBACK_DEEP_BUFFER; 2724 out->config = pcm_config_deep_buffer; 2725 out->sample_rate = out->config.rate; 2726 ALOGV("%s: use AUDIO_PLAYBACK_DEEP_BUFFER",__func__); 2727 } else { 2728 out->usecase = USECASE_AUDIO_PLAYBACK; 2729 out->sample_rate = out->config.rate; 2730 } 2731 2732 if (flags & AUDIO_OUTPUT_FLAG_PRIMARY) { 2733 if (adev->primary_output == NULL) 2734 adev->primary_output = out; 2735 else { 2736 ALOGE("%s: Primary output is already opened", __func__); 2737 ret = -EEXIST; 2738 goto error_open; 2739 } 2740 } 2741 2742 /* Check if this usecase is already existing */ 2743 pthread_mutex_lock(&adev->lock); 2744 if (get_usecase_from_id(adev, out->usecase) != NULL) { 2745 ALOGE("%s: Usecase (%d) is already present", __func__, out->usecase); 2746 pthread_mutex_unlock(&adev->lock); 2747 ret = -EEXIST; 2748 goto error_open; 2749 } 2750 pthread_mutex_unlock(&adev->lock); 2751 2752 out->stream.common.get_sample_rate = out_get_sample_rate; 2753 out->stream.common.set_sample_rate = out_set_sample_rate; 2754 out->stream.common.get_buffer_size = out_get_buffer_size; 2755 out->stream.common.get_channels = out_get_channels; 2756 out->stream.common.get_format = out_get_format; 2757 out->stream.common.set_format = out_set_format; 2758 out->stream.common.standby = out_standby; 2759 out->stream.common.dump = out_dump; 2760 out->stream.common.set_parameters = out_set_parameters; 2761 out->stream.common.get_parameters = out_get_parameters; 2762 out->stream.common.add_audio_effect = out_add_audio_effect; 2763 out->stream.common.remove_audio_effect = out_remove_audio_effect; 2764 out->stream.get_latency = out_get_latency; 2765 out->stream.set_volume = out_set_volume; 2766 out->stream.write = out_write; 2767 out->stream.get_render_position = out_get_render_position; 2768 out->stream.get_next_write_timestamp = out_get_next_write_timestamp; 2769 out->stream.get_presentation_position = out_get_presentation_position; 2770 2771 out->standby = 1; 2772 /* out->muted = false; by calloc() */ 2773 /* out->written = 0; by calloc() */ 2774 2775 pthread_mutex_init(&out->lock, (const pthread_mutexattr_t *) NULL); 2776 pthread_mutex_init(&out->pre_lock, (const pthread_mutexattr_t *) NULL); 2777 pthread_cond_init(&out->cond, (const pthread_condattr_t *) NULL); 2778 2779 config->format = out->stream.common.get_format(&out->stream.common); 2780 config->channel_mask = out->stream.common.get_channels(&out->stream.common); 2781 config->sample_rate = out->stream.common.get_sample_rate(&out->stream.common); 2782 2783 *stream_out = &out->stream; 2784 ALOGV("%s: exit", __func__); 2785 return 0; 2786 2787 error_open: 2788 free(out); 2789 *stream_out = NULL; 2790 ALOGV("%s: exit: ret %d", __func__, ret); 2791 return ret; 2792 } 2793 2794 static void adev_close_output_stream(struct audio_hw_device *dev, 2795 struct audio_stream_out *stream) 2796 { 2797 struct stream_out *out = (struct stream_out *)stream; 2798 struct audio_device *adev = out->dev; 2799 (void)dev; 2800 2801 ALOGV("%s: enter", __func__); 2802 out_standby(&stream->common); 2803 pthread_cond_destroy(&out->cond); 2804 pthread_mutex_destroy(&out->lock); 2805 pthread_mutex_destroy(&out->pre_lock); 2806 free(out->proc_buf_out); 2807 free(stream); 2808 ALOGV("%s: exit", __func__); 2809 } 2810 2811 static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs) 2812 { 2813 struct audio_device *adev = (struct audio_device *)dev; 2814 struct str_parms *parms; 2815 char *str; 2816 char value[32]; 2817 int val; 2818 int ret; 2819 2820 ALOGV("%s: enter: %s", __func__, kvpairs); 2821 2822 parms = str_parms_create_str(kvpairs); 2823 ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_TTY_MODE, value, sizeof(value)); 2824 if (ret >= 0) { 2825 int tty_mode; 2826 2827 if (strcmp(value, AUDIO_PARAMETER_VALUE_TTY_OFF) == 0) 2828 tty_mode = TTY_MODE_OFF; 2829 else if (strcmp(value, AUDIO_PARAMETER_VALUE_TTY_VCO) == 0) 2830 tty_mode = TTY_MODE_VCO; 2831 else if (strcmp(value, AUDIO_PARAMETER_VALUE_TTY_HCO) == 0) 2832 tty_mode = TTY_MODE_HCO; 2833 else if (strcmp(value, AUDIO_PARAMETER_VALUE_TTY_FULL) == 0) 2834 tty_mode = TTY_MODE_FULL; 2835 else 2836 return -EINVAL; 2837 2838 pthread_mutex_lock(&adev->lock); 2839 if (tty_mode != adev->tty_mode) { 2840 adev->tty_mode = tty_mode; 2841 if (adev->in_call) 2842 select_devices(adev, USECASE_VOICE_CALL); 2843 } 2844 pthread_mutex_unlock(&adev->lock); 2845 } 2846 2847 ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_BT_NREC, value, sizeof(value)); 2848 if (ret >= 0) { 2849 /* When set to false, HAL should disable EC and NS 2850 * But it is currently not supported. 2851 */ 2852 if (strcmp(value, AUDIO_PARAMETER_VALUE_ON) == 0) 2853 adev->bluetooth_nrec = true; 2854 else 2855 adev->bluetooth_nrec = false; 2856 } 2857 2858 ret = str_parms_get_str(parms, "screen_state", value, sizeof(value)); 2859 if (ret >= 0) { 2860 if (strcmp(value, AUDIO_PARAMETER_VALUE_ON) == 0) 2861 adev->screen_off = false; 2862 else 2863 adev->screen_off = true; 2864 } 2865 2866 ret = str_parms_get_int(parms, "rotation", &val); 2867 if (ret >= 0) { 2868 bool reverse_speakers = false; 2869 switch(val) { 2870 /* FIXME: note that the code below assumes that the speakers are in the correct placement 2871 relative to the user when the device is rotated 90deg from its default rotation. This 2872 assumption is device-specific, not platform-specific like this code. */ 2873 case 270: 2874 reverse_speakers = true; 2875 break; 2876 case 0: 2877 case 90: 2878 case 180: 2879 break; 2880 default: 2881 ALOGE("%s: unexpected rotation of %d", __func__, val); 2882 } 2883 pthread_mutex_lock(&adev->lock); 2884 if (adev->speaker_lr_swap != reverse_speakers) { 2885 adev->speaker_lr_swap = reverse_speakers; 2886 /* only update the selected device if there is active pcm playback */ 2887 struct audio_usecase *usecase; 2888 struct listnode *node; 2889 list_for_each(node, &adev->usecase_list) { 2890 usecase = node_to_item(node, struct audio_usecase, adev_list_node); 2891 if (usecase->type == PCM_PLAYBACK) { 2892 select_devices(adev, usecase->id); 2893 /* TODO(dgreid) speaker flip */ 2894 break; 2895 } 2896 } 2897 } 2898 pthread_mutex_unlock(&adev->lock); 2899 } 2900 2901 str_parms_destroy(parms); 2902 ALOGV("%s: exit with code(%d)", __func__, ret); 2903 return ret; 2904 } 2905 2906 static char* adev_get_parameters(const struct audio_hw_device *dev, 2907 const char *keys) 2908 { 2909 (void)dev; 2910 (void)keys; 2911 2912 return strdup(""); 2913 } 2914 2915 static int adev_init_check(const struct audio_hw_device *dev) 2916 { 2917 (void)dev; 2918 2919 return 0; 2920 } 2921 2922 static int adev_set_voice_volume(struct audio_hw_device *dev, float volume) 2923 { 2924 int ret = 0; 2925 struct audio_device *adev = (struct audio_device *)dev; 2926 pthread_mutex_lock(&adev->lock); 2927 /* cache volume */ 2928 adev->voice_volume = volume; 2929 ret = set_voice_volume_l(adev, adev->voice_volume); 2930 pthread_mutex_unlock(&adev->lock); 2931 return ret; 2932 } 2933 2934 static int adev_set_master_volume(struct audio_hw_device *dev, float volume) 2935 { 2936 (void)dev; 2937 (void)volume; 2938 2939 return -ENOSYS; 2940 } 2941 2942 static int adev_get_master_volume(struct audio_hw_device *dev, 2943 float *volume) 2944 { 2945 (void)dev; 2946 (void)volume; 2947 2948 return -ENOSYS; 2949 } 2950 2951 static int adev_set_master_mute(struct audio_hw_device *dev, bool muted) 2952 { 2953 (void)dev; 2954 (void)muted; 2955 2956 return -ENOSYS; 2957 } 2958 2959 static int adev_get_master_mute(struct audio_hw_device *dev, bool *muted) 2960 { 2961 (void)dev; 2962 (void)muted; 2963 2964 return -ENOSYS; 2965 } 2966 2967 static int adev_set_mode(struct audio_hw_device *dev, audio_mode_t mode) 2968 { 2969 struct audio_device *adev = (struct audio_device *)dev; 2970 2971 pthread_mutex_lock(&adev->lock); 2972 if (adev->mode != mode) { 2973 ALOGI("%s mode = %d", __func__, mode); 2974 adev->mode = mode; 2975 } 2976 pthread_mutex_unlock(&adev->lock); 2977 return 0; 2978 } 2979 2980 static int adev_set_mic_mute(struct audio_hw_device *dev, bool state) 2981 { 2982 struct audio_device *adev = (struct audio_device *)dev; 2983 int err = 0; 2984 2985 pthread_mutex_lock(&adev->lock); 2986 adev->mic_mute = state; 2987 2988 if (adev->mode == AUDIO_MODE_IN_CALL) { 2989 /* TODO */ 2990 } 2991 2992 pthread_mutex_unlock(&adev->lock); 2993 return err; 2994 } 2995 2996 static int adev_get_mic_mute(const struct audio_hw_device *dev, bool *state) 2997 { 2998 struct audio_device *adev = (struct audio_device *)dev; 2999 3000 *state = adev->mic_mute; 3001 3002 return 0; 3003 } 3004 3005 static size_t adev_get_input_buffer_size(const struct audio_hw_device *dev, 3006 const struct audio_config *config) 3007 { 3008 (void)dev; 3009 3010 /* NOTE: we default to built in mic which may cause a mismatch between what we 3011 * report here and the actual buffer size 3012 */ 3013 return get_input_buffer_size(config->sample_rate, 3014 config->format, 3015 audio_channel_count_from_in_mask(config->channel_mask), 3016 PCM_CAPTURE /* usecase_type */, 3017 AUDIO_DEVICE_IN_BUILTIN_MIC); 3018 } 3019 3020 static int adev_open_input_stream(struct audio_hw_device *dev, 3021 audio_io_handle_t handle __unused, 3022 audio_devices_t devices, 3023 struct audio_config *config, 3024 struct audio_stream_in **stream_in, 3025 audio_input_flags_t flags, 3026 const char *address __unused, 3027 audio_source_t source) 3028 { 3029 struct audio_device *adev = (struct audio_device *)dev; 3030 struct stream_in *in; 3031 struct pcm_device_profile *pcm_profile; 3032 3033 ALOGV("%s: enter", __func__); 3034 3035 *stream_in = NULL; 3036 if (check_input_parameters(config->sample_rate, config->format, 3037 audio_channel_count_from_in_mask(config->channel_mask)) != 0) 3038 return -EINVAL; 3039 3040 usecase_type_t usecase_type = (source == AUDIO_SOURCE_HOTWORD) ? 3041 PCM_HOTWORD_STREAMING : PCM_CAPTURE; 3042 pcm_profile = get_pcm_device(usecase_type, devices); 3043 if (pcm_profile == NULL) 3044 return -EINVAL; 3045 3046 in = (struct stream_in *)calloc(1, sizeof(struct stream_in)); 3047 3048 in->stream.common.get_sample_rate = in_get_sample_rate; 3049 in->stream.common.set_sample_rate = in_set_sample_rate; 3050 in->stream.common.get_buffer_size = in_get_buffer_size; 3051 in->stream.common.get_channels = in_get_channels; 3052 in->stream.common.get_format = in_get_format; 3053 in->stream.common.set_format = in_set_format; 3054 in->stream.common.standby = in_standby; 3055 in->stream.common.dump = in_dump; 3056 in->stream.common.set_parameters = in_set_parameters; 3057 in->stream.common.get_parameters = in_get_parameters; 3058 in->stream.common.add_audio_effect = in_add_audio_effect; 3059 in->stream.common.remove_audio_effect = in_remove_audio_effect; 3060 in->stream.set_gain = in_set_gain; 3061 in->stream.read = in_read; 3062 in->stream.get_input_frames_lost = in_get_input_frames_lost; 3063 3064 in->devices = devices; 3065 in->source = source; 3066 in->dev = adev; 3067 in->standby = 1; 3068 in->main_channels = config->channel_mask; 3069 in->requested_rate = config->sample_rate; 3070 if (config->sample_rate != CAPTURE_DEFAULT_SAMPLING_RATE) 3071 flags = flags & ~AUDIO_INPUT_FLAG_FAST; 3072 in->input_flags = flags; 3073 /* HW codec is limited to default channels. No need to update with 3074 * requested channels */ 3075 in->config = pcm_profile->config; 3076 3077 /* Update config params with the requested sample rate and channels */ 3078 if (source == AUDIO_SOURCE_HOTWORD) { 3079 in->usecase = USECASE_AUDIO_CAPTURE_HOTWORD; 3080 } else { 3081 in->usecase = USECASE_AUDIO_CAPTURE; 3082 } 3083 in->usecase_type = usecase_type; 3084 3085 pthread_mutex_init(&in->lock, (const pthread_mutexattr_t *) NULL); 3086 pthread_mutex_init(&in->pre_lock, (const pthread_mutexattr_t *) NULL); 3087 3088 *stream_in = &in->stream; 3089 ALOGV("%s: exit", __func__); 3090 return 0; 3091 } 3092 3093 static void adev_close_input_stream(struct audio_hw_device *dev, 3094 struct audio_stream_in *stream) 3095 { 3096 struct audio_device *adev = (struct audio_device *)dev; 3097 struct stream_in *in = (struct stream_in*)stream; 3098 ALOGV("%s", __func__); 3099 3100 /* prevent concurrent out_set_parameters, or out_write from standby */ 3101 pthread_mutex_lock(&adev->lock_inputs); 3102 3103 in_standby_l(in); 3104 pthread_mutex_destroy(&in->lock); 3105 pthread_mutex_destroy(&in->pre_lock); 3106 free(in->proc_buf_out); 3107 3108 #ifdef PREPROCESSING_ENABLED 3109 int i; 3110 3111 for (i=0; i<in->num_preprocessors; i++) { 3112 free(in->preprocessors[i].channel_configs); 3113 } 3114 3115 if (in->read_buf) { 3116 free(in->read_buf); 3117 } 3118 3119 if (in->proc_buf_in) { 3120 free(in->proc_buf_in); 3121 } 3122 3123 if (in->resampler) { 3124 release_resampler(in->resampler); 3125 } 3126 #endif 3127 3128 free(stream); 3129 3130 pthread_mutex_unlock(&adev->lock_inputs); 3131 3132 return; 3133 } 3134 3135 static int adev_dump(const audio_hw_device_t *device, int fd) 3136 { 3137 (void)device; 3138 (void)fd; 3139 3140 return 0; 3141 } 3142 3143 static int adev_close(hw_device_t *device) 3144 { 3145 struct audio_device *adev = (struct audio_device *)device; 3146 free(adev->snd_dev_ref_cnt); 3147 free_mixer_list(adev); 3148 free(device); 3149 return 0; 3150 } 3151 3152 static int adev_open(const hw_module_t *module, const char *name, 3153 hw_device_t **device) 3154 { 3155 struct audio_device *adev; 3156 int i, ret, retry_count; 3157 3158 ALOGV("%s: enter", __func__); 3159 if (strcmp(name, AUDIO_HARDWARE_INTERFACE) != 0) return -EINVAL; 3160 3161 adev = calloc(1, sizeof(struct audio_device)); 3162 3163 adev->device.common.tag = HARDWARE_DEVICE_TAG; 3164 adev->device.common.version = AUDIO_DEVICE_API_VERSION_2_0; 3165 adev->device.common.module = (struct hw_module_t *)module; 3166 adev->device.common.close = adev_close; 3167 3168 adev->device.init_check = adev_init_check; 3169 adev->device.set_voice_volume = adev_set_voice_volume; 3170 adev->device.set_master_volume = adev_set_master_volume; 3171 adev->device.get_master_volume = adev_get_master_volume; 3172 adev->device.set_master_mute = adev_set_master_mute; 3173 adev->device.get_master_mute = adev_get_master_mute; 3174 adev->device.set_mode = adev_set_mode; 3175 adev->device.set_mic_mute = adev_set_mic_mute; 3176 adev->device.get_mic_mute = adev_get_mic_mute; 3177 adev->device.set_parameters = adev_set_parameters; 3178 adev->device.get_parameters = adev_get_parameters; 3179 adev->device.get_input_buffer_size = adev_get_input_buffer_size; 3180 adev->device.open_output_stream = adev_open_output_stream; 3181 adev->device.close_output_stream = adev_close_output_stream; 3182 adev->device.open_input_stream = adev_open_input_stream; 3183 adev->device.close_input_stream = adev_close_input_stream; 3184 adev->device.dump = adev_dump; 3185 3186 /* Set the default route before the PCM stream is opened */ 3187 adev->mode = AUDIO_MODE_NORMAL; 3188 adev->active_input = NULL; 3189 adev->primary_output = NULL; 3190 adev->voice_volume = 1.0f; 3191 adev->tty_mode = TTY_MODE_OFF; 3192 adev->bluetooth_nrec = true; 3193 adev->in_call = false; 3194 /* adev->cur_hdmi_channels = 0; by calloc() */ 3195 adev->snd_dev_ref_cnt = calloc(SND_DEVICE_MAX, sizeof(int)); 3196 3197 adev->dualmic_config = DUALMIC_CONFIG_NONE; 3198 adev->ns_in_voice_rec = false; 3199 3200 list_init(&adev->usecase_list); 3201 3202 if (mixer_init(adev) != 0) { 3203 free(adev->snd_dev_ref_cnt); 3204 free(adev); 3205 ALOGE("%s: Failed to init, aborting.", __func__); 3206 *device = NULL; 3207 return -EINVAL; 3208 } 3209 3210 3211 if (access(SOUND_TRIGGER_HAL_LIBRARY_PATH, R_OK) == 0) { 3212 adev->sound_trigger_lib = dlopen(SOUND_TRIGGER_HAL_LIBRARY_PATH, 3213 RTLD_NOW); 3214 if (adev->sound_trigger_lib == NULL) { 3215 ALOGE("%s: DLOPEN failed for %s", __func__, 3216 SOUND_TRIGGER_HAL_LIBRARY_PATH); 3217 } else { 3218 ALOGV("%s: DLOPEN successful for %s", __func__, 3219 SOUND_TRIGGER_HAL_LIBRARY_PATH); 3220 adev->sound_trigger_open_for_streaming = 3221 (int (*)(void))dlsym(adev->sound_trigger_lib, 3222 "sound_trigger_open_for_streaming"); 3223 adev->sound_trigger_read_samples = 3224 (size_t (*)(int, void *, size_t))dlsym( 3225 adev->sound_trigger_lib, 3226 "sound_trigger_read_samples"); 3227 adev->sound_trigger_close_for_streaming = 3228 (int (*)(int))dlsym( 3229 adev->sound_trigger_lib, 3230 "sound_trigger_close_for_streaming"); 3231 if (!adev->sound_trigger_open_for_streaming || 3232 !adev->sound_trigger_read_samples || 3233 !adev->sound_trigger_close_for_streaming) { 3234 3235 ALOGE("%s: Error grabbing functions in %s", __func__, 3236 SOUND_TRIGGER_HAL_LIBRARY_PATH); 3237 adev->sound_trigger_open_for_streaming = 0; 3238 adev->sound_trigger_read_samples = 0; 3239 adev->sound_trigger_close_for_streaming = 0; 3240 } 3241 } 3242 } 3243 3244 *device = &adev->device.common; 3245 3246 cras_dsp_init("/system/etc/cras/speakerdsp.ini"); 3247 3248 ALOGV("%s: exit", __func__); 3249 return 0; 3250 } 3251 3252 static struct hw_module_methods_t hal_module_methods = { 3253 .open = adev_open, 3254 }; 3255 3256 struct audio_module HAL_MODULE_INFO_SYM = { 3257 .common = { 3258 .tag = HARDWARE_MODULE_TAG, 3259 .module_api_version = AUDIO_MODULE_API_VERSION_0_1, 3260 .hal_api_version = HARDWARE_HAL_API_VERSION, 3261 .id = AUDIO_HARDWARE_MODULE_ID, 3262 .name = "NVIDIA Tegra Audio HAL", 3263 .author = "The Android Open Source Project", 3264 .methods = &hal_module_methods, 3265 }, 3266 }; 3267