1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #define LOG_TAG "audio_hw_primary" 18 /*#define LOG_NDEBUG 0*/ 19 /*#define VERY_VERY_VERBOSE_LOGGING*/ 20 #ifdef VERY_VERY_VERBOSE_LOGGING 21 #define ALOGVV ALOGV 22 #else 23 #define ALOGVV(a...) do { } while(0) 24 #endif 25 26 #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_hw.h" 47 #include "platform_api.h" 48 #include <platform.h> 49 50 #include "sound/compress_params.h" 51 52 #define COMPRESS_OFFLOAD_FRAGMENT_SIZE (32 * 1024) 53 #define COMPRESS_OFFLOAD_NUM_FRAGMENTS 4 54 /* ToDo: Check and update a proper value in msec */ 55 #define COMPRESS_OFFLOAD_PLAYBACK_LATENCY 96 56 #define COMPRESS_PLAYBACK_VOLUME_MAX 0x2000 57 58 struct pcm_config pcm_config_deep_buffer = { 59 .channels = 2, 60 .rate = DEFAULT_OUTPUT_SAMPLING_RATE, 61 .period_size = DEEP_BUFFER_OUTPUT_PERIOD_SIZE, 62 .period_count = DEEP_BUFFER_OUTPUT_PERIOD_COUNT, 63 .format = PCM_FORMAT_S16_LE, 64 .start_threshold = DEEP_BUFFER_OUTPUT_PERIOD_SIZE / 4, 65 .stop_threshold = INT_MAX, 66 .avail_min = DEEP_BUFFER_OUTPUT_PERIOD_SIZE / 4, 67 }; 68 69 struct pcm_config pcm_config_low_latency = { 70 .channels = 2, 71 .rate = DEFAULT_OUTPUT_SAMPLING_RATE, 72 .period_size = LOW_LATENCY_OUTPUT_PERIOD_SIZE, 73 .period_count = LOW_LATENCY_OUTPUT_PERIOD_COUNT, 74 .format = PCM_FORMAT_S16_LE, 75 .start_threshold = LOW_LATENCY_OUTPUT_PERIOD_SIZE / 4, 76 .stop_threshold = INT_MAX, 77 .avail_min = LOW_LATENCY_OUTPUT_PERIOD_SIZE / 4, 78 }; 79 80 struct pcm_config pcm_config_hdmi_multi = { 81 .channels = HDMI_MULTI_DEFAULT_CHANNEL_COUNT, /* changed when the stream is opened */ 82 .rate = DEFAULT_OUTPUT_SAMPLING_RATE, /* changed when the stream is opened */ 83 .period_size = HDMI_MULTI_PERIOD_SIZE, 84 .period_count = HDMI_MULTI_PERIOD_COUNT, 85 .format = PCM_FORMAT_S16_LE, 86 .start_threshold = 0, 87 .stop_threshold = INT_MAX, 88 .avail_min = 0, 89 }; 90 91 struct pcm_config pcm_config_audio_capture = { 92 .channels = 2, 93 .period_count = AUDIO_CAPTURE_PERIOD_COUNT, 94 .format = PCM_FORMAT_S16_LE, 95 }; 96 97 struct pcm_config pcm_config_voice_call = { 98 .channels = 1, 99 .rate = 8000, 100 .period_size = 160, 101 .period_count = 2, 102 .format = PCM_FORMAT_S16_LE, 103 }; 104 105 static const char * const use_case_table[AUDIO_USECASE_MAX] = { 106 [USECASE_AUDIO_PLAYBACK_DEEP_BUFFER] = "deep-buffer-playback", 107 [USECASE_AUDIO_PLAYBACK_LOW_LATENCY] = "low-latency-playback", 108 [USECASE_AUDIO_PLAYBACK_MULTI_CH] = "multi-channel-playback", 109 [USECASE_AUDIO_RECORD] = "audio-record", 110 [USECASE_AUDIO_RECORD_LOW_LATENCY] = "low-latency-record", 111 [USECASE_VOICE_CALL] = "voice-call", 112 [USECASE_AUDIO_PLAYBACK_OFFLOAD] = "compress-offload-playback", 113 }; 114 115 116 #define STRING_TO_ENUM(string) { #string, string } 117 118 struct string_to_enum { 119 const char *name; 120 uint32_t value; 121 }; 122 123 static const struct string_to_enum out_channels_name_to_enum_table[] = { 124 STRING_TO_ENUM(AUDIO_CHANNEL_OUT_STEREO), 125 STRING_TO_ENUM(AUDIO_CHANNEL_OUT_5POINT1), 126 STRING_TO_ENUM(AUDIO_CHANNEL_OUT_7POINT1), 127 }; 128 129 static int set_voice_volume_l(struct audio_device *adev, float volume); 130 131 static bool is_supported_format(audio_format_t format) 132 { 133 if (format == AUDIO_FORMAT_MP3 || 134 format == AUDIO_FORMAT_AAC) 135 return true; 136 137 return false; 138 } 139 140 static int get_snd_codec_id(audio_format_t format) 141 { 142 int id = 0; 143 144 switch (format) { 145 case AUDIO_FORMAT_MP3: 146 id = SND_AUDIOCODEC_MP3; 147 break; 148 case AUDIO_FORMAT_AAC: 149 id = SND_AUDIOCODEC_AAC; 150 break; 151 default: 152 ALOGE("%s: Unsupported audio format", __func__); 153 } 154 155 return id; 156 } 157 158 static int enable_audio_route(struct audio_device *adev, 159 struct audio_usecase *usecase, 160 bool update_mixer) 161 { 162 snd_device_t snd_device; 163 char mixer_path[50]; 164 165 if (usecase == NULL) 166 return -EINVAL; 167 168 ALOGV("%s: enter: usecase(%d)", __func__, usecase->id); 169 170 if (usecase->type == PCM_CAPTURE) 171 snd_device = usecase->in_snd_device; 172 else 173 snd_device = usecase->out_snd_device; 174 175 strcpy(mixer_path, use_case_table[usecase->id]); 176 platform_add_backend_name(mixer_path, snd_device); 177 ALOGV("%s: apply mixer path: %s", __func__, mixer_path); 178 audio_route_apply_path(adev->audio_route, mixer_path); 179 if (update_mixer) 180 audio_route_update_mixer(adev->audio_route); 181 182 ALOGV("%s: exit", __func__); 183 return 0; 184 } 185 186 static int disable_audio_route(struct audio_device *adev, 187 struct audio_usecase *usecase, 188 bool update_mixer) 189 { 190 snd_device_t snd_device; 191 char mixer_path[50]; 192 193 if (usecase == NULL) 194 return -EINVAL; 195 196 ALOGV("%s: enter: usecase(%d)", __func__, usecase->id); 197 if (usecase->type == PCM_CAPTURE) 198 snd_device = usecase->in_snd_device; 199 else 200 snd_device = usecase->out_snd_device; 201 strcpy(mixer_path, use_case_table[usecase->id]); 202 platform_add_backend_name(mixer_path, snd_device); 203 ALOGV("%s: reset mixer path: %s", __func__, mixer_path); 204 audio_route_reset_path(adev->audio_route, mixer_path); 205 if (update_mixer) 206 audio_route_update_mixer(adev->audio_route); 207 208 ALOGV("%s: exit", __func__); 209 return 0; 210 } 211 212 static int enable_snd_device(struct audio_device *adev, 213 snd_device_t snd_device, 214 bool update_mixer) 215 { 216 if (snd_device < SND_DEVICE_MIN || 217 snd_device >= SND_DEVICE_MAX) { 218 ALOGE("%s: Invalid sound device %d", __func__, snd_device); 219 return -EINVAL; 220 } 221 222 adev->snd_dev_ref_cnt[snd_device]++; 223 if (adev->snd_dev_ref_cnt[snd_device] > 1) { 224 ALOGV("%s: snd_device(%d: %s) is already active", 225 __func__, snd_device, platform_get_snd_device_name(snd_device)); 226 return 0; 227 } 228 229 if (platform_send_audio_calibration(adev->platform, snd_device) < 0) { 230 adev->snd_dev_ref_cnt[snd_device]--; 231 return -EINVAL; 232 } 233 234 ALOGV("%s: snd_device(%d: %s)", __func__, 235 snd_device, platform_get_snd_device_name(snd_device)); 236 audio_route_apply_path(adev->audio_route, platform_get_snd_device_name(snd_device)); 237 if (update_mixer) 238 audio_route_update_mixer(adev->audio_route); 239 240 return 0; 241 } 242 243 static int disable_snd_device(struct audio_device *adev, 244 snd_device_t snd_device, 245 bool update_mixer) 246 { 247 if (snd_device < SND_DEVICE_MIN || 248 snd_device >= SND_DEVICE_MAX) { 249 ALOGE("%s: Invalid sound device %d", __func__, snd_device); 250 return -EINVAL; 251 } 252 if (adev->snd_dev_ref_cnt[snd_device] <= 0) { 253 ALOGE("%s: device ref cnt is already 0", __func__); 254 return -EINVAL; 255 } 256 adev->snd_dev_ref_cnt[snd_device]--; 257 if (adev->snd_dev_ref_cnt[snd_device] == 0) { 258 ALOGV("%s: snd_device(%d: %s)", __func__, 259 snd_device, platform_get_snd_device_name(snd_device)); 260 audio_route_reset_path(adev->audio_route, platform_get_snd_device_name(snd_device)); 261 if (update_mixer) 262 audio_route_update_mixer(adev->audio_route); 263 } 264 return 0; 265 } 266 267 static void check_usecases_codec_backend(struct audio_device *adev, 268 struct audio_usecase *uc_info, 269 snd_device_t snd_device) 270 { 271 struct listnode *node; 272 struct audio_usecase *usecase; 273 bool switch_device[AUDIO_USECASE_MAX]; 274 int i, num_uc_to_switch = 0; 275 276 /* 277 * This function is to make sure that all the usecases that are active on 278 * the hardware codec backend are always routed to any one device that is 279 * handled by the hardware codec. 280 * For example, if low-latency and deep-buffer usecases are currently active 281 * on speaker and out_set_parameters(headset) is received on low-latency 282 * output, then we have to make sure deep-buffer is also switched to headset, 283 * because of the limitation that both the devices cannot be enabled 284 * at the same time as they share the same backend. 285 */ 286 /* Disable all the usecases on the shared backend other than the 287 specified usecase */ 288 for (i = 0; i < AUDIO_USECASE_MAX; i++) 289 switch_device[i] = false; 290 291 list_for_each(node, &adev->usecase_list) { 292 usecase = node_to_item(node, struct audio_usecase, list); 293 if (usecase->type != PCM_CAPTURE && 294 usecase != uc_info && 295 usecase->out_snd_device != snd_device && 296 usecase->devices & AUDIO_DEVICE_OUT_ALL_CODEC_BACKEND) { 297 ALOGV("%s: Usecase (%s) is active on (%s) - disabling ..", 298 __func__, use_case_table[usecase->id], 299 platform_get_snd_device_name(usecase->out_snd_device)); 300 disable_audio_route(adev, usecase, false); 301 switch_device[usecase->id] = true; 302 num_uc_to_switch++; 303 } 304 } 305 306 if (num_uc_to_switch) { 307 /* Make sure all the streams are de-routed before disabling the device */ 308 audio_route_update_mixer(adev->audio_route); 309 310 list_for_each(node, &adev->usecase_list) { 311 usecase = node_to_item(node, struct audio_usecase, list); 312 if (switch_device[usecase->id]) { 313 disable_snd_device(adev, usecase->out_snd_device, false); 314 } 315 } 316 317 list_for_each(node, &adev->usecase_list) { 318 usecase = node_to_item(node, struct audio_usecase, list); 319 if (switch_device[usecase->id]) { 320 enable_snd_device(adev, snd_device, false); 321 } 322 } 323 324 /* Make sure new snd device is enabled before re-routing the streams */ 325 audio_route_update_mixer(adev->audio_route); 326 327 /* Re-route all the usecases on the shared backend other than the 328 specified usecase to new snd devices */ 329 list_for_each(node, &adev->usecase_list) { 330 usecase = node_to_item(node, struct audio_usecase, list); 331 /* Update the out_snd_device only before enabling the audio route */ 332 if (switch_device[usecase->id] ) { 333 usecase->out_snd_device = snd_device; 334 enable_audio_route(adev, usecase, false); 335 } 336 } 337 338 audio_route_update_mixer(adev->audio_route); 339 } 340 } 341 342 static void check_and_route_capture_usecases(struct audio_device *adev, 343 struct audio_usecase *uc_info, 344 snd_device_t snd_device) 345 { 346 struct listnode *node; 347 struct audio_usecase *usecase; 348 bool switch_device[AUDIO_USECASE_MAX]; 349 int i, num_uc_to_switch = 0; 350 351 /* 352 * This function is to make sure that all the active capture usecases 353 * are always routed to the same input sound device. 354 * For example, if audio-record and voice-call usecases are currently 355 * active on speaker(rx) and speaker-mic (tx) and out_set_parameters(earpiece) 356 * is received for voice call then we have to make sure that audio-record 357 * usecase is also switched to earpiece i.e. voice-dmic-ef, 358 * because of the limitation that two devices cannot be enabled 359 * at the same time if they share the same backend. 360 */ 361 for (i = 0; i < AUDIO_USECASE_MAX; i++) 362 switch_device[i] = false; 363 364 list_for_each(node, &adev->usecase_list) { 365 usecase = node_to_item(node, struct audio_usecase, list); 366 if (usecase->type != PCM_PLAYBACK && 367 usecase != uc_info && 368 usecase->in_snd_device != snd_device) { 369 ALOGV("%s: Usecase (%s) is active on (%s) - disabling ..", 370 __func__, use_case_table[usecase->id], 371 platform_get_snd_device_name(usecase->in_snd_device)); 372 disable_audio_route(adev, usecase, false); 373 switch_device[usecase->id] = true; 374 num_uc_to_switch++; 375 } 376 } 377 378 if (num_uc_to_switch) { 379 /* Make sure all the streams are de-routed before disabling the device */ 380 audio_route_update_mixer(adev->audio_route); 381 382 list_for_each(node, &adev->usecase_list) { 383 usecase = node_to_item(node, struct audio_usecase, list); 384 if (switch_device[usecase->id]) { 385 disable_snd_device(adev, usecase->in_snd_device, false); 386 enable_snd_device(adev, snd_device, false); 387 } 388 } 389 390 /* Make sure new snd device is enabled before re-routing the streams */ 391 audio_route_update_mixer(adev->audio_route); 392 393 /* Re-route all the usecases on the shared backend other than the 394 specified usecase to new snd devices */ 395 list_for_each(node, &adev->usecase_list) { 396 usecase = node_to_item(node, struct audio_usecase, list); 397 /* Update the in_snd_device only before enabling the audio route */ 398 if (switch_device[usecase->id] ) { 399 usecase->in_snd_device = snd_device; 400 enable_audio_route(adev, usecase, false); 401 } 402 } 403 404 audio_route_update_mixer(adev->audio_route); 405 } 406 } 407 408 409 /* must be called with hw device mutex locked */ 410 static int read_hdmi_channel_masks(struct stream_out *out) 411 { 412 int ret = 0; 413 int channels = platform_edid_get_max_channels(out->dev->platform); 414 415 switch (channels) { 416 /* 417 * Do not handle stereo output in Multi-channel cases 418 * Stereo case is handled in normal playback path 419 */ 420 case 6: 421 ALOGV("%s: HDMI supports 5.1", __func__); 422 out->supported_channel_masks[0] = AUDIO_CHANNEL_OUT_5POINT1; 423 break; 424 case 8: 425 ALOGV("%s: HDMI supports 5.1 and 7.1 channels", __func__); 426 out->supported_channel_masks[0] = AUDIO_CHANNEL_OUT_5POINT1; 427 out->supported_channel_masks[1] = AUDIO_CHANNEL_OUT_7POINT1; 428 break; 429 default: 430 ALOGE("HDMI does not support multi channel playback"); 431 ret = -ENOSYS; 432 break; 433 } 434 return ret; 435 } 436 437 static struct audio_usecase *get_usecase_from_list(struct audio_device *adev, 438 audio_usecase_t uc_id) 439 { 440 struct audio_usecase *usecase; 441 struct listnode *node; 442 443 list_for_each(node, &adev->usecase_list) { 444 usecase = node_to_item(node, struct audio_usecase, list); 445 if (usecase->id == uc_id) 446 return usecase; 447 } 448 return NULL; 449 } 450 451 static int select_devices(struct audio_device *adev, 452 audio_usecase_t uc_id) 453 { 454 snd_device_t out_snd_device = SND_DEVICE_NONE; 455 snd_device_t in_snd_device = SND_DEVICE_NONE; 456 struct audio_usecase *usecase = NULL; 457 struct audio_usecase *vc_usecase = NULL; 458 struct listnode *node; 459 int status = 0; 460 461 usecase = get_usecase_from_list(adev, uc_id); 462 if (usecase == NULL) { 463 ALOGE("%s: Could not find the usecase(%d)", __func__, uc_id); 464 return -EINVAL; 465 } 466 467 if (usecase->type == VOICE_CALL) { 468 out_snd_device = platform_get_output_snd_device(adev->platform, 469 usecase->stream.out->devices); 470 in_snd_device = platform_get_input_snd_device(adev->platform, usecase->stream.out->devices); 471 usecase->devices = usecase->stream.out->devices; 472 } else { 473 /* 474 * If the voice call is active, use the sound devices of voice call usecase 475 * so that it would not result any device switch. All the usecases will 476 * be switched to new device when select_devices() is called for voice call 477 * usecase. This is to avoid switching devices for voice call when 478 * check_usecases_codec_backend() is called below. 479 */ 480 if (adev->in_call) { 481 vc_usecase = get_usecase_from_list(adev, USECASE_VOICE_CALL); 482 if (vc_usecase->devices & AUDIO_DEVICE_OUT_ALL_CODEC_BACKEND) { 483 in_snd_device = vc_usecase->in_snd_device; 484 out_snd_device = vc_usecase->out_snd_device; 485 } 486 } 487 if (usecase->type == PCM_PLAYBACK) { 488 usecase->devices = usecase->stream.out->devices; 489 in_snd_device = SND_DEVICE_NONE; 490 if (out_snd_device == SND_DEVICE_NONE) { 491 out_snd_device = platform_get_output_snd_device(adev->platform, 492 usecase->stream.out->devices); 493 if (usecase->stream.out == adev->primary_output && 494 adev->active_input && 495 adev->active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION) { 496 select_devices(adev, adev->active_input->usecase); 497 } 498 } 499 } else if (usecase->type == PCM_CAPTURE) { 500 usecase->devices = usecase->stream.in->device; 501 out_snd_device = SND_DEVICE_NONE; 502 if (in_snd_device == SND_DEVICE_NONE) { 503 if (adev->active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION && 504 adev->primary_output && !adev->primary_output->standby) { 505 in_snd_device = platform_get_input_snd_device(adev->platform, 506 adev->primary_output->devices); 507 } else { 508 in_snd_device = platform_get_input_snd_device(adev->platform, 509 AUDIO_DEVICE_NONE); 510 } 511 } 512 } 513 } 514 515 if (out_snd_device == usecase->out_snd_device && 516 in_snd_device == usecase->in_snd_device) { 517 return 0; 518 } 519 520 ALOGD("%s: out_snd_device(%d: %s) in_snd_device(%d: %s)", __func__, 521 out_snd_device, platform_get_snd_device_name(out_snd_device), 522 in_snd_device, platform_get_snd_device_name(in_snd_device)); 523 524 /* 525 * Limitation: While in call, to do a device switch we need to disable 526 * and enable both RX and TX devices though one of them is same as current 527 * device. 528 */ 529 if (usecase->type == VOICE_CALL) { 530 status = platform_switch_voice_call_device_pre(adev->platform); 531 } 532 533 /* Disable current sound devices */ 534 if (usecase->out_snd_device != SND_DEVICE_NONE) { 535 disable_audio_route(adev, usecase, true); 536 disable_snd_device(adev, usecase->out_snd_device, false); 537 } 538 539 if (usecase->in_snd_device != SND_DEVICE_NONE) { 540 disable_audio_route(adev, usecase, true); 541 disable_snd_device(adev, usecase->in_snd_device, false); 542 } 543 544 /* Enable new sound devices */ 545 if (out_snd_device != SND_DEVICE_NONE) { 546 if (usecase->devices & AUDIO_DEVICE_OUT_ALL_CODEC_BACKEND) 547 check_usecases_codec_backend(adev, usecase, out_snd_device); 548 enable_snd_device(adev, out_snd_device, false); 549 } 550 551 if (in_snd_device != SND_DEVICE_NONE) { 552 check_and_route_capture_usecases(adev, usecase, in_snd_device); 553 enable_snd_device(adev, in_snd_device, false); 554 } 555 556 if (usecase->type == VOICE_CALL) 557 status = platform_switch_voice_call_device_post(adev->platform, 558 out_snd_device, 559 in_snd_device); 560 561 audio_route_update_mixer(adev->audio_route); 562 563 usecase->in_snd_device = in_snd_device; 564 usecase->out_snd_device = out_snd_device; 565 566 enable_audio_route(adev, usecase, true); 567 568 return status; 569 } 570 571 static int stop_input_stream(struct stream_in *in) 572 { 573 int i, ret = 0; 574 struct audio_usecase *uc_info; 575 struct audio_device *adev = in->dev; 576 577 adev->active_input = NULL; 578 579 ALOGV("%s: enter: usecase(%d: %s)", __func__, 580 in->usecase, use_case_table[in->usecase]); 581 uc_info = get_usecase_from_list(adev, in->usecase); 582 if (uc_info == NULL) { 583 ALOGE("%s: Could not find the usecase (%d) in the list", 584 __func__, in->usecase); 585 return -EINVAL; 586 } 587 588 /* 1. Disable stream specific mixer controls */ 589 disable_audio_route(adev, uc_info, true); 590 591 /* 2. Disable the tx device */ 592 disable_snd_device(adev, uc_info->in_snd_device, true); 593 594 list_remove(&uc_info->list); 595 free(uc_info); 596 597 ALOGV("%s: exit: status(%d)", __func__, ret); 598 return ret; 599 } 600 601 int start_input_stream(struct stream_in *in) 602 { 603 /* 1. Enable output device and stream routing controls */ 604 int ret = 0; 605 struct audio_usecase *uc_info; 606 struct audio_device *adev = in->dev; 607 608 ALOGV("%s: enter: usecase(%d)", __func__, in->usecase); 609 in->pcm_device_id = platform_get_pcm_device_id(in->usecase, PCM_CAPTURE); 610 if (in->pcm_device_id < 0) { 611 ALOGE("%s: Could not find PCM device id for the usecase(%d)", 612 __func__, in->usecase); 613 ret = -EINVAL; 614 goto error_config; 615 } 616 617 adev->active_input = in; 618 uc_info = (struct audio_usecase *)calloc(1, sizeof(struct audio_usecase)); 619 uc_info->id = in->usecase; 620 uc_info->type = PCM_CAPTURE; 621 uc_info->stream.in = in; 622 uc_info->devices = in->device; 623 uc_info->in_snd_device = SND_DEVICE_NONE; 624 uc_info->out_snd_device = SND_DEVICE_NONE; 625 626 list_add_tail(&adev->usecase_list, &uc_info->list); 627 select_devices(adev, in->usecase); 628 629 ALOGV("%s: Opening PCM device card_id(%d) device_id(%d), channels %d", 630 __func__, SOUND_CARD, in->pcm_device_id, in->config.channels); 631 in->pcm = pcm_open(SOUND_CARD, in->pcm_device_id, 632 PCM_IN, &in->config); 633 if (in->pcm && !pcm_is_ready(in->pcm)) { 634 ALOGE("%s: %s", __func__, pcm_get_error(in->pcm)); 635 pcm_close(in->pcm); 636 in->pcm = NULL; 637 ret = -EIO; 638 goto error_open; 639 } 640 ALOGV("%s: exit", __func__); 641 return ret; 642 643 error_open: 644 stop_input_stream(in); 645 646 error_config: 647 adev->active_input = NULL; 648 ALOGD("%s: exit: status(%d)", __func__, ret); 649 650 return ret; 651 } 652 653 /* must be called with out->lock locked */ 654 static int send_offload_cmd_l(struct stream_out* out, int command) 655 { 656 struct offload_cmd *cmd = (struct offload_cmd *)calloc(1, sizeof(struct offload_cmd)); 657 658 ALOGVV("%s %d", __func__, command); 659 660 cmd->cmd = command; 661 list_add_tail(&out->offload_cmd_list, &cmd->node); 662 pthread_cond_signal(&out->offload_cond); 663 return 0; 664 } 665 666 /* must be called iwth out->lock locked */ 667 static void stop_compressed_output_l(struct stream_out *out) 668 { 669 out->offload_state = OFFLOAD_STATE_IDLE; 670 out->playback_started = 0; 671 out->send_new_metadata = 1; 672 if (out->compr != NULL) { 673 compress_stop(out->compr); 674 while (out->offload_thread_blocked) { 675 pthread_cond_wait(&out->cond, &out->lock); 676 } 677 } 678 } 679 680 static void *offload_thread_loop(void *context) 681 { 682 struct stream_out *out = (struct stream_out *) context; 683 struct listnode *item; 684 685 out->offload_state = OFFLOAD_STATE_IDLE; 686 out->playback_started = 0; 687 688 setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_AUDIO); 689 set_sched_policy(0, SP_FOREGROUND); 690 prctl(PR_SET_NAME, (unsigned long)"Offload Callback", 0, 0, 0); 691 692 ALOGV("%s", __func__); 693 pthread_mutex_lock(&out->lock); 694 for (;;) { 695 struct offload_cmd *cmd = NULL; 696 stream_callback_event_t event; 697 bool send_callback = false; 698 699 ALOGVV("%s offload_cmd_list %d out->offload_state %d", 700 __func__, list_empty(&out->offload_cmd_list), 701 out->offload_state); 702 if (list_empty(&out->offload_cmd_list)) { 703 ALOGV("%s SLEEPING", __func__); 704 pthread_cond_wait(&out->offload_cond, &out->lock); 705 ALOGV("%s RUNNING", __func__); 706 continue; 707 } 708 709 item = list_head(&out->offload_cmd_list); 710 cmd = node_to_item(item, struct offload_cmd, node); 711 list_remove(item); 712 713 ALOGVV("%s STATE %d CMD %d out->compr %p", 714 __func__, out->offload_state, cmd->cmd, out->compr); 715 716 if (cmd->cmd == OFFLOAD_CMD_EXIT) { 717 free(cmd); 718 break; 719 } 720 721 if (out->compr == NULL) { 722 ALOGE("%s: Compress handle is NULL", __func__); 723 pthread_cond_signal(&out->cond); 724 continue; 725 } 726 out->offload_thread_blocked = true; 727 pthread_mutex_unlock(&out->lock); 728 send_callback = false; 729 switch(cmd->cmd) { 730 case OFFLOAD_CMD_WAIT_FOR_BUFFER: 731 compress_wait(out->compr, -1); 732 send_callback = true; 733 event = STREAM_CBK_EVENT_WRITE_READY; 734 break; 735 case OFFLOAD_CMD_PARTIAL_DRAIN: 736 compress_next_track(out->compr); 737 compress_partial_drain(out->compr); 738 send_callback = true; 739 event = STREAM_CBK_EVENT_DRAIN_READY; 740 break; 741 case OFFLOAD_CMD_DRAIN: 742 compress_drain(out->compr); 743 send_callback = true; 744 event = STREAM_CBK_EVENT_DRAIN_READY; 745 break; 746 default: 747 ALOGE("%s unknown command received: %d", __func__, cmd->cmd); 748 break; 749 } 750 pthread_mutex_lock(&out->lock); 751 out->offload_thread_blocked = false; 752 pthread_cond_signal(&out->cond); 753 if (send_callback) { 754 out->offload_callback(event, NULL, out->offload_cookie); 755 } 756 free(cmd); 757 } 758 759 pthread_cond_signal(&out->cond); 760 while (!list_empty(&out->offload_cmd_list)) { 761 item = list_head(&out->offload_cmd_list); 762 list_remove(item); 763 free(node_to_item(item, struct offload_cmd, node)); 764 } 765 pthread_mutex_unlock(&out->lock); 766 767 return NULL; 768 } 769 770 static int create_offload_callback_thread(struct stream_out *out) 771 { 772 pthread_cond_init(&out->offload_cond, (const pthread_condattr_t *) NULL); 773 list_init(&out->offload_cmd_list); 774 pthread_create(&out->offload_thread, (const pthread_attr_t *) NULL, 775 offload_thread_loop, out); 776 return 0; 777 } 778 779 static int destroy_offload_callback_thread(struct stream_out *out) 780 { 781 pthread_mutex_lock(&out->lock); 782 stop_compressed_output_l(out); 783 send_offload_cmd_l(out, OFFLOAD_CMD_EXIT); 784 785 pthread_mutex_unlock(&out->lock); 786 pthread_join(out->offload_thread, (void **) NULL); 787 pthread_cond_destroy(&out->offload_cond); 788 789 return 0; 790 } 791 792 static bool allow_hdmi_channel_config(struct audio_device *adev) 793 { 794 struct listnode *node; 795 struct audio_usecase *usecase; 796 bool ret = true; 797 798 list_for_each(node, &adev->usecase_list) { 799 usecase = node_to_item(node, struct audio_usecase, list); 800 if (usecase->devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) { 801 /* 802 * If voice call is already existing, do not proceed further to avoid 803 * disabling/enabling both RX and TX devices, CSD calls, etc. 804 * Once the voice call done, the HDMI channels can be configured to 805 * max channels of remaining use cases. 806 */ 807 if (usecase->id == USECASE_VOICE_CALL) { 808 ALOGD("%s: voice call is active, no change in HDMI channels", 809 __func__); 810 ret = false; 811 break; 812 } else if (usecase->id == USECASE_AUDIO_PLAYBACK_MULTI_CH) { 813 ALOGD("%s: multi channel playback is active, " 814 "no change in HDMI channels", __func__); 815 ret = false; 816 break; 817 } 818 } 819 } 820 return ret; 821 } 822 823 static int check_and_set_hdmi_channels(struct audio_device *adev, 824 unsigned int channels) 825 { 826 struct listnode *node; 827 struct audio_usecase *usecase; 828 829 /* Check if change in HDMI channel config is allowed */ 830 if (!allow_hdmi_channel_config(adev)) 831 return 0; 832 833 if (channels == adev->cur_hdmi_channels) { 834 ALOGD("%s: Requested channels are same as current", __func__); 835 return 0; 836 } 837 838 platform_set_hdmi_channels(adev->platform, channels); 839 adev->cur_hdmi_channels = channels; 840 841 /* 842 * Deroute all the playback streams routed to HDMI so that 843 * the back end is deactivated. Note that backend will not 844 * be deactivated if any one stream is connected to it. 845 */ 846 list_for_each(node, &adev->usecase_list) { 847 usecase = node_to_item(node, struct audio_usecase, list); 848 if (usecase->type == PCM_PLAYBACK && 849 usecase->devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) { 850 disable_audio_route(adev, usecase, true); 851 } 852 } 853 854 /* 855 * Enable all the streams disabled above. Now the HDMI backend 856 * will be activated with new channel configuration 857 */ 858 list_for_each(node, &adev->usecase_list) { 859 usecase = node_to_item(node, struct audio_usecase, list); 860 if (usecase->type == PCM_PLAYBACK && 861 usecase->devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) { 862 enable_audio_route(adev, usecase, true); 863 } 864 } 865 866 return 0; 867 } 868 869 static int stop_output_stream(struct stream_out *out) 870 { 871 int i, ret = 0; 872 struct audio_usecase *uc_info; 873 struct audio_device *adev = out->dev; 874 875 ALOGV("%s: enter: usecase(%d: %s)", __func__, 876 out->usecase, use_case_table[out->usecase]); 877 uc_info = get_usecase_from_list(adev, out->usecase); 878 if (uc_info == NULL) { 879 ALOGE("%s: Could not find the usecase (%d) in the list", 880 __func__, out->usecase); 881 return -EINVAL; 882 } 883 884 if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD && 885 adev->visualizer_stop_output != NULL) 886 adev->visualizer_stop_output(out->handle); 887 888 /* 1. Get and set stream specific mixer controls */ 889 disable_audio_route(adev, uc_info, true); 890 891 /* 2. Disable the rx device */ 892 disable_snd_device(adev, uc_info->out_snd_device, true); 893 894 list_remove(&uc_info->list); 895 free(uc_info); 896 897 /* Must be called after removing the usecase from list */ 898 if (out->devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) 899 check_and_set_hdmi_channels(adev, DEFAULT_HDMI_OUT_CHANNELS); 900 901 ALOGV("%s: exit: status(%d)", __func__, ret); 902 return ret; 903 } 904 905 int start_output_stream(struct stream_out *out) 906 { 907 int ret = 0; 908 struct audio_usecase *uc_info; 909 struct audio_device *adev = out->dev; 910 911 ALOGV("%s: enter: usecase(%d: %s) devices(%#x)", 912 __func__, out->usecase, use_case_table[out->usecase], out->devices); 913 out->pcm_device_id = platform_get_pcm_device_id(out->usecase, PCM_PLAYBACK); 914 if (out->pcm_device_id < 0) { 915 ALOGE("%s: Invalid PCM device id(%d) for the usecase(%d)", 916 __func__, out->pcm_device_id, out->usecase); 917 ret = -EINVAL; 918 goto error_config; 919 } 920 921 uc_info = (struct audio_usecase *)calloc(1, sizeof(struct audio_usecase)); 922 uc_info->id = out->usecase; 923 uc_info->type = PCM_PLAYBACK; 924 uc_info->stream.out = out; 925 uc_info->devices = out->devices; 926 uc_info->in_snd_device = SND_DEVICE_NONE; 927 uc_info->out_snd_device = SND_DEVICE_NONE; 928 929 /* This must be called before adding this usecase to the list */ 930 if (out->devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) 931 check_and_set_hdmi_channels(adev, out->config.channels); 932 933 list_add_tail(&adev->usecase_list, &uc_info->list); 934 935 select_devices(adev, out->usecase); 936 937 ALOGV("%s: Opening PCM device card_id(%d) device_id(%d)", 938 __func__, 0, out->pcm_device_id); 939 if (out->usecase != USECASE_AUDIO_PLAYBACK_OFFLOAD) { 940 out->pcm = pcm_open(SOUND_CARD, out->pcm_device_id, 941 PCM_OUT | PCM_MONOTONIC, &out->config); 942 if (out->pcm && !pcm_is_ready(out->pcm)) { 943 ALOGE("%s: %s", __func__, pcm_get_error(out->pcm)); 944 pcm_close(out->pcm); 945 out->pcm = NULL; 946 ret = -EIO; 947 goto error_open; 948 } 949 } else { 950 out->pcm = NULL; 951 out->compr = compress_open(SOUND_CARD, out->pcm_device_id, 952 COMPRESS_IN, &out->compr_config); 953 if (out->compr && !is_compress_ready(out->compr)) { 954 ALOGE("%s: %s", __func__, compress_get_error(out->compr)); 955 compress_close(out->compr); 956 out->compr = NULL; 957 ret = -EIO; 958 goto error_open; 959 } 960 if (out->offload_callback) 961 compress_nonblock(out->compr, out->non_blocking); 962 963 if (adev->visualizer_start_output != NULL) 964 adev->visualizer_start_output(out->handle); 965 } 966 ALOGV("%s: exit", __func__); 967 return 0; 968 error_open: 969 stop_output_stream(out); 970 error_config: 971 return ret; 972 } 973 974 static int stop_voice_call(struct audio_device *adev) 975 { 976 int i, ret = 0; 977 struct audio_usecase *uc_info; 978 979 ALOGV("%s: enter", __func__); 980 adev->in_call = false; 981 982 ret = platform_stop_voice_call(adev->platform); 983 984 /* 1. Close the PCM devices */ 985 if (adev->voice_call_rx) { 986 pcm_close(adev->voice_call_rx); 987 adev->voice_call_rx = NULL; 988 } 989 if (adev->voice_call_tx) { 990 pcm_close(adev->voice_call_tx); 991 adev->voice_call_tx = NULL; 992 } 993 994 uc_info = get_usecase_from_list(adev, USECASE_VOICE_CALL); 995 if (uc_info == NULL) { 996 ALOGE("%s: Could not find the usecase (%d) in the list", 997 __func__, USECASE_VOICE_CALL); 998 return -EINVAL; 999 } 1000 1001 /* 2. Get and set stream specific mixer controls */ 1002 disable_audio_route(adev, uc_info, true); 1003 1004 /* 3. Disable the rx and tx devices */ 1005 disable_snd_device(adev, uc_info->out_snd_device, false); 1006 disable_snd_device(adev, uc_info->in_snd_device, true); 1007 1008 list_remove(&uc_info->list); 1009 free(uc_info); 1010 1011 ALOGV("%s: exit: status(%d)", __func__, ret); 1012 return ret; 1013 } 1014 1015 static int start_voice_call(struct audio_device *adev) 1016 { 1017 int i, ret = 0; 1018 struct audio_usecase *uc_info; 1019 int pcm_dev_rx_id, pcm_dev_tx_id; 1020 1021 ALOGV("%s: enter", __func__); 1022 1023 uc_info = (struct audio_usecase *)calloc(1, sizeof(struct audio_usecase)); 1024 uc_info->id = USECASE_VOICE_CALL; 1025 uc_info->type = VOICE_CALL; 1026 uc_info->stream.out = adev->primary_output; 1027 uc_info->devices = adev->primary_output->devices; 1028 uc_info->in_snd_device = SND_DEVICE_NONE; 1029 uc_info->out_snd_device = SND_DEVICE_NONE; 1030 1031 list_add_tail(&adev->usecase_list, &uc_info->list); 1032 1033 select_devices(adev, USECASE_VOICE_CALL); 1034 1035 pcm_dev_rx_id = platform_get_pcm_device_id(uc_info->id, PCM_PLAYBACK); 1036 pcm_dev_tx_id = platform_get_pcm_device_id(uc_info->id, PCM_CAPTURE); 1037 1038 if (pcm_dev_rx_id < 0 || pcm_dev_tx_id < 0) { 1039 ALOGE("%s: Invalid PCM devices (rx: %d tx: %d) for the usecase(%d)", 1040 __func__, pcm_dev_rx_id, pcm_dev_tx_id, uc_info->id); 1041 ret = -EIO; 1042 goto error_start_voice; 1043 } 1044 1045 ALOGV("%s: Opening PCM playback device card_id(%d) device_id(%d)", 1046 __func__, SOUND_CARD, pcm_dev_rx_id); 1047 adev->voice_call_rx = pcm_open(SOUND_CARD, 1048 pcm_dev_rx_id, 1049 PCM_OUT | PCM_MONOTONIC, &pcm_config_voice_call); 1050 if (adev->voice_call_rx && !pcm_is_ready(adev->voice_call_rx)) { 1051 ALOGE("%s: %s", __func__, pcm_get_error(adev->voice_call_rx)); 1052 ret = -EIO; 1053 goto error_start_voice; 1054 } 1055 1056 ALOGV("%s: Opening PCM capture device card_id(%d) device_id(%d)", 1057 __func__, SOUND_CARD, pcm_dev_tx_id); 1058 adev->voice_call_tx = pcm_open(SOUND_CARD, 1059 pcm_dev_tx_id, 1060 PCM_IN, &pcm_config_voice_call); 1061 if (adev->voice_call_tx && !pcm_is_ready(adev->voice_call_tx)) { 1062 ALOGE("%s: %s", __func__, pcm_get_error(adev->voice_call_tx)); 1063 ret = -EIO; 1064 goto error_start_voice; 1065 } 1066 1067 /* set cached volume */ 1068 set_voice_volume_l(adev, adev->voice_volume); 1069 1070 pcm_start(adev->voice_call_rx); 1071 pcm_start(adev->voice_call_tx); 1072 1073 ret = platform_start_voice_call(adev->platform); 1074 if (ret < 0) { 1075 ALOGE("%s: platform_start_voice_call error %d\n", __func__, ret); 1076 goto error_start_voice; 1077 } 1078 adev->in_call = true; 1079 return 0; 1080 1081 error_start_voice: 1082 stop_voice_call(adev); 1083 1084 ALOGD("%s: exit: status(%d)", __func__, ret); 1085 return ret; 1086 } 1087 1088 static int check_input_parameters(uint32_t sample_rate, 1089 audio_format_t format, 1090 int channel_count) 1091 { 1092 if (format != AUDIO_FORMAT_PCM_16_BIT) return -EINVAL; 1093 1094 if ((channel_count < 1) || (channel_count > 2)) return -EINVAL; 1095 1096 switch (sample_rate) { 1097 case 8000: 1098 case 11025: 1099 case 12000: 1100 case 16000: 1101 case 22050: 1102 case 24000: 1103 case 32000: 1104 case 44100: 1105 case 48000: 1106 break; 1107 default: 1108 return -EINVAL; 1109 } 1110 1111 return 0; 1112 } 1113 1114 static size_t get_input_buffer_size(uint32_t sample_rate, 1115 audio_format_t format, 1116 int channel_count) 1117 { 1118 size_t size = 0; 1119 1120 if (check_input_parameters(sample_rate, format, channel_count) != 0) 1121 return 0; 1122 1123 size = (sample_rate * AUDIO_CAPTURE_PERIOD_DURATION_MSEC) / 1000; 1124 /* ToDo: should use frame_size computed based on the format and 1125 channel_count here. */ 1126 size *= sizeof(short) * channel_count; 1127 1128 /* make sure the size is multiple of 64 */ 1129 size += 0x3f; 1130 size &= ~0x3f; 1131 1132 return size; 1133 } 1134 1135 static uint32_t out_get_sample_rate(const struct audio_stream *stream) 1136 { 1137 struct stream_out *out = (struct stream_out *)stream; 1138 1139 return out->sample_rate; 1140 } 1141 1142 static int out_set_sample_rate(struct audio_stream *stream, uint32_t rate) 1143 { 1144 return -ENOSYS; 1145 } 1146 1147 static size_t out_get_buffer_size(const struct audio_stream *stream) 1148 { 1149 struct stream_out *out = (struct stream_out *)stream; 1150 1151 if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) { 1152 return out->compr_config.fragment_size; 1153 } 1154 1155 return out->config.period_size * audio_stream_frame_size(stream); 1156 } 1157 1158 static uint32_t out_get_channels(const struct audio_stream *stream) 1159 { 1160 struct stream_out *out = (struct stream_out *)stream; 1161 1162 return out->channel_mask; 1163 } 1164 1165 static audio_format_t out_get_format(const struct audio_stream *stream) 1166 { 1167 struct stream_out *out = (struct stream_out *)stream; 1168 1169 return out->format; 1170 } 1171 1172 static int out_set_format(struct audio_stream *stream, audio_format_t format) 1173 { 1174 return -ENOSYS; 1175 } 1176 1177 static int out_standby(struct audio_stream *stream) 1178 { 1179 struct stream_out *out = (struct stream_out *)stream; 1180 struct audio_device *adev = out->dev; 1181 1182 ALOGV("%s: enter: usecase(%d: %s)", __func__, 1183 out->usecase, use_case_table[out->usecase]); 1184 1185 pthread_mutex_lock(&out->lock); 1186 if (!out->standby) { 1187 pthread_mutex_lock(&adev->lock); 1188 out->standby = true; 1189 if (out->usecase != USECASE_AUDIO_PLAYBACK_OFFLOAD) { 1190 if (out->pcm) { 1191 pcm_close(out->pcm); 1192 out->pcm = NULL; 1193 } 1194 } else { 1195 stop_compressed_output_l(out); 1196 out->gapless_mdata.encoder_delay = 0; 1197 out->gapless_mdata.encoder_padding = 0; 1198 if (out->compr != NULL) { 1199 compress_close(out->compr); 1200 out->compr = NULL; 1201 } 1202 } 1203 stop_output_stream(out); 1204 pthread_mutex_unlock(&adev->lock); 1205 } 1206 pthread_mutex_unlock(&out->lock); 1207 ALOGV("%s: exit", __func__); 1208 return 0; 1209 } 1210 1211 static int out_dump(const struct audio_stream *stream, int fd) 1212 { 1213 return 0; 1214 } 1215 1216 static int parse_compress_metadata(struct stream_out *out, struct str_parms *parms) 1217 { 1218 int ret = 0; 1219 char value[32]; 1220 struct compr_gapless_mdata tmp_mdata; 1221 1222 if (!out || !parms) { 1223 return -EINVAL; 1224 } 1225 1226 ret = str_parms_get_str(parms, AUDIO_OFFLOAD_CODEC_DELAY_SAMPLES, value, sizeof(value)); 1227 if (ret >= 0) { 1228 tmp_mdata.encoder_delay = atoi(value); //whats a good limit check? 1229 } else { 1230 return -EINVAL; 1231 } 1232 1233 ret = str_parms_get_str(parms, AUDIO_OFFLOAD_CODEC_PADDING_SAMPLES, value, sizeof(value)); 1234 if (ret >= 0) { 1235 tmp_mdata.encoder_padding = atoi(value); 1236 } else { 1237 return -EINVAL; 1238 } 1239 1240 out->gapless_mdata = tmp_mdata; 1241 out->send_new_metadata = 1; 1242 ALOGV("%s new encoder delay %u and padding %u", __func__, 1243 out->gapless_mdata.encoder_delay, out->gapless_mdata.encoder_padding); 1244 1245 return 0; 1246 } 1247 1248 1249 static int out_set_parameters(struct audio_stream *stream, const char *kvpairs) 1250 { 1251 struct stream_out *out = (struct stream_out *)stream; 1252 struct audio_device *adev = out->dev; 1253 struct audio_usecase *usecase; 1254 struct listnode *node; 1255 struct str_parms *parms; 1256 char value[32]; 1257 int ret, val = 0; 1258 bool select_new_device = false; 1259 1260 ALOGD("%s: enter: usecase(%d: %s) kvpairs: %s", 1261 __func__, out->usecase, use_case_table[out->usecase], kvpairs); 1262 parms = str_parms_create_str(kvpairs); 1263 ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_ROUTING, value, sizeof(value)); 1264 if (ret >= 0) { 1265 val = atoi(value); 1266 pthread_mutex_lock(&out->lock); 1267 pthread_mutex_lock(&adev->lock); 1268 1269 /* 1270 * When HDMI cable is unplugged the music playback is paused and 1271 * the policy manager sends routing=0. But the audioflinger 1272 * continues to write data until standby time (3sec). 1273 * As the HDMI core is turned off, the write gets blocked. 1274 * Avoid this by routing audio to speaker until standby. 1275 */ 1276 if (out->devices == AUDIO_DEVICE_OUT_AUX_DIGITAL && 1277 val == AUDIO_DEVICE_NONE) { 1278 val = AUDIO_DEVICE_OUT_SPEAKER; 1279 } 1280 1281 /* 1282 * select_devices() call below switches all the usecases on the same 1283 * backend to the new device. Refer to check_usecases_codec_backend() in 1284 * the select_devices(). But how do we undo this? 1285 * 1286 * For example, music playback is active on headset (deep-buffer usecase) 1287 * and if we go to ringtones and select a ringtone, low-latency usecase 1288 * will be started on headset+speaker. As we can't enable headset+speaker 1289 * and headset devices at the same time, select_devices() switches the music 1290 * playback to headset+speaker while starting low-lateny usecase for ringtone. 1291 * So when the ringtone playback is completed, how do we undo the same? 1292 * 1293 * We are relying on the out_set_parameters() call on deep-buffer output, 1294 * once the ringtone playback is ended. 1295 * NOTE: We should not check if the current devices are same as new devices. 1296 * Because select_devices() must be called to switch back the music 1297 * playback to headset. 1298 */ 1299 if (val != 0) { 1300 out->devices = val; 1301 1302 if (!out->standby) 1303 select_devices(adev, out->usecase); 1304 1305 if ((adev->mode == AUDIO_MODE_IN_CALL) && !adev->in_call && 1306 (out == adev->primary_output)) { 1307 start_voice_call(adev); 1308 } else if ((adev->mode == AUDIO_MODE_IN_CALL) && adev->in_call && 1309 (out == adev->primary_output)) { 1310 select_devices(adev, USECASE_VOICE_CALL); 1311 } 1312 } 1313 1314 if ((adev->mode == AUDIO_MODE_NORMAL) && adev->in_call && 1315 (out == adev->primary_output)) { 1316 stop_voice_call(adev); 1317 } 1318 1319 pthread_mutex_unlock(&adev->lock); 1320 pthread_mutex_unlock(&out->lock); 1321 } 1322 1323 if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) { 1324 parse_compress_metadata(out, parms); 1325 } 1326 1327 str_parms_destroy(parms); 1328 ALOGV("%s: exit: code(%d)", __func__, ret); 1329 return ret; 1330 } 1331 1332 static char* out_get_parameters(const struct audio_stream *stream, const char *keys) 1333 { 1334 struct stream_out *out = (struct stream_out *)stream; 1335 struct str_parms *query = str_parms_create_str(keys); 1336 char *str; 1337 char value[256]; 1338 struct str_parms *reply = str_parms_create(); 1339 size_t i, j; 1340 int ret; 1341 bool first = true; 1342 ALOGV("%s: enter: keys - %s", __func__, keys); 1343 ret = str_parms_get_str(query, AUDIO_PARAMETER_STREAM_SUP_CHANNELS, value, sizeof(value)); 1344 if (ret >= 0) { 1345 value[0] = '\0'; 1346 i = 0; 1347 while (out->supported_channel_masks[i] != 0) { 1348 for (j = 0; j < ARRAY_SIZE(out_channels_name_to_enum_table); j++) { 1349 if (out_channels_name_to_enum_table[j].value == out->supported_channel_masks[i]) { 1350 if (!first) { 1351 strcat(value, "|"); 1352 } 1353 strcat(value, out_channels_name_to_enum_table[j].name); 1354 first = false; 1355 break; 1356 } 1357 } 1358 i++; 1359 } 1360 str_parms_add_str(reply, AUDIO_PARAMETER_STREAM_SUP_CHANNELS, value); 1361 str = str_parms_to_str(reply); 1362 } else { 1363 str = strdup(keys); 1364 } 1365 str_parms_destroy(query); 1366 str_parms_destroy(reply); 1367 ALOGV("%s: exit: returns - %s", __func__, str); 1368 return str; 1369 } 1370 1371 static uint32_t out_get_latency(const struct audio_stream_out *stream) 1372 { 1373 struct stream_out *out = (struct stream_out *)stream; 1374 1375 if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) 1376 return COMPRESS_OFFLOAD_PLAYBACK_LATENCY; 1377 1378 return (out->config.period_count * out->config.period_size * 1000) / 1379 (out->config.rate); 1380 } 1381 1382 static int out_set_volume(struct audio_stream_out *stream, float left, 1383 float right) 1384 { 1385 struct stream_out *out = (struct stream_out *)stream; 1386 int volume[2]; 1387 1388 if (out->usecase == USECASE_AUDIO_PLAYBACK_MULTI_CH) { 1389 /* only take left channel into account: the API is for stereo anyway */ 1390 out->muted = (left == 0.0f); 1391 return 0; 1392 } else if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) { 1393 const char *mixer_ctl_name = "Compress Playback Volume"; 1394 struct audio_device *adev = out->dev; 1395 struct mixer_ctl *ctl; 1396 1397 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name); 1398 if (!ctl) { 1399 ALOGE("%s: Could not get ctl for mixer cmd - %s", 1400 __func__, mixer_ctl_name); 1401 return -EINVAL; 1402 } 1403 volume[0] = (int)(left * COMPRESS_PLAYBACK_VOLUME_MAX); 1404 volume[1] = (int)(right * COMPRESS_PLAYBACK_VOLUME_MAX); 1405 mixer_ctl_set_array(ctl, volume, sizeof(volume)/sizeof(volume[0])); 1406 return 0; 1407 } 1408 1409 return -ENOSYS; 1410 } 1411 1412 static ssize_t out_write(struct audio_stream_out *stream, const void *buffer, 1413 size_t bytes) 1414 { 1415 struct stream_out *out = (struct stream_out *)stream; 1416 struct audio_device *adev = out->dev; 1417 ssize_t ret = 0; 1418 1419 pthread_mutex_lock(&out->lock); 1420 if (out->standby) { 1421 out->standby = false; 1422 pthread_mutex_lock(&adev->lock); 1423 ret = start_output_stream(out); 1424 pthread_mutex_unlock(&adev->lock); 1425 /* ToDo: If use case is compress offload should return 0 */ 1426 if (ret != 0) { 1427 out->standby = true; 1428 goto exit; 1429 } 1430 } 1431 1432 if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) { 1433 ALOGVV("%s: writing buffer (%d bytes) to compress device", __func__, bytes); 1434 if (out->send_new_metadata) { 1435 ALOGVV("send new gapless metadata"); 1436 compress_set_gapless_metadata(out->compr, &out->gapless_mdata); 1437 out->send_new_metadata = 0; 1438 } 1439 1440 ret = compress_write(out->compr, buffer, bytes); 1441 ALOGVV("%s: writing buffer (%d bytes) to compress device returned %d", __func__, bytes, ret); 1442 if (ret >= 0 && ret < (ssize_t)bytes) { 1443 send_offload_cmd_l(out, OFFLOAD_CMD_WAIT_FOR_BUFFER); 1444 } 1445 if (!out->playback_started) { 1446 compress_start(out->compr); 1447 out->playback_started = 1; 1448 out->offload_state = OFFLOAD_STATE_PLAYING; 1449 } 1450 pthread_mutex_unlock(&out->lock); 1451 return ret; 1452 } else { 1453 if (out->pcm) { 1454 if (out->muted) 1455 memset((void *)buffer, 0, bytes); 1456 ALOGVV("%s: writing buffer (%d bytes) to pcm device", __func__, bytes); 1457 ret = pcm_write(out->pcm, (void *)buffer, bytes); 1458 if (ret == 0) 1459 out->written += bytes / (out->config.channels * sizeof(short)); 1460 } 1461 } 1462 1463 exit: 1464 pthread_mutex_unlock(&out->lock); 1465 1466 if (ret != 0) { 1467 if (out->pcm) 1468 ALOGE("%s: error %d - %s", __func__, ret, pcm_get_error(out->pcm)); 1469 out_standby(&out->stream.common); 1470 usleep(bytes * 1000000 / audio_stream_frame_size(&out->stream.common) / 1471 out_get_sample_rate(&out->stream.common)); 1472 } 1473 return bytes; 1474 } 1475 1476 static int out_get_render_position(const struct audio_stream_out *stream, 1477 uint32_t *dsp_frames) 1478 { 1479 struct stream_out *out = (struct stream_out *)stream; 1480 *dsp_frames = 0; 1481 if ((out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) && (dsp_frames != NULL)) { 1482 pthread_mutex_lock(&out->lock); 1483 if (out->compr != NULL) { 1484 compress_get_tstamp(out->compr, (unsigned long *)dsp_frames, 1485 &out->sample_rate); 1486 ALOGVV("%s rendered frames %d sample_rate %d", 1487 __func__, *dsp_frames, out->sample_rate); 1488 } 1489 pthread_mutex_unlock(&out->lock); 1490 return 0; 1491 } else 1492 return -EINVAL; 1493 } 1494 1495 static int out_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect) 1496 { 1497 return 0; 1498 } 1499 1500 static int out_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect) 1501 { 1502 return 0; 1503 } 1504 1505 static int out_get_next_write_timestamp(const struct audio_stream_out *stream, 1506 int64_t *timestamp) 1507 { 1508 return -EINVAL; 1509 } 1510 1511 static int out_get_presentation_position(const struct audio_stream_out *stream, 1512 uint64_t *frames, struct timespec *timestamp) 1513 { 1514 struct stream_out *out = (struct stream_out *)stream; 1515 int ret = -1; 1516 unsigned long dsp_frames; 1517 1518 pthread_mutex_lock(&out->lock); 1519 1520 if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) { 1521 if (out->compr != NULL) { 1522 compress_get_tstamp(out->compr, &dsp_frames, 1523 &out->sample_rate); 1524 ALOGVV("%s rendered frames %ld sample_rate %d", 1525 __func__, dsp_frames, out->sample_rate); 1526 *frames = dsp_frames; 1527 ret = 0; 1528 /* this is the best we can do */ 1529 clock_gettime(CLOCK_MONOTONIC, timestamp); 1530 } 1531 } else { 1532 if (out->pcm) { 1533 size_t avail; 1534 if (pcm_get_htimestamp(out->pcm, &avail, timestamp) == 0) { 1535 size_t kernel_buffer_size = out->config.period_size * out->config.period_count; 1536 int64_t signed_frames = out->written - kernel_buffer_size + avail; 1537 // This adjustment accounts for buffering after app processor. 1538 // It is based on estimated DSP latency per use case, rather than exact. 1539 signed_frames -= 1540 (platform_render_latency(out->usecase) * out->sample_rate / 1000000LL); 1541 1542 // It would be unusual for this value to be negative, but check just in case ... 1543 if (signed_frames >= 0) { 1544 *frames = signed_frames; 1545 ret = 0; 1546 } 1547 } 1548 } 1549 } 1550 1551 pthread_mutex_unlock(&out->lock); 1552 1553 return ret; 1554 } 1555 1556 static int out_set_callback(struct audio_stream_out *stream, 1557 stream_callback_t callback, void *cookie) 1558 { 1559 struct stream_out *out = (struct stream_out *)stream; 1560 1561 ALOGV("%s", __func__); 1562 pthread_mutex_lock(&out->lock); 1563 out->offload_callback = callback; 1564 out->offload_cookie = cookie; 1565 pthread_mutex_unlock(&out->lock); 1566 return 0; 1567 } 1568 1569 static int out_pause(struct audio_stream_out* stream) 1570 { 1571 struct stream_out *out = (struct stream_out *)stream; 1572 int status = -ENOSYS; 1573 ALOGV("%s", __func__); 1574 if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) { 1575 pthread_mutex_lock(&out->lock); 1576 if (out->compr != NULL && out->offload_state == OFFLOAD_STATE_PLAYING) { 1577 status = compress_pause(out->compr); 1578 out->offload_state = OFFLOAD_STATE_PAUSED; 1579 } 1580 pthread_mutex_unlock(&out->lock); 1581 } 1582 return status; 1583 } 1584 1585 static int out_resume(struct audio_stream_out* stream) 1586 { 1587 struct stream_out *out = (struct stream_out *)stream; 1588 int status = -ENOSYS; 1589 ALOGV("%s", __func__); 1590 if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) { 1591 status = 0; 1592 pthread_mutex_lock(&out->lock); 1593 if (out->compr != NULL && out->offload_state == OFFLOAD_STATE_PAUSED) { 1594 status = compress_resume(out->compr); 1595 out->offload_state = OFFLOAD_STATE_PLAYING; 1596 } 1597 pthread_mutex_unlock(&out->lock); 1598 } 1599 return status; 1600 } 1601 1602 static int out_drain(struct audio_stream_out* stream, audio_drain_type_t type ) 1603 { 1604 struct stream_out *out = (struct stream_out *)stream; 1605 int status = -ENOSYS; 1606 ALOGV("%s", __func__); 1607 if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) { 1608 pthread_mutex_lock(&out->lock); 1609 if (type == AUDIO_DRAIN_EARLY_NOTIFY) 1610 status = send_offload_cmd_l(out, OFFLOAD_CMD_PARTIAL_DRAIN); 1611 else 1612 status = send_offload_cmd_l(out, OFFLOAD_CMD_DRAIN); 1613 pthread_mutex_unlock(&out->lock); 1614 } 1615 return status; 1616 } 1617 1618 static int out_flush(struct audio_stream_out* stream) 1619 { 1620 struct stream_out *out = (struct stream_out *)stream; 1621 ALOGV("%s", __func__); 1622 if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) { 1623 pthread_mutex_lock(&out->lock); 1624 stop_compressed_output_l(out); 1625 pthread_mutex_unlock(&out->lock); 1626 return 0; 1627 } 1628 return -ENOSYS; 1629 } 1630 1631 /** audio_stream_in implementation **/ 1632 static uint32_t in_get_sample_rate(const struct audio_stream *stream) 1633 { 1634 struct stream_in *in = (struct stream_in *)stream; 1635 1636 return in->config.rate; 1637 } 1638 1639 static int in_set_sample_rate(struct audio_stream *stream, uint32_t rate) 1640 { 1641 return -ENOSYS; 1642 } 1643 1644 static size_t in_get_buffer_size(const struct audio_stream *stream) 1645 { 1646 struct stream_in *in = (struct stream_in *)stream; 1647 1648 return in->config.period_size * audio_stream_frame_size(stream); 1649 } 1650 1651 static uint32_t in_get_channels(const struct audio_stream *stream) 1652 { 1653 struct stream_in *in = (struct stream_in *)stream; 1654 1655 return in->channel_mask; 1656 } 1657 1658 static audio_format_t in_get_format(const struct audio_stream *stream) 1659 { 1660 return AUDIO_FORMAT_PCM_16_BIT; 1661 } 1662 1663 static int in_set_format(struct audio_stream *stream, audio_format_t format) 1664 { 1665 return -ENOSYS; 1666 } 1667 1668 static int in_standby(struct audio_stream *stream) 1669 { 1670 struct stream_in *in = (struct stream_in *)stream; 1671 struct audio_device *adev = in->dev; 1672 int status = 0; 1673 ALOGV("%s: enter", __func__); 1674 pthread_mutex_lock(&in->lock); 1675 if (!in->standby) { 1676 pthread_mutex_lock(&adev->lock); 1677 in->standby = true; 1678 if (in->pcm) { 1679 pcm_close(in->pcm); 1680 in->pcm = NULL; 1681 } 1682 status = stop_input_stream(in); 1683 pthread_mutex_unlock(&adev->lock); 1684 } 1685 pthread_mutex_unlock(&in->lock); 1686 ALOGV("%s: exit: status(%d)", __func__, status); 1687 return status; 1688 } 1689 1690 static int in_dump(const struct audio_stream *stream, int fd) 1691 { 1692 return 0; 1693 } 1694 1695 static int in_set_parameters(struct audio_stream *stream, const char *kvpairs) 1696 { 1697 struct stream_in *in = (struct stream_in *)stream; 1698 struct audio_device *adev = in->dev; 1699 struct str_parms *parms; 1700 char *str; 1701 char value[32]; 1702 int ret, val = 0; 1703 1704 ALOGV("%s: enter: kvpairs=%s", __func__, kvpairs); 1705 parms = str_parms_create_str(kvpairs); 1706 1707 ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_INPUT_SOURCE, value, sizeof(value)); 1708 1709 pthread_mutex_lock(&in->lock); 1710 pthread_mutex_lock(&adev->lock); 1711 if (ret >= 0) { 1712 val = atoi(value); 1713 /* no audio source uses val == 0 */ 1714 if ((in->source != val) && (val != 0)) { 1715 in->source = val; 1716 } 1717 } 1718 1719 ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_ROUTING, value, sizeof(value)); 1720 if (ret >= 0) { 1721 val = atoi(value); 1722 if ((in->device != val) && (val != 0)) { 1723 in->device = val; 1724 /* If recording is in progress, change the tx device to new device */ 1725 if (!in->standby) 1726 ret = select_devices(adev, in->usecase); 1727 } 1728 } 1729 1730 pthread_mutex_unlock(&adev->lock); 1731 pthread_mutex_unlock(&in->lock); 1732 1733 str_parms_destroy(parms); 1734 ALOGV("%s: exit: status(%d)", __func__, ret); 1735 return ret; 1736 } 1737 1738 static char* in_get_parameters(const struct audio_stream *stream, 1739 const char *keys) 1740 { 1741 return strdup(""); 1742 } 1743 1744 static int in_set_gain(struct audio_stream_in *stream, float gain) 1745 { 1746 return 0; 1747 } 1748 1749 static ssize_t in_read(struct audio_stream_in *stream, void *buffer, 1750 size_t bytes) 1751 { 1752 struct stream_in *in = (struct stream_in *)stream; 1753 struct audio_device *adev = in->dev; 1754 int i, ret = -1; 1755 1756 pthread_mutex_lock(&in->lock); 1757 if (in->standby) { 1758 pthread_mutex_lock(&adev->lock); 1759 ret = start_input_stream(in); 1760 pthread_mutex_unlock(&adev->lock); 1761 if (ret != 0) { 1762 goto exit; 1763 } 1764 in->standby = 0; 1765 } 1766 1767 if (in->pcm) { 1768 ret = pcm_read(in->pcm, buffer, bytes); 1769 } 1770 1771 /* 1772 * Instead of writing zeroes here, we could trust the hardware 1773 * to always provide zeroes when muted. 1774 */ 1775 if (ret == 0 && adev->mic_mute) 1776 memset(buffer, 0, bytes); 1777 1778 exit: 1779 pthread_mutex_unlock(&in->lock); 1780 1781 if (ret != 0) { 1782 in_standby(&in->stream.common); 1783 ALOGV("%s: read failed - sleeping for buffer duration", __func__); 1784 usleep(bytes * 1000000 / audio_stream_frame_size(&in->stream.common) / 1785 in_get_sample_rate(&in->stream.common)); 1786 } 1787 return bytes; 1788 } 1789 1790 static uint32_t in_get_input_frames_lost(struct audio_stream_in *stream) 1791 { 1792 return 0; 1793 } 1794 1795 static int add_remove_audio_effect(const struct audio_stream *stream, 1796 effect_handle_t effect, 1797 bool enable) 1798 { 1799 struct stream_in *in = (struct stream_in *)stream; 1800 int status = 0; 1801 effect_descriptor_t desc; 1802 1803 status = (*effect)->get_descriptor(effect, &desc); 1804 if (status != 0) 1805 return status; 1806 1807 pthread_mutex_lock(&in->lock); 1808 pthread_mutex_lock(&in->dev->lock); 1809 if ((in->source == AUDIO_SOURCE_VOICE_COMMUNICATION) && 1810 in->enable_aec != enable && 1811 (memcmp(&desc.type, FX_IID_AEC, sizeof(effect_uuid_t)) == 0)) { 1812 in->enable_aec = enable; 1813 if (!in->standby) 1814 select_devices(in->dev, in->usecase); 1815 } 1816 pthread_mutex_unlock(&in->dev->lock); 1817 pthread_mutex_unlock(&in->lock); 1818 1819 return 0; 1820 } 1821 1822 static int in_add_audio_effect(const struct audio_stream *stream, 1823 effect_handle_t effect) 1824 { 1825 ALOGV("%s: effect %p", __func__, effect); 1826 return add_remove_audio_effect(stream, effect, true); 1827 } 1828 1829 static int in_remove_audio_effect(const struct audio_stream *stream, 1830 effect_handle_t effect) 1831 { 1832 ALOGV("%s: effect %p", __func__, effect); 1833 return add_remove_audio_effect(stream, effect, false); 1834 } 1835 1836 static int adev_open_output_stream(struct audio_hw_device *dev, 1837 audio_io_handle_t handle, 1838 audio_devices_t devices, 1839 audio_output_flags_t flags, 1840 struct audio_config *config, 1841 struct audio_stream_out **stream_out) 1842 { 1843 struct audio_device *adev = (struct audio_device *)dev; 1844 struct stream_out *out; 1845 int i, ret; 1846 1847 ALOGV("%s: enter: sample_rate(%d) channel_mask(%#x) devices(%#x) flags(%#x)", 1848 __func__, config->sample_rate, config->channel_mask, devices, flags); 1849 *stream_out = NULL; 1850 out = (struct stream_out *)calloc(1, sizeof(struct stream_out)); 1851 1852 if (devices == AUDIO_DEVICE_NONE) 1853 devices = AUDIO_DEVICE_OUT_SPEAKER; 1854 1855 out->flags = flags; 1856 out->devices = devices; 1857 out->dev = adev; 1858 out->format = config->format; 1859 out->sample_rate = config->sample_rate; 1860 out->channel_mask = AUDIO_CHANNEL_OUT_STEREO; 1861 out->supported_channel_masks[0] = AUDIO_CHANNEL_OUT_STEREO; 1862 out->handle = handle; 1863 1864 /* Init use case and pcm_config */ 1865 if (out->flags & AUDIO_OUTPUT_FLAG_DIRECT && 1866 !(out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) && 1867 out->devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) { 1868 pthread_mutex_lock(&adev->lock); 1869 ret = read_hdmi_channel_masks(out); 1870 pthread_mutex_unlock(&adev->lock); 1871 if (ret != 0) 1872 goto error_open; 1873 1874 if (config->sample_rate == 0) 1875 config->sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE; 1876 if (config->channel_mask == 0) 1877 config->channel_mask = AUDIO_CHANNEL_OUT_5POINT1; 1878 1879 out->channel_mask = config->channel_mask; 1880 out->sample_rate = config->sample_rate; 1881 out->usecase = USECASE_AUDIO_PLAYBACK_MULTI_CH; 1882 out->config = pcm_config_hdmi_multi; 1883 out->config.rate = config->sample_rate; 1884 out->config.channels = popcount(out->channel_mask); 1885 out->config.period_size = HDMI_MULTI_PERIOD_BYTES / (out->config.channels * 2); 1886 } else if (out->flags & AUDIO_OUTPUT_FLAG_DEEP_BUFFER) { 1887 out->usecase = USECASE_AUDIO_PLAYBACK_DEEP_BUFFER; 1888 out->config = pcm_config_deep_buffer; 1889 out->sample_rate = out->config.rate; 1890 } else if (out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) { 1891 if (config->offload_info.version != AUDIO_INFO_INITIALIZER.version || 1892 config->offload_info.size != AUDIO_INFO_INITIALIZER.size) { 1893 ALOGE("%s: Unsupported Offload information", __func__); 1894 ret = -EINVAL; 1895 goto error_open; 1896 } 1897 if (!is_supported_format(config->offload_info.format)) { 1898 ALOGE("%s: Unsupported audio format", __func__); 1899 ret = -EINVAL; 1900 goto error_open; 1901 } 1902 1903 out->compr_config.codec = (struct snd_codec *) 1904 calloc(1, sizeof(struct snd_codec)); 1905 1906 out->usecase = USECASE_AUDIO_PLAYBACK_OFFLOAD; 1907 if (config->offload_info.channel_mask) 1908 out->channel_mask = config->offload_info.channel_mask; 1909 else if (config->channel_mask) 1910 out->channel_mask = config->channel_mask; 1911 out->format = config->offload_info.format; 1912 out->sample_rate = config->offload_info.sample_rate; 1913 1914 out->stream.set_callback = out_set_callback; 1915 out->stream.pause = out_pause; 1916 out->stream.resume = out_resume; 1917 out->stream.drain = out_drain; 1918 out->stream.flush = out_flush; 1919 1920 out->compr_config.codec->id = 1921 get_snd_codec_id(config->offload_info.format); 1922 out->compr_config.fragment_size = COMPRESS_OFFLOAD_FRAGMENT_SIZE; 1923 out->compr_config.fragments = COMPRESS_OFFLOAD_NUM_FRAGMENTS; 1924 out->compr_config.codec->sample_rate = 1925 compress_get_alsa_rate(config->offload_info.sample_rate); 1926 out->compr_config.codec->bit_rate = 1927 config->offload_info.bit_rate; 1928 out->compr_config.codec->ch_in = 1929 popcount(config->channel_mask); 1930 out->compr_config.codec->ch_out = out->compr_config.codec->ch_in; 1931 1932 if (flags & AUDIO_OUTPUT_FLAG_NON_BLOCKING) 1933 out->non_blocking = 1; 1934 1935 out->send_new_metadata = 1; 1936 create_offload_callback_thread(out); 1937 ALOGV("%s: offloaded output offload_info version %04x bit rate %d", 1938 __func__, config->offload_info.version, 1939 config->offload_info.bit_rate); 1940 } else { 1941 out->usecase = USECASE_AUDIO_PLAYBACK_LOW_LATENCY; 1942 out->config = pcm_config_low_latency; 1943 out->sample_rate = out->config.rate; 1944 } 1945 1946 if (flags & AUDIO_OUTPUT_FLAG_PRIMARY) { 1947 if(adev->primary_output == NULL) 1948 adev->primary_output = out; 1949 else { 1950 ALOGE("%s: Primary output is already opened", __func__); 1951 ret = -EEXIST; 1952 goto error_open; 1953 } 1954 } 1955 1956 /* Check if this usecase is already existing */ 1957 pthread_mutex_lock(&adev->lock); 1958 if (get_usecase_from_list(adev, out->usecase) != NULL) { 1959 ALOGE("%s: Usecase (%d) is already present", __func__, out->usecase); 1960 pthread_mutex_unlock(&adev->lock); 1961 ret = -EEXIST; 1962 goto error_open; 1963 } 1964 pthread_mutex_unlock(&adev->lock); 1965 1966 out->stream.common.get_sample_rate = out_get_sample_rate; 1967 out->stream.common.set_sample_rate = out_set_sample_rate; 1968 out->stream.common.get_buffer_size = out_get_buffer_size; 1969 out->stream.common.get_channels = out_get_channels; 1970 out->stream.common.get_format = out_get_format; 1971 out->stream.common.set_format = out_set_format; 1972 out->stream.common.standby = out_standby; 1973 out->stream.common.dump = out_dump; 1974 out->stream.common.set_parameters = out_set_parameters; 1975 out->stream.common.get_parameters = out_get_parameters; 1976 out->stream.common.add_audio_effect = out_add_audio_effect; 1977 out->stream.common.remove_audio_effect = out_remove_audio_effect; 1978 out->stream.get_latency = out_get_latency; 1979 out->stream.set_volume = out_set_volume; 1980 out->stream.write = out_write; 1981 out->stream.get_render_position = out_get_render_position; 1982 out->stream.get_next_write_timestamp = out_get_next_write_timestamp; 1983 out->stream.get_presentation_position = out_get_presentation_position; 1984 1985 out->standby = 1; 1986 /* out->muted = false; by calloc() */ 1987 /* out->written = 0; by calloc() */ 1988 1989 pthread_mutex_init(&out->lock, (const pthread_mutexattr_t *) NULL); 1990 pthread_cond_init(&out->cond, (const pthread_condattr_t *) NULL); 1991 1992 config->format = out->stream.common.get_format(&out->stream.common); 1993 config->channel_mask = out->stream.common.get_channels(&out->stream.common); 1994 config->sample_rate = out->stream.common.get_sample_rate(&out->stream.common); 1995 1996 *stream_out = &out->stream; 1997 ALOGV("%s: exit", __func__); 1998 return 0; 1999 2000 error_open: 2001 free(out); 2002 *stream_out = NULL; 2003 ALOGD("%s: exit: ret %d", __func__, ret); 2004 return ret; 2005 } 2006 2007 static void adev_close_output_stream(struct audio_hw_device *dev, 2008 struct audio_stream_out *stream) 2009 { 2010 struct stream_out *out = (struct stream_out *)stream; 2011 struct audio_device *adev = out->dev; 2012 2013 ALOGV("%s: enter", __func__); 2014 out_standby(&stream->common); 2015 if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) { 2016 destroy_offload_callback_thread(out); 2017 2018 if (out->compr_config.codec != NULL) 2019 free(out->compr_config.codec); 2020 } 2021 pthread_cond_destroy(&out->cond); 2022 pthread_mutex_destroy(&out->lock); 2023 free(stream); 2024 ALOGV("%s: exit", __func__); 2025 } 2026 2027 static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs) 2028 { 2029 struct audio_device *adev = (struct audio_device *)dev; 2030 struct str_parms *parms; 2031 char *str; 2032 char value[32]; 2033 int val; 2034 int ret; 2035 2036 ALOGV("%s: enter: %s", __func__, kvpairs); 2037 2038 parms = str_parms_create_str(kvpairs); 2039 ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_TTY_MODE, value, sizeof(value)); 2040 if (ret >= 0) { 2041 int tty_mode; 2042 2043 if (strcmp(value, AUDIO_PARAMETER_VALUE_TTY_OFF) == 0) 2044 tty_mode = TTY_MODE_OFF; 2045 else if (strcmp(value, AUDIO_PARAMETER_VALUE_TTY_VCO) == 0) 2046 tty_mode = TTY_MODE_VCO; 2047 else if (strcmp(value, AUDIO_PARAMETER_VALUE_TTY_HCO) == 0) 2048 tty_mode = TTY_MODE_HCO; 2049 else if (strcmp(value, AUDIO_PARAMETER_VALUE_TTY_FULL) == 0) 2050 tty_mode = TTY_MODE_FULL; 2051 else 2052 return -EINVAL; 2053 2054 pthread_mutex_lock(&adev->lock); 2055 if (tty_mode != adev->tty_mode) { 2056 adev->tty_mode = tty_mode; 2057 adev->acdb_settings = (adev->acdb_settings & TTY_MODE_CLEAR) | tty_mode; 2058 if (adev->in_call) 2059 select_devices(adev, USECASE_VOICE_CALL); 2060 } 2061 pthread_mutex_unlock(&adev->lock); 2062 } 2063 2064 ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_BT_NREC, value, sizeof(value)); 2065 if (ret >= 0) { 2066 /* When set to false, HAL should disable EC and NS 2067 * But it is currently not supported. 2068 */ 2069 if (strcmp(value, AUDIO_PARAMETER_VALUE_ON) == 0) 2070 adev->bluetooth_nrec = true; 2071 else 2072 adev->bluetooth_nrec = false; 2073 } 2074 2075 ret = str_parms_get_str(parms, "screen_state", value, sizeof(value)); 2076 if (ret >= 0) { 2077 if (strcmp(value, AUDIO_PARAMETER_VALUE_ON) == 0) 2078 adev->screen_off = false; 2079 else 2080 adev->screen_off = true; 2081 } 2082 2083 ret = str_parms_get_int(parms, "rotation", &val); 2084 if (ret >= 0) { 2085 bool reverse_speakers = false; 2086 switch(val) { 2087 // FIXME: note that the code below assumes that the speakers are in the correct placement 2088 // relative to the user when the device is rotated 90deg from its default rotation. This 2089 // assumption is device-specific, not platform-specific like this code. 2090 case 270: 2091 reverse_speakers = true; 2092 break; 2093 case 0: 2094 case 90: 2095 case 180: 2096 break; 2097 default: 2098 ALOGE("%s: unexpected rotation of %d", __func__, val); 2099 } 2100 pthread_mutex_lock(&adev->lock); 2101 if (adev->speaker_lr_swap != reverse_speakers) { 2102 adev->speaker_lr_swap = reverse_speakers; 2103 // only update the selected device if there is active pcm playback 2104 struct audio_usecase *usecase; 2105 struct listnode *node; 2106 list_for_each(node, &adev->usecase_list) { 2107 usecase = node_to_item(node, struct audio_usecase, list); 2108 if (usecase->type == PCM_PLAYBACK) { 2109 select_devices(adev, usecase->id); 2110 break; 2111 } 2112 } 2113 } 2114 pthread_mutex_unlock(&adev->lock); 2115 } 2116 2117 str_parms_destroy(parms); 2118 ALOGV("%s: exit with code(%d)", __func__, ret); 2119 return ret; 2120 } 2121 2122 static char* adev_get_parameters(const struct audio_hw_device *dev, 2123 const char *keys) 2124 { 2125 return strdup(""); 2126 } 2127 2128 static int adev_init_check(const struct audio_hw_device *dev) 2129 { 2130 return 0; 2131 } 2132 2133 /* always called with adev lock held */ 2134 static int set_voice_volume_l(struct audio_device *adev, float volume) 2135 { 2136 int vol, err = 0; 2137 2138 if (adev->mode == AUDIO_MODE_IN_CALL) { 2139 if (volume < 0.0) { 2140 volume = 0.0; 2141 } else if (volume > 1.0) { 2142 volume = 1.0; 2143 } 2144 2145 vol = lrint(volume * 100.0); 2146 2147 // Voice volume levels from android are mapped to driver volume levels as follows. 2148 // 0 -> 5, 20 -> 4, 40 ->3, 60 -> 2, 80 -> 1, 100 -> 0 2149 // So adjust the volume to get the correct volume index in driver 2150 vol = 100 - vol; 2151 2152 err = platform_set_voice_volume(adev->platform, vol); 2153 } 2154 return err; 2155 } 2156 2157 static int adev_set_voice_volume(struct audio_hw_device *dev, float volume) 2158 { 2159 int ret; 2160 struct audio_device *adev = (struct audio_device *)dev; 2161 pthread_mutex_lock(&adev->lock); 2162 /* cache volume */ 2163 adev->voice_volume = volume; 2164 ret = set_voice_volume_l(adev, adev->voice_volume); 2165 pthread_mutex_unlock(&adev->lock); 2166 return ret; 2167 } 2168 2169 static int adev_set_master_volume(struct audio_hw_device *dev, float volume) 2170 { 2171 return -ENOSYS; 2172 } 2173 2174 static int adev_get_master_volume(struct audio_hw_device *dev, 2175 float *volume) 2176 { 2177 return -ENOSYS; 2178 } 2179 2180 static int adev_set_master_mute(struct audio_hw_device *dev, bool muted) 2181 { 2182 return -ENOSYS; 2183 } 2184 2185 static int adev_get_master_mute(struct audio_hw_device *dev, bool *muted) 2186 { 2187 return -ENOSYS; 2188 } 2189 2190 static int adev_set_mode(struct audio_hw_device *dev, audio_mode_t mode) 2191 { 2192 struct audio_device *adev = (struct audio_device *)dev; 2193 2194 pthread_mutex_lock(&adev->lock); 2195 if (adev->mode != mode) { 2196 adev->mode = mode; 2197 } 2198 pthread_mutex_unlock(&adev->lock); 2199 return 0; 2200 } 2201 2202 static int adev_set_mic_mute(struct audio_hw_device *dev, bool state) 2203 { 2204 struct audio_device *adev = (struct audio_device *)dev; 2205 int err = 0; 2206 2207 pthread_mutex_lock(&adev->lock); 2208 adev->mic_mute = state; 2209 2210 err = platform_set_mic_mute(adev->platform, state); 2211 pthread_mutex_unlock(&adev->lock); 2212 return err; 2213 } 2214 2215 static int adev_get_mic_mute(const struct audio_hw_device *dev, bool *state) 2216 { 2217 struct audio_device *adev = (struct audio_device *)dev; 2218 2219 *state = adev->mic_mute; 2220 2221 return 0; 2222 } 2223 2224 static size_t adev_get_input_buffer_size(const struct audio_hw_device *dev, 2225 const struct audio_config *config) 2226 { 2227 int channel_count = popcount(config->channel_mask); 2228 2229 return get_input_buffer_size(config->sample_rate, config->format, channel_count); 2230 } 2231 2232 static int adev_open_input_stream(struct audio_hw_device *dev, 2233 audio_io_handle_t handle, 2234 audio_devices_t devices, 2235 struct audio_config *config, 2236 struct audio_stream_in **stream_in) 2237 { 2238 struct audio_device *adev = (struct audio_device *)dev; 2239 struct stream_in *in; 2240 int ret, buffer_size, frame_size; 2241 int channel_count = popcount(config->channel_mask); 2242 2243 ALOGV("%s: enter", __func__); 2244 *stream_in = NULL; 2245 if (check_input_parameters(config->sample_rate, config->format, channel_count) != 0) 2246 return -EINVAL; 2247 2248 in = (struct stream_in *)calloc(1, sizeof(struct stream_in)); 2249 2250 in->stream.common.get_sample_rate = in_get_sample_rate; 2251 in->stream.common.set_sample_rate = in_set_sample_rate; 2252 in->stream.common.get_buffer_size = in_get_buffer_size; 2253 in->stream.common.get_channels = in_get_channels; 2254 in->stream.common.get_format = in_get_format; 2255 in->stream.common.set_format = in_set_format; 2256 in->stream.common.standby = in_standby; 2257 in->stream.common.dump = in_dump; 2258 in->stream.common.set_parameters = in_set_parameters; 2259 in->stream.common.get_parameters = in_get_parameters; 2260 in->stream.common.add_audio_effect = in_add_audio_effect; 2261 in->stream.common.remove_audio_effect = in_remove_audio_effect; 2262 in->stream.set_gain = in_set_gain; 2263 in->stream.read = in_read; 2264 in->stream.get_input_frames_lost = in_get_input_frames_lost; 2265 2266 in->device = devices; 2267 in->source = AUDIO_SOURCE_DEFAULT; 2268 in->dev = adev; 2269 in->standby = 1; 2270 in->channel_mask = config->channel_mask; 2271 2272 /* Update config params with the requested sample rate and channels */ 2273 in->usecase = USECASE_AUDIO_RECORD; 2274 in->config = pcm_config_audio_capture; 2275 in->config.channels = channel_count; 2276 in->config.rate = config->sample_rate; 2277 2278 frame_size = audio_stream_frame_size((struct audio_stream *)in); 2279 buffer_size = get_input_buffer_size(config->sample_rate, 2280 config->format, 2281 channel_count); 2282 in->config.period_size = buffer_size / frame_size; 2283 2284 *stream_in = &in->stream; 2285 ALOGV("%s: exit", __func__); 2286 return 0; 2287 2288 err_open: 2289 free(in); 2290 *stream_in = NULL; 2291 return ret; 2292 } 2293 2294 static void adev_close_input_stream(struct audio_hw_device *dev, 2295 struct audio_stream_in *stream) 2296 { 2297 ALOGV("%s", __func__); 2298 2299 in_standby(&stream->common); 2300 free(stream); 2301 2302 return; 2303 } 2304 2305 static int adev_dump(const audio_hw_device_t *device, int fd) 2306 { 2307 return 0; 2308 } 2309 2310 static int adev_close(hw_device_t *device) 2311 { 2312 struct audio_device *adev = (struct audio_device *)device; 2313 audio_route_free(adev->audio_route); 2314 free(adev->snd_dev_ref_cnt); 2315 platform_deinit(adev->platform); 2316 free(device); 2317 return 0; 2318 } 2319 2320 static int adev_open(const hw_module_t *module, const char *name, 2321 hw_device_t **device) 2322 { 2323 struct audio_device *adev; 2324 int i, ret; 2325 2326 ALOGD("%s: enter", __func__); 2327 if (strcmp(name, AUDIO_HARDWARE_INTERFACE) != 0) return -EINVAL; 2328 2329 adev = calloc(1, sizeof(struct audio_device)); 2330 2331 adev->device.common.tag = HARDWARE_DEVICE_TAG; 2332 adev->device.common.version = AUDIO_DEVICE_API_VERSION_2_0; 2333 adev->device.common.module = (struct hw_module_t *)module; 2334 adev->device.common.close = adev_close; 2335 2336 adev->device.init_check = adev_init_check; 2337 adev->device.set_voice_volume = adev_set_voice_volume; 2338 adev->device.set_master_volume = adev_set_master_volume; 2339 adev->device.get_master_volume = adev_get_master_volume; 2340 adev->device.set_master_mute = adev_set_master_mute; 2341 adev->device.get_master_mute = adev_get_master_mute; 2342 adev->device.set_mode = adev_set_mode; 2343 adev->device.set_mic_mute = adev_set_mic_mute; 2344 adev->device.get_mic_mute = adev_get_mic_mute; 2345 adev->device.set_parameters = adev_set_parameters; 2346 adev->device.get_parameters = adev_get_parameters; 2347 adev->device.get_input_buffer_size = adev_get_input_buffer_size; 2348 adev->device.open_output_stream = adev_open_output_stream; 2349 adev->device.close_output_stream = adev_close_output_stream; 2350 adev->device.open_input_stream = adev_open_input_stream; 2351 adev->device.close_input_stream = adev_close_input_stream; 2352 adev->device.dump = adev_dump; 2353 2354 /* Set the default route before the PCM stream is opened */ 2355 pthread_mutex_lock(&adev->lock); 2356 adev->mode = AUDIO_MODE_NORMAL; 2357 adev->active_input = NULL; 2358 adev->primary_output = NULL; 2359 adev->out_device = AUDIO_DEVICE_NONE; 2360 adev->voice_call_rx = NULL; 2361 adev->voice_call_tx = NULL; 2362 adev->voice_volume = 1.0f; 2363 adev->tty_mode = TTY_MODE_OFF; 2364 adev->bluetooth_nrec = true; 2365 adev->in_call = false; 2366 adev->acdb_settings = TTY_MODE_OFF; 2367 /* adev->cur_hdmi_channels = 0; by calloc() */ 2368 adev->snd_dev_ref_cnt = calloc(SND_DEVICE_MAX, sizeof(int)); 2369 list_init(&adev->usecase_list); 2370 pthread_mutex_unlock(&adev->lock); 2371 2372 /* Loads platform specific libraries dynamically */ 2373 adev->platform = platform_init(adev); 2374 if (!adev->platform) { 2375 free(adev->snd_dev_ref_cnt); 2376 free(adev); 2377 ALOGE("%s: Failed to init platform data, aborting.", __func__); 2378 *device = NULL; 2379 return -EINVAL; 2380 } 2381 2382 if (access(VISUALIZER_LIBRARY_PATH, R_OK) == 0) { 2383 adev->visualizer_lib = dlopen(VISUALIZER_LIBRARY_PATH, RTLD_NOW); 2384 if (adev->visualizer_lib == NULL) { 2385 ALOGE("%s: DLOPEN failed for %s", __func__, VISUALIZER_LIBRARY_PATH); 2386 } else { 2387 ALOGV("%s: DLOPEN successful for %s", __func__, VISUALIZER_LIBRARY_PATH); 2388 adev->visualizer_start_output = 2389 (int (*)(audio_io_handle_t))dlsym(adev->visualizer_lib, 2390 "visualizer_hal_start_output"); 2391 adev->visualizer_stop_output = 2392 (int (*)(audio_io_handle_t))dlsym(adev->visualizer_lib, 2393 "visualizer_hal_stop_output"); 2394 } 2395 } 2396 2397 *device = &adev->device.common; 2398 2399 ALOGV("%s: exit", __func__); 2400 return 0; 2401 } 2402 2403 static struct hw_module_methods_t hal_module_methods = { 2404 .open = adev_open, 2405 }; 2406 2407 struct audio_module HAL_MODULE_INFO_SYM = { 2408 .common = { 2409 .tag = HARDWARE_MODULE_TAG, 2410 .module_api_version = AUDIO_MODULE_API_VERSION_0_1, 2411 .hal_api_version = HARDWARE_HAL_API_VERSION, 2412 .id = AUDIO_HARDWARE_MODULE_ID, 2413 .name = "QCOM Audio HAL", 2414 .author = "Code Aurora Forum", 2415 .methods = &hal_module_methods, 2416 }, 2417 }; 2418