Home | History | Annotate | Download | only in hal
      1 /*
      2  * Copyright (C) 2013-2016 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 ATRACE_TAG ATRACE_TAG_AUDIO
     19 /*#define LOG_NDEBUG 0*/
     20 /*#define VERY_VERY_VERBOSE_LOGGING*/
     21 #ifdef VERY_VERY_VERBOSE_LOGGING
     22 #define ALOGVV ALOGV
     23 #else
     24 #define ALOGVV(a...) do { } while(0)
     25 #endif
     26 
     27 #include <errno.h>
     28 #include <pthread.h>
     29 #include <stdint.h>
     30 #include <sys/time.h>
     31 #include <stdlib.h>
     32 #include <math.h>
     33 #include <dlfcn.h>
     34 #include <sys/resource.h>
     35 #include <sys/prctl.h>
     36 
     37 #include <cutils/log.h>
     38 #include <cutils/trace.h>
     39 #include <cutils/str_parms.h>
     40 #include <cutils/properties.h>
     41 #include <cutils/atomic.h>
     42 #include <cutils/sched_policy.h>
     43 
     44 #include <hardware/audio_effect.h>
     45 #include <hardware/audio_alsaops.h>
     46 #include <system/thread_defs.h>
     47 #include <audio_effects/effect_aec.h>
     48 #include <audio_effects/effect_ns.h>
     49 #include "audio_hw.h"
     50 #include "audio_extn.h"
     51 #include "platform_api.h"
     52 #include <platform.h>
     53 #include "voice_extn.h"
     54 
     55 #include "sound/compress_params.h"
     56 
     57 /* COMPRESS_OFFLOAD_FRAGMENT_SIZE must be more than 8KB and a multiple of 32KB if more than 32KB.
     58  * COMPRESS_OFFLOAD_FRAGMENT_SIZE * COMPRESS_OFFLOAD_NUM_FRAGMENTS must be less than 8MB. */
     59 #define COMPRESS_OFFLOAD_FRAGMENT_SIZE (256 * 1024)
     60 // 2 buffers causes problems with high bitrate files
     61 #define COMPRESS_OFFLOAD_NUM_FRAGMENTS 3
     62 /* ToDo: Check and update a proper value in msec */
     63 #define COMPRESS_OFFLOAD_PLAYBACK_LATENCY 96
     64 #define COMPRESS_PLAYBACK_VOLUME_MAX 0x2000
     65 
     66 #define PROXY_OPEN_RETRY_COUNT           100
     67 #define PROXY_OPEN_WAIT_TIME             20
     68 
     69 #define MIN_CHANNEL_COUNT                1
     70 #define DEFAULT_CHANNEL_COUNT            2
     71 
     72 #ifndef MAX_TARGET_SPECIFIC_CHANNEL_CNT
     73 #define MAX_CHANNEL_COUNT 1
     74 #else
     75 #define MAX_CHANNEL_COUNT atoi(XSTR(MAX_TARGET_SPECIFIC_CHANNEL_CNT))
     76 #define XSTR(x) STR(x)
     77 #define STR(x) #x
     78 #endif
     79 
     80 #define ULL_PERIOD_SIZE (DEFAULT_OUTPUT_SAMPLING_RATE/1000)
     81 
     82 static unsigned int configured_low_latency_capture_period_size =
     83         LOW_LATENCY_CAPTURE_PERIOD_SIZE;
     84 
     85 /* This constant enables extended precision handling.
     86  * TODO The flag is off until more testing is done.
     87  */
     88 static const bool k_enable_extended_precision = false;
     89 
     90 struct pcm_config pcm_config_deep_buffer = {
     91     .channels = DEFAULT_CHANNEL_COUNT,
     92     .rate = DEFAULT_OUTPUT_SAMPLING_RATE,
     93     .period_size = DEEP_BUFFER_OUTPUT_PERIOD_SIZE,
     94     .period_count = DEEP_BUFFER_OUTPUT_PERIOD_COUNT,
     95     .format = PCM_FORMAT_S16_LE,
     96     .start_threshold = DEEP_BUFFER_OUTPUT_PERIOD_SIZE / 4,
     97     .stop_threshold = INT_MAX,
     98     .avail_min = DEEP_BUFFER_OUTPUT_PERIOD_SIZE / 4,
     99 };
    100 
    101 struct pcm_config pcm_config_low_latency = {
    102     .channels = DEFAULT_CHANNEL_COUNT,
    103     .rate = DEFAULT_OUTPUT_SAMPLING_RATE,
    104     .period_size = LOW_LATENCY_OUTPUT_PERIOD_SIZE,
    105     .period_count = LOW_LATENCY_OUTPUT_PERIOD_COUNT,
    106     .format = PCM_FORMAT_S16_LE,
    107     .start_threshold = LOW_LATENCY_OUTPUT_PERIOD_SIZE / 4,
    108     .stop_threshold = INT_MAX,
    109     .avail_min = LOW_LATENCY_OUTPUT_PERIOD_SIZE / 4,
    110 };
    111 
    112 static int af_period_multiplier = 4;
    113 struct pcm_config pcm_config_rt = {
    114     .channels = DEFAULT_CHANNEL_COUNT,
    115     .rate = DEFAULT_OUTPUT_SAMPLING_RATE,
    116     .period_size = ULL_PERIOD_SIZE, //1 ms
    117     .period_count = 512, //=> buffer size is 512ms
    118     .format = PCM_FORMAT_S16_LE,
    119     .start_threshold = ULL_PERIOD_SIZE*8, //8ms
    120     .stop_threshold = INT_MAX,
    121     .silence_threshold = 0,
    122     .silence_size = 0,
    123     .avail_min = ULL_PERIOD_SIZE, //1 ms
    124 };
    125 
    126 struct pcm_config pcm_config_hdmi_multi = {
    127     .channels = HDMI_MULTI_DEFAULT_CHANNEL_COUNT, /* changed when the stream is opened */
    128     .rate = DEFAULT_OUTPUT_SAMPLING_RATE, /* changed when the stream is opened */
    129     .period_size = HDMI_MULTI_PERIOD_SIZE,
    130     .period_count = HDMI_MULTI_PERIOD_COUNT,
    131     .format = PCM_FORMAT_S16_LE,
    132     .start_threshold = 0,
    133     .stop_threshold = INT_MAX,
    134     .avail_min = 0,
    135 };
    136 
    137 struct pcm_config pcm_config_audio_capture = {
    138     .channels = DEFAULT_CHANNEL_COUNT,
    139     .period_count = AUDIO_CAPTURE_PERIOD_COUNT,
    140     .format = PCM_FORMAT_S16_LE,
    141     .stop_threshold = INT_MAX,
    142     .avail_min = 0,
    143 };
    144 
    145 struct pcm_config pcm_config_audio_capture_rt = {
    146     .channels = DEFAULT_CHANNEL_COUNT,
    147     .rate = DEFAULT_OUTPUT_SAMPLING_RATE,
    148     .period_size = ULL_PERIOD_SIZE,
    149     .period_count = 512,
    150     .format = PCM_FORMAT_S16_LE,
    151     .start_threshold = 0,
    152     .stop_threshold = INT_MAX,
    153     .silence_threshold = 0,
    154     .silence_size = 0,
    155     .avail_min = ULL_PERIOD_SIZE, //1 ms
    156 };
    157 
    158 #define AFE_PROXY_CHANNEL_COUNT 2
    159 #define AFE_PROXY_SAMPLING_RATE 48000
    160 
    161 #define AFE_PROXY_PLAYBACK_PERIOD_SIZE  768
    162 #define AFE_PROXY_PLAYBACK_PERIOD_COUNT 4
    163 
    164 struct pcm_config pcm_config_afe_proxy_playback = {
    165     .channels = AFE_PROXY_CHANNEL_COUNT,
    166     .rate = AFE_PROXY_SAMPLING_RATE,
    167     .period_size = AFE_PROXY_PLAYBACK_PERIOD_SIZE,
    168     .period_count = AFE_PROXY_PLAYBACK_PERIOD_COUNT,
    169     .format = PCM_FORMAT_S16_LE,
    170     .start_threshold = AFE_PROXY_PLAYBACK_PERIOD_SIZE,
    171     .stop_threshold = INT_MAX,
    172     .avail_min = AFE_PROXY_PLAYBACK_PERIOD_SIZE,
    173 };
    174 
    175 #define AFE_PROXY_RECORD_PERIOD_SIZE  768
    176 #define AFE_PROXY_RECORD_PERIOD_COUNT 4
    177 
    178 struct pcm_config pcm_config_afe_proxy_record = {
    179     .channels = AFE_PROXY_CHANNEL_COUNT,
    180     .rate = AFE_PROXY_SAMPLING_RATE,
    181     .period_size = AFE_PROXY_RECORD_PERIOD_SIZE,
    182     .period_count = AFE_PROXY_RECORD_PERIOD_COUNT,
    183     .format = PCM_FORMAT_S16_LE,
    184     .start_threshold = AFE_PROXY_RECORD_PERIOD_SIZE,
    185     .stop_threshold = INT_MAX,
    186     .avail_min = AFE_PROXY_RECORD_PERIOD_SIZE,
    187 };
    188 
    189 const char * const use_case_table[AUDIO_USECASE_MAX] = {
    190     [USECASE_AUDIO_PLAYBACK_DEEP_BUFFER] = "deep-buffer-playback",
    191     [USECASE_AUDIO_PLAYBACK_LOW_LATENCY] = "low-latency-playback",
    192     [USECASE_AUDIO_PLAYBACK_MULTI_CH] = "multi-channel-playback",
    193     [USECASE_AUDIO_PLAYBACK_OFFLOAD] = "compress-offload-playback",
    194     [USECASE_AUDIO_PLAYBACK_TTS] = "audio-tts-playback",
    195     [USECASE_AUDIO_PLAYBACK_ULL] = "audio-ull-playback",
    196 
    197     [USECASE_AUDIO_RECORD] = "audio-record",
    198     [USECASE_AUDIO_RECORD_LOW_LATENCY] = "low-latency-record",
    199 
    200     [USECASE_AUDIO_HFP_SCO] = "hfp-sco",
    201     [USECASE_AUDIO_HFP_SCO_WB] = "hfp-sco-wb",
    202 
    203     [USECASE_VOICE_CALL] = "voice-call",
    204     [USECASE_VOICE2_CALL] = "voice2-call",
    205     [USECASE_VOLTE_CALL] = "volte-call",
    206     [USECASE_QCHAT_CALL] = "qchat-call",
    207     [USECASE_VOWLAN_CALL] = "vowlan-call",
    208     [USECASE_VOICEMMODE1_CALL] = "voicemmode1-call",
    209     [USECASE_VOICEMMODE2_CALL] = "voicemmode2-call",
    210 
    211     [USECASE_AUDIO_SPKR_CALIB_RX] = "spkr-rx-calib",
    212     [USECASE_AUDIO_SPKR_CALIB_TX] = "spkr-vi-record",
    213 
    214     [USECASE_AUDIO_PLAYBACK_AFE_PROXY] = "afe-proxy-playback",
    215     [USECASE_AUDIO_RECORD_AFE_PROXY] = "afe-proxy-record",
    216 };
    217 
    218 
    219 #define STRING_TO_ENUM(string) { #string, string }
    220 
    221 struct string_to_enum {
    222     const char *name;
    223     uint32_t value;
    224 };
    225 
    226 static const struct string_to_enum out_channels_name_to_enum_table[] = {
    227     STRING_TO_ENUM(AUDIO_CHANNEL_OUT_STEREO),
    228     STRING_TO_ENUM(AUDIO_CHANNEL_OUT_5POINT1),
    229     STRING_TO_ENUM(AUDIO_CHANNEL_OUT_7POINT1),
    230 };
    231 
    232 static int set_voice_volume_l(struct audio_device *adev, float volume);
    233 static struct audio_device *adev = NULL;
    234 static pthread_mutex_t adev_init_lock;
    235 static unsigned int audio_device_ref_count;
    236 //cache last MBDRC cal step level
    237 static int last_known_cal_step = -1 ;
    238 
    239 static bool may_use_noirq_mode(struct audio_device *adev, audio_usecase_t uc_id,
    240                                int flags __unused)
    241 {
    242     int dir = 0;
    243     switch (uc_id) {
    244     case USECASE_AUDIO_RECORD_LOW_LATENCY:
    245         dir = 1;
    246     case USECASE_AUDIO_PLAYBACK_ULL:
    247         break;
    248     default:
    249         return false;
    250     }
    251 
    252     int dev_id = platform_get_pcm_device_id(uc_id, dir == 0 ?
    253                                             PCM_PLAYBACK : PCM_CAPTURE);
    254     if (adev->adm_is_noirq_avail)
    255         return adev->adm_is_noirq_avail(adev->adm_data,
    256                                         adev->snd_card, dev_id, dir);
    257     return false;
    258 }
    259 
    260 static void register_out_stream(struct stream_out *out)
    261 {
    262     struct audio_device *adev = out->dev;
    263     if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD)
    264         return;
    265 
    266     if (!adev->adm_register_output_stream)
    267         return;
    268 
    269     adev->adm_register_output_stream(adev->adm_data,
    270                                      out->handle,
    271                                      out->flags);
    272 
    273     if (!adev->adm_set_config)
    274         return;
    275 
    276     if (out->realtime) {
    277         adev->adm_set_config(adev->adm_data,
    278                              out->handle,
    279                              out->pcm, &out->config);
    280     }
    281 }
    282 
    283 static void register_in_stream(struct stream_in *in)
    284 {
    285     struct audio_device *adev = in->dev;
    286     if (!adev->adm_register_input_stream)
    287         return;
    288 
    289     adev->adm_register_input_stream(adev->adm_data,
    290                                     in->capture_handle,
    291                                     in->flags);
    292 
    293     if (!adev->adm_set_config)
    294         return;
    295 
    296     if (in->realtime) {
    297         adev->adm_set_config(adev->adm_data,
    298                              in->capture_handle,
    299                              in->pcm,
    300                              &in->config);
    301     }
    302 }
    303 
    304 static void request_out_focus(struct stream_out *out, long ns)
    305 {
    306     struct audio_device *adev = out->dev;
    307 
    308     if (out->routing_change) {
    309         out->routing_change = false;
    310         if (adev->adm_on_routing_change)
    311             adev->adm_on_routing_change(adev->adm_data, out->handle);
    312     }
    313 
    314     if (adev->adm_request_focus_v2) {
    315         adev->adm_request_focus_v2(adev->adm_data, out->handle, ns);
    316     } else if (adev->adm_request_focus) {
    317         adev->adm_request_focus(adev->adm_data, out->handle);
    318     }
    319 }
    320 
    321 static void request_in_focus(struct stream_in *in, long ns)
    322 {
    323     struct audio_device *adev = in->dev;
    324 
    325     if (in->routing_change) {
    326         in->routing_change = false;
    327         if (adev->adm_on_routing_change)
    328             adev->adm_on_routing_change(adev->adm_data, in->capture_handle);
    329     }
    330 
    331     if (adev->adm_request_focus_v2) {
    332         adev->adm_request_focus_v2(adev->adm_data, in->capture_handle, ns);
    333     } else if (adev->adm_request_focus) {
    334         adev->adm_request_focus(adev->adm_data, in->capture_handle);
    335     }
    336 }
    337 
    338 static void release_out_focus(struct stream_out *out, long ns __unused)
    339 {
    340     struct audio_device *adev = out->dev;
    341 
    342     if (adev->adm_abandon_focus)
    343         adev->adm_abandon_focus(adev->adm_data, out->handle);
    344 }
    345 
    346 static void release_in_focus(struct stream_in *in, long ns __unused)
    347 {
    348     struct audio_device *adev = in->dev;
    349     if (adev->adm_abandon_focus)
    350         adev->adm_abandon_focus(adev->adm_data, in->capture_handle);
    351 }
    352 
    353 static int parse_snd_card_status(struct str_parms * parms, int * card,
    354                                  card_status_t * status)
    355 {
    356     char value[32]={0};
    357     char state[32]={0};
    358 
    359     int ret = str_parms_get_str(parms, "SND_CARD_STATUS", value, sizeof(value));
    360 
    361     if (ret < 0)
    362         return -1;
    363 
    364     // sscanf should be okay as value is of max length 32.
    365     // same as sizeof state.
    366     if (sscanf(value, "%d,%s", card, state) < 2)
    367         return -1;
    368 
    369     *status = !strcmp(state, "ONLINE") ? CARD_STATUS_ONLINE :
    370                                          CARD_STATUS_OFFLINE;
    371     return 0;
    372 }
    373 
    374 __attribute__ ((visibility ("default")))
    375 bool audio_hw_send_gain_dep_calibration(int level) {
    376     bool ret_val = false;
    377     ALOGV("%s: enter ... ", __func__);
    378 
    379     pthread_mutex_lock(&adev_init_lock);
    380 
    381     if (adev != NULL && adev->platform != NULL) {
    382         pthread_mutex_lock(&adev->lock);
    383         ret_val = platform_send_gain_dep_cal(adev->platform, level);
    384         pthread_mutex_unlock(&adev->lock);
    385 
    386         // if cal set fails, cache level info
    387         // if cal set succeds, reset known last cal set
    388         if (!ret_val)
    389             last_known_cal_step = level;
    390         else if (last_known_cal_step != -1)
    391             last_known_cal_step = -1;
    392     } else {
    393         ALOGE("%s: %s is NULL", __func__, adev == NULL ? "adev" : "adev->platform");
    394     }
    395 
    396     pthread_mutex_unlock(&adev_init_lock);
    397 
    398     ALOGV("%s: exit with ret_val %d ", __func__, ret_val);
    399     return ret_val;
    400 }
    401 
    402 __attribute__ ((visibility ("default")))
    403 int audio_hw_get_gain_level_mapping(struct amp_db_and_gain_table *mapping_tbl,
    404                                     int table_size) {
    405      int ret_val = 0;
    406      ALOGV("%s: enter ... ", __func__);
    407 
    408      pthread_mutex_lock(&adev_init_lock);
    409      if (adev == NULL) {
    410          ALOGW("%s: adev is NULL .... ", __func__);
    411          goto done;
    412      }
    413 
    414      pthread_mutex_lock(&adev->lock);
    415      ret_val = platform_get_gain_level_mapping(mapping_tbl, table_size);
    416      pthread_mutex_unlock(&adev->lock);
    417 done:
    418      pthread_mutex_unlock(&adev_init_lock);
    419      ALOGV("%s: exit ... ", __func__);
    420      return ret_val;
    421 }
    422 
    423 static bool is_supported_format(audio_format_t format)
    424 {
    425     switch (format) {
    426         case AUDIO_FORMAT_MP3:
    427         case AUDIO_FORMAT_AAC_LC:
    428         case AUDIO_FORMAT_AAC_HE_V1:
    429         case AUDIO_FORMAT_AAC_HE_V2:
    430             return true;
    431         default:
    432             break;
    433     }
    434     return false;
    435 }
    436 
    437 static inline bool is_mmap_usecase(audio_usecase_t uc_id)
    438 {
    439     return (uc_id == USECASE_AUDIO_RECORD_AFE_PROXY) ||
    440            (uc_id == USECASE_AUDIO_PLAYBACK_AFE_PROXY);
    441 }
    442 
    443 static int get_snd_codec_id(audio_format_t format)
    444 {
    445     int id = 0;
    446 
    447     switch (format & AUDIO_FORMAT_MAIN_MASK) {
    448     case AUDIO_FORMAT_MP3:
    449         id = SND_AUDIOCODEC_MP3;
    450         break;
    451     case AUDIO_FORMAT_AAC:
    452         id = SND_AUDIOCODEC_AAC;
    453         break;
    454     default:
    455         ALOGE("%s: Unsupported audio format", __func__);
    456     }
    457 
    458     return id;
    459 }
    460 
    461 int enable_audio_route(struct audio_device *adev,
    462                        struct audio_usecase *usecase)
    463 {
    464     snd_device_t snd_device;
    465     char mixer_path[50];
    466 
    467     if (usecase == NULL)
    468         return -EINVAL;
    469 
    470     ALOGV("%s: enter: usecase(%d)", __func__, usecase->id);
    471 
    472     if (usecase->type == PCM_CAPTURE)
    473         snd_device = usecase->in_snd_device;
    474     else
    475         snd_device = usecase->out_snd_device;
    476 
    477     strcpy(mixer_path, use_case_table[usecase->id]);
    478     platform_add_backend_name(adev->platform, mixer_path, snd_device);
    479     ALOGD("%s: usecase(%d) apply and update mixer path: %s", __func__,  usecase->id, mixer_path);
    480     audio_route_apply_and_update_path(adev->audio_route, mixer_path);
    481 
    482     ALOGV("%s: exit", __func__);
    483     return 0;
    484 }
    485 
    486 int disable_audio_route(struct audio_device *adev,
    487                         struct audio_usecase *usecase)
    488 {
    489     snd_device_t snd_device;
    490     char mixer_path[50];
    491 
    492     if (usecase == NULL)
    493         return -EINVAL;
    494 
    495     ALOGV("%s: enter: usecase(%d)", __func__, usecase->id);
    496     if (usecase->type == PCM_CAPTURE)
    497         snd_device = usecase->in_snd_device;
    498     else
    499         snd_device = usecase->out_snd_device;
    500     strcpy(mixer_path, use_case_table[usecase->id]);
    501     platform_add_backend_name(adev->platform, mixer_path, snd_device);
    502     ALOGD("%s: usecase(%d) reset and update mixer path: %s", __func__, usecase->id, mixer_path);
    503     audio_route_reset_and_update_path(adev->audio_route, mixer_path);
    504 
    505     ALOGV("%s: exit", __func__);
    506     return 0;
    507 }
    508 
    509 int enable_snd_device(struct audio_device *adev,
    510                       snd_device_t snd_device)
    511 {
    512     int i, num_devices = 0;
    513     snd_device_t new_snd_devices[2];
    514     int ret_val = -EINVAL;
    515     if (snd_device < SND_DEVICE_MIN ||
    516         snd_device >= SND_DEVICE_MAX) {
    517         ALOGE("%s: Invalid sound device %d", __func__, snd_device);
    518         goto on_error;
    519     }
    520 
    521     platform_send_audio_calibration(adev->platform, snd_device);
    522 
    523     if (adev->snd_dev_ref_cnt[snd_device] >= 1) {
    524         ALOGV("%s: snd_device(%d: %s) is already active",
    525               __func__, snd_device, platform_get_snd_device_name(snd_device));
    526         goto on_success;
    527     }
    528 
    529     /* due to the possibility of calibration overwrite between listen
    530         and audio, notify sound trigger hal before audio calibration is sent */
    531     audio_extn_sound_trigger_update_device_status(snd_device,
    532                                     ST_EVENT_SND_DEVICE_BUSY);
    533 
    534     if (audio_extn_spkr_prot_is_enabled())
    535          audio_extn_spkr_prot_calib_cancel(adev);
    536 
    537     audio_extn_dsm_feedback_enable(adev, snd_device, true);
    538 
    539     if ((snd_device == SND_DEVICE_OUT_SPEAKER ||
    540         snd_device == SND_DEVICE_OUT_VOICE_SPEAKER) &&
    541         audio_extn_spkr_prot_is_enabled()) {
    542         if (audio_extn_spkr_prot_get_acdb_id(snd_device) < 0) {
    543             goto on_error;
    544         }
    545         if (audio_extn_spkr_prot_start_processing(snd_device)) {
    546             ALOGE("%s: spkr_start_processing failed", __func__);
    547             goto on_error;
    548         }
    549     } else if (platform_can_split_snd_device(snd_device, &num_devices, new_snd_devices)) {
    550         for (i = 0; i < num_devices; i++) {
    551             enable_snd_device(adev, new_snd_devices[i]);
    552         }
    553         platform_set_speaker_gain_in_combo(adev, snd_device, true);
    554     } else {
    555         char device_name[DEVICE_NAME_MAX_SIZE] = {0};
    556         if (platform_get_snd_device_name_extn(adev->platform, snd_device, device_name) < 0 ) {
    557             ALOGE(" %s: Invalid sound device returned", __func__);
    558             goto on_error;
    559         }
    560 
    561         ALOGD("%s: snd_device(%d: %s)", __func__, snd_device, device_name);
    562         audio_route_apply_and_update_path(adev->audio_route, device_name);
    563     }
    564 on_success:
    565     adev->snd_dev_ref_cnt[snd_device]++;
    566     ret_val = 0;
    567 on_error:
    568     return ret_val;
    569 }
    570 
    571 int disable_snd_device(struct audio_device *adev,
    572                        snd_device_t snd_device)
    573 {
    574     int i, num_devices = 0;
    575     snd_device_t new_snd_devices[2];
    576 
    577     if (snd_device < SND_DEVICE_MIN ||
    578         snd_device >= SND_DEVICE_MAX) {
    579         ALOGE("%s: Invalid sound device %d", __func__, snd_device);
    580         return -EINVAL;
    581     }
    582     if (adev->snd_dev_ref_cnt[snd_device] <= 0) {
    583         ALOGE("%s: device ref cnt is already 0", __func__);
    584         return -EINVAL;
    585     }
    586     adev->snd_dev_ref_cnt[snd_device]--;
    587     if (adev->snd_dev_ref_cnt[snd_device] == 0) {
    588         audio_extn_dsm_feedback_enable(adev, snd_device, false);
    589         if ((snd_device == SND_DEVICE_OUT_SPEAKER ||
    590             snd_device == SND_DEVICE_OUT_VOICE_SPEAKER) &&
    591             audio_extn_spkr_prot_is_enabled()) {
    592             audio_extn_spkr_prot_stop_processing(snd_device);
    593         } else if (platform_can_split_snd_device(snd_device, &num_devices, new_snd_devices)) {
    594             for (i = 0; i < num_devices; i++) {
    595                 disable_snd_device(adev, new_snd_devices[i]);
    596             }
    597             platform_set_speaker_gain_in_combo(adev, snd_device, false);
    598         } else {
    599             char device_name[DEVICE_NAME_MAX_SIZE] = {0};
    600             if (platform_get_snd_device_name_extn(adev->platform, snd_device, device_name) < 0 ) {
    601                 ALOGE(" %s: Invalid sound device returned", __func__);
    602                 return -EINVAL;
    603             }
    604 
    605             ALOGD("%s: snd_device(%d: %s)", __func__, snd_device, device_name);
    606             audio_route_reset_and_update_path(adev->audio_route, device_name);
    607         }
    608         audio_extn_sound_trigger_update_device_status(snd_device,
    609                                         ST_EVENT_SND_DEVICE_FREE);
    610     }
    611 
    612     return 0;
    613 }
    614 
    615 static void check_and_route_playback_usecases(struct audio_device *adev,
    616                                               struct audio_usecase *uc_info,
    617                                               snd_device_t snd_device)
    618 {
    619     struct listnode *node;
    620     struct audio_usecase *usecase;
    621     bool switch_device[AUDIO_USECASE_MAX];
    622     int i, num_uc_to_switch = 0;
    623 
    624     /*
    625      * This function is to make sure that all the usecases that are active on
    626      * the hardware codec backend are always routed to any one device that is
    627      * handled by the hardware codec.
    628      * For example, if low-latency and deep-buffer usecases are currently active
    629      * on speaker and out_set_parameters(headset) is received on low-latency
    630      * output, then we have to make sure deep-buffer is also switched to headset,
    631      * because of the limitation that both the devices cannot be enabled
    632      * at the same time as they share the same backend.
    633      */
    634     /* Disable all the usecases on the shared backend other than the
    635        specified usecase */
    636     for (i = 0; i < AUDIO_USECASE_MAX; i++)
    637         switch_device[i] = false;
    638 
    639     list_for_each(node, &adev->usecase_list) {
    640         usecase = node_to_item(node, struct audio_usecase, list);
    641         if (usecase->type != PCM_CAPTURE &&
    642                 usecase != uc_info &&
    643                 usecase->out_snd_device != snd_device &&
    644                 usecase->devices & AUDIO_DEVICE_OUT_ALL_CODEC_BACKEND &&
    645                 platform_check_backends_match(snd_device, usecase->out_snd_device)) {
    646             ALOGV("%s: Usecase (%s) is active on (%s) - disabling ..",
    647                   __func__, use_case_table[usecase->id],
    648                   platform_get_snd_device_name(usecase->out_snd_device));
    649             disable_audio_route(adev, usecase);
    650             switch_device[usecase->id] = true;
    651             num_uc_to_switch++;
    652         }
    653     }
    654 
    655     if (num_uc_to_switch) {
    656         list_for_each(node, &adev->usecase_list) {
    657             usecase = node_to_item(node, struct audio_usecase, list);
    658             if (switch_device[usecase->id]) {
    659                 disable_snd_device(adev, usecase->out_snd_device);
    660             }
    661         }
    662 
    663         list_for_each(node, &adev->usecase_list) {
    664             usecase = node_to_item(node, struct audio_usecase, list);
    665             if (switch_device[usecase->id]) {
    666                 enable_snd_device(adev, snd_device);
    667             }
    668         }
    669 
    670         /* Re-route all the usecases on the shared backend other than the
    671            specified usecase to new snd devices */
    672         list_for_each(node, &adev->usecase_list) {
    673             usecase = node_to_item(node, struct audio_usecase, list);
    674             /* Update the out_snd_device only before enabling the audio route */
    675             if (switch_device[usecase->id] ) {
    676                 usecase->out_snd_device = snd_device;
    677                 enable_audio_route(adev, usecase);
    678             }
    679         }
    680     }
    681 }
    682 
    683 static void check_and_route_capture_usecases(struct audio_device *adev,
    684                                              struct audio_usecase *uc_info,
    685                                              snd_device_t snd_device)
    686 {
    687     struct listnode *node;
    688     struct audio_usecase *usecase;
    689     bool switch_device[AUDIO_USECASE_MAX];
    690     int i, num_uc_to_switch = 0;
    691 
    692     platform_check_and_set_capture_backend_cfg(adev, uc_info, snd_device);
    693 
    694     /*
    695      * This function is to make sure that all the active capture usecases
    696      * are always routed to the same input sound device.
    697      * For example, if audio-record and voice-call usecases are currently
    698      * active on speaker(rx) and speaker-mic (tx) and out_set_parameters(earpiece)
    699      * is received for voice call then we have to make sure that audio-record
    700      * usecase is also switched to earpiece i.e. voice-dmic-ef,
    701      * because of the limitation that two devices cannot be enabled
    702      * at the same time if they share the same backend.
    703      */
    704     for (i = 0; i < AUDIO_USECASE_MAX; i++)
    705         switch_device[i] = false;
    706 
    707     list_for_each(node, &adev->usecase_list) {
    708         usecase = node_to_item(node, struct audio_usecase, list);
    709         if (usecase->type != PCM_PLAYBACK &&
    710                 usecase != uc_info &&
    711                 usecase->in_snd_device != snd_device &&
    712                 (usecase->id != USECASE_AUDIO_SPKR_CALIB_TX)) {
    713             ALOGV("%s: Usecase (%s) is active on (%s) - disabling ..",
    714                   __func__, use_case_table[usecase->id],
    715                   platform_get_snd_device_name(usecase->in_snd_device));
    716             disable_audio_route(adev, usecase);
    717             switch_device[usecase->id] = true;
    718             num_uc_to_switch++;
    719         }
    720     }
    721 
    722     if (num_uc_to_switch) {
    723         list_for_each(node, &adev->usecase_list) {
    724             usecase = node_to_item(node, struct audio_usecase, list);
    725             if (switch_device[usecase->id]) {
    726                 disable_snd_device(adev, usecase->in_snd_device);
    727             }
    728         }
    729 
    730         list_for_each(node, &adev->usecase_list) {
    731             usecase = node_to_item(node, struct audio_usecase, list);
    732             if (switch_device[usecase->id]) {
    733                 enable_snd_device(adev, snd_device);
    734             }
    735         }
    736 
    737         /* Re-route all the usecases on the shared backend other than the
    738            specified usecase to new snd devices */
    739         list_for_each(node, &adev->usecase_list) {
    740             usecase = node_to_item(node, struct audio_usecase, list);
    741             /* Update the in_snd_device only before enabling the audio route */
    742             if (switch_device[usecase->id] ) {
    743                 usecase->in_snd_device = snd_device;
    744                 enable_audio_route(adev, usecase);
    745             }
    746         }
    747     }
    748 }
    749 
    750 /* must be called with hw device mutex locked */
    751 static int read_hdmi_channel_masks(struct stream_out *out)
    752 {
    753     int ret = 0;
    754     int channels = platform_edid_get_max_channels(out->dev->platform);
    755 
    756     switch (channels) {
    757         /*
    758          * Do not handle stereo output in Multi-channel cases
    759          * Stereo case is handled in normal playback path
    760          */
    761     case 6:
    762         ALOGV("%s: HDMI supports 5.1", __func__);
    763         out->supported_channel_masks[0] = AUDIO_CHANNEL_OUT_5POINT1;
    764         break;
    765     case 8:
    766         ALOGV("%s: HDMI supports 5.1 and 7.1 channels", __func__);
    767         out->supported_channel_masks[0] = AUDIO_CHANNEL_OUT_5POINT1;
    768         out->supported_channel_masks[1] = AUDIO_CHANNEL_OUT_7POINT1;
    769         break;
    770     default:
    771         ALOGE("HDMI does not support multi channel playback");
    772         ret = -ENOSYS;
    773         break;
    774     }
    775     return ret;
    776 }
    777 
    778 static audio_usecase_t get_voice_usecase_id_from_list(struct audio_device *adev)
    779 {
    780     struct audio_usecase *usecase;
    781     struct listnode *node;
    782 
    783     list_for_each(node, &adev->usecase_list) {
    784         usecase = node_to_item(node, struct audio_usecase, list);
    785         if (usecase->type == VOICE_CALL) {
    786             ALOGV("%s: usecase id %d", __func__, usecase->id);
    787             return usecase->id;
    788         }
    789     }
    790     return USECASE_INVALID;
    791 }
    792 
    793 struct audio_usecase *get_usecase_from_list(struct audio_device *adev,
    794                                             audio_usecase_t uc_id)
    795 {
    796     struct audio_usecase *usecase;
    797     struct listnode *node;
    798 
    799     list_for_each(node, &adev->usecase_list) {
    800         usecase = node_to_item(node, struct audio_usecase, list);
    801         if (usecase->id == uc_id)
    802             return usecase;
    803     }
    804     return NULL;
    805 }
    806 
    807 int select_devices(struct audio_device *adev,
    808                    audio_usecase_t uc_id)
    809 {
    810     snd_device_t out_snd_device = SND_DEVICE_NONE;
    811     snd_device_t in_snd_device = SND_DEVICE_NONE;
    812     struct audio_usecase *usecase = NULL;
    813     struct audio_usecase *vc_usecase = NULL;
    814     struct audio_usecase *hfp_usecase = NULL;
    815     audio_usecase_t hfp_ucid;
    816     struct listnode *node;
    817     int status = 0;
    818 
    819     usecase = get_usecase_from_list(adev, uc_id);
    820     if (usecase == NULL) {
    821         ALOGE("%s: Could not find the usecase(%d)", __func__, uc_id);
    822         return -EINVAL;
    823     }
    824 
    825     if ((usecase->type == VOICE_CALL) ||
    826         (usecase->type == PCM_HFP_CALL)) {
    827         out_snd_device = platform_get_output_snd_device(adev->platform,
    828                                                         usecase->stream.out->devices);
    829         in_snd_device = platform_get_input_snd_device(adev->platform, usecase->stream.out->devices);
    830         usecase->devices = usecase->stream.out->devices;
    831     } else {
    832         /*
    833          * If the voice call is active, use the sound devices of voice call usecase
    834          * so that it would not result any device switch. All the usecases will
    835          * be switched to new device when select_devices() is called for voice call
    836          * usecase. This is to avoid switching devices for voice call when
    837          * check_and_route_playback_usecases() is called below.
    838          */
    839         if (voice_is_in_call(adev)) {
    840             vc_usecase = get_usecase_from_list(adev,
    841                                                get_voice_usecase_id_from_list(adev));
    842             if ((vc_usecase != NULL) &&
    843                 ((vc_usecase->devices & AUDIO_DEVICE_OUT_ALL_CODEC_BACKEND) ||
    844                 (usecase->devices == AUDIO_DEVICE_IN_VOICE_CALL))) {
    845                 in_snd_device = vc_usecase->in_snd_device;
    846                 out_snd_device = vc_usecase->out_snd_device;
    847             }
    848         } else if (audio_extn_hfp_is_active(adev)) {
    849             hfp_ucid = audio_extn_hfp_get_usecase();
    850             hfp_usecase = get_usecase_from_list(adev, hfp_ucid);
    851             if (hfp_usecase->devices & AUDIO_DEVICE_OUT_ALL_CODEC_BACKEND) {
    852                    in_snd_device = hfp_usecase->in_snd_device;
    853                    out_snd_device = hfp_usecase->out_snd_device;
    854             }
    855         }
    856         if (usecase->type == PCM_PLAYBACK) {
    857             usecase->devices = usecase->stream.out->devices;
    858             in_snd_device = SND_DEVICE_NONE;
    859             if (out_snd_device == SND_DEVICE_NONE) {
    860                 out_snd_device = platform_get_output_snd_device(adev->platform,
    861                                             usecase->stream.out->devices);
    862                 if (usecase->stream.out == adev->primary_output &&
    863                         adev->active_input &&
    864                         (adev->active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION ||
    865                             adev->mode == AUDIO_MODE_IN_COMMUNICATION) &&
    866                         out_snd_device != usecase->out_snd_device) {
    867                     select_devices(adev, adev->active_input->usecase);
    868                 }
    869             }
    870         } else if (usecase->type == PCM_CAPTURE) {
    871             usecase->devices = usecase->stream.in->device;
    872             out_snd_device = SND_DEVICE_NONE;
    873             if (in_snd_device == SND_DEVICE_NONE) {
    874                 audio_devices_t out_device = AUDIO_DEVICE_NONE;
    875                 if (adev->active_input &&
    876                         (adev->active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION ||
    877                             adev->mode == AUDIO_MODE_IN_COMMUNICATION)) {
    878                     platform_set_echo_reference(adev, false, AUDIO_DEVICE_NONE);
    879                     if (usecase->id == USECASE_AUDIO_RECORD_AFE_PROXY) {
    880                         out_device = AUDIO_DEVICE_OUT_TELEPHONY_TX;
    881                     } else if (adev->primary_output) {
    882                         out_device = adev->primary_output->devices;
    883                     }
    884                 }
    885                 in_snd_device = platform_get_input_snd_device(adev->platform, out_device);
    886             }
    887         }
    888     }
    889 
    890     if (out_snd_device == usecase->out_snd_device &&
    891         in_snd_device == usecase->in_snd_device) {
    892         return 0;
    893     }
    894 
    895     if (out_snd_device != SND_DEVICE_NONE &&
    896             out_snd_device != adev->last_logged_snd_device[uc_id][0]) {
    897         ALOGD("%s: changing use case %s output device from(%d: %s, acdb %d) to (%d: %s, acdb %d)",
    898               __func__,
    899               use_case_table[uc_id],
    900               adev->last_logged_snd_device[uc_id][0],
    901               platform_get_snd_device_name(adev->last_logged_snd_device[uc_id][0]),
    902               adev->last_logged_snd_device[uc_id][0] != SND_DEVICE_NONE ?
    903                       platform_get_snd_device_acdb_id(adev->last_logged_snd_device[uc_id][0]) :
    904                       -1,
    905               out_snd_device,
    906               platform_get_snd_device_name(out_snd_device),
    907               platform_get_snd_device_acdb_id(out_snd_device));
    908         adev->last_logged_snd_device[uc_id][0] = out_snd_device;
    909     }
    910     if (in_snd_device != SND_DEVICE_NONE &&
    911             in_snd_device != adev->last_logged_snd_device[uc_id][1]) {
    912         ALOGD("%s: changing use case %s input device from(%d: %s, acdb %d) to (%d: %s, acdb %d)",
    913               __func__,
    914               use_case_table[uc_id],
    915               adev->last_logged_snd_device[uc_id][1],
    916               platform_get_snd_device_name(adev->last_logged_snd_device[uc_id][1]),
    917               adev->last_logged_snd_device[uc_id][1] != SND_DEVICE_NONE ?
    918                       platform_get_snd_device_acdb_id(adev->last_logged_snd_device[uc_id][1]) :
    919                       -1,
    920               in_snd_device,
    921               platform_get_snd_device_name(in_snd_device),
    922               platform_get_snd_device_acdb_id(in_snd_device));
    923         adev->last_logged_snd_device[uc_id][1] = in_snd_device;
    924     }
    925 
    926     /*
    927      * Limitation: While in call, to do a device switch we need to disable
    928      * and enable both RX and TX devices though one of them is same as current
    929      * device.
    930      */
    931     if ((usecase->type == VOICE_CALL) &&
    932         (usecase->in_snd_device != SND_DEVICE_NONE) &&
    933         (usecase->out_snd_device != SND_DEVICE_NONE)) {
    934         status = platform_switch_voice_call_device_pre(adev->platform);
    935         /* Disable sidetone only if voice call already exists */
    936         if (voice_is_call_state_active(adev))
    937             voice_set_sidetone(adev, usecase->out_snd_device, false);
    938     }
    939 
    940     /* Disable current sound devices */
    941     if (usecase->out_snd_device != SND_DEVICE_NONE) {
    942         disable_audio_route(adev, usecase);
    943         disable_snd_device(adev, usecase->out_snd_device);
    944     }
    945 
    946     if (usecase->in_snd_device != SND_DEVICE_NONE) {
    947         disable_audio_route(adev, usecase);
    948         disable_snd_device(adev, usecase->in_snd_device);
    949     }
    950 
    951     /* Applicable only on the targets that has external modem.
    952      * New device information should be sent to modem before enabling
    953      * the devices to reduce in-call device switch time.
    954      */
    955     if ((usecase->type == VOICE_CALL) &&
    956         (usecase->in_snd_device != SND_DEVICE_NONE) &&
    957         (usecase->out_snd_device != SND_DEVICE_NONE)) {
    958         status = platform_switch_voice_call_enable_device_config(adev->platform,
    959                                                                  out_snd_device,
    960                                                                  in_snd_device);
    961     }
    962 
    963     /* Enable new sound devices */
    964     if (out_snd_device != SND_DEVICE_NONE) {
    965         if (usecase->devices & AUDIO_DEVICE_OUT_ALL_CODEC_BACKEND)
    966             check_and_route_playback_usecases(adev, usecase, out_snd_device);
    967         enable_snd_device(adev, out_snd_device);
    968     }
    969 
    970     if (in_snd_device != SND_DEVICE_NONE) {
    971         check_and_route_capture_usecases(adev, usecase, in_snd_device);
    972         enable_snd_device(adev, in_snd_device);
    973     }
    974 
    975     if (usecase->type == VOICE_CALL)
    976         status = platform_switch_voice_call_device_post(adev->platform,
    977                                                         out_snd_device,
    978                                                         in_snd_device);
    979 
    980     usecase->in_snd_device = in_snd_device;
    981     usecase->out_snd_device = out_snd_device;
    982 
    983     enable_audio_route(adev, usecase);
    984 
    985     /* Applicable only on the targets that has external modem.
    986      * Enable device command should be sent to modem only after
    987      * enabling voice call mixer controls
    988      */
    989     if (usecase->type == VOICE_CALL) {
    990         status = platform_switch_voice_call_usecase_route_post(adev->platform,
    991                                                                out_snd_device,
    992                                                                in_snd_device);
    993          /* Enable sidetone only if voice call already exists */
    994         if (voice_is_call_state_active(adev))
    995             voice_set_sidetone(adev, out_snd_device, true);
    996     }
    997 
    998     return status;
    999 }
   1000 
   1001 static int stop_input_stream(struct stream_in *in)
   1002 {
   1003     int i, ret = 0;
   1004     struct audio_usecase *uc_info;
   1005     struct audio_device *adev = in->dev;
   1006 
   1007     adev->active_input = NULL;
   1008 
   1009     ALOGV("%s: enter: usecase(%d: %s)", __func__,
   1010           in->usecase, use_case_table[in->usecase]);
   1011     uc_info = get_usecase_from_list(adev, in->usecase);
   1012     if (uc_info == NULL) {
   1013         ALOGE("%s: Could not find the usecase (%d) in the list",
   1014               __func__, in->usecase);
   1015         return -EINVAL;
   1016     }
   1017 
   1018     /* 1. Disable stream specific mixer controls */
   1019     disable_audio_route(adev, uc_info);
   1020 
   1021     /* 2. Disable the tx device */
   1022     disable_snd_device(adev, uc_info->in_snd_device);
   1023 
   1024     list_remove(&uc_info->list);
   1025     free(uc_info);
   1026 
   1027     ALOGV("%s: exit: status(%d)", __func__, ret);
   1028     return ret;
   1029 }
   1030 
   1031 int start_input_stream(struct stream_in *in)
   1032 {
   1033     /* 1. Enable output device and stream routing controls */
   1034     int ret = 0;
   1035     struct audio_usecase *uc_info;
   1036     struct audio_device *adev = in->dev;
   1037 
   1038     ALOGV("%s: enter: usecase(%d)", __func__, in->usecase);
   1039 
   1040     if (in->card_status == CARD_STATUS_OFFLINE ||
   1041         adev->card_status == CARD_STATUS_OFFLINE) {
   1042         ALOGW("in->card_status or adev->card_status offline, try again");
   1043         ret = -EAGAIN;
   1044         goto error_config;
   1045     }
   1046 
   1047     in->pcm_device_id = platform_get_pcm_device_id(in->usecase, PCM_CAPTURE);
   1048     if (in->pcm_device_id < 0) {
   1049         ALOGE("%s: Could not find PCM device id for the usecase(%d)",
   1050               __func__, in->usecase);
   1051         ret = -EINVAL;
   1052         goto error_config;
   1053     }
   1054 
   1055     adev->active_input = in;
   1056     uc_info = (struct audio_usecase *)calloc(1, sizeof(struct audio_usecase));
   1057     uc_info->id = in->usecase;
   1058     uc_info->type = PCM_CAPTURE;
   1059     uc_info->stream.in = in;
   1060     uc_info->devices = in->device;
   1061     uc_info->in_snd_device = SND_DEVICE_NONE;
   1062     uc_info->out_snd_device = SND_DEVICE_NONE;
   1063 
   1064     list_add_tail(&adev->usecase_list, &uc_info->list);
   1065 
   1066     audio_extn_perf_lock_acquire();
   1067 
   1068     select_devices(adev, in->usecase);
   1069 
   1070     ALOGV("%s: Opening PCM device card_id(%d) device_id(%d), channels %d",
   1071           __func__, adev->snd_card, in->pcm_device_id, in->config.channels);
   1072 
   1073     unsigned int flags = PCM_IN | PCM_MONOTONIC;
   1074     unsigned int pcm_open_retry_count = 0;
   1075 
   1076     if (in->usecase == USECASE_AUDIO_RECORD_AFE_PROXY) {
   1077         flags |= PCM_MMAP | PCM_NOIRQ;
   1078         pcm_open_retry_count = PROXY_OPEN_RETRY_COUNT;
   1079     } else if (in->realtime) {
   1080         flags |= PCM_MMAP | PCM_NOIRQ;
   1081     }
   1082 
   1083     while (1) {
   1084         in->pcm = pcm_open(adev->snd_card, in->pcm_device_id,
   1085                            flags, &in->config);
   1086         if (in->pcm == NULL || !pcm_is_ready(in->pcm)) {
   1087             ALOGE("%s: %s", __func__, pcm_get_error(in->pcm));
   1088             if (in->pcm != NULL) {
   1089                 pcm_close(in->pcm);
   1090                 in->pcm = NULL;
   1091             }
   1092             if (pcm_open_retry_count-- == 0) {
   1093                 ret = -EIO;
   1094                 goto error_open;
   1095             }
   1096             usleep(PROXY_OPEN_WAIT_TIME * 1000);
   1097             continue;
   1098         }
   1099         break;
   1100     }
   1101 
   1102     ALOGV("%s: pcm_prepare", __func__);
   1103     ret = pcm_prepare(in->pcm);
   1104     if (ret < 0) {
   1105         ALOGE("%s: pcm_prepare returned %d", __func__, ret);
   1106         pcm_close(in->pcm);
   1107         in->pcm = NULL;
   1108         goto error_open;
   1109     }
   1110     if (in->realtime) {
   1111         ret = pcm_start(in->pcm);
   1112         if (ret < 0) {
   1113             ALOGE("%s: RT pcm_start failed ret %d", __func__, ret);
   1114             pcm_close(in->pcm);
   1115             in->pcm = NULL;
   1116             goto error_open;
   1117         }
   1118     }
   1119     register_in_stream(in);
   1120     audio_extn_perf_lock_release();
   1121     ALOGV("%s: exit", __func__);
   1122 
   1123     return ret;
   1124 
   1125 error_open:
   1126     stop_input_stream(in);
   1127     audio_extn_perf_lock_release();
   1128 
   1129 error_config:
   1130     adev->active_input = NULL;
   1131     ALOGW("%s: exit: status(%d)", __func__, ret);
   1132 
   1133     return ret;
   1134 }
   1135 
   1136 void lock_input_stream(struct stream_in *in)
   1137 {
   1138     pthread_mutex_lock(&in->pre_lock);
   1139     pthread_mutex_lock(&in->lock);
   1140     pthread_mutex_unlock(&in->pre_lock);
   1141 }
   1142 
   1143 void lock_output_stream(struct stream_out *out)
   1144 {
   1145     pthread_mutex_lock(&out->pre_lock);
   1146     pthread_mutex_lock(&out->lock);
   1147     pthread_mutex_unlock(&out->pre_lock);
   1148 }
   1149 
   1150 /* must be called with out->lock locked */
   1151 static int send_offload_cmd_l(struct stream_out* out, int command)
   1152 {
   1153     struct offload_cmd *cmd = (struct offload_cmd *)calloc(1, sizeof(struct offload_cmd));
   1154 
   1155     ALOGVV("%s %d", __func__, command);
   1156 
   1157     cmd->cmd = command;
   1158     list_add_tail(&out->offload_cmd_list, &cmd->node);
   1159     pthread_cond_signal(&out->offload_cond);
   1160     return 0;
   1161 }
   1162 
   1163 /* must be called iwth out->lock locked */
   1164 static void stop_compressed_output_l(struct stream_out *out)
   1165 {
   1166     out->offload_state = OFFLOAD_STATE_IDLE;
   1167     out->playback_started = 0;
   1168     out->send_new_metadata = 1;
   1169     if (out->compr != NULL) {
   1170         compress_stop(out->compr);
   1171         while (out->offload_thread_blocked) {
   1172             pthread_cond_wait(&out->cond, &out->lock);
   1173         }
   1174     }
   1175 }
   1176 
   1177 static void *offload_thread_loop(void *context)
   1178 {
   1179     struct stream_out *out = (struct stream_out *) context;
   1180     struct listnode *item;
   1181 
   1182     out->offload_state = OFFLOAD_STATE_IDLE;
   1183     out->playback_started = 0;
   1184 
   1185     setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_AUDIO);
   1186     set_sched_policy(0, SP_FOREGROUND);
   1187     prctl(PR_SET_NAME, (unsigned long)"Offload Callback", 0, 0, 0);
   1188 
   1189     ALOGV("%s", __func__);
   1190     lock_output_stream(out);
   1191     for (;;) {
   1192         struct offload_cmd *cmd = NULL;
   1193         stream_callback_event_t event;
   1194         bool send_callback = false;
   1195 
   1196         ALOGVV("%s offload_cmd_list %d out->offload_state %d",
   1197               __func__, list_empty(&out->offload_cmd_list),
   1198               out->offload_state);
   1199         if (list_empty(&out->offload_cmd_list)) {
   1200             ALOGV("%s SLEEPING", __func__);
   1201             pthread_cond_wait(&out->offload_cond, &out->lock);
   1202             ALOGV("%s RUNNING", __func__);
   1203             continue;
   1204         }
   1205 
   1206         item = list_head(&out->offload_cmd_list);
   1207         cmd = node_to_item(item, struct offload_cmd, node);
   1208         list_remove(item);
   1209 
   1210         ALOGVV("%s STATE %d CMD %d out->compr %p",
   1211                __func__, out->offload_state, cmd->cmd, out->compr);
   1212 
   1213         if (cmd->cmd == OFFLOAD_CMD_EXIT) {
   1214             free(cmd);
   1215             break;
   1216         }
   1217 
   1218         if (out->compr == NULL) {
   1219             ALOGE("%s: Compress handle is NULL", __func__);
   1220             free(cmd);
   1221             pthread_cond_signal(&out->cond);
   1222             continue;
   1223         }
   1224         out->offload_thread_blocked = true;
   1225         pthread_mutex_unlock(&out->lock);
   1226         send_callback = false;
   1227         switch(cmd->cmd) {
   1228         case OFFLOAD_CMD_WAIT_FOR_BUFFER:
   1229             compress_wait(out->compr, -1);
   1230             send_callback = true;
   1231             event = STREAM_CBK_EVENT_WRITE_READY;
   1232             break;
   1233         case OFFLOAD_CMD_PARTIAL_DRAIN:
   1234             compress_next_track(out->compr);
   1235             compress_partial_drain(out->compr);
   1236             send_callback = true;
   1237             event = STREAM_CBK_EVENT_DRAIN_READY;
   1238             /* Resend the metadata for next iteration */
   1239             out->send_new_metadata = 1;
   1240             break;
   1241         case OFFLOAD_CMD_DRAIN:
   1242             compress_drain(out->compr);
   1243             send_callback = true;
   1244             event = STREAM_CBK_EVENT_DRAIN_READY;
   1245             break;
   1246         case OFFLOAD_CMD_ERROR:
   1247             send_callback = true;
   1248             event = STREAM_CBK_EVENT_ERROR;
   1249             break;
   1250         default:
   1251             ALOGE("%s unknown command received: %d", __func__, cmd->cmd);
   1252             break;
   1253         }
   1254         lock_output_stream(out);
   1255         out->offload_thread_blocked = false;
   1256         pthread_cond_signal(&out->cond);
   1257         if (send_callback) {
   1258             ALOGVV("%s: sending offload_callback event %d", __func__, event);
   1259             out->offload_callback(event, NULL, out->offload_cookie);
   1260         }
   1261         free(cmd);
   1262     }
   1263 
   1264     pthread_cond_signal(&out->cond);
   1265     while (!list_empty(&out->offload_cmd_list)) {
   1266         item = list_head(&out->offload_cmd_list);
   1267         list_remove(item);
   1268         free(node_to_item(item, struct offload_cmd, node));
   1269     }
   1270     pthread_mutex_unlock(&out->lock);
   1271 
   1272     return NULL;
   1273 }
   1274 
   1275 static int create_offload_callback_thread(struct stream_out *out)
   1276 {
   1277     pthread_cond_init(&out->offload_cond, (const pthread_condattr_t *) NULL);
   1278     list_init(&out->offload_cmd_list);
   1279     pthread_create(&out->offload_thread, (const pthread_attr_t *) NULL,
   1280                     offload_thread_loop, out);
   1281     return 0;
   1282 }
   1283 
   1284 static int destroy_offload_callback_thread(struct stream_out *out)
   1285 {
   1286     lock_output_stream(out);
   1287     stop_compressed_output_l(out);
   1288     send_offload_cmd_l(out, OFFLOAD_CMD_EXIT);
   1289 
   1290     pthread_mutex_unlock(&out->lock);
   1291     pthread_join(out->offload_thread, (void **) NULL);
   1292     pthread_cond_destroy(&out->offload_cond);
   1293 
   1294     return 0;
   1295 }
   1296 
   1297 static bool allow_hdmi_channel_config(struct audio_device *adev)
   1298 {
   1299     struct listnode *node;
   1300     struct audio_usecase *usecase;
   1301     bool ret = true;
   1302 
   1303     list_for_each(node, &adev->usecase_list) {
   1304         usecase = node_to_item(node, struct audio_usecase, list);
   1305         if (usecase->devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
   1306             /*
   1307              * If voice call is already existing, do not proceed further to avoid
   1308              * disabling/enabling both RX and TX devices, CSD calls, etc.
   1309              * Once the voice call done, the HDMI channels can be configured to
   1310              * max channels of remaining use cases.
   1311              */
   1312             if (usecase->id == USECASE_VOICE_CALL) {
   1313                 ALOGV("%s: voice call is active, no change in HDMI channels",
   1314                       __func__);
   1315                 ret = false;
   1316                 break;
   1317             } else if (usecase->id == USECASE_AUDIO_PLAYBACK_MULTI_CH) {
   1318                 ALOGV("%s: multi channel playback is active, "
   1319                       "no change in HDMI channels", __func__);
   1320                 ret = false;
   1321                 break;
   1322             }
   1323         }
   1324     }
   1325     return ret;
   1326 }
   1327 
   1328 static int check_and_set_hdmi_channels(struct audio_device *adev,
   1329                                        unsigned int channels)
   1330 {
   1331     struct listnode *node;
   1332     struct audio_usecase *usecase;
   1333 
   1334     /* Check if change in HDMI channel config is allowed */
   1335     if (!allow_hdmi_channel_config(adev))
   1336         return 0;
   1337 
   1338     if (channels == adev->cur_hdmi_channels) {
   1339         ALOGV("%s: Requested channels are same as current", __func__);
   1340         return 0;
   1341     }
   1342 
   1343     platform_set_hdmi_channels(adev->platform, channels);
   1344     adev->cur_hdmi_channels = channels;
   1345 
   1346     /*
   1347      * Deroute all the playback streams routed to HDMI so that
   1348      * the back end is deactivated. Note that backend will not
   1349      * be deactivated if any one stream is connected to it.
   1350      */
   1351     list_for_each(node, &adev->usecase_list) {
   1352         usecase = node_to_item(node, struct audio_usecase, list);
   1353         if (usecase->type == PCM_PLAYBACK &&
   1354                 usecase->devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
   1355             disable_audio_route(adev, usecase);
   1356         }
   1357     }
   1358 
   1359     /*
   1360      * Enable all the streams disabled above. Now the HDMI backend
   1361      * will be activated with new channel configuration
   1362      */
   1363     list_for_each(node, &adev->usecase_list) {
   1364         usecase = node_to_item(node, struct audio_usecase, list);
   1365         if (usecase->type == PCM_PLAYBACK &&
   1366                 usecase->devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
   1367             enable_audio_route(adev, usecase);
   1368         }
   1369     }
   1370 
   1371     return 0;
   1372 }
   1373 
   1374 static int stop_output_stream(struct stream_out *out)
   1375 {
   1376     int i, ret = 0;
   1377     struct audio_usecase *uc_info;
   1378     struct audio_device *adev = out->dev;
   1379 
   1380     ALOGV("%s: enter: usecase(%d: %s)", __func__,
   1381           out->usecase, use_case_table[out->usecase]);
   1382     uc_info = get_usecase_from_list(adev, out->usecase);
   1383     if (uc_info == NULL) {
   1384         ALOGE("%s: Could not find the usecase (%d) in the list",
   1385               __func__, out->usecase);
   1386         return -EINVAL;
   1387     }
   1388 
   1389     if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
   1390         if (adev->visualizer_stop_output != NULL)
   1391             adev->visualizer_stop_output(out->handle, out->pcm_device_id);
   1392         if (adev->offload_effects_stop_output != NULL)
   1393             adev->offload_effects_stop_output(out->handle, out->pcm_device_id);
   1394     }
   1395 
   1396     /* 1. Get and set stream specific mixer controls */
   1397     disable_audio_route(adev, uc_info);
   1398 
   1399     /* 2. Disable the rx device */
   1400     disable_snd_device(adev, uc_info->out_snd_device);
   1401 
   1402     list_remove(&uc_info->list);
   1403     free(uc_info);
   1404 
   1405     audio_extn_extspk_update(adev->extspk);
   1406 
   1407     /* Must be called after removing the usecase from list */
   1408     if (out->devices & AUDIO_DEVICE_OUT_AUX_DIGITAL)
   1409         check_and_set_hdmi_channels(adev, DEFAULT_HDMI_OUT_CHANNELS);
   1410 
   1411     ALOGV("%s: exit: status(%d)", __func__, ret);
   1412     return ret;
   1413 }
   1414 
   1415 int start_output_stream(struct stream_out *out)
   1416 {
   1417     int ret = 0;
   1418     struct audio_usecase *uc_info;
   1419     struct audio_device *adev = out->dev;
   1420 
   1421     ALOGV("%s: enter: usecase(%d: %s) devices(%#x)",
   1422           __func__, out->usecase, use_case_table[out->usecase], out->devices);
   1423 
   1424     if (out->card_status == CARD_STATUS_OFFLINE ||
   1425         adev->card_status == CARD_STATUS_OFFLINE) {
   1426         ALOGW("out->card_status or adev->card_status offline, try again");
   1427         ret = -EAGAIN;
   1428         goto error_config;
   1429     }
   1430 
   1431     out->pcm_device_id = platform_get_pcm_device_id(out->usecase, PCM_PLAYBACK);
   1432     if (out->pcm_device_id < 0) {
   1433         ALOGE("%s: Invalid PCM device id(%d) for the usecase(%d)",
   1434               __func__, out->pcm_device_id, out->usecase);
   1435         ret = -EINVAL;
   1436         goto error_config;
   1437     }
   1438 
   1439     uc_info = (struct audio_usecase *)calloc(1, sizeof(struct audio_usecase));
   1440     uc_info->id = out->usecase;
   1441     uc_info->type = PCM_PLAYBACK;
   1442     uc_info->stream.out = out;
   1443     uc_info->devices = out->devices;
   1444     uc_info->in_snd_device = SND_DEVICE_NONE;
   1445     uc_info->out_snd_device = SND_DEVICE_NONE;
   1446 
   1447     /* This must be called before adding this usecase to the list */
   1448     if (out->devices & AUDIO_DEVICE_OUT_AUX_DIGITAL)
   1449         check_and_set_hdmi_channels(adev, out->config.channels);
   1450 
   1451     list_add_tail(&adev->usecase_list, &uc_info->list);
   1452 
   1453     audio_extn_perf_lock_acquire();
   1454 
   1455     select_devices(adev, out->usecase);
   1456 
   1457     audio_extn_extspk_update(adev->extspk);
   1458 
   1459     ALOGV("%s: Opening PCM device card_id(%d) device_id(%d) format(%#x)",
   1460           __func__, adev->snd_card, out->pcm_device_id, out->config.format);
   1461     if (out->usecase != USECASE_AUDIO_PLAYBACK_OFFLOAD) {
   1462         unsigned int flags = PCM_OUT;
   1463         unsigned int pcm_open_retry_count = 0;
   1464 
   1465         if (out->usecase == USECASE_AUDIO_PLAYBACK_AFE_PROXY) {
   1466             flags |= PCM_MMAP | PCM_NOIRQ;
   1467             pcm_open_retry_count = PROXY_OPEN_RETRY_COUNT;
   1468         } else if (out->realtime) {
   1469             flags |= PCM_MMAP | PCM_NOIRQ;
   1470         } else
   1471             flags |= PCM_MONOTONIC;
   1472 
   1473         while (1) {
   1474             out->pcm = pcm_open(adev->snd_card, out->pcm_device_id,
   1475                                flags, &out->config);
   1476             if (out->pcm == NULL || !pcm_is_ready(out->pcm)) {
   1477                 ALOGE("%s: %s", __func__, pcm_get_error(out->pcm));
   1478                 if (out->pcm != NULL) {
   1479                     pcm_close(out->pcm);
   1480                     out->pcm = NULL;
   1481                 }
   1482                 if (pcm_open_retry_count-- == 0) {
   1483                     ret = -EIO;
   1484                     goto error_open;
   1485                 }
   1486                 usleep(PROXY_OPEN_WAIT_TIME * 1000);
   1487                 continue;
   1488             }
   1489             break;
   1490         }
   1491         ALOGV("%s: pcm_prepare", __func__);
   1492         if (pcm_is_ready(out->pcm)) {
   1493             ret = pcm_prepare(out->pcm);
   1494             if (ret < 0) {
   1495                 ALOGE("%s: pcm_prepare returned %d", __func__, ret);
   1496                 pcm_close(out->pcm);
   1497                 out->pcm = NULL;
   1498                 goto error_open;
   1499             }
   1500         }
   1501     } else {
   1502         out->pcm = NULL;
   1503         out->compr = compress_open(adev->snd_card, out->pcm_device_id,
   1504                                    COMPRESS_IN, &out->compr_config);
   1505         if (out->compr && !is_compress_ready(out->compr)) {
   1506             ALOGE("%s: %s", __func__, compress_get_error(out->compr));
   1507             compress_close(out->compr);
   1508             out->compr = NULL;
   1509             ret = -EIO;
   1510             goto error_open;
   1511         }
   1512         if (out->offload_callback)
   1513             compress_nonblock(out->compr, out->non_blocking);
   1514 
   1515         if (adev->visualizer_start_output != NULL)
   1516             adev->visualizer_start_output(out->handle, out->pcm_device_id);
   1517         if (adev->offload_effects_start_output != NULL)
   1518             adev->offload_effects_start_output(out->handle, out->pcm_device_id);
   1519     }
   1520     ret = 0;
   1521     if (out->realtime) {
   1522         ret = pcm_start(out->pcm);
   1523         if (ret < 0) {
   1524             ALOGE("%s: RT pcm_start failed ret %d", __func__, ret);
   1525             pcm_close(out->pcm);
   1526             out->pcm = NULL;
   1527             goto error_open;
   1528         }
   1529     }
   1530     register_out_stream(out);
   1531     audio_extn_perf_lock_release();
   1532     ALOGV("%s: exit", __func__);
   1533     return ret;
   1534 error_open:
   1535     audio_extn_perf_lock_release();
   1536     stop_output_stream(out);
   1537 error_config:
   1538     return ret;
   1539 }
   1540 
   1541 static int check_input_parameters(uint32_t sample_rate,
   1542                                   audio_format_t format,
   1543                                   int channel_count)
   1544 {
   1545     if ((format != AUDIO_FORMAT_PCM_16_BIT) && (format != AUDIO_FORMAT_PCM_8_24_BIT)) {
   1546         ALOGE("%s: unsupported AUDIO FORMAT (%d) ", __func__, format);
   1547         return -EINVAL;
   1548     }
   1549 
   1550     if ((channel_count < MIN_CHANNEL_COUNT) || (channel_count > MAX_CHANNEL_COUNT)) {
   1551         ALOGE("%s: unsupported channel count (%d) passed  Min / Max (%d / %d)", __func__,
   1552                channel_count, MIN_CHANNEL_COUNT, MAX_CHANNEL_COUNT);
   1553         return -EINVAL;
   1554     }
   1555 
   1556     switch (sample_rate) {
   1557     case 8000:
   1558     case 11025:
   1559     case 12000:
   1560     case 16000:
   1561     case 22050:
   1562     case 24000:
   1563     case 32000:
   1564     case 44100:
   1565     case 48000:
   1566         break;
   1567     default:
   1568         ALOGE("%s: unsupported (%d) samplerate passed ", __func__, sample_rate);
   1569         return -EINVAL;
   1570     }
   1571 
   1572     return 0;
   1573 }
   1574 
   1575 static size_t get_input_buffer_size(uint32_t sample_rate,
   1576                                     audio_format_t format,
   1577                                     int channel_count,
   1578                                     bool is_low_latency)
   1579 {
   1580     size_t size = 0;
   1581 
   1582     if (check_input_parameters(sample_rate, format, channel_count) != 0)
   1583         return 0;
   1584 
   1585     size = (sample_rate * AUDIO_CAPTURE_PERIOD_DURATION_MSEC) / 1000;
   1586     if (is_low_latency)
   1587         size = configured_low_latency_capture_period_size;
   1588 
   1589     size *= channel_count * audio_bytes_per_sample(format);
   1590 
   1591     /* make sure the size is multiple of 32 bytes
   1592      * At 48 kHz mono 16-bit PCM:
   1593      *  5.000 ms = 240 frames = 15*16*1*2 = 480, a whole multiple of 32 (15)
   1594      *  3.333 ms = 160 frames = 10*16*1*2 = 320, a whole multiple of 32 (10)
   1595      */
   1596     size += 0x1f;
   1597     size &= ~0x1f;
   1598 
   1599     return size;
   1600 }
   1601 
   1602 static uint32_t out_get_sample_rate(const struct audio_stream *stream)
   1603 {
   1604     struct stream_out *out = (struct stream_out *)stream;
   1605 
   1606     return out->sample_rate;
   1607 }
   1608 
   1609 static int out_set_sample_rate(struct audio_stream *stream __unused, uint32_t rate __unused)
   1610 {
   1611     return -ENOSYS;
   1612 }
   1613 
   1614 static size_t out_get_buffer_size(const struct audio_stream *stream)
   1615 {
   1616     struct stream_out *out = (struct stream_out *)stream;
   1617 
   1618     if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
   1619         return out->compr_config.fragment_size;
   1620     }
   1621     return out->config.period_size * out->af_period_multiplier *
   1622                 audio_stream_out_frame_size((const struct audio_stream_out *)stream);
   1623 }
   1624 
   1625 static uint32_t out_get_channels(const struct audio_stream *stream)
   1626 {
   1627     struct stream_out *out = (struct stream_out *)stream;
   1628 
   1629     return out->channel_mask;
   1630 }
   1631 
   1632 static audio_format_t out_get_format(const struct audio_stream *stream)
   1633 {
   1634     struct stream_out *out = (struct stream_out *)stream;
   1635 
   1636     return out->format;
   1637 }
   1638 
   1639 static int out_set_format(struct audio_stream *stream __unused, audio_format_t format __unused)
   1640 {
   1641     return -ENOSYS;
   1642 }
   1643 
   1644 static int out_standby(struct audio_stream *stream)
   1645 {
   1646     struct stream_out *out = (struct stream_out *)stream;
   1647     struct audio_device *adev = out->dev;
   1648 
   1649     ALOGV("%s: enter: usecase(%d: %s)", __func__,
   1650           out->usecase, use_case_table[out->usecase]);
   1651 
   1652     lock_output_stream(out);
   1653     if (!out->standby) {
   1654         if (adev->adm_deregister_stream)
   1655             adev->adm_deregister_stream(adev->adm_data, out->handle);
   1656 
   1657         pthread_mutex_lock(&adev->lock);
   1658         out->standby = true;
   1659         if (out->usecase != USECASE_AUDIO_PLAYBACK_OFFLOAD) {
   1660             if (out->pcm) {
   1661                 pcm_close(out->pcm);
   1662                 out->pcm = NULL;
   1663             }
   1664         } else {
   1665             stop_compressed_output_l(out);
   1666             out->gapless_mdata.encoder_delay = 0;
   1667             out->gapless_mdata.encoder_padding = 0;
   1668             if (out->compr != NULL) {
   1669                 compress_close(out->compr);
   1670                 out->compr = NULL;
   1671             }
   1672         }
   1673         stop_output_stream(out);
   1674         pthread_mutex_unlock(&adev->lock);
   1675     }
   1676     pthread_mutex_unlock(&out->lock);
   1677     ALOGV("%s: exit", __func__);
   1678     return 0;
   1679 }
   1680 
   1681 static int out_on_error(struct audio_stream *stream)
   1682 {
   1683     struct stream_out *out = (struct stream_out *)stream;
   1684     struct audio_device *adev = out->dev;
   1685     bool do_standby = false;
   1686 
   1687     lock_output_stream(out);
   1688     if (!out->standby) {
   1689         if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
   1690             stop_compressed_output_l(out);
   1691             send_offload_cmd_l(out, OFFLOAD_CMD_ERROR);
   1692         } else
   1693             do_standby = true;
   1694     }
   1695     pthread_mutex_unlock(&out->lock);
   1696 
   1697     if (do_standby)
   1698         return out_standby(&out->stream.common);
   1699 
   1700     return 0;
   1701 }
   1702 
   1703 static int out_dump(const struct audio_stream *stream __unused, int fd __unused)
   1704 {
   1705     return 0;
   1706 }
   1707 
   1708 static int parse_compress_metadata(struct stream_out *out, struct str_parms *parms)
   1709 {
   1710     int ret = 0;
   1711     char value[32];
   1712     struct compr_gapless_mdata tmp_mdata;
   1713 
   1714     if (!out || !parms) {
   1715         return -EINVAL;
   1716     }
   1717 
   1718     ret = str_parms_get_str(parms, AUDIO_OFFLOAD_CODEC_DELAY_SAMPLES, value, sizeof(value));
   1719     if (ret >= 0) {
   1720         tmp_mdata.encoder_delay = atoi(value); //whats a good limit check?
   1721     } else {
   1722         return -EINVAL;
   1723     }
   1724 
   1725     ret = str_parms_get_str(parms, AUDIO_OFFLOAD_CODEC_PADDING_SAMPLES, value, sizeof(value));
   1726     if (ret >= 0) {
   1727         tmp_mdata.encoder_padding = atoi(value);
   1728     } else {
   1729         return -EINVAL;
   1730     }
   1731 
   1732     out->gapless_mdata = tmp_mdata;
   1733     out->send_new_metadata = 1;
   1734     ALOGV("%s new encoder delay %u and padding %u", __func__,
   1735           out->gapless_mdata.encoder_delay, out->gapless_mdata.encoder_padding);
   1736 
   1737     return 0;
   1738 }
   1739 
   1740 static bool output_drives_call(struct audio_device *adev, struct stream_out *out)
   1741 {
   1742     return out == adev->primary_output || out == adev->voice_tx_output;
   1743 }
   1744 
   1745 static int out_set_parameters(struct audio_stream *stream, const char *kvpairs)
   1746 {
   1747     struct stream_out *out = (struct stream_out *)stream;
   1748     struct audio_device *adev = out->dev;
   1749     struct audio_usecase *usecase;
   1750     struct listnode *node;
   1751     struct str_parms *parms;
   1752     char value[32];
   1753     int ret, val = 0;
   1754     bool select_new_device = false;
   1755     int status = 0;
   1756 
   1757     ALOGD("%s: enter: usecase(%d: %s) kvpairs: %s",
   1758           __func__, out->usecase, use_case_table[out->usecase], kvpairs);
   1759     parms = str_parms_create_str(kvpairs);
   1760     ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_ROUTING, value, sizeof(value));
   1761     if (ret >= 0) {
   1762         val = atoi(value);
   1763         lock_output_stream(out);
   1764         pthread_mutex_lock(&adev->lock);
   1765 
   1766         /*
   1767          * When HDMI cable is unplugged the music playback is paused and
   1768          * the policy manager sends routing=0. But the audioflinger
   1769          * continues to write data until standby time (3sec).
   1770          * As the HDMI core is turned off, the write gets blocked.
   1771          * Avoid this by routing audio to speaker until standby.
   1772          */
   1773         if (out->devices == AUDIO_DEVICE_OUT_AUX_DIGITAL &&
   1774                 val == AUDIO_DEVICE_NONE) {
   1775             val = AUDIO_DEVICE_OUT_SPEAKER;
   1776         }
   1777 
   1778         /*
   1779          * select_devices() call below switches all the usecases on the same
   1780          * backend to the new device. Refer to check_and_route_playback_usecases() in
   1781          * the select_devices(). But how do we undo this?
   1782          *
   1783          * For example, music playback is active on headset (deep-buffer usecase)
   1784          * and if we go to ringtones and select a ringtone, low-latency usecase
   1785          * will be started on headset+speaker. As we can't enable headset+speaker
   1786          * and headset devices at the same time, select_devices() switches the music
   1787          * playback to headset+speaker while starting low-lateny usecase for ringtone.
   1788          * So when the ringtone playback is completed, how do we undo the same?
   1789          *
   1790          * We are relying on the out_set_parameters() call on deep-buffer output,
   1791          * once the ringtone playback is ended.
   1792          * NOTE: We should not check if the current devices are same as new devices.
   1793          *       Because select_devices() must be called to switch back the music
   1794          *       playback to headset.
   1795          */
   1796         audio_devices_t new_dev = val;
   1797         if (new_dev != AUDIO_DEVICE_NONE) {
   1798             bool same_dev = out->devices == new_dev;
   1799             out->devices = new_dev;
   1800 
   1801             if (output_drives_call(adev, out)) {
   1802                 if (!voice_is_in_call(adev)) {
   1803                     if (adev->mode == AUDIO_MODE_IN_CALL) {
   1804                         adev->current_call_output = out;
   1805                         ret = voice_start_call(adev);
   1806                     }
   1807                 } else {
   1808                     adev->current_call_output = out;
   1809                     voice_update_devices_for_all_voice_usecases(adev);
   1810                 }
   1811             }
   1812 
   1813             if (!out->standby) {
   1814                 if (!same_dev) {
   1815                     ALOGV("update routing change");
   1816                     out->routing_change = true;
   1817                 }
   1818                 select_devices(adev, out->usecase);
   1819             }
   1820 
   1821         }
   1822 
   1823         pthread_mutex_unlock(&adev->lock);
   1824         pthread_mutex_unlock(&out->lock);
   1825 
   1826         /*handles device and call state changes*/
   1827         audio_extn_extspk_update(adev->extspk);
   1828     }
   1829 
   1830     if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
   1831         parse_compress_metadata(out, parms);
   1832     }
   1833 
   1834     str_parms_destroy(parms);
   1835     ALOGV("%s: exit: code(%d)", __func__, status);
   1836     return status;
   1837 }
   1838 
   1839 static char* out_get_parameters(const struct audio_stream *stream, const char *keys)
   1840 {
   1841     struct stream_out *out = (struct stream_out *)stream;
   1842     struct str_parms *query = str_parms_create_str(keys);
   1843     char *str;
   1844     char value[256];
   1845     struct str_parms *reply = str_parms_create();
   1846     size_t i, j;
   1847     int ret;
   1848     bool first = true;
   1849     ALOGV("%s: enter: keys - %s", __func__, keys);
   1850     ret = str_parms_get_str(query, AUDIO_PARAMETER_STREAM_SUP_CHANNELS, value, sizeof(value));
   1851     if (ret >= 0) {
   1852         value[0] = '\0';
   1853         i = 0;
   1854         while (out->supported_channel_masks[i] != 0) {
   1855             for (j = 0; j < ARRAY_SIZE(out_channels_name_to_enum_table); j++) {
   1856                 if (out_channels_name_to_enum_table[j].value == out->supported_channel_masks[i]) {
   1857                     if (!first) {
   1858                         strcat(value, "|");
   1859                     }
   1860                     strcat(value, out_channels_name_to_enum_table[j].name);
   1861                     first = false;
   1862                     break;
   1863                 }
   1864             }
   1865             i++;
   1866         }
   1867         str_parms_add_str(reply, AUDIO_PARAMETER_STREAM_SUP_CHANNELS, value);
   1868         str = str_parms_to_str(reply);
   1869     } else {
   1870         str = strdup(keys);
   1871     }
   1872     str_parms_destroy(query);
   1873     str_parms_destroy(reply);
   1874     ALOGV("%s: exit: returns - %s", __func__, str);
   1875     return str;
   1876 }
   1877 
   1878 static uint32_t out_get_latency(const struct audio_stream_out *stream)
   1879 {
   1880     uint32_t hw_delay, period_ms;
   1881     struct stream_out *out = (struct stream_out *)stream;
   1882 
   1883     if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD)
   1884         return COMPRESS_OFFLOAD_PLAYBACK_LATENCY;
   1885     else if (out->realtime) {
   1886         // since the buffer won't be filled up faster than realtime,
   1887         // return a smaller number
   1888         period_ms = (out->af_period_multiplier * out->config.period_size *
   1889                      1000) / (out->config.rate);
   1890         hw_delay = platform_render_latency(out->usecase)/1000;
   1891         return period_ms + hw_delay;
   1892     }
   1893 
   1894     return (out->config.period_count * out->config.period_size * 1000) /
   1895            (out->config.rate);
   1896 }
   1897 
   1898 static int out_set_volume(struct audio_stream_out *stream, float left,
   1899                           float right)
   1900 {
   1901     struct stream_out *out = (struct stream_out *)stream;
   1902     int volume[2];
   1903 
   1904     if (out->usecase == USECASE_AUDIO_PLAYBACK_MULTI_CH) {
   1905         /* only take left channel into account: the API is for stereo anyway */
   1906         out->muted = (left == 0.0f);
   1907         return 0;
   1908     } else if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
   1909         const char *mixer_ctl_name = "Compress Playback Volume";
   1910         struct audio_device *adev = out->dev;
   1911         struct mixer_ctl *ctl;
   1912         ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
   1913         if (!ctl) {
   1914             /* try with the control based on device id */
   1915             int pcm_device_id = platform_get_pcm_device_id(out->usecase,
   1916                                                        PCM_PLAYBACK);
   1917             char ctl_name[128] = {0};
   1918             snprintf(ctl_name, sizeof(ctl_name),
   1919                      "Compress Playback %d Volume", pcm_device_id);
   1920             ctl = mixer_get_ctl_by_name(adev->mixer, ctl_name);
   1921             if (!ctl) {
   1922                 ALOGE("%s: Could not get volume ctl mixer cmd", __func__);
   1923                 return -EINVAL;
   1924             }
   1925         }
   1926         volume[0] = (int)(left * COMPRESS_PLAYBACK_VOLUME_MAX);
   1927         volume[1] = (int)(right * COMPRESS_PLAYBACK_VOLUME_MAX);
   1928         mixer_ctl_set_array(ctl, volume, sizeof(volume)/sizeof(volume[0]));
   1929         return 0;
   1930     }
   1931 
   1932     return -ENOSYS;
   1933 }
   1934 
   1935 // note: this call is safe only if the stream_cb is
   1936 // removed first in close_output_stream (as is done now).
   1937 static void out_snd_mon_cb(void * stream, struct str_parms * parms)
   1938 {
   1939     if (!stream || !parms)
   1940         return;
   1941 
   1942     struct stream_out *out = (struct stream_out *)stream;
   1943     struct audio_device *adev = out->dev;
   1944 
   1945     card_status_t status;
   1946     int card;
   1947     if (parse_snd_card_status(parms, &card, &status) < 0)
   1948         return;
   1949 
   1950     pthread_mutex_lock(&adev->lock);
   1951     bool valid_cb = (card == adev->snd_card);
   1952     pthread_mutex_unlock(&adev->lock);
   1953 
   1954     if (!valid_cb)
   1955         return;
   1956 
   1957     lock_output_stream(out);
   1958     if (out->card_status != status)
   1959         out->card_status = status;
   1960     pthread_mutex_unlock(&out->lock);
   1961 
   1962     ALOGW("out_snd_mon_cb for card %d usecase %s, status %s", card,
   1963           use_case_table[out->usecase],
   1964           status == CARD_STATUS_OFFLINE ? "offline" : "online");
   1965 
   1966     if (status == CARD_STATUS_OFFLINE)
   1967         out_on_error(stream);
   1968 
   1969     return;
   1970 }
   1971 
   1972 #ifdef NO_AUDIO_OUT
   1973 static ssize_t out_write_for_no_output(struct audio_stream_out *stream,
   1974                                        const void *buffer, size_t bytes)
   1975 {
   1976     struct stream_out *out = (struct stream_out *)stream;
   1977 
   1978     /* No Output device supported other than BT for playback.
   1979      * Sleep for the amount of buffer duration
   1980      */
   1981     lock_output_stream(out);
   1982     usleep(bytes * 1000000 / audio_stream_out_frame_size(&out->stream.common) /
   1983             out_get_sample_rate(&out->stream.common));
   1984     pthread_mutex_unlock(&out->lock);
   1985     return bytes;
   1986 }
   1987 #endif
   1988 
   1989 static ssize_t out_write(struct audio_stream_out *stream, const void *buffer,
   1990                          size_t bytes)
   1991 {
   1992     struct stream_out *out = (struct stream_out *)stream;
   1993     struct audio_device *adev = out->dev;
   1994     ssize_t ret = 0;
   1995 
   1996     lock_output_stream(out);
   1997     if (out->standby) {
   1998         out->standby = false;
   1999         pthread_mutex_lock(&adev->lock);
   2000         ret = start_output_stream(out);
   2001         pthread_mutex_unlock(&adev->lock);
   2002         /* ToDo: If use case is compress offload should return 0 */
   2003         if (ret != 0) {
   2004             out->standby = true;
   2005             goto exit;
   2006         }
   2007 
   2008         if (last_known_cal_step != -1) {
   2009             ALOGD("%s: retry previous failed cal level set", __func__);
   2010             audio_hw_send_gain_dep_calibration(last_known_cal_step);
   2011         }
   2012     }
   2013 
   2014     if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
   2015         ALOGVV("%s: writing buffer (%d bytes) to compress device", __func__, bytes);
   2016         if (out->send_new_metadata) {
   2017             ALOGVV("send new gapless metadata");
   2018             compress_set_gapless_metadata(out->compr, &out->gapless_mdata);
   2019             out->send_new_metadata = 0;
   2020         }
   2021         unsigned int avail;
   2022         struct timespec tstamp;
   2023         ret = compress_get_hpointer(out->compr, &avail, &tstamp);
   2024         /* Do not limit write size if the available frames count is unknown */
   2025         if (ret != 0) {
   2026             avail = bytes;
   2027         }
   2028         if (avail == 0) {
   2029             ret = 0;
   2030         } else {
   2031             if (avail > bytes) {
   2032                 avail = bytes;
   2033             }
   2034             ret = compress_write(out->compr, buffer, avail);
   2035             ALOGVV("%s: writing buffer (%d bytes) to compress device returned %zd",
   2036                    __func__, avail, ret);
   2037         }
   2038 
   2039         if (ret >= 0 && ret < (ssize_t)bytes) {
   2040             send_offload_cmd_l(out, OFFLOAD_CMD_WAIT_FOR_BUFFER);
   2041         }
   2042         if (ret > 0 && !out->playback_started) {
   2043             compress_start(out->compr);
   2044             out->playback_started = 1;
   2045             out->offload_state = OFFLOAD_STATE_PLAYING;
   2046         }
   2047         pthread_mutex_unlock(&out->lock);
   2048         return ret;
   2049     } else {
   2050         if (out->pcm) {
   2051             if (out->muted)
   2052                 memset((void *)buffer, 0, bytes);
   2053 
   2054             ALOGVV("%s: writing buffer (%d bytes) to pcm device", __func__, bytes);
   2055 
   2056             long ns = pcm_bytes_to_frames(out->pcm, bytes)*1000000000LL/
   2057                                                 out->config.rate;
   2058             request_out_focus(out, ns);
   2059 
   2060             bool use_mmap = is_mmap_usecase(out->usecase) || out->realtime;
   2061             if (use_mmap)
   2062                 ret = pcm_mmap_write(out->pcm, (void *)buffer, bytes);
   2063             else
   2064                 ret = pcm_write(out->pcm, (void *)buffer, bytes);
   2065 
   2066             if (ret == 0)
   2067                 out->written += bytes / (out->config.channels * sizeof(short));
   2068 
   2069             release_out_focus(out, ns);
   2070         }
   2071     }
   2072 
   2073 exit:
   2074     pthread_mutex_unlock(&out->lock);
   2075 
   2076     if (ret != 0) {
   2077         out_on_error(&out->stream.common);
   2078         if (out->pcm)
   2079             ALOGE("%s: error %zu - %s", __func__, ret, pcm_get_error(out->pcm));
   2080         if (out->usecase != USECASE_AUDIO_PLAYBACK_OFFLOAD)
   2081             usleep(bytes * 1000000 / audio_stream_out_frame_size(stream) /
   2082                    out_get_sample_rate(&out->stream.common));
   2083     }
   2084     return bytes;
   2085 }
   2086 
   2087 static int out_get_render_position(const struct audio_stream_out *stream,
   2088                                    uint32_t *dsp_frames)
   2089 {
   2090     struct stream_out *out = (struct stream_out *)stream;
   2091     *dsp_frames = 0;
   2092     if ((out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) && (dsp_frames != NULL)) {
   2093         lock_output_stream(out);
   2094         if (out->compr != NULL) {
   2095             unsigned long frames = 0;
   2096             // TODO: check return value
   2097             compress_get_tstamp(out->compr, &frames, &out->sample_rate);
   2098             *dsp_frames = (uint32_t)frames;
   2099             ALOGVV("%s rendered frames %d sample_rate %d",
   2100                    __func__, *dsp_frames, out->sample_rate);
   2101         }
   2102         pthread_mutex_unlock(&out->lock);
   2103         return 0;
   2104     } else
   2105         return -EINVAL;
   2106 }
   2107 
   2108 static int out_add_audio_effect(const struct audio_stream *stream __unused,
   2109                                 effect_handle_t effect __unused)
   2110 {
   2111     return 0;
   2112 }
   2113 
   2114 static int out_remove_audio_effect(const struct audio_stream *stream __unused,
   2115                                    effect_handle_t effect __unused)
   2116 {
   2117     return 0;
   2118 }
   2119 
   2120 static int out_get_next_write_timestamp(const struct audio_stream_out *stream __unused,
   2121                                         int64_t *timestamp __unused)
   2122 {
   2123     return -EINVAL;
   2124 }
   2125 
   2126 static int out_get_presentation_position(const struct audio_stream_out *stream,
   2127                                    uint64_t *frames, struct timespec *timestamp)
   2128 {
   2129     struct stream_out *out = (struct stream_out *)stream;
   2130     int ret = -EINVAL;
   2131     unsigned long dsp_frames;
   2132 
   2133     lock_output_stream(out);
   2134 
   2135     if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
   2136         if (out->compr != NULL) {
   2137             // TODO: check return value
   2138             compress_get_tstamp(out->compr, &dsp_frames,
   2139                     &out->sample_rate);
   2140             ALOGVV("%s rendered frames %ld sample_rate %d",
   2141                    __func__, dsp_frames, out->sample_rate);
   2142             *frames = dsp_frames;
   2143             ret = 0;
   2144             /* this is the best we can do */
   2145             clock_gettime(CLOCK_MONOTONIC, timestamp);
   2146         }
   2147     } else {
   2148         if (out->pcm) {
   2149             unsigned int avail;
   2150             if (pcm_get_htimestamp(out->pcm, &avail, timestamp) == 0) {
   2151                 size_t kernel_buffer_size = out->config.period_size * out->config.period_count;
   2152                 int64_t signed_frames = out->written - kernel_buffer_size + avail;
   2153                 // This adjustment accounts for buffering after app processor.
   2154                 // It is based on estimated DSP latency per use case, rather than exact.
   2155                 signed_frames -=
   2156                     (platform_render_latency(out->usecase) * out->sample_rate / 1000000LL);
   2157 
   2158                 // It would be unusual for this value to be negative, but check just in case ...
   2159                 if (signed_frames >= 0) {
   2160                     *frames = signed_frames;
   2161                     ret = 0;
   2162                 }
   2163             }
   2164         }
   2165     }
   2166 
   2167     pthread_mutex_unlock(&out->lock);
   2168 
   2169     return ret;
   2170 }
   2171 
   2172 static int out_set_callback(struct audio_stream_out *stream,
   2173             stream_callback_t callback, void *cookie)
   2174 {
   2175     struct stream_out *out = (struct stream_out *)stream;
   2176 
   2177     ALOGV("%s", __func__);
   2178     lock_output_stream(out);
   2179     out->offload_callback = callback;
   2180     out->offload_cookie = cookie;
   2181     pthread_mutex_unlock(&out->lock);
   2182     return 0;
   2183 }
   2184 
   2185 static int out_pause(struct audio_stream_out* stream)
   2186 {
   2187     struct stream_out *out = (struct stream_out *)stream;
   2188     int status = -ENOSYS;
   2189     ALOGV("%s", __func__);
   2190     if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
   2191         lock_output_stream(out);
   2192         if (out->compr != NULL && out->offload_state == OFFLOAD_STATE_PLAYING) {
   2193             status = compress_pause(out->compr);
   2194             out->offload_state = OFFLOAD_STATE_PAUSED;
   2195         }
   2196         pthread_mutex_unlock(&out->lock);
   2197     }
   2198     return status;
   2199 }
   2200 
   2201 static int out_resume(struct audio_stream_out* stream)
   2202 {
   2203     struct stream_out *out = (struct stream_out *)stream;
   2204     int status = -ENOSYS;
   2205     ALOGV("%s", __func__);
   2206     if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
   2207         status = 0;
   2208         lock_output_stream(out);
   2209         if (out->compr != NULL && out->offload_state == OFFLOAD_STATE_PAUSED) {
   2210             status = compress_resume(out->compr);
   2211             out->offload_state = OFFLOAD_STATE_PLAYING;
   2212         }
   2213         pthread_mutex_unlock(&out->lock);
   2214     }
   2215     return status;
   2216 }
   2217 
   2218 static int out_drain(struct audio_stream_out* stream, audio_drain_type_t type )
   2219 {
   2220     struct stream_out *out = (struct stream_out *)stream;
   2221     int status = -ENOSYS;
   2222     ALOGV("%s", __func__);
   2223     if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
   2224         lock_output_stream(out);
   2225         if (type == AUDIO_DRAIN_EARLY_NOTIFY)
   2226             status = send_offload_cmd_l(out, OFFLOAD_CMD_PARTIAL_DRAIN);
   2227         else
   2228             status = send_offload_cmd_l(out, OFFLOAD_CMD_DRAIN);
   2229         pthread_mutex_unlock(&out->lock);
   2230     }
   2231     return status;
   2232 }
   2233 
   2234 static int out_flush(struct audio_stream_out* stream)
   2235 {
   2236     struct stream_out *out = (struct stream_out *)stream;
   2237     ALOGV("%s", __func__);
   2238     if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
   2239         lock_output_stream(out);
   2240         stop_compressed_output_l(out);
   2241         pthread_mutex_unlock(&out->lock);
   2242         return 0;
   2243     }
   2244     return -ENOSYS;
   2245 }
   2246 
   2247 /** audio_stream_in implementation **/
   2248 static uint32_t in_get_sample_rate(const struct audio_stream *stream)
   2249 {
   2250     struct stream_in *in = (struct stream_in *)stream;
   2251 
   2252     return in->config.rate;
   2253 }
   2254 
   2255 static int in_set_sample_rate(struct audio_stream *stream __unused, uint32_t rate __unused)
   2256 {
   2257     return -ENOSYS;
   2258 }
   2259 
   2260 static size_t in_get_buffer_size(const struct audio_stream *stream)
   2261 {
   2262     struct stream_in *in = (struct stream_in *)stream;
   2263 
   2264     return in->config.period_size * in->af_period_multiplier *
   2265         audio_stream_in_frame_size((const struct audio_stream_in *)stream);
   2266 }
   2267 
   2268 static uint32_t in_get_channels(const struct audio_stream *stream)
   2269 {
   2270     struct stream_in *in = (struct stream_in *)stream;
   2271 
   2272     return in->channel_mask;
   2273 }
   2274 
   2275 static audio_format_t in_get_format(const struct audio_stream *stream)
   2276 {
   2277     struct stream_in *in = (struct stream_in *)stream;
   2278     return in->format;
   2279 }
   2280 
   2281 static int in_set_format(struct audio_stream *stream __unused, audio_format_t format __unused)
   2282 {
   2283     return -ENOSYS;
   2284 }
   2285 
   2286 static int in_standby(struct audio_stream *stream)
   2287 {
   2288     struct stream_in *in = (struct stream_in *)stream;
   2289     struct audio_device *adev = in->dev;
   2290     int status = 0;
   2291     ALOGV("%s: enter", __func__);
   2292 
   2293     lock_input_stream(in);
   2294 
   2295     if (!in->standby && in->is_st_session) {
   2296         ALOGV("%s: sound trigger pcm stop lab", __func__);
   2297         audio_extn_sound_trigger_stop_lab(in);
   2298         in->standby = true;
   2299     }
   2300 
   2301     if (!in->standby) {
   2302         if (adev->adm_deregister_stream)
   2303             adev->adm_deregister_stream(adev->adm_data, in->capture_handle);
   2304 
   2305         pthread_mutex_lock(&adev->lock);
   2306         in->standby = true;
   2307         if (in->pcm) {
   2308             pcm_close(in->pcm);
   2309             in->pcm = NULL;
   2310         }
   2311         adev->enable_voicerx = false;
   2312         platform_set_echo_reference(adev, false, AUDIO_DEVICE_NONE );
   2313         status = stop_input_stream(in);
   2314         pthread_mutex_unlock(&adev->lock);
   2315     }
   2316     pthread_mutex_unlock(&in->lock);
   2317     ALOGV("%s: exit:  status(%d)", __func__, status);
   2318     return status;
   2319 }
   2320 
   2321 static int in_dump(const struct audio_stream *stream __unused, int fd __unused)
   2322 {
   2323     return 0;
   2324 }
   2325 
   2326 static int in_set_parameters(struct audio_stream *stream, const char *kvpairs)
   2327 {
   2328     struct stream_in *in = (struct stream_in *)stream;
   2329     struct audio_device *adev = in->dev;
   2330     struct str_parms *parms;
   2331     char *str;
   2332     char value[32];
   2333     int ret, val = 0;
   2334     int status = 0;
   2335 
   2336     ALOGV("%s: enter: kvpairs=%s", __func__, kvpairs);
   2337     parms = str_parms_create_str(kvpairs);
   2338 
   2339     ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_INPUT_SOURCE, value, sizeof(value));
   2340 
   2341     lock_input_stream(in);
   2342 
   2343     pthread_mutex_lock(&adev->lock);
   2344     if (ret >= 0) {
   2345         val = atoi(value);
   2346         /* no audio source uses val == 0 */
   2347         if ((in->source != val) && (val != 0)) {
   2348             in->source = val;
   2349         }
   2350     }
   2351 
   2352     ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_ROUTING, value, sizeof(value));
   2353 
   2354     if (ret >= 0) {
   2355         val = atoi(value);
   2356         if (((int)in->device != val) && (val != 0)) {
   2357             in->device = val;
   2358             /* If recording is in progress, change the tx device to new device */
   2359             if (!in->standby) {
   2360                 ALOGV("update input routing change");
   2361                 in->routing_change = true;
   2362                 select_devices(adev, in->usecase);
   2363             }
   2364         }
   2365     }
   2366 
   2367     pthread_mutex_unlock(&adev->lock);
   2368     pthread_mutex_unlock(&in->lock);
   2369 
   2370     str_parms_destroy(parms);
   2371     ALOGV("%s: exit: status(%d)", __func__, status);
   2372     return status;
   2373 }
   2374 
   2375 static char* in_get_parameters(const struct audio_stream *stream __unused,
   2376                                const char *keys __unused)
   2377 {
   2378     return strdup("");
   2379 }
   2380 
   2381 static int in_set_gain(struct audio_stream_in *stream __unused, float gain __unused)
   2382 {
   2383     return 0;
   2384 }
   2385 
   2386 static void in_snd_mon_cb(void * stream, struct str_parms * parms)
   2387 {
   2388     if (!stream || !parms)
   2389         return;
   2390 
   2391     struct stream_in *in = (struct stream_in *)stream;
   2392     struct audio_device *adev = in->dev;
   2393 
   2394     card_status_t status;
   2395     int card;
   2396     if (parse_snd_card_status(parms, &card, &status) < 0)
   2397         return;
   2398 
   2399     pthread_mutex_lock(&adev->lock);
   2400     bool valid_cb = (card == adev->snd_card);
   2401     pthread_mutex_unlock(&adev->lock);
   2402 
   2403     if (!valid_cb)
   2404         return;
   2405 
   2406     lock_input_stream(in);
   2407     if (in->card_status != status)
   2408         in->card_status = status;
   2409     pthread_mutex_unlock(&in->lock);
   2410 
   2411     ALOGW("in_snd_mon_cb for card %d usecase %s, status %s", card,
   2412           use_case_table[in->usecase],
   2413           status == CARD_STATUS_OFFLINE ? "offline" : "online");
   2414 
   2415     // a better solution would be to report error back to AF and let
   2416     // it put the stream to standby
   2417     if (status == CARD_STATUS_OFFLINE)
   2418         in_standby(&in->stream.common);
   2419 
   2420     return;
   2421 }
   2422 
   2423 static ssize_t in_read(struct audio_stream_in *stream, void *buffer,
   2424                        size_t bytes)
   2425 {
   2426     struct stream_in *in = (struct stream_in *)stream;
   2427     struct audio_device *adev = in->dev;
   2428     int i, ret = -1;
   2429     int *int_buf_stream = NULL;
   2430 
   2431     lock_input_stream(in);
   2432 
   2433     if (in->is_st_session) {
   2434         ALOGVV(" %s: reading on st session bytes=%d", __func__, bytes);
   2435         /* Read from sound trigger HAL */
   2436         audio_extn_sound_trigger_read(in, buffer, bytes);
   2437         pthread_mutex_unlock(&in->lock);
   2438         return bytes;
   2439     }
   2440 
   2441     if (in->standby) {
   2442         pthread_mutex_lock(&adev->lock);
   2443         ret = start_input_stream(in);
   2444         pthread_mutex_unlock(&adev->lock);
   2445         if (ret != 0) {
   2446             goto exit;
   2447         }
   2448         in->standby = 0;
   2449     }
   2450 
   2451     //what's the duration requested by the client?
   2452     long ns = pcm_bytes_to_frames(in->pcm, bytes)*1000000000LL/
   2453                                                 in->config.rate;
   2454     request_in_focus(in, ns);
   2455 
   2456     bool use_mmap = is_mmap_usecase(in->usecase) || in->realtime;
   2457     if (in->pcm) {
   2458         if (use_mmap) {
   2459             ret = pcm_mmap_read(in->pcm, buffer, bytes);
   2460         } else {
   2461             ret = pcm_read(in->pcm, buffer, bytes);
   2462         }
   2463         if (ret < 0) {
   2464             ALOGE("Failed to read w/err %s", strerror(errno));
   2465             ret = -errno;
   2466         }
   2467         if (!ret && bytes > 0 && (in->format == AUDIO_FORMAT_PCM_8_24_BIT)) {
   2468             if (bytes % 4 == 0) {
   2469                 /* data from DSP comes in 24_8 format, convert it to 8_24 */
   2470                 int_buf_stream = buffer;
   2471                 for (size_t itt=0; itt < bytes/4 ; itt++) {
   2472                     int_buf_stream[itt] >>= 8;
   2473                 }
   2474             } else {
   2475                 ALOGE("%s: !!! something wrong !!! ... data not 32 bit aligned ", __func__);
   2476                 ret = -EINVAL;
   2477                 goto exit;
   2478             }
   2479         }
   2480     }
   2481 
   2482     release_in_focus(in, ns);
   2483 
   2484     /*
   2485      * Instead of writing zeroes here, we could trust the hardware
   2486      * to always provide zeroes when muted.
   2487      * No need to acquire adev->lock to read mic_muted here as we don't change its state.
   2488      */
   2489     if (ret == 0 && adev->mic_muted && in->usecase != USECASE_AUDIO_RECORD_AFE_PROXY)
   2490         memset(buffer, 0, bytes);
   2491 
   2492 exit:
   2493     pthread_mutex_unlock(&in->lock);
   2494 
   2495     if (ret != 0) {
   2496         in_standby(&in->stream.common);
   2497         ALOGV("%s: read failed - sleeping for buffer duration", __func__);
   2498         usleep(bytes * 1000000 / audio_stream_in_frame_size(stream) /
   2499                in_get_sample_rate(&in->stream.common));
   2500         memset(buffer, 0, bytes); // clear return data
   2501     }
   2502     if (bytes > 0) {
   2503         in->frames_read += bytes / audio_stream_in_frame_size(stream);
   2504     }
   2505     return bytes;
   2506 }
   2507 
   2508 static uint32_t in_get_input_frames_lost(struct audio_stream_in *stream __unused)
   2509 {
   2510     return 0;
   2511 }
   2512 
   2513 static int in_get_capture_position(const struct audio_stream_in *stream,
   2514                                    int64_t *frames, int64_t *time)
   2515 {
   2516     if (stream == NULL || frames == NULL || time == NULL) {
   2517         return -EINVAL;
   2518     }
   2519     struct stream_in *in = (struct stream_in *)stream;
   2520     int ret = -ENOSYS;
   2521 
   2522     lock_input_stream(in);
   2523     if (in->pcm) {
   2524         struct timespec timestamp;
   2525         unsigned int avail;
   2526         if (pcm_get_htimestamp(in->pcm, &avail, &timestamp) == 0) {
   2527             *frames = in->frames_read + avail;
   2528             *time = timestamp.tv_sec * 1000000000LL + timestamp.tv_nsec;
   2529             ret = 0;
   2530         }
   2531     }
   2532     pthread_mutex_unlock(&in->lock);
   2533     return ret;
   2534 }
   2535 
   2536 static int add_remove_audio_effect(const struct audio_stream *stream,
   2537                                    effect_handle_t effect,
   2538                                    bool enable)
   2539 {
   2540     struct stream_in *in = (struct stream_in *)stream;
   2541     struct audio_device *adev = in->dev;
   2542     int status = 0;
   2543     effect_descriptor_t desc;
   2544 
   2545     status = (*effect)->get_descriptor(effect, &desc);
   2546     if (status != 0)
   2547         return status;
   2548 
   2549     lock_input_stream(in);
   2550     pthread_mutex_lock(&in->dev->lock);
   2551     if ((in->source == AUDIO_SOURCE_VOICE_COMMUNICATION ||
   2552             in->source == AUDIO_SOURCE_VOICE_RECOGNITION ||
   2553             adev->mode == AUDIO_MODE_IN_COMMUNICATION) &&
   2554             in->enable_aec != enable &&
   2555             (memcmp(&desc.type, FX_IID_AEC, sizeof(effect_uuid_t)) == 0)) {
   2556         in->enable_aec = enable;
   2557         if (!enable)
   2558             platform_set_echo_reference(in->dev, enable, AUDIO_DEVICE_NONE);
   2559         if (in->source == AUDIO_SOURCE_VOICE_COMMUNICATION ||
   2560             adev->mode == AUDIO_MODE_IN_COMMUNICATION) {
   2561             adev->enable_voicerx = enable;
   2562             struct audio_usecase *usecase;
   2563             struct listnode *node;
   2564             list_for_each(node, &adev->usecase_list) {
   2565                 usecase = node_to_item(node, struct audio_usecase, list);
   2566                 if (usecase->type == PCM_PLAYBACK) {
   2567                     select_devices(adev, usecase->id);
   2568                     break;
   2569                 }
   2570             }
   2571         }
   2572         if (!in->standby)
   2573             select_devices(in->dev, in->usecase);
   2574     }
   2575     if (in->enable_ns != enable &&
   2576             (memcmp(&desc.type, FX_IID_NS, sizeof(effect_uuid_t)) == 0)) {
   2577         in->enable_ns = enable;
   2578         if (!in->standby)
   2579             select_devices(in->dev, in->usecase);
   2580     }
   2581     pthread_mutex_unlock(&in->dev->lock);
   2582     pthread_mutex_unlock(&in->lock);
   2583 
   2584     return 0;
   2585 }
   2586 
   2587 static int in_add_audio_effect(const struct audio_stream *stream,
   2588                                effect_handle_t effect)
   2589 {
   2590     ALOGV("%s: effect %p", __func__, effect);
   2591     return add_remove_audio_effect(stream, effect, true);
   2592 }
   2593 
   2594 static int in_remove_audio_effect(const struct audio_stream *stream,
   2595                                   effect_handle_t effect)
   2596 {
   2597     ALOGV("%s: effect %p", __func__, effect);
   2598     return add_remove_audio_effect(stream, effect, false);
   2599 }
   2600 
   2601 static int adev_open_output_stream(struct audio_hw_device *dev,
   2602                                    audio_io_handle_t handle,
   2603                                    audio_devices_t devices,
   2604                                    audio_output_flags_t flags,
   2605                                    struct audio_config *config,
   2606                                    struct audio_stream_out **stream_out,
   2607                                    const char *address __unused)
   2608 {
   2609     struct audio_device *adev = (struct audio_device *)dev;
   2610     struct stream_out *out;
   2611     int i, ret;
   2612 
   2613     ALOGV("%s: enter: sample_rate(%d) channel_mask(%#x) devices(%#x) flags(%#x)",
   2614           __func__, config->sample_rate, config->channel_mask, devices, flags);
   2615     *stream_out = NULL;
   2616     out = (struct stream_out *)calloc(1, sizeof(struct stream_out));
   2617 
   2618     if (devices == AUDIO_DEVICE_NONE)
   2619         devices = AUDIO_DEVICE_OUT_SPEAKER;
   2620 
   2621     out->flags = flags;
   2622     out->devices = devices;
   2623     out->dev = adev;
   2624     out->format = config->format;
   2625     out->sample_rate = config->sample_rate;
   2626     out->channel_mask = AUDIO_CHANNEL_OUT_STEREO;
   2627     out->supported_channel_masks[0] = AUDIO_CHANNEL_OUT_STEREO;
   2628     out->handle = handle;
   2629 
   2630     /* Init use case and pcm_config */
   2631     if (out->flags & AUDIO_OUTPUT_FLAG_DIRECT &&
   2632             !(out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) &&
   2633         out->devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
   2634         pthread_mutex_lock(&adev->lock);
   2635         ret = read_hdmi_channel_masks(out);
   2636         pthread_mutex_unlock(&adev->lock);
   2637         if (ret != 0)
   2638             goto error_open;
   2639 
   2640         if (config->sample_rate == 0)
   2641             config->sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
   2642         if (config->channel_mask == 0)
   2643             config->channel_mask = AUDIO_CHANNEL_OUT_5POINT1;
   2644         if (config->format == AUDIO_FORMAT_DEFAULT)
   2645             config->format = AUDIO_FORMAT_PCM_16_BIT;
   2646 
   2647         out->channel_mask = config->channel_mask;
   2648         out->sample_rate = config->sample_rate;
   2649         out->format = config->format;
   2650         out->usecase = USECASE_AUDIO_PLAYBACK_MULTI_CH;
   2651         out->config = pcm_config_hdmi_multi;
   2652         out->config.rate = config->sample_rate;
   2653         out->config.channels = audio_channel_count_from_out_mask(out->channel_mask);
   2654         out->config.period_size = HDMI_MULTI_PERIOD_BYTES / (out->config.channels * 2);
   2655     } else if (out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) {
   2656         pthread_mutex_lock(&adev->lock);
   2657         bool offline = (adev->card_status == CARD_STATUS_OFFLINE);
   2658         pthread_mutex_unlock(&adev->lock);
   2659 
   2660         // reject offload during card offline to allow
   2661         // fallback to s/w paths
   2662         if (offline) {
   2663             ret = -ENODEV;
   2664             goto error_open;
   2665         }
   2666 
   2667         if (config->offload_info.version != AUDIO_INFO_INITIALIZER.version ||
   2668             config->offload_info.size != AUDIO_INFO_INITIALIZER.size) {
   2669             ALOGE("%s: Unsupported Offload information", __func__);
   2670             ret = -EINVAL;
   2671             goto error_open;
   2672         }
   2673         if (!is_supported_format(config->offload_info.format)) {
   2674             ALOGE("%s: Unsupported audio format", __func__);
   2675             ret = -EINVAL;
   2676             goto error_open;
   2677         }
   2678 
   2679         out->compr_config.codec = (struct snd_codec *)
   2680                                     calloc(1, sizeof(struct snd_codec));
   2681 
   2682         out->usecase = USECASE_AUDIO_PLAYBACK_OFFLOAD;
   2683         if (config->offload_info.channel_mask)
   2684             out->channel_mask = config->offload_info.channel_mask;
   2685         else if (config->channel_mask)
   2686             out->channel_mask = config->channel_mask;
   2687         out->format = config->offload_info.format;
   2688         out->sample_rate = config->offload_info.sample_rate;
   2689 
   2690         out->stream.set_callback = out_set_callback;
   2691         out->stream.pause = out_pause;
   2692         out->stream.resume = out_resume;
   2693         out->stream.drain = out_drain;
   2694         out->stream.flush = out_flush;
   2695 
   2696         out->compr_config.codec->id =
   2697                 get_snd_codec_id(config->offload_info.format);
   2698         out->compr_config.fragment_size = COMPRESS_OFFLOAD_FRAGMENT_SIZE;
   2699         out->compr_config.fragments = COMPRESS_OFFLOAD_NUM_FRAGMENTS;
   2700         out->compr_config.codec->sample_rate = config->offload_info.sample_rate;
   2701         out->compr_config.codec->bit_rate =
   2702                     config->offload_info.bit_rate;
   2703         out->compr_config.codec->ch_in =
   2704                 audio_channel_count_from_out_mask(config->channel_mask);
   2705         out->compr_config.codec->ch_out = out->compr_config.codec->ch_in;
   2706 
   2707         if (flags & AUDIO_OUTPUT_FLAG_NON_BLOCKING)
   2708             out->non_blocking = 1;
   2709 
   2710         out->send_new_metadata = 1;
   2711         create_offload_callback_thread(out);
   2712         ALOGV("%s: offloaded output offload_info version %04x bit rate %d",
   2713                 __func__, config->offload_info.version,
   2714                 config->offload_info.bit_rate);
   2715     } else  if (out->devices == AUDIO_DEVICE_OUT_TELEPHONY_TX) {
   2716         if (config->sample_rate == 0)
   2717             config->sample_rate = AFE_PROXY_SAMPLING_RATE;
   2718         if (config->sample_rate != 48000 && config->sample_rate != 16000 &&
   2719                 config->sample_rate != 8000) {
   2720             config->sample_rate = AFE_PROXY_SAMPLING_RATE;
   2721             ret = -EINVAL;
   2722             goto error_open;
   2723         }
   2724         out->sample_rate = config->sample_rate;
   2725         out->config.rate = config->sample_rate;
   2726         if (config->format == AUDIO_FORMAT_DEFAULT)
   2727             config->format = AUDIO_FORMAT_PCM_16_BIT;
   2728         if (config->format != AUDIO_FORMAT_PCM_16_BIT) {
   2729             config->format = AUDIO_FORMAT_PCM_16_BIT;
   2730             ret = -EINVAL;
   2731             goto error_open;
   2732         }
   2733         out->format = config->format;
   2734         out->usecase = USECASE_AUDIO_PLAYBACK_AFE_PROXY;
   2735         out->config = pcm_config_afe_proxy_playback;
   2736         adev->voice_tx_output = out;
   2737     } else {
   2738         if (out->flags & AUDIO_OUTPUT_FLAG_DEEP_BUFFER) {
   2739             out->usecase = USECASE_AUDIO_PLAYBACK_DEEP_BUFFER;
   2740             out->config = pcm_config_deep_buffer;
   2741         } else if (out->flags & AUDIO_OUTPUT_FLAG_TTS) {
   2742             out->usecase = USECASE_AUDIO_PLAYBACK_TTS;
   2743             out->config = pcm_config_deep_buffer;
   2744         } else if (out->flags & AUDIO_OUTPUT_FLAG_RAW) {
   2745             out->usecase = USECASE_AUDIO_PLAYBACK_ULL;
   2746             out->realtime = may_use_noirq_mode(adev, USECASE_AUDIO_PLAYBACK_ULL, out->flags);
   2747             out->usecase = USECASE_AUDIO_PLAYBACK_ULL;
   2748             out->config = out->realtime ? pcm_config_rt : pcm_config_low_latency;
   2749         } else {
   2750             out->usecase = USECASE_AUDIO_PLAYBACK_LOW_LATENCY;
   2751             out->config = pcm_config_low_latency;
   2752         }
   2753         if (config->format != audio_format_from_pcm_format(out->config.format)) {
   2754             if (k_enable_extended_precision
   2755                     && pcm_params_format_test(adev->use_case_table[out->usecase],
   2756                             pcm_format_from_audio_format(config->format))) {
   2757                 out->config.format = pcm_format_from_audio_format(config->format);
   2758                 /* out->format already set to config->format */
   2759             } else {
   2760                 /* deny the externally proposed config format
   2761                  * and use the one specified in audio_hw layer configuration.
   2762                  * Note: out->format is returned by out->stream.common.get_format()
   2763                  * and is used to set config->format in the code several lines below.
   2764                  */
   2765                 out->format = audio_format_from_pcm_format(out->config.format);
   2766             }
   2767         }
   2768         out->sample_rate = out->config.rate;
   2769     }
   2770     ALOGV("%s: Usecase(%s) config->format %#x  out->config.format %#x\n",
   2771             __func__, use_case_table[out->usecase], config->format, out->config.format);
   2772 
   2773     if (flags & AUDIO_OUTPUT_FLAG_PRIMARY) {
   2774         if (adev->primary_output == NULL)
   2775             adev->primary_output = out;
   2776         else {
   2777             ALOGE("%s: Primary output is already opened", __func__);
   2778             ret = -EEXIST;
   2779             goto error_open;
   2780         }
   2781     }
   2782 
   2783     /* Check if this usecase is already existing */
   2784     pthread_mutex_lock(&adev->lock);
   2785     if (get_usecase_from_list(adev, out->usecase) != NULL) {
   2786         ALOGE("%s: Usecase (%d) is already present", __func__, out->usecase);
   2787         pthread_mutex_unlock(&adev->lock);
   2788         ret = -EEXIST;
   2789         goto error_open;
   2790     }
   2791     pthread_mutex_unlock(&adev->lock);
   2792 
   2793     out->stream.common.get_sample_rate = out_get_sample_rate;
   2794     out->stream.common.set_sample_rate = out_set_sample_rate;
   2795     out->stream.common.get_buffer_size = out_get_buffer_size;
   2796     out->stream.common.get_channels = out_get_channels;
   2797     out->stream.common.get_format = out_get_format;
   2798     out->stream.common.set_format = out_set_format;
   2799     out->stream.common.standby = out_standby;
   2800     out->stream.common.dump = out_dump;
   2801     out->stream.common.set_parameters = out_set_parameters;
   2802     out->stream.common.get_parameters = out_get_parameters;
   2803     out->stream.common.add_audio_effect = out_add_audio_effect;
   2804     out->stream.common.remove_audio_effect = out_remove_audio_effect;
   2805     out->stream.get_latency = out_get_latency;
   2806     out->stream.set_volume = out_set_volume;
   2807 #ifdef NO_AUDIO_OUT
   2808     out->stream.write = out_write_for_no_output;
   2809 #else
   2810     out->stream.write = out_write;
   2811 #endif
   2812     out->stream.get_render_position = out_get_render_position;
   2813     out->stream.get_next_write_timestamp = out_get_next_write_timestamp;
   2814     out->stream.get_presentation_position = out_get_presentation_position;
   2815 
   2816     out->af_period_multiplier  = out->realtime ? af_period_multiplier : 1;
   2817     out->standby = 1;
   2818     /* out->muted = false; by calloc() */
   2819     /* out->written = 0; by calloc() */
   2820 
   2821     pthread_mutex_init(&out->lock, (const pthread_mutexattr_t *) NULL);
   2822     pthread_mutex_init(&out->pre_lock, (const pthread_mutexattr_t *) NULL);
   2823     pthread_cond_init(&out->cond, (const pthread_condattr_t *) NULL);
   2824 
   2825     config->format = out->stream.common.get_format(&out->stream.common);
   2826     config->channel_mask = out->stream.common.get_channels(&out->stream.common);
   2827     config->sample_rate = out->stream.common.get_sample_rate(&out->stream.common);
   2828 
   2829 
   2830     /*
   2831        By locking output stream before registering, we allow the callback
   2832        to update stream's state only after stream's initial state is set to
   2833        adev state.
   2834     */
   2835     lock_output_stream(out);
   2836     audio_extn_snd_mon_register_listener(out, out_snd_mon_cb);
   2837     pthread_mutex_lock(&adev->lock);
   2838     out->card_status = adev->card_status;
   2839     pthread_mutex_unlock(&adev->lock);
   2840     pthread_mutex_unlock(&out->lock);
   2841 
   2842     *stream_out = &out->stream;
   2843     ALOGV("%s: exit", __func__);
   2844     return 0;
   2845 
   2846 error_open:
   2847     free(out);
   2848     *stream_out = NULL;
   2849     ALOGW("%s: exit: ret %d", __func__, ret);
   2850     return ret;
   2851 }
   2852 
   2853 static void adev_close_output_stream(struct audio_hw_device *dev __unused,
   2854                                      struct audio_stream_out *stream)
   2855 {
   2856     struct stream_out *out = (struct stream_out *)stream;
   2857     struct audio_device *adev = out->dev;
   2858 
   2859     ALOGV("%s: enter", __func__);
   2860 
   2861     // must deregister from sndmonitor first to prevent races
   2862     // between the callback and close_stream
   2863     audio_extn_snd_mon_unregister_listener(out);
   2864     out_standby(&stream->common);
   2865     if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
   2866         destroy_offload_callback_thread(out);
   2867 
   2868         if (out->compr_config.codec != NULL)
   2869             free(out->compr_config.codec);
   2870     }
   2871 
   2872     if (adev->voice_tx_output == out)
   2873         adev->voice_tx_output = NULL;
   2874 
   2875     pthread_cond_destroy(&out->cond);
   2876     pthread_mutex_destroy(&out->lock);
   2877     free(stream);
   2878     ALOGV("%s: exit", __func__);
   2879 }
   2880 
   2881 static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs)
   2882 {
   2883     struct audio_device *adev = (struct audio_device *)dev;
   2884     struct str_parms *parms;
   2885     char *str;
   2886     char value[32];
   2887     int val;
   2888     int ret;
   2889     int status = 0;
   2890 
   2891     ALOGV("%s: enter: %s", __func__, kvpairs);
   2892 
   2893     pthread_mutex_lock(&adev->lock);
   2894 
   2895     parms = str_parms_create_str(kvpairs);
   2896     status = voice_set_parameters(adev, parms);
   2897     if (status != 0) {
   2898         goto done;
   2899     }
   2900 
   2901     ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_BT_NREC, value, sizeof(value));
   2902     if (ret >= 0) {
   2903         /* When set to false, HAL should disable EC and NS */
   2904         if (strcmp(value, AUDIO_PARAMETER_VALUE_ON) == 0)
   2905             adev->bluetooth_nrec = true;
   2906         else
   2907             adev->bluetooth_nrec = false;
   2908     }
   2909 
   2910     ret = str_parms_get_str(parms, "screen_state", value, sizeof(value));
   2911     if (ret >= 0) {
   2912         if (strcmp(value, AUDIO_PARAMETER_VALUE_ON) == 0)
   2913             adev->screen_off = false;
   2914         else
   2915             adev->screen_off = true;
   2916     }
   2917 
   2918     ret = str_parms_get_int(parms, "rotation", &val);
   2919     if (ret >= 0) {
   2920         bool reverse_speakers = false;
   2921         switch(val) {
   2922         // FIXME: note that the code below assumes that the speakers are in the correct placement
   2923         //   relative to the user when the device is rotated 90deg from its default rotation. This
   2924         //   assumption is device-specific, not platform-specific like this code.
   2925         case 270:
   2926             reverse_speakers = true;
   2927             break;
   2928         case 0:
   2929         case 90:
   2930         case 180:
   2931             break;
   2932         default:
   2933             ALOGE("%s: unexpected rotation of %d", __func__, val);
   2934             status = -EINVAL;
   2935         }
   2936         if (status == 0) {
   2937             platform_swap_lr_channels(adev, reverse_speakers);
   2938         }
   2939     }
   2940 
   2941     ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_BT_SCO_WB, value, sizeof(value));
   2942     if (ret >= 0) {
   2943         adev->bt_wb_speech_enabled = !strcmp(value, AUDIO_PARAMETER_VALUE_ON);
   2944     }
   2945 
   2946     audio_extn_hfp_set_parameters(adev, parms);
   2947 done:
   2948     str_parms_destroy(parms);
   2949     pthread_mutex_unlock(&adev->lock);
   2950     ALOGV("%s: exit with code(%d)", __func__, status);
   2951     return status;
   2952 }
   2953 
   2954 static char* adev_get_parameters(const struct audio_hw_device *dev,
   2955                                  const char *keys)
   2956 {
   2957     struct audio_device *adev = (struct audio_device *)dev;
   2958     struct str_parms *reply = str_parms_create();
   2959     struct str_parms *query = str_parms_create_str(keys);
   2960     char *str;
   2961 
   2962     pthread_mutex_lock(&adev->lock);
   2963 
   2964     voice_get_parameters(adev, query, reply);
   2965     str = str_parms_to_str(reply);
   2966     str_parms_destroy(query);
   2967     str_parms_destroy(reply);
   2968 
   2969     pthread_mutex_unlock(&adev->lock);
   2970     ALOGV("%s: exit: returns - %s", __func__, str);
   2971     return str;
   2972 }
   2973 
   2974 static int adev_init_check(const struct audio_hw_device *dev __unused)
   2975 {
   2976     return 0;
   2977 }
   2978 
   2979 static int adev_set_voice_volume(struct audio_hw_device *dev, float volume)
   2980 {
   2981     int ret;
   2982     struct audio_device *adev = (struct audio_device *)dev;
   2983 
   2984     audio_extn_extspk_set_voice_vol(adev->extspk, volume);
   2985 
   2986     pthread_mutex_lock(&adev->lock);
   2987     ret = voice_set_volume(adev, volume);
   2988     pthread_mutex_unlock(&adev->lock);
   2989 
   2990     return ret;
   2991 }
   2992 
   2993 static int adev_set_master_volume(struct audio_hw_device *dev __unused, float volume __unused)
   2994 {
   2995     return -ENOSYS;
   2996 }
   2997 
   2998 static int adev_get_master_volume(struct audio_hw_device *dev __unused,
   2999                                   float *volume __unused)
   3000 {
   3001     return -ENOSYS;
   3002 }
   3003 
   3004 static int adev_set_master_mute(struct audio_hw_device *dev __unused, bool muted __unused)
   3005 {
   3006     return -ENOSYS;
   3007 }
   3008 
   3009 static int adev_get_master_mute(struct audio_hw_device *dev __unused, bool *muted __unused)
   3010 {
   3011     return -ENOSYS;
   3012 }
   3013 
   3014 static int adev_set_mode(struct audio_hw_device *dev, audio_mode_t mode)
   3015 {
   3016     struct audio_device *adev = (struct audio_device *)dev;
   3017 
   3018     pthread_mutex_lock(&adev->lock);
   3019     if (adev->mode != mode) {
   3020         ALOGD("%s: mode %d", __func__, (int)mode);
   3021         adev->mode = mode;
   3022         if ((mode == AUDIO_MODE_NORMAL || mode == AUDIO_MODE_IN_COMMUNICATION) &&
   3023                 voice_is_in_call(adev)) {
   3024             voice_stop_call(adev);
   3025             adev->current_call_output = NULL;
   3026         }
   3027     }
   3028     pthread_mutex_unlock(&adev->lock);
   3029 
   3030     audio_extn_extspk_set_mode(adev->extspk, mode);
   3031 
   3032     return 0;
   3033 }
   3034 
   3035 static int adev_set_mic_mute(struct audio_hw_device *dev, bool state)
   3036 {
   3037     int ret;
   3038     struct audio_device *adev = (struct audio_device *)dev;
   3039 
   3040     ALOGD("%s: state %d", __func__, (int)state);
   3041     pthread_mutex_lock(&adev->lock);
   3042     ret = voice_set_mic_mute(adev, state);
   3043     adev->mic_muted = state;
   3044     pthread_mutex_unlock(&adev->lock);
   3045 
   3046     return ret;
   3047 }
   3048 
   3049 static int adev_get_mic_mute(const struct audio_hw_device *dev, bool *state)
   3050 {
   3051     *state = voice_get_mic_mute((struct audio_device *)dev);
   3052     return 0;
   3053 }
   3054 
   3055 static size_t adev_get_input_buffer_size(const struct audio_hw_device *dev __unused,
   3056                                          const struct audio_config *config)
   3057 {
   3058     int channel_count = audio_channel_count_from_in_mask(config->channel_mask);
   3059 
   3060     return get_input_buffer_size(config->sample_rate, config->format, channel_count,
   3061             false /* is_low_latency: since we don't know, be conservative */);
   3062 }
   3063 
   3064 static int adev_open_input_stream(struct audio_hw_device *dev,
   3065                                   audio_io_handle_t handle,
   3066                                   audio_devices_t devices,
   3067                                   struct audio_config *config,
   3068                                   struct audio_stream_in **stream_in,
   3069                                   audio_input_flags_t flags,
   3070                                   const char *address __unused,
   3071                                   audio_source_t source )
   3072 {
   3073     struct audio_device *adev = (struct audio_device *)dev;
   3074     struct stream_in *in;
   3075     int ret = 0, buffer_size, frame_size;
   3076     int channel_count = audio_channel_count_from_in_mask(config->channel_mask);
   3077     bool is_low_latency = false;
   3078 
   3079     ALOGV("%s: enter", __func__);
   3080     *stream_in = NULL;
   3081     if (check_input_parameters(config->sample_rate, config->format, channel_count) != 0)
   3082         return -EINVAL;
   3083 
   3084     in = (struct stream_in *)calloc(1, sizeof(struct stream_in));
   3085 
   3086     pthread_mutex_init(&in->lock, (const pthread_mutexattr_t *) NULL);
   3087     pthread_mutex_init(&in->pre_lock, (const pthread_mutexattr_t *) NULL);
   3088 
   3089     in->stream.common.get_sample_rate = in_get_sample_rate;
   3090     in->stream.common.set_sample_rate = in_set_sample_rate;
   3091     in->stream.common.get_buffer_size = in_get_buffer_size;
   3092     in->stream.common.get_channels = in_get_channels;
   3093     in->stream.common.get_format = in_get_format;
   3094     in->stream.common.set_format = in_set_format;
   3095     in->stream.common.standby = in_standby;
   3096     in->stream.common.dump = in_dump;
   3097     in->stream.common.set_parameters = in_set_parameters;
   3098     in->stream.common.get_parameters = in_get_parameters;
   3099     in->stream.common.add_audio_effect = in_add_audio_effect;
   3100     in->stream.common.remove_audio_effect = in_remove_audio_effect;
   3101     in->stream.set_gain = in_set_gain;
   3102     in->stream.read = in_read;
   3103     in->stream.get_input_frames_lost = in_get_input_frames_lost;
   3104     in->stream.get_capture_position = in_get_capture_position;
   3105 
   3106     in->device = devices;
   3107     in->source = source;
   3108     in->dev = adev;
   3109     in->standby = 1;
   3110     in->channel_mask = config->channel_mask;
   3111     in->capture_handle = handle;
   3112     in->flags = flags;
   3113 
   3114     // restrict 24 bit capture for unprocessed source only
   3115     // for other sources if 24 bit requested reject 24 and set 16 bit capture only
   3116     if (config->format == AUDIO_FORMAT_DEFAULT) {
   3117         config->format = AUDIO_FORMAT_PCM_16_BIT;
   3118     } else if (config->format == AUDIO_FORMAT_PCM_FLOAT ||
   3119                config->format == AUDIO_FORMAT_PCM_24_BIT_PACKED ||
   3120                config->format == AUDIO_FORMAT_PCM_8_24_BIT) {
   3121         bool ret_error = false;
   3122         /* 24 bit is restricted to UNPROCESSED source only,also format supported
   3123            from HAL is 8_24
   3124            *> In case of UNPROCESSED source, for 24 bit, if format requested is other than
   3125               8_24 return error indicating supported format is 8_24
   3126            *> In case of any other source requesting 24 bit or float return error
   3127               indicating format supported is 16 bit only.
   3128 
   3129            on error flinger will retry with supported format passed
   3130          */
   3131         if (source != AUDIO_SOURCE_UNPROCESSED) {
   3132             config->format = AUDIO_FORMAT_PCM_16_BIT;
   3133             ret_error = true;
   3134         } else if (config->format != AUDIO_FORMAT_PCM_8_24_BIT) {
   3135             config->format = AUDIO_FORMAT_PCM_8_24_BIT;
   3136             ret_error = true;
   3137         }
   3138 
   3139         if (ret_error) {
   3140             ret = -EINVAL;
   3141             goto err_open;
   3142         }
   3143     }
   3144 
   3145     in->format = config->format;
   3146 
   3147     /* Update config params with the requested sample rate and channels */
   3148     if (in->device == AUDIO_DEVICE_IN_TELEPHONY_RX) {
   3149         if (config->sample_rate == 0)
   3150             config->sample_rate = AFE_PROXY_SAMPLING_RATE;
   3151         if (config->sample_rate != 48000 && config->sample_rate != 16000 &&
   3152                 config->sample_rate != 8000) {
   3153             config->sample_rate = AFE_PROXY_SAMPLING_RATE;
   3154             ret = -EINVAL;
   3155             goto err_open;
   3156         }
   3157 
   3158         if (config->format != AUDIO_FORMAT_PCM_16_BIT) {
   3159             config->format = AUDIO_FORMAT_PCM_16_BIT;
   3160             ret = -EINVAL;
   3161             goto err_open;
   3162         }
   3163 
   3164         in->usecase = USECASE_AUDIO_RECORD_AFE_PROXY;
   3165         in->config = pcm_config_afe_proxy_record;
   3166     } else {
   3167         in->usecase = USECASE_AUDIO_RECORD;
   3168         if (config->sample_rate == LOW_LATENCY_CAPTURE_SAMPLE_RATE &&
   3169                 (flags & AUDIO_INPUT_FLAG_FAST) != 0) {
   3170             is_low_latency = true;
   3171 #if LOW_LATENCY_CAPTURE_USE_CASE
   3172             in->usecase = USECASE_AUDIO_RECORD_LOW_LATENCY;
   3173 #endif
   3174             in->realtime = may_use_noirq_mode(adev, in->usecase, in->flags);
   3175         }
   3176 
   3177         in->config = in->realtime ? pcm_config_audio_capture_rt :
   3178                                   pcm_config_audio_capture;
   3179 
   3180         if (config->format == AUDIO_FORMAT_PCM_8_24_BIT)
   3181             in->config.format = PCM_FORMAT_S24_LE;
   3182 
   3183         if (!in->realtime) {
   3184             frame_size = audio_stream_in_frame_size(&in->stream);
   3185             buffer_size = get_input_buffer_size(config->sample_rate,
   3186                                                 config->format,
   3187                                                 channel_count,
   3188                                                 is_low_latency);
   3189             in->config.period_size = buffer_size / frame_size;
   3190         } // period size is left untouched for rt mode playback
   3191     }
   3192 
   3193     in->config.channels = channel_count;
   3194     if (in->realtime) {
   3195         in->af_period_multiplier = af_period_multiplier;
   3196     } else {
   3197         in->config.rate = config->sample_rate;
   3198         in->af_period_multiplier = 1;
   3199     }
   3200 
   3201     /* This stream could be for sound trigger lab,
   3202        get sound trigger pcm if present */
   3203     audio_extn_sound_trigger_check_and_get_session(in);
   3204 
   3205     lock_input_stream(in);
   3206     audio_extn_snd_mon_register_listener(in, in_snd_mon_cb);
   3207     pthread_mutex_lock(&adev->lock);
   3208     in->card_status = adev->card_status;
   3209     pthread_mutex_unlock(&adev->lock);
   3210     pthread_mutex_unlock(&in->lock);
   3211 
   3212     *stream_in = &in->stream;
   3213     ALOGV("%s: exit", __func__);
   3214     return 0;
   3215 
   3216 err_open:
   3217     free(in);
   3218     *stream_in = NULL;
   3219     return ret;
   3220 }
   3221 
   3222 static void adev_close_input_stream(struct audio_hw_device *dev __unused,
   3223                                     struct audio_stream_in *stream)
   3224 {
   3225     ALOGV("%s", __func__);
   3226 
   3227     // must deregister from sndmonitor first to prevent races
   3228     // between the callback and close_stream
   3229     audio_extn_snd_mon_unregister_listener(stream);
   3230     in_standby(&stream->common);
   3231     free(stream);
   3232 
   3233     return;
   3234 }
   3235 
   3236 static int adev_dump(const audio_hw_device_t *device __unused, int fd __unused)
   3237 {
   3238     return 0;
   3239 }
   3240 
   3241 /* verifies input and output devices and their capabilities.
   3242  *
   3243  * This verification is required when enabling extended bit-depth or
   3244  * sampling rates, as not all qcom products support it.
   3245  *
   3246  * Suitable for calling only on initialization such as adev_open().
   3247  * It fills the audio_device use_case_table[] array.
   3248  *
   3249  * Has a side-effect that it needs to configure audio routing / devices
   3250  * in order to power up the devices and read the device parameters.
   3251  * It does not acquire any hw device lock. Should restore the devices
   3252  * back to "normal state" upon completion.
   3253  */
   3254 static int adev_verify_devices(struct audio_device *adev)
   3255 {
   3256     /* enumeration is a bit difficult because one really wants to pull
   3257      * the use_case, device id, etc from the hidden pcm_device_table[].
   3258      * In this case there are the following use cases and device ids.
   3259      *
   3260      * [USECASE_AUDIO_PLAYBACK_DEEP_BUFFER] = {0, 0},
   3261      * [USECASE_AUDIO_PLAYBACK_LOW_LATENCY] = {15, 15},
   3262      * [USECASE_AUDIO_PLAYBACK_MULTI_CH] = {1, 1},
   3263      * [USECASE_AUDIO_PLAYBACK_OFFLOAD] = {9, 9},
   3264      * [USECASE_AUDIO_RECORD] = {0, 0},
   3265      * [USECASE_AUDIO_RECORD_LOW_LATENCY] = {15, 15},
   3266      * [USECASE_VOICE_CALL] = {2, 2},
   3267      *
   3268      * USECASE_AUDIO_PLAYBACK_OFFLOAD, USECASE_AUDIO_PLAYBACK_MULTI_CH omitted.
   3269      * USECASE_VOICE_CALL omitted, but possible for either input or output.
   3270      */
   3271 
   3272     /* should be the usecases enabled in adev_open_input_stream() */
   3273     static const int test_in_usecases[] = {
   3274              USECASE_AUDIO_RECORD,
   3275              USECASE_AUDIO_RECORD_LOW_LATENCY, /* does not appear to be used */
   3276     };
   3277     /* should be the usecases enabled in adev_open_output_stream()*/
   3278     static const int test_out_usecases[] = {
   3279             USECASE_AUDIO_PLAYBACK_DEEP_BUFFER,
   3280             USECASE_AUDIO_PLAYBACK_LOW_LATENCY,
   3281     };
   3282     static const usecase_type_t usecase_type_by_dir[] = {
   3283             PCM_PLAYBACK,
   3284             PCM_CAPTURE,
   3285     };
   3286     static const unsigned flags_by_dir[] = {
   3287             PCM_OUT,
   3288             PCM_IN,
   3289     };
   3290 
   3291     size_t i;
   3292     unsigned dir;
   3293     const unsigned card_id = adev->snd_card;
   3294     char info[512]; /* for possible debug info */
   3295 
   3296     for (dir = 0; dir < 2; ++dir) {
   3297         const usecase_type_t usecase_type = usecase_type_by_dir[dir];
   3298         const unsigned flags_dir = flags_by_dir[dir];
   3299         const size_t testsize =
   3300                 dir ? ARRAY_SIZE(test_in_usecases) : ARRAY_SIZE(test_out_usecases);
   3301         const int *testcases =
   3302                 dir ? test_in_usecases : test_out_usecases;
   3303         const audio_devices_t audio_device =
   3304                 dir ? AUDIO_DEVICE_IN_BUILTIN_MIC : AUDIO_DEVICE_OUT_SPEAKER;
   3305 
   3306         for (i = 0; i < testsize; ++i) {
   3307             const audio_usecase_t audio_usecase = testcases[i];
   3308             int device_id;
   3309             snd_device_t snd_device;
   3310             struct pcm_params **pparams;
   3311             struct stream_out out;
   3312             struct stream_in in;
   3313             struct audio_usecase uc_info;
   3314             int retval;
   3315 
   3316             pparams = &adev->use_case_table[audio_usecase];
   3317             pcm_params_free(*pparams); /* can accept null input */
   3318             *pparams = NULL;
   3319 
   3320             /* find the device ID for the use case (signed, for error) */
   3321             device_id = platform_get_pcm_device_id(audio_usecase, usecase_type);
   3322             if (device_id < 0)
   3323                 continue;
   3324 
   3325             /* prepare structures for device probing */
   3326             memset(&uc_info, 0, sizeof(uc_info));
   3327             uc_info.id = audio_usecase;
   3328             uc_info.type = usecase_type;
   3329             if (dir) {
   3330                 adev->active_input = &in;
   3331                 memset(&in, 0, sizeof(in));
   3332                 in.device = audio_device;
   3333                 in.source = AUDIO_SOURCE_VOICE_COMMUNICATION;
   3334                 uc_info.stream.in = &in;
   3335             }  else {
   3336                 adev->active_input = NULL;
   3337             }
   3338             memset(&out, 0, sizeof(out));
   3339             out.devices = audio_device; /* only field needed in select_devices */
   3340             uc_info.stream.out = &out;
   3341             uc_info.devices = audio_device;
   3342             uc_info.in_snd_device = SND_DEVICE_NONE;
   3343             uc_info.out_snd_device = SND_DEVICE_NONE;
   3344             list_add_tail(&adev->usecase_list, &uc_info.list);
   3345 
   3346             /* select device - similar to start_(in/out)put_stream() */
   3347             retval = select_devices(adev, audio_usecase);
   3348             if (retval >= 0) {
   3349                 *pparams = pcm_params_get(card_id, device_id, flags_dir);
   3350 #if LOG_NDEBUG == 0
   3351                 if (*pparams) {
   3352                     ALOGV("%s: (%s) card %d  device %d", __func__,
   3353                             dir ? "input" : "output", card_id, device_id);
   3354                     pcm_params_to_string(*pparams, info, ARRAY_SIZE(info));
   3355                 } else {
   3356                     ALOGV("%s: cannot locate card %d  device %d", __func__, card_id, device_id);
   3357                 }
   3358 #endif
   3359             }
   3360 
   3361             /* deselect device - similar to stop_(in/out)put_stream() */
   3362             /* 1. Get and set stream specific mixer controls */
   3363             retval = disable_audio_route(adev, &uc_info);
   3364             /* 2. Disable the rx device */
   3365             retval = disable_snd_device(adev,
   3366                     dir ? uc_info.in_snd_device : uc_info.out_snd_device);
   3367             list_remove(&uc_info.list);
   3368         }
   3369     }
   3370     adev->active_input = NULL; /* restore adev state */
   3371     return 0;
   3372 }
   3373 
   3374 static int adev_close(hw_device_t *device)
   3375 {
   3376     size_t i;
   3377     struct audio_device *adev = (struct audio_device *)device;
   3378 
   3379     if (!adev)
   3380         return 0;
   3381 
   3382     audio_extn_snd_mon_unregister_listener(adev);
   3383     pthread_mutex_lock(&adev_init_lock);
   3384 
   3385     if ((--audio_device_ref_count) == 0) {
   3386         audio_route_free(adev->audio_route);
   3387         free(adev->snd_dev_ref_cnt);
   3388         platform_deinit(adev->platform);
   3389         audio_extn_extspk_deinit(adev->extspk);
   3390         audio_extn_sound_trigger_deinit(adev);
   3391         for (i = 0; i < ARRAY_SIZE(adev->use_case_table); ++i) {
   3392             pcm_params_free(adev->use_case_table[i]);
   3393         }
   3394         if (adev->adm_deinit)
   3395             adev->adm_deinit(adev->adm_data);
   3396         free(device);
   3397     }
   3398 
   3399     pthread_mutex_unlock(&adev_init_lock);
   3400 
   3401     return 0;
   3402 }
   3403 
   3404 /* This returns 1 if the input parameter looks at all plausible as a low latency period size,
   3405  * or 0 otherwise.  A return value of 1 doesn't mean the value is guaranteed to work,
   3406  * just that it _might_ work.
   3407  */
   3408 static int period_size_is_plausible_for_low_latency(int period_size)
   3409 {
   3410     switch (period_size) {
   3411     case 48:
   3412     case 96:
   3413     case 144:
   3414     case 160:
   3415     case 192:
   3416     case 240:
   3417     case 320:
   3418     case 480:
   3419         return 1;
   3420     default:
   3421         return 0;
   3422     }
   3423 }
   3424 
   3425 static void adev_snd_mon_cb(void * stream __unused, struct str_parms * parms)
   3426 {
   3427     int card;
   3428     card_status_t status;
   3429 
   3430     if (!parms)
   3431         return;
   3432 
   3433     if (parse_snd_card_status(parms, &card, &status) < 0)
   3434         return;
   3435 
   3436     pthread_mutex_lock(&adev->lock);
   3437     bool valid_cb = (card == adev->snd_card);
   3438     if (valid_cb) {
   3439         if (adev->card_status != status) {
   3440             adev->card_status = status;
   3441             platform_snd_card_update(adev->platform, status);
   3442         }
   3443     }
   3444     pthread_mutex_unlock(&adev->lock);
   3445     return;
   3446 }
   3447 
   3448 static int adev_open(const hw_module_t *module, const char *name,
   3449                      hw_device_t **device)
   3450 {
   3451     int i, ret;
   3452 
   3453     ALOGD("%s: enter", __func__);
   3454     if (strcmp(name, AUDIO_HARDWARE_INTERFACE) != 0) return -EINVAL;
   3455     pthread_mutex_lock(&adev_init_lock);
   3456     if (audio_device_ref_count != 0) {
   3457         *device = &adev->device.common;
   3458         audio_device_ref_count++;
   3459         ALOGV("%s: returning existing instance of adev", __func__);
   3460         ALOGV("%s: exit", __func__);
   3461         pthread_mutex_unlock(&adev_init_lock);
   3462         return 0;
   3463     }
   3464     adev = calloc(1, sizeof(struct audio_device));
   3465 
   3466     pthread_mutex_init(&adev->lock, (const pthread_mutexattr_t *) NULL);
   3467 
   3468     adev->device.common.tag = HARDWARE_DEVICE_TAG;
   3469     adev->device.common.version = AUDIO_DEVICE_API_VERSION_2_0;
   3470     adev->device.common.module = (struct hw_module_t *)module;
   3471     adev->device.common.close = adev_close;
   3472 
   3473     adev->device.init_check = adev_init_check;
   3474     adev->device.set_voice_volume = adev_set_voice_volume;
   3475     adev->device.set_master_volume = adev_set_master_volume;
   3476     adev->device.get_master_volume = adev_get_master_volume;
   3477     adev->device.set_master_mute = adev_set_master_mute;
   3478     adev->device.get_master_mute = adev_get_master_mute;
   3479     adev->device.set_mode = adev_set_mode;
   3480     adev->device.set_mic_mute = adev_set_mic_mute;
   3481     adev->device.get_mic_mute = adev_get_mic_mute;
   3482     adev->device.set_parameters = adev_set_parameters;
   3483     adev->device.get_parameters = adev_get_parameters;
   3484     adev->device.get_input_buffer_size = adev_get_input_buffer_size;
   3485     adev->device.open_output_stream = adev_open_output_stream;
   3486     adev->device.close_output_stream = adev_close_output_stream;
   3487     adev->device.open_input_stream = adev_open_input_stream;
   3488     adev->device.close_input_stream = adev_close_input_stream;
   3489     adev->device.dump = adev_dump;
   3490 
   3491     /* Set the default route before the PCM stream is opened */
   3492     pthread_mutex_lock(&adev->lock);
   3493     adev->mode = AUDIO_MODE_NORMAL;
   3494     adev->active_input = NULL;
   3495     adev->primary_output = NULL;
   3496     adev->bluetooth_nrec = true;
   3497     adev->acdb_settings = TTY_MODE_OFF;
   3498     /* adev->cur_hdmi_channels = 0;  by calloc() */
   3499     adev->snd_dev_ref_cnt = calloc(SND_DEVICE_MAX, sizeof(int));
   3500     voice_init(adev);
   3501     list_init(&adev->usecase_list);
   3502     pthread_mutex_unlock(&adev->lock);
   3503 
   3504     /* Loads platform specific libraries dynamically */
   3505     adev->platform = platform_init(adev);
   3506     if (!adev->platform) {
   3507         free(adev->snd_dev_ref_cnt);
   3508         free(adev);
   3509         ALOGE("%s: Failed to init platform data, aborting.", __func__);
   3510         *device = NULL;
   3511         pthread_mutex_unlock(&adev_init_lock);
   3512         return -EINVAL;
   3513     }
   3514     adev->extspk = audio_extn_extspk_init(adev);
   3515     audio_extn_sound_trigger_init(adev);
   3516 
   3517     adev->visualizer_lib = dlopen(VISUALIZER_LIBRARY_PATH, RTLD_NOW);
   3518     if (adev->visualizer_lib == NULL) {
   3519         ALOGW("%s: DLOPEN failed for %s", __func__, VISUALIZER_LIBRARY_PATH);
   3520     } else {
   3521         ALOGV("%s: DLOPEN successful for %s", __func__, VISUALIZER_LIBRARY_PATH);
   3522         adev->visualizer_start_output =
   3523                     (int (*)(audio_io_handle_t, int))dlsym(adev->visualizer_lib,
   3524                                                     "visualizer_hal_start_output");
   3525         adev->visualizer_stop_output =
   3526                     (int (*)(audio_io_handle_t, int))dlsym(adev->visualizer_lib,
   3527                                                     "visualizer_hal_stop_output");
   3528     }
   3529 
   3530     adev->offload_effects_lib = dlopen(OFFLOAD_EFFECTS_BUNDLE_LIBRARY_PATH, RTLD_NOW);
   3531     if (adev->offload_effects_lib == NULL) {
   3532         ALOGW("%s: DLOPEN failed for %s", __func__,
   3533               OFFLOAD_EFFECTS_BUNDLE_LIBRARY_PATH);
   3534     } else {
   3535         ALOGV("%s: DLOPEN successful for %s", __func__,
   3536               OFFLOAD_EFFECTS_BUNDLE_LIBRARY_PATH);
   3537         adev->offload_effects_start_output =
   3538                     (int (*)(audio_io_handle_t, int))dlsym(adev->offload_effects_lib,
   3539                                      "offload_effects_bundle_hal_start_output");
   3540         adev->offload_effects_stop_output =
   3541                     (int (*)(audio_io_handle_t, int))dlsym(adev->offload_effects_lib,
   3542                                      "offload_effects_bundle_hal_stop_output");
   3543     }
   3544 
   3545     adev->adm_lib = dlopen(ADM_LIBRARY_PATH, RTLD_NOW);
   3546     if (adev->adm_lib == NULL) {
   3547         ALOGW("%s: DLOPEN failed for %s", __func__, ADM_LIBRARY_PATH);
   3548     } else {
   3549         ALOGV("%s: DLOPEN successful for %s", __func__, ADM_LIBRARY_PATH);
   3550         adev->adm_init = (adm_init_t)
   3551                                 dlsym(adev->adm_lib, "adm_init");
   3552         adev->adm_deinit = (adm_deinit_t)
   3553                                 dlsym(adev->adm_lib, "adm_deinit");
   3554         adev->adm_register_input_stream = (adm_register_input_stream_t)
   3555                                 dlsym(adev->adm_lib, "adm_register_input_stream");
   3556         adev->adm_register_output_stream = (adm_register_output_stream_t)
   3557                                 dlsym(adev->adm_lib, "adm_register_output_stream");
   3558         adev->adm_deregister_stream = (adm_deregister_stream_t)
   3559                                 dlsym(adev->adm_lib, "adm_deregister_stream");
   3560         adev->adm_request_focus = (adm_request_focus_t)
   3561                                 dlsym(adev->adm_lib, "adm_request_focus");
   3562         adev->adm_abandon_focus = (adm_abandon_focus_t)
   3563                                 dlsym(adev->adm_lib, "adm_abandon_focus");
   3564         adev->adm_set_config = (adm_set_config_t)
   3565                                     dlsym(adev->adm_lib, "adm_set_config");
   3566         adev->adm_request_focus_v2 = (adm_request_focus_v2_t)
   3567                                     dlsym(adev->adm_lib, "adm_request_focus_v2");
   3568         adev->adm_is_noirq_avail = (adm_is_noirq_avail_t)
   3569                                     dlsym(adev->adm_lib, "adm_is_noirq_avail");
   3570         adev->adm_on_routing_change = (adm_on_routing_change_t)
   3571                                     dlsym(adev->adm_lib, "adm_on_routing_change");
   3572     }
   3573 
   3574     adev->bt_wb_speech_enabled = false;
   3575     adev->enable_voicerx = false;
   3576 
   3577     *device = &adev->device.common;
   3578 
   3579     if (k_enable_extended_precision)
   3580         adev_verify_devices(adev);
   3581 
   3582     char value[PROPERTY_VALUE_MAX];
   3583     int trial;
   3584     if (property_get("audio_hal.period_size", value, NULL) > 0) {
   3585         trial = atoi(value);
   3586         if (period_size_is_plausible_for_low_latency(trial)) {
   3587             pcm_config_low_latency.period_size = trial;
   3588             pcm_config_low_latency.start_threshold = trial / 4;
   3589             pcm_config_low_latency.avail_min = trial / 4;
   3590             configured_low_latency_capture_period_size = trial;
   3591         }
   3592     }
   3593     if (property_get("audio_hal.in_period_size", value, NULL) > 0) {
   3594         trial = atoi(value);
   3595         if (period_size_is_plausible_for_low_latency(trial)) {
   3596             configured_low_latency_capture_period_size = trial;
   3597         }
   3598     }
   3599 
   3600     audio_device_ref_count++;
   3601 
   3602     if (property_get("audio_hal.period_multiplier", value, NULL) > 0) {
   3603         af_period_multiplier = atoi(value);
   3604         if (af_period_multiplier < 0) {
   3605             af_period_multiplier = 2;
   3606         } else if (af_period_multiplier > 4) {
   3607             af_period_multiplier = 4;
   3608         }
   3609         ALOGV("new period_multiplier = %d", af_period_multiplier);
   3610     }
   3611 
   3612     pthread_mutex_unlock(&adev_init_lock);
   3613 
   3614     if (adev->adm_init)
   3615         adev->adm_data = adev->adm_init();
   3616 
   3617     audio_extn_perf_lock_init();
   3618     audio_extn_snd_mon_init();
   3619     pthread_mutex_lock(&adev->lock);
   3620     audio_extn_snd_mon_register_listener(NULL, adev_snd_mon_cb);
   3621     adev->card_status = CARD_STATUS_ONLINE;
   3622     pthread_mutex_unlock(&adev->lock);
   3623 
   3624     ALOGD("%s: exit", __func__);
   3625     return 0;
   3626 }
   3627 
   3628 static struct hw_module_methods_t hal_module_methods = {
   3629     .open = adev_open,
   3630 };
   3631 
   3632 struct audio_module HAL_MODULE_INFO_SYM = {
   3633     .common = {
   3634         .tag = HARDWARE_MODULE_TAG,
   3635         .module_api_version = AUDIO_MODULE_API_VERSION_0_1,
   3636         .hal_api_version = HARDWARE_HAL_API_VERSION,
   3637         .id = AUDIO_HARDWARE_MODULE_ID,
   3638         .name = "QCOM Audio HAL",
   3639         .author = "Code Aurora Forum",
   3640         .methods = &hal_module_methods,
   3641     },
   3642 };
   3643