• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  #include <limits.h>
37  
38  #include <log/log.h>
39  #include <cutils/trace.h>
40  #include <cutils/str_parms.h>
41  #include <cutils/properties.h>
42  #include <cutils/atomic.h>
43  #include <utils/Timers.h> // systemTime
44  
45  #include <hardware/audio_effect.h>
46  #include <hardware/audio_alsaops.h>
47  #include <processgroup/sched_policy.h>
48  #include <system/thread_defs.h>
49  #include <tinyalsa/asoundlib.h>
50  #include <audio_effects/effect_aec.h>
51  #include <audio_effects/effect_ns.h>
52  #include <audio_utils/clock.h>
53  #include "audio_hw.h"
54  #include "audio_extn.h"
55  #include "audio_perf.h"
56  #include "platform_api.h"
57  #include <platform.h>
58  #include "voice_extn.h"
59  
60  #include "sound/compress_params.h"
61  #include "audio_extn/tfa_98xx.h"
62  #include "audio_extn/maxxaudio.h"
63  #include "audio_extn/audiozoom.h"
64  
65  /* COMPRESS_OFFLOAD_FRAGMENT_SIZE must be more than 8KB and a multiple of 32KB if more than 32KB.
66   * COMPRESS_OFFLOAD_FRAGMENT_SIZE * COMPRESS_OFFLOAD_NUM_FRAGMENTS must be less than 8MB. */
67  #define COMPRESS_OFFLOAD_FRAGMENT_SIZE (256 * 1024)
68  // 2 buffers causes problems with high bitrate files
69  #define COMPRESS_OFFLOAD_NUM_FRAGMENTS 3
70  /* ToDo: Check and update a proper value in msec */
71  #define COMPRESS_OFFLOAD_PLAYBACK_LATENCY 96
72  /* treat as unsigned Q1.13 */
73  #define APP_TYPE_GAIN_DEFAULT         0x2000
74  #define COMPRESS_PLAYBACK_VOLUME_MAX 0x2000
75  #define PCM_PLAYBACK_VOLUME_MAX 0x2000
76  #define INVALID_OUT_VOLUME -1
77  
78  /* treat as unsigned Q1.13 */
79  #define VOIP_PLAYBACK_VOLUME_MAX 0x2000
80  
81  #define RECORD_GAIN_MIN 0.0f
82  #define RECORD_GAIN_MAX 1.0f
83  #define RECORD_VOLUME_CTL_MAX 0x2000
84  
85  #define PROXY_OPEN_RETRY_COUNT           100
86  #define PROXY_OPEN_WAIT_TIME             20
87  
88  #define MIN_CHANNEL_COUNT                1
89  #define DEFAULT_CHANNEL_COUNT            2
90  
91  #ifndef MAX_TARGET_SPECIFIC_CHANNEL_CNT
92  #define MAX_CHANNEL_COUNT 1
93  #else
94  #define MAX_CHANNEL_COUNT atoi(XSTR(MAX_TARGET_SPECIFIC_CHANNEL_CNT))
95  #define XSTR(x) STR(x)
96  #define STR(x) #x
97  #endif
98  #define MAX_HIFI_CHANNEL_COUNT 8
99  
100  #define ULL_PERIOD_SIZE (DEFAULT_OUTPUT_SAMPLING_RATE/1000)
101  
102  static unsigned int configured_low_latency_capture_period_size =
103          LOW_LATENCY_CAPTURE_PERIOD_SIZE;
104  
105  
106  #define MMAP_PERIOD_SIZE (DEFAULT_OUTPUT_SAMPLING_RATE/1000)
107  #define MMAP_PERIOD_COUNT_MIN 32
108  #define MMAP_PERIOD_COUNT_MAX 512
109  #define MMAP_PERIOD_COUNT_DEFAULT (MMAP_PERIOD_COUNT_MAX)
110  #define MMAP_MIN_SIZE_FRAMES_MAX 64 * 1024
111  
112  /* This constant enables extended precision handling.
113   * TODO The flag is off until more testing is done.
114   */
115  static const bool k_enable_extended_precision = false;
116  
117  struct pcm_config pcm_config_deep_buffer = {
118      .channels = DEFAULT_CHANNEL_COUNT,
119      .rate = DEFAULT_OUTPUT_SAMPLING_RATE,
120      .period_size = DEEP_BUFFER_OUTPUT_PERIOD_SIZE,
121      .period_count = DEEP_BUFFER_OUTPUT_PERIOD_COUNT,
122      .format = PCM_FORMAT_S16_LE,
123      .start_threshold = DEEP_BUFFER_OUTPUT_PERIOD_SIZE / 4,
124      .stop_threshold = INT_MAX,
125      .avail_min = DEEP_BUFFER_OUTPUT_PERIOD_SIZE / 4,
126  };
127  
128  struct pcm_config pcm_config_low_latency = {
129      .channels = DEFAULT_CHANNEL_COUNT,
130      .rate = DEFAULT_OUTPUT_SAMPLING_RATE,
131      .period_size = LOW_LATENCY_OUTPUT_PERIOD_SIZE,
132      .period_count = LOW_LATENCY_OUTPUT_PERIOD_COUNT,
133      .format = PCM_FORMAT_S16_LE,
134      .start_threshold = LOW_LATENCY_OUTPUT_PERIOD_SIZE / 4,
135      .stop_threshold = INT_MAX,
136      .avail_min = LOW_LATENCY_OUTPUT_PERIOD_SIZE / 4,
137  };
138  
139  struct pcm_config pcm_config_haptics_audio = {
140      .channels = 1,
141      .rate = DEFAULT_OUTPUT_SAMPLING_RATE,
142      .period_size = LOW_LATENCY_OUTPUT_PERIOD_SIZE,
143      .period_count = LOW_LATENCY_OUTPUT_PERIOD_COUNT,
144      .format = PCM_FORMAT_S16_LE,
145      .start_threshold = LOW_LATENCY_OUTPUT_PERIOD_SIZE / 4,
146      .stop_threshold = INT_MAX,
147      .avail_min = LOW_LATENCY_OUTPUT_PERIOD_SIZE / 4,
148  };
149  
150  struct pcm_config pcm_config_haptics = {
151      .channels = 1,
152      .rate = DEFAULT_OUTPUT_SAMPLING_RATE,
153      .period_count = 2,
154      .format = PCM_FORMAT_S16_LE,
155      .stop_threshold = INT_MAX,
156      .avail_min = 0,
157  };
158  
159  static int af_period_multiplier = 4;
160  struct pcm_config pcm_config_rt = {
161      .channels = DEFAULT_CHANNEL_COUNT,
162      .rate = DEFAULT_OUTPUT_SAMPLING_RATE,
163      .period_size = ULL_PERIOD_SIZE, //1 ms
164      .period_count = 512, //=> buffer size is 512ms
165      .format = PCM_FORMAT_S16_LE,
166      .start_threshold = ULL_PERIOD_SIZE*8, //8ms
167      .stop_threshold = INT_MAX,
168      .silence_threshold = 0,
169      .silence_size = 0,
170      .avail_min = ULL_PERIOD_SIZE, //1 ms
171  };
172  
173  struct pcm_config pcm_config_hdmi_multi = {
174      .channels = HDMI_MULTI_DEFAULT_CHANNEL_COUNT, /* changed when the stream is opened */
175      .rate = DEFAULT_OUTPUT_SAMPLING_RATE, /* changed when the stream is opened */
176      .period_size = HDMI_MULTI_PERIOD_SIZE,
177      .period_count = HDMI_MULTI_PERIOD_COUNT,
178      .format = PCM_FORMAT_S16_LE,
179      .start_threshold = 0,
180      .stop_threshold = INT_MAX,
181      .avail_min = 0,
182  };
183  
184  struct pcm_config pcm_config_mmap_playback = {
185      .channels = DEFAULT_CHANNEL_COUNT,
186      .rate = DEFAULT_OUTPUT_SAMPLING_RATE,
187      .period_size = MMAP_PERIOD_SIZE,
188      .period_count = MMAP_PERIOD_COUNT_DEFAULT,
189      .format = PCM_FORMAT_S16_LE,
190      .start_threshold = MMAP_PERIOD_SIZE*8,
191      .stop_threshold = INT32_MAX,
192      .silence_threshold = 0,
193      .silence_size = 0,
194      .avail_min = MMAP_PERIOD_SIZE, //1 ms
195  };
196  
197  struct pcm_config pcm_config_hifi = {
198      .channels = DEFAULT_CHANNEL_COUNT, /* changed when the stream is opened */
199      .rate = DEFAULT_OUTPUT_SAMPLING_RATE, /* changed when the stream is opened */
200      .period_size = DEEP_BUFFER_OUTPUT_PERIOD_SIZE, /* change #define */
201      .period_count = DEEP_BUFFER_OUTPUT_PERIOD_COUNT,
202      .format = PCM_FORMAT_S24_3LE,
203      .start_threshold = 0,
204      .stop_threshold = INT_MAX,
205      .avail_min = 0,
206  };
207  
208  struct pcm_config pcm_config_audio_capture = {
209      .channels = DEFAULT_CHANNEL_COUNT,
210      .period_count = AUDIO_CAPTURE_PERIOD_COUNT,
211      .format = PCM_FORMAT_S16_LE,
212      .stop_threshold = INT_MAX,
213      .avail_min = 0,
214  };
215  
216  struct pcm_config pcm_config_audio_capture_rt = {
217      .channels = DEFAULT_CHANNEL_COUNT,
218      .rate = DEFAULT_OUTPUT_SAMPLING_RATE,
219      .period_size = ULL_PERIOD_SIZE,
220      .period_count = 512,
221      .format = PCM_FORMAT_S16_LE,
222      .start_threshold = 0,
223      .stop_threshold = INT_MAX,
224      .silence_threshold = 0,
225      .silence_size = 0,
226      .avail_min = ULL_PERIOD_SIZE, //1 ms
227  };
228  
229  struct pcm_config pcm_config_mmap_capture = {
230      .channels = DEFAULT_CHANNEL_COUNT,
231      .rate = DEFAULT_OUTPUT_SAMPLING_RATE,
232      .period_size = MMAP_PERIOD_SIZE,
233      .period_count = MMAP_PERIOD_COUNT_DEFAULT,
234      .format = PCM_FORMAT_S16_LE,
235      .start_threshold = 0,
236      .stop_threshold = INT_MAX,
237      .silence_threshold = 0,
238      .silence_size = 0,
239      .avail_min = MMAP_PERIOD_SIZE, //1 ms
240  };
241  
242  struct pcm_config pcm_config_voip = {
243      .channels = 1,
244      .period_count = 2,
245      .format = PCM_FORMAT_S16_LE,
246      .stop_threshold = INT_MAX,
247      .avail_min = 0,
248  };
249  
250  #define AFE_PROXY_CHANNEL_COUNT 2
251  #define AFE_PROXY_SAMPLING_RATE 48000
252  
253  #define AFE_PROXY_PLAYBACK_PERIOD_SIZE  256
254  #define AFE_PROXY_PLAYBACK_PERIOD_COUNT 4
255  
256  struct pcm_config pcm_config_afe_proxy_playback = {
257      .channels = AFE_PROXY_CHANNEL_COUNT,
258      .rate = AFE_PROXY_SAMPLING_RATE,
259      .period_size = AFE_PROXY_PLAYBACK_PERIOD_SIZE,
260      .period_count = AFE_PROXY_PLAYBACK_PERIOD_COUNT,
261      .format = PCM_FORMAT_S16_LE,
262      .start_threshold = AFE_PROXY_PLAYBACK_PERIOD_SIZE,
263      .stop_threshold = INT_MAX,
264      .avail_min = AFE_PROXY_PLAYBACK_PERIOD_SIZE,
265  };
266  
267  #define AFE_PROXY_RECORD_PERIOD_SIZE  256
268  #define AFE_PROXY_RECORD_PERIOD_COUNT 4
269  
270  struct pcm_config pcm_config_afe_proxy_record = {
271      .channels = AFE_PROXY_CHANNEL_COUNT,
272      .rate = AFE_PROXY_SAMPLING_RATE,
273      .period_size = AFE_PROXY_RECORD_PERIOD_SIZE,
274      .period_count = AFE_PROXY_RECORD_PERIOD_COUNT,
275      .format = PCM_FORMAT_S16_LE,
276      .start_threshold = AFE_PROXY_RECORD_PERIOD_SIZE,
277      .stop_threshold = AFE_PROXY_RECORD_PERIOD_SIZE * AFE_PROXY_RECORD_PERIOD_COUNT,
278      .avail_min = AFE_PROXY_RECORD_PERIOD_SIZE,
279  };
280  
281  const char * const use_case_table[AUDIO_USECASE_MAX] = {
282      [USECASE_AUDIO_PLAYBACK_DEEP_BUFFER] = "deep-buffer-playback",
283      [USECASE_AUDIO_PLAYBACK_LOW_LATENCY] = "low-latency-playback",
284      [USECASE_AUDIO_PLAYBACK_WITH_HAPTICS] = "audio-with-haptics-playback",
285      [USECASE_AUDIO_PLAYBACK_HIFI] = "hifi-playback",
286      [USECASE_AUDIO_PLAYBACK_OFFLOAD] = "compress-offload-playback",
287      [USECASE_AUDIO_PLAYBACK_TTS] = "audio-tts-playback",
288      [USECASE_AUDIO_PLAYBACK_ULL] = "audio-ull-playback",
289      [USECASE_AUDIO_PLAYBACK_MMAP] = "mmap-playback",
290  
291      [USECASE_AUDIO_RECORD] = "audio-record",
292      [USECASE_AUDIO_RECORD_LOW_LATENCY] = "low-latency-record",
293      [USECASE_AUDIO_RECORD_MMAP] = "mmap-record",
294      [USECASE_AUDIO_RECORD_HIFI] = "hifi-record",
295  
296      [USECASE_AUDIO_HFP_SCO] = "hfp-sco",
297      [USECASE_AUDIO_HFP_SCO_WB] = "hfp-sco-wb",
298  
299      [USECASE_VOICE_CALL] = "voice-call",
300      [USECASE_VOICE2_CALL] = "voice2-call",
301      [USECASE_VOLTE_CALL] = "volte-call",
302      [USECASE_QCHAT_CALL] = "qchat-call",
303      [USECASE_VOWLAN_CALL] = "vowlan-call",
304      [USECASE_VOICEMMODE1_CALL] = "voicemmode1-call",
305      [USECASE_VOICEMMODE2_CALL] = "voicemmode2-call",
306  
307      [USECASE_AUDIO_SPKR_CALIB_RX] = "spkr-rx-calib",
308      [USECASE_AUDIO_SPKR_CALIB_TX] = "spkr-vi-record",
309  
310      [USECASE_AUDIO_PLAYBACK_AFE_PROXY] = "afe-proxy-playback",
311      [USECASE_AUDIO_RECORD_AFE_PROXY] = "afe-proxy-record",
312  
313      [USECASE_INCALL_REC_UPLINK] = "incall-rec-uplink",
314      [USECASE_INCALL_REC_DOWNLINK] = "incall-rec-downlink",
315      [USECASE_INCALL_REC_UPLINK_AND_DOWNLINK] = "incall-rec-uplink-and-downlink",
316  
317      [USECASE_AUDIO_PLAYBACK_VOIP] = "audio-playback-voip",
318      [USECASE_AUDIO_RECORD_VOIP] = "audio-record-voip",
319  
320      [USECASE_INCALL_MUSIC_UPLINK] = "incall-music-uplink",
321      [USECASE_INCALL_MUSIC_UPLINK2] = "incall-music-uplink2",
322  
323      [USECASE_AUDIO_A2DP_ABR_FEEDBACK] = "a2dp-abr-feedback",
324  };
325  
326  
327  #define STRING_TO_ENUM(string) { #string, string }
328  
329  struct string_to_enum {
330      const char *name;
331      uint32_t value;
332  };
333  
334  static const struct string_to_enum channels_name_to_enum_table[] = {
335      STRING_TO_ENUM(AUDIO_CHANNEL_OUT_STEREO),
336      STRING_TO_ENUM(AUDIO_CHANNEL_OUT_5POINT1),
337      STRING_TO_ENUM(AUDIO_CHANNEL_OUT_7POINT1),
338      STRING_TO_ENUM(AUDIO_CHANNEL_IN_MONO),
339      STRING_TO_ENUM(AUDIO_CHANNEL_IN_STEREO),
340      STRING_TO_ENUM(AUDIO_CHANNEL_IN_FRONT_BACK),
341      STRING_TO_ENUM(AUDIO_CHANNEL_INDEX_MASK_1),
342      STRING_TO_ENUM(AUDIO_CHANNEL_INDEX_MASK_2),
343      STRING_TO_ENUM(AUDIO_CHANNEL_INDEX_MASK_3),
344      STRING_TO_ENUM(AUDIO_CHANNEL_INDEX_MASK_4),
345      STRING_TO_ENUM(AUDIO_CHANNEL_INDEX_MASK_5),
346      STRING_TO_ENUM(AUDIO_CHANNEL_INDEX_MASK_6),
347      STRING_TO_ENUM(AUDIO_CHANNEL_INDEX_MASK_7),
348      STRING_TO_ENUM(AUDIO_CHANNEL_INDEX_MASK_8),
349  };
350  
351  struct in_effect_list {
352      struct listnode list;
353      effect_handle_t handle;
354  };
355  
356  static int set_voice_volume_l(struct audio_device *adev, float volume);
357  static struct audio_device *adev = NULL;
358  static pthread_mutex_t adev_init_lock = PTHREAD_MUTEX_INITIALIZER;
359  static unsigned int audio_device_ref_count;
360  //cache last MBDRC cal step level
361  static int last_known_cal_step = -1 ;
362  
363  static int check_a2dp_restore_l(struct audio_device *adev, struct stream_out *out, bool restore);
364  static int out_set_compr_volume(struct audio_stream_out *stream, float left, float right);
365  static int out_set_pcm_volume(struct audio_stream_out *stream, float left, float right);
366  
367  static int in_set_microphone_direction(const struct audio_stream_in *stream,
368                                             audio_microphone_direction_t dir);
369  static int in_set_microphone_field_dimension(const struct audio_stream_in *stream, float zoom);
370  
may_use_noirq_mode(struct audio_device * adev,audio_usecase_t uc_id,int flags __unused)371  static bool may_use_noirq_mode(struct audio_device *adev, audio_usecase_t uc_id,
372                                 int flags __unused)
373  {
374      int dir = 0;
375      switch (uc_id) {
376      case USECASE_AUDIO_RECORD_LOW_LATENCY:
377          dir = 1;
378      case USECASE_AUDIO_PLAYBACK_ULL:
379          break;
380      default:
381          return false;
382      }
383  
384      int dev_id = platform_get_pcm_device_id(uc_id, dir == 0 ?
385                                              PCM_PLAYBACK : PCM_CAPTURE);
386      if (adev->adm_is_noirq_avail)
387          return adev->adm_is_noirq_avail(adev->adm_data,
388                                          adev->snd_card, dev_id, dir);
389      return false;
390  }
391  
register_out_stream(struct stream_out * out)392  static void register_out_stream(struct stream_out *out)
393  {
394      struct audio_device *adev = out->dev;
395      if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD)
396          return;
397  
398      if (!adev->adm_register_output_stream)
399          return;
400  
401      adev->adm_register_output_stream(adev->adm_data,
402                                       out->handle,
403                                       out->flags);
404  
405      if (!adev->adm_set_config)
406          return;
407  
408      if (out->realtime) {
409          adev->adm_set_config(adev->adm_data,
410                               out->handle,
411                               out->pcm, &out->config);
412      }
413  }
414  
register_in_stream(struct stream_in * in)415  static void register_in_stream(struct stream_in *in)
416  {
417      struct audio_device *adev = in->dev;
418      if (!adev->adm_register_input_stream)
419          return;
420  
421      adev->adm_register_input_stream(adev->adm_data,
422                                      in->capture_handle,
423                                      in->flags);
424  
425      if (!adev->adm_set_config)
426          return;
427  
428      if (in->realtime) {
429          adev->adm_set_config(adev->adm_data,
430                               in->capture_handle,
431                               in->pcm,
432                               &in->config);
433      }
434  }
435  
request_out_focus(struct stream_out * out,long ns)436  static void request_out_focus(struct stream_out *out, long ns)
437  {
438      struct audio_device *adev = out->dev;
439  
440      if (adev->adm_request_focus_v2) {
441          adev->adm_request_focus_v2(adev->adm_data, out->handle, ns);
442      } else if (adev->adm_request_focus) {
443          adev->adm_request_focus(adev->adm_data, out->handle);
444      }
445  }
446  
request_in_focus(struct stream_in * in,long ns)447  static void request_in_focus(struct stream_in *in, long ns)
448  {
449      struct audio_device *adev = in->dev;
450  
451      if (adev->adm_request_focus_v2) {
452          adev->adm_request_focus_v2(adev->adm_data, in->capture_handle, ns);
453      } else if (adev->adm_request_focus) {
454          adev->adm_request_focus(adev->adm_data, in->capture_handle);
455      }
456  }
457  
release_out_focus(struct stream_out * out,long ns __unused)458  static void release_out_focus(struct stream_out *out, long ns __unused)
459  {
460      struct audio_device *adev = out->dev;
461  
462      if (adev->adm_abandon_focus)
463          adev->adm_abandon_focus(adev->adm_data, out->handle);
464  }
465  
release_in_focus(struct stream_in * in,long ns __unused)466  static void release_in_focus(struct stream_in *in, long ns __unused)
467  {
468      struct audio_device *adev = in->dev;
469      if (adev->adm_abandon_focus)
470          adev->adm_abandon_focus(adev->adm_data, in->capture_handle);
471  }
472  
parse_snd_card_status(struct str_parms * parms,int * card,card_status_t * status)473  static int parse_snd_card_status(struct str_parms * parms, int * card,
474                                   card_status_t * status)
475  {
476      char value[32]={0};
477      char state[32]={0};
478  
479      int ret = str_parms_get_str(parms, "SND_CARD_STATUS", value, sizeof(value));
480  
481      if (ret < 0)
482          return -1;
483  
484      // sscanf should be okay as value is of max length 32.
485      // same as sizeof state.
486      if (sscanf(value, "%d,%s", card, state) < 2)
487          return -1;
488  
489      *status = !strcmp(state, "ONLINE") ? CARD_STATUS_ONLINE :
490                                           CARD_STATUS_OFFLINE;
491      return 0;
492  }
493  
494  // always call with adev lock held
send_gain_dep_calibration_l()495  void send_gain_dep_calibration_l() {
496      if (last_known_cal_step >= 0)
497          platform_send_gain_dep_cal(adev->platform, last_known_cal_step);
498  }
499  
500  __attribute__ ((visibility ("default")))
audio_hw_send_gain_dep_calibration(int level)501  bool audio_hw_send_gain_dep_calibration(int level) {
502      bool ret_val = false;
503      ALOGV("%s: enter ... ", __func__);
504  
505      pthread_mutex_lock(&adev_init_lock);
506  
507      if (adev != NULL && adev->platform != NULL) {
508          pthread_mutex_lock(&adev->lock);
509          last_known_cal_step = level;
510          send_gain_dep_calibration_l();
511          pthread_mutex_unlock(&adev->lock);
512      } else {
513          ALOGE("%s: %s is NULL", __func__, adev == NULL ? "adev" : "adev->platform");
514      }
515  
516      pthread_mutex_unlock(&adev_init_lock);
517  
518      ALOGV("%s: exit with ret_val %d ", __func__, ret_val);
519      return ret_val;
520  }
521  
522  #ifdef MAXXAUDIO_QDSP_ENABLED
audio_hw_send_ma_parameter(int stream_type,float vol,bool active)523  bool audio_hw_send_ma_parameter(int stream_type, float vol, bool active)
524  {
525      bool ret = false;
526      ALOGV("%s: enter ...", __func__);
527  
528      pthread_mutex_lock(&adev_init_lock);
529  
530      if (adev != NULL && adev->platform != NULL) {
531          pthread_mutex_lock(&adev->lock);
532          ret = audio_extn_ma_set_state(adev, stream_type, vol, active);
533          pthread_mutex_unlock(&adev->lock);
534      }
535  
536      pthread_mutex_unlock(&adev_init_lock);
537  
538      ALOGV("%s: exit with ret %d", __func__, ret);
539      return ret;
540  }
541  #else
542  #define audio_hw_send_ma_parameter(stream_type, vol, active) (0)
543  #endif
544  
545  __attribute__ ((visibility ("default")))
audio_hw_get_gain_level_mapping(struct amp_db_and_gain_table * mapping_tbl,int table_size)546  int audio_hw_get_gain_level_mapping(struct amp_db_and_gain_table *mapping_tbl,
547                                      int table_size) {
548       int ret_val = 0;
549       ALOGV("%s: enter ... ", __func__);
550  
551       pthread_mutex_lock(&adev_init_lock);
552       if (adev == NULL) {
553           ALOGW("%s: adev is NULL .... ", __func__);
554           goto done;
555       }
556  
557       pthread_mutex_lock(&adev->lock);
558       ret_val = platform_get_gain_level_mapping(mapping_tbl, table_size);
559       pthread_mutex_unlock(&adev->lock);
560  done:
561       pthread_mutex_unlock(&adev_init_lock);
562       ALOGV("%s: exit ... ", __func__);
563       return ret_val;
564  }
565  
is_supported_format(audio_format_t format)566  static bool is_supported_format(audio_format_t format)
567  {
568      switch (format) {
569          case AUDIO_FORMAT_MP3:
570          case AUDIO_FORMAT_AAC_LC:
571          case AUDIO_FORMAT_AAC_HE_V1:
572          case AUDIO_FORMAT_AAC_HE_V2:
573              return true;
574          default:
575              break;
576      }
577      return false;
578  }
579  
is_supported_24bits_audiosource(audio_source_t source)580  static bool is_supported_24bits_audiosource(audio_source_t source)
581  {
582      switch (source) {
583          case AUDIO_SOURCE_UNPROCESSED:
584  #ifdef ENABLED_24BITS_CAMCORDER
585          case AUDIO_SOURCE_CAMCORDER:
586  #endif
587              return true;
588          default:
589              break;
590      }
591      return false;
592  }
593  
is_mmap_usecase(audio_usecase_t uc_id)594  static inline bool is_mmap_usecase(audio_usecase_t uc_id)
595  {
596      return (uc_id == USECASE_AUDIO_RECORD_AFE_PROXY) ||
597             (uc_id == USECASE_AUDIO_PLAYBACK_AFE_PROXY);
598  }
599  
get_snd_codec_id(audio_format_t format)600  static int get_snd_codec_id(audio_format_t format)
601  {
602      int id = 0;
603  
604      switch (format & AUDIO_FORMAT_MAIN_MASK) {
605      case AUDIO_FORMAT_MP3:
606          id = SND_AUDIOCODEC_MP3;
607          break;
608      case AUDIO_FORMAT_AAC:
609          id = SND_AUDIOCODEC_AAC;
610          break;
611      default:
612          ALOGE("%s: Unsupported audio format", __func__);
613      }
614  
615      return id;
616  }
617  
audio_ssr_status(struct audio_device * adev)618  static int audio_ssr_status(struct audio_device *adev)
619  {
620      int ret = 0;
621      struct mixer_ctl *ctl;
622      const char *mixer_ctl_name = "Audio SSR Status";
623  
624      ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
625      ret = mixer_ctl_get_value(ctl, 0);
626      ALOGD("%s: value: %d", __func__, ret);
627      return ret;
628  }
629  
stream_app_type_cfg_init(struct stream_app_type_cfg * cfg)630  static void stream_app_type_cfg_init(struct stream_app_type_cfg *cfg)
631  {
632      cfg->gain[0] = cfg->gain[1] = APP_TYPE_GAIN_DEFAULT;
633  }
634  
is_btsco_device(snd_device_t out_snd_device,snd_device_t in_snd_device)635  static bool is_btsco_device(snd_device_t out_snd_device, snd_device_t in_snd_device)
636  {
637     return out_snd_device == SND_DEVICE_OUT_BT_SCO ||
638            out_snd_device == SND_DEVICE_OUT_BT_SCO_WB ||
639            in_snd_device == SND_DEVICE_IN_BT_SCO_MIC_WB_NREC ||
640            in_snd_device == SND_DEVICE_IN_BT_SCO_MIC_WB ||
641            in_snd_device == SND_DEVICE_IN_BT_SCO_MIC_NREC ||
642            in_snd_device == SND_DEVICE_IN_BT_SCO_MIC;
643  
644  }
645  
is_a2dp_device(snd_device_t out_snd_device)646  static bool is_a2dp_device(snd_device_t out_snd_device)
647  {
648     return out_snd_device == SND_DEVICE_OUT_BT_A2DP;
649  }
650  
enable_audio_route(struct audio_device * adev,struct audio_usecase * usecase)651  int enable_audio_route(struct audio_device *adev,
652                         struct audio_usecase *usecase)
653  {
654      snd_device_t snd_device;
655      char mixer_path[MIXER_PATH_MAX_LENGTH];
656  
657      if (usecase == NULL)
658          return -EINVAL;
659  
660      ALOGV("%s: enter: usecase(%d)", __func__, usecase->id);
661  
662      audio_extn_sound_trigger_update_stream_status(usecase, ST_EVENT_STREAM_BUSY);
663  
664      if (usecase->type == PCM_CAPTURE) {
665          struct stream_in *in = usecase->stream.in;
666          struct audio_usecase *uinfo;
667          snd_device = usecase->in_snd_device;
668  
669          if (in) {
670              if (in->enable_aec || in->enable_ec_port) {
671                  audio_devices_t out_device = AUDIO_DEVICE_OUT_SPEAKER;
672                  struct listnode *node;
673                  struct audio_usecase *voip_usecase = get_usecase_from_list(adev,
674                                                             USECASE_AUDIO_PLAYBACK_VOIP);
675                  if (voip_usecase) {
676                      out_device = voip_usecase->stream.out->devices;
677                  } else if (adev->primary_output &&
678                                !adev->primary_output->standby) {
679                      out_device = adev->primary_output->devices;
680                  } else {
681                      list_for_each(node, &adev->usecase_list) {
682                          uinfo = node_to_item(node, struct audio_usecase, list);
683                          if (uinfo->type != PCM_CAPTURE) {
684                              out_device = uinfo->stream.out->devices;
685                              break;
686                          }
687                      }
688                  }
689                  platform_set_echo_reference(adev, true, out_device);
690                  in->ec_opened = true;
691              }
692          }
693      } else
694          snd_device = usecase->out_snd_device;
695      audio_extn_utils_send_app_type_cfg(adev, usecase);
696      audio_extn_ma_set_device(usecase);
697      audio_extn_utils_send_audio_calibration(adev, usecase);
698  
699      // we shouldn't truncate mixer_path
700      ALOGW_IF(strlcpy(mixer_path, use_case_table[usecase->id], sizeof(mixer_path))
701              >= sizeof(mixer_path), "%s: truncation on mixer path", __func__);
702      // this also appends to mixer_path
703      platform_add_backend_name(adev->platform, mixer_path, snd_device);
704  
705      ALOGD("%s: usecase(%d) apply and update mixer path: %s", __func__,  usecase->id, mixer_path);
706      audio_route_apply_and_update_path(adev->audio_route, mixer_path);
707  
708      ALOGV("%s: exit", __func__);
709      return 0;
710  }
711  
disable_audio_route(struct audio_device * adev,struct audio_usecase * usecase)712  int disable_audio_route(struct audio_device *adev,
713                          struct audio_usecase *usecase)
714  {
715      snd_device_t snd_device;
716      char mixer_path[MIXER_PATH_MAX_LENGTH];
717  
718      if (usecase == NULL)
719          return -EINVAL;
720  
721      ALOGV("%s: enter: usecase(%d)", __func__, usecase->id);
722      if (usecase->type == PCM_CAPTURE)
723          snd_device = usecase->in_snd_device;
724      else
725          snd_device = usecase->out_snd_device;
726  
727      // we shouldn't truncate mixer_path
728      ALOGW_IF(strlcpy(mixer_path, use_case_table[usecase->id], sizeof(mixer_path))
729              >= sizeof(mixer_path), "%s: truncation on mixer path", __func__);
730      // this also appends to mixer_path
731      platform_add_backend_name(adev->platform, mixer_path, snd_device);
732      ALOGD("%s: usecase(%d) reset and update mixer path: %s", __func__, usecase->id, mixer_path);
733  
734      audio_route_reset_and_update_path(adev->audio_route, mixer_path);
735      if (usecase->type == PCM_CAPTURE) {
736          struct stream_in *in = usecase->stream.in;
737          if (in && in->ec_opened) {
738              platform_set_echo_reference(in->dev, false, AUDIO_DEVICE_NONE);
739              in->ec_opened = false;
740          }
741      }
742      audio_extn_sound_trigger_update_stream_status(usecase, ST_EVENT_STREAM_FREE);
743  
744      ALOGV("%s: exit", __func__);
745      return 0;
746  }
747  
enable_snd_device(struct audio_device * adev,snd_device_t snd_device)748  int enable_snd_device(struct audio_device *adev,
749                        snd_device_t snd_device)
750  {
751      int i, num_devices = 0;
752      snd_device_t new_snd_devices[2];
753      int ret_val = -EINVAL;
754      if (snd_device < SND_DEVICE_MIN ||
755          snd_device >= SND_DEVICE_MAX) {
756          ALOGE("%s: Invalid sound device %d", __func__, snd_device);
757          goto on_error;
758      }
759  
760      platform_send_audio_calibration(adev->platform, snd_device);
761  
762      if (adev->snd_dev_ref_cnt[snd_device] >= 1) {
763          ALOGV("%s: snd_device(%d: %s) is already active",
764                __func__, snd_device, platform_get_snd_device_name(snd_device));
765          goto on_success;
766      }
767  
768      /* due to the possibility of calibration overwrite between listen
769          and audio, notify sound trigger hal before audio calibration is sent */
770      audio_extn_sound_trigger_update_device_status(snd_device,
771                                      ST_EVENT_SND_DEVICE_BUSY);
772  
773      if (audio_extn_spkr_prot_is_enabled())
774           audio_extn_spkr_prot_calib_cancel(adev);
775  
776      audio_extn_dsm_feedback_enable(adev, snd_device, true);
777  
778      if ((snd_device == SND_DEVICE_OUT_SPEAKER ||
779          snd_device == SND_DEVICE_OUT_SPEAKER_SAFE ||
780          snd_device == SND_DEVICE_OUT_SPEAKER_REVERSE ||
781          snd_device == SND_DEVICE_OUT_VOICE_SPEAKER) &&
782          audio_extn_spkr_prot_is_enabled()) {
783          if (platform_get_snd_device_acdb_id(snd_device) < 0) {
784              goto on_error;
785          }
786          if (audio_extn_spkr_prot_start_processing(snd_device)) {
787              ALOGE("%s: spkr_start_processing failed", __func__);
788              goto on_error;
789          }
790      } else if (platform_can_split_snd_device(snd_device,
791                                               &num_devices,
792                                               new_snd_devices) == 0) {
793          for (i = 0; i < num_devices; i++) {
794              enable_snd_device(adev, new_snd_devices[i]);
795          }
796          platform_set_speaker_gain_in_combo(adev, snd_device, true);
797      } else {
798          char device_name[DEVICE_NAME_MAX_SIZE] = {0};
799          if (platform_get_snd_device_name_extn(adev->platform, snd_device, device_name) < 0 ) {
800              ALOGE(" %s: Invalid sound device returned", __func__);
801              goto on_error;
802          }
803  
804          ALOGD("%s: snd_device(%d: %s)", __func__, snd_device, device_name);
805  
806          if (is_a2dp_device(snd_device)) {
807              if (audio_extn_a2dp_start_playback() < 0) {
808                  ALOGE("%s: failed to configure A2DP control path", __func__);
809                  goto on_error;
810              } else {
811                  adev->a2dp_started = true;
812              }
813          }
814  
815          audio_route_apply_and_update_path(adev->audio_route, device_name);
816      }
817  on_success:
818      adev->snd_dev_ref_cnt[snd_device]++;
819      ret_val = 0;
820  on_error:
821      return ret_val;
822  }
823  
disable_snd_device(struct audio_device * adev,snd_device_t snd_device)824  int disable_snd_device(struct audio_device *adev,
825                         snd_device_t snd_device)
826  {
827      int i, num_devices = 0;
828      snd_device_t new_snd_devices[2];
829  
830      if (snd_device < SND_DEVICE_MIN ||
831          snd_device >= SND_DEVICE_MAX) {
832          ALOGE("%s: Invalid sound device %d", __func__, snd_device);
833          return -EINVAL;
834      }
835      if (adev->snd_dev_ref_cnt[snd_device] <= 0) {
836          ALOGE("%s: device ref cnt is already 0", __func__);
837          return -EINVAL;
838      }
839      audio_extn_tfa_98xx_disable_speaker(snd_device);
840  
841      adev->snd_dev_ref_cnt[snd_device]--;
842      if (adev->snd_dev_ref_cnt[snd_device] == 0) {
843          audio_extn_dsm_feedback_enable(adev, snd_device, false);
844  
845          if (is_a2dp_device(snd_device)) {
846              audio_extn_a2dp_stop_playback();
847              adev->a2dp_started = false;
848          }
849          if ((snd_device == SND_DEVICE_OUT_SPEAKER ||
850              snd_device == SND_DEVICE_OUT_SPEAKER_SAFE ||
851              snd_device == SND_DEVICE_OUT_SPEAKER_REVERSE ||
852              snd_device == SND_DEVICE_OUT_VOICE_SPEAKER) &&
853              audio_extn_spkr_prot_is_enabled()) {
854              audio_extn_spkr_prot_stop_processing(snd_device);
855  
856              // FIXME b/65363602: bullhead is the only Nexus with audio_extn_spkr_prot_is_enabled()
857              // and does not use speaker swap. As this code causes a problem with device enable ref
858              // counting we remove it for now.
859              // when speaker device is disabled, reset swap.
860              // will be renabled on usecase start
861              // platform_set_swap_channels(adev, false);
862  
863          } else if (platform_can_split_snd_device(snd_device,
864                                                   &num_devices,
865                                                   new_snd_devices) == 0) {
866              for (i = 0; i < num_devices; i++) {
867                  disable_snd_device(adev, new_snd_devices[i]);
868              }
869              platform_set_speaker_gain_in_combo(adev, snd_device, false);
870          } else {
871              char device_name[DEVICE_NAME_MAX_SIZE] = {0};
872              if (platform_get_snd_device_name_extn(adev->platform, snd_device, device_name) < 0 ) {
873                  ALOGE(" %s: Invalid sound device returned", __func__);
874                  return -EINVAL;
875              }
876  
877              ALOGD("%s: snd_device(%d: %s)", __func__, snd_device, device_name);
878              audio_route_reset_and_update_path(adev->audio_route, device_name);
879          }
880          audio_extn_sound_trigger_update_device_status(snd_device,
881                                          ST_EVENT_SND_DEVICE_FREE);
882      }
883  
884      return 0;
885  }
886  
887  #ifdef DYNAMIC_ECNS_ENABLED
send_effect_enable_disable_mixer_ctl(struct audio_device * adev,struct stream_in * in,struct audio_effect_config effect_config,unsigned int param_value)888  static int send_effect_enable_disable_mixer_ctl(struct audio_device *adev,
889                            struct stream_in *in,
890                            struct audio_effect_config effect_config,
891                            unsigned int param_value)
892  {
893      char mixer_ctl_name[] = "Audio Effect";
894      long set_values[6];
895  
896      struct mixer_ctl *ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
897      if (!ctl) {
898          ALOGE("%s: Could not get mixer ctl - %s",
899                 __func__, mixer_ctl_name);
900          return -EINVAL;
901      }
902  
903      set_values[0] = 1; //0:Rx 1:Tx
904      set_values[1] = in->app_type_cfg.app_type;
905      set_values[2] = (long)effect_config.module_id;
906      set_values[3] = (long)effect_config.instance_id;
907      set_values[4] = (long)effect_config.param_id;
908      set_values[5] = param_value;
909  
910      mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
911  
912      return 0;
913  
914  }
915  
update_effect_param_ecns(struct audio_usecase * usecase,unsigned int module_id,int effect_type,unsigned int * param_value)916  static int update_effect_param_ecns(struct audio_usecase *usecase,
917                                 unsigned int module_id, int effect_type,
918                                 unsigned int *param_value)
919  {
920      int ret = 0;
921      struct audio_effect_config other_effect_config;
922      struct stream_in *in = NULL;
923  
924      if (!usecase)
925          return -EINVAL;
926  
927      in = usecase->stream.in;
928  
929      /* Get the effect config data of the other effect */
930      ret = platform_get_effect_config_data(usecase->in_snd_device,
931                                            &other_effect_config,
932                                            effect_type == EFFECT_AEC ? EFFECT_NS : EFFECT_AEC);
933      if (ret < 0) {
934          ALOGE("%s Failed to get effect params %d", __func__, ret);
935          return ret;
936      }
937  
938      if (module_id == other_effect_config.module_id) {
939              //Same module id for AEC/NS. Values need to be combined
940              if (((effect_type == EFFECT_AEC) && (in->enable_ns)) ||
941                  ((effect_type == EFFECT_NS) && (in->enable_aec)))
942                  *param_value |= other_effect_config.param_value;
943      }
944  
945      return ret;
946  }
947  
enable_disable_effect(struct audio_device * adev,struct stream_in * in,int effect_type,bool enable)948  static int enable_disable_effect(struct audio_device *adev, struct stream_in *in,
949                                     int effect_type, bool enable)
950  {
951      struct audio_effect_config effect_config;
952      struct audio_usecase *usecase = NULL;
953      int ret = 0;
954      unsigned int param_value = 0;
955  
956      if (!in) {
957          ALOGE("%s: Invalid input stream", __func__);
958          return -EINVAL;
959      }
960  
961      ALOGD("%s: effect_type:%d enable:%d", __func__, effect_type, enable);
962  
963      usecase = get_usecase_from_list(adev, in->usecase);
964  
965      ret = platform_get_effect_config_data(usecase->in_snd_device,
966                                             &effect_config, effect_type);
967      if (ret < 0) {
968          ALOGE("%s Failed to get module id %d", __func__, ret);
969          return ret;
970      }
971      ALOGV("%s: module %d app_type %d usecase->id:%d usecase->in_snd_device:%d",
972             __func__, effect_config.module_id, in->app_type_cfg.app_type,
973            usecase->id, usecase->in_snd_device);
974  
975      if (enable)
976          param_value = effect_config.param_value;
977  
978      /*Special handling for AEC & NS effects Param values need to be
979        updated if module ids are same*/
980  
981      if ((effect_type == EFFECT_AEC) || (effect_type == EFFECT_NS)) {
982          ret = update_effect_param_ecns(usecase, effect_config.module_id,
983                                         effect_type, &param_value);
984          if (ret < 0)
985              return ret;
986      }
987  
988      ret = send_effect_enable_disable_mixer_ctl(adev, in,
989                                                 effect_config, param_value);
990  
991      return ret;
992  }
993  
check_and_enable_effect(struct audio_device * adev)994  static int check_and_enable_effect(struct audio_device *adev)
995  {
996      int ret = 0;
997  
998      struct listnode *node;
999      struct stream_in *in = NULL;
1000  
1001      list_for_each(node, &adev->usecase_list)
1002      {
1003          struct audio_usecase *usecase = node_to_item(node, struct audio_usecase, list);
1004          if (usecase->type == PCM_CAPTURE && usecase->stream.in != NULL) {
1005              in = usecase->stream.in;
1006  
1007              if (in->standby)
1008                  continue;
1009  
1010              if (in->enable_aec) {
1011                  ret = enable_disable_effect(adev, in, EFFECT_AEC, true);
1012              }
1013  
1014              if (in->enable_ns &&
1015                  in->source == AUDIO_SOURCE_VOICE_COMMUNICATION) {
1016                  ret = enable_disable_effect(adev, in, EFFECT_NS, true);
1017              }
1018          }
1019      }
1020  
1021      return ret;
1022  }
1023  #else
1024  #define enable_disable_effect(w, x, y, z) -ENOSYS
1025  #define check_and_enable_effect(x) -ENOSYS
1026  #endif
1027  
1028  /*
1029    legend:
1030    uc - existing usecase
1031    new_uc - new usecase
1032    d1, d11, d2 - SND_DEVICE enums
1033    a1, a2 - corresponding ANDROID device enums
1034    B, B1, B2 - backend strings
1035  
1036  case 1
1037    uc->dev  d1 (a1)               B1
1038    new_uc->dev d1 (a1), d2 (a2)   B1, B2
1039  
1040    resolution: disable and enable uc->dev on d1
1041  
1042  case 2
1043    uc->dev d1 (a1)        B1
1044    new_uc->dev d11 (a1)   B1
1045  
1046    resolution: need to switch uc since d1 and d11 are related
1047    (e.g. speaker and voice-speaker)
1048    use ANDROID_DEVICE_OUT enums to match devices since SND_DEVICE enums may vary
1049  
1050  case 3
1051    uc->dev d1 (a1)        B1
1052    new_uc->dev d2 (a2)    B2
1053  
1054    resolution: no need to switch uc
1055  
1056  case 4
1057    uc->dev d1 (a1)      B
1058    new_uc->dev d2 (a2)  B
1059  
1060    resolution: disable enable uc-dev on d2 since backends match
1061    we cannot enable two streams on two different devices if they
1062    share the same backend. e.g. if offload is on speaker device using
1063    QUAD_MI2S backend and a low-latency stream is started on voice-handset
1064    using the same backend, offload must also be switched to voice-handset.
1065  
1066  case 5
1067    uc->dev  d1 (a1)                  B
1068    new_uc->dev d1 (a1), d2 (a2)      B
1069  
1070    resolution: disable enable uc-dev on d2 since backends match
1071    we cannot enable two streams on two different devices if they
1072    share the same backend.
1073  
1074  case 6
1075    uc->dev  d1 a1    B1
1076    new_uc->dev d2 a1 B2
1077  
1078    resolution: no need to switch
1079  
1080  case 7
1081  
1082    uc->dev d1 (a1), d2 (a2)       B1, B2
1083    new_uc->dev d1                 B1
1084  
1085    resolution: no need to switch
1086  
1087  */
derive_playback_snd_device(struct audio_usecase * uc,struct audio_usecase * new_uc,snd_device_t new_snd_device)1088  static snd_device_t derive_playback_snd_device(struct audio_usecase *uc,
1089                                                 struct audio_usecase *new_uc,
1090                                                 snd_device_t new_snd_device)
1091  {
1092      audio_devices_t a1 = uc->stream.out->devices;
1093      audio_devices_t a2 = new_uc->stream.out->devices;
1094  
1095      snd_device_t d1 = uc->out_snd_device;
1096      snd_device_t d2 = new_snd_device;
1097  
1098      // Treat as a special case when a1 and a2 are not disjoint
1099      if ((a1 != a2) && (a1 & a2)) {
1100          snd_device_t d3[2];
1101          int num_devices = 0;
1102          int ret = platform_can_split_snd_device(popcount(a1) > 1 ? d1 : d2,
1103                                                  &num_devices,
1104                                                  d3);
1105          if (ret < 0) {
1106              if (ret != -ENOSYS) {
1107                  ALOGW("%s failed to split snd_device %d",
1108                        __func__,
1109                        popcount(a1) > 1 ? d1 : d2);
1110              }
1111              goto end;
1112          }
1113  
1114          // NB: case 7 is hypothetical and isn't a practical usecase yet.
1115          // But if it does happen, we need to give priority to d2 if
1116          // the combo devices active on the existing usecase share a backend.
1117          // This is because we cannot have a usecase active on a combo device
1118          // and a new usecase requests one device in this combo pair.
1119          if (platform_check_backends_match(d3[0], d3[1])) {
1120              return d2; // case 5
1121          } else {
1122              return d1; // case 1
1123          }
1124      } else {
1125          if (platform_check_backends_match(d1, d2)) {
1126              return d2; // case 2, 4
1127          } else {
1128              return d1; // case 6, 3
1129          }
1130      }
1131  
1132  end:
1133      return d2; // return whatever was calculated before.
1134  }
1135  
check_and_route_playback_usecases(struct audio_device * adev,struct audio_usecase * uc_info,snd_device_t snd_device)1136  static void check_and_route_playback_usecases(struct audio_device *adev,
1137                                                struct audio_usecase *uc_info,
1138                                                snd_device_t snd_device)
1139  {
1140      struct listnode *node;
1141      struct audio_usecase *usecase;
1142      bool switch_device[AUDIO_USECASE_MAX];
1143      int i, num_uc_to_switch = 0;
1144  
1145      bool force_routing =  platform_check_and_set_playback_backend_cfg(adev,
1146                                                                        uc_info,
1147                                                                        snd_device);
1148  
1149      /* For a2dp device reconfigure all active sessions
1150       * with new AFE encoder format based on a2dp state
1151       */
1152      if ((SND_DEVICE_OUT_BT_A2DP == snd_device ||
1153           SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP == snd_device ||
1154           SND_DEVICE_OUT_SPEAKER_SAFE_AND_BT_A2DP == snd_device) &&
1155           audio_extn_a2dp_is_force_device_switch()) {
1156           force_routing = true;
1157      }
1158  
1159      /*
1160       * This function is to make sure that all the usecases that are active on
1161       * the hardware codec backend are always routed to any one device that is
1162       * handled by the hardware codec.
1163       * For example, if low-latency and deep-buffer usecases are currently active
1164       * on speaker and out_set_parameters(headset) is received on low-latency
1165       * output, then we have to make sure deep-buffer is also switched to headset,
1166       * because of the limitation that both the devices cannot be enabled
1167       * at the same time as they share the same backend.
1168       */
1169      /* Disable all the usecases on the shared backend other than the
1170         specified usecase */
1171      for (i = 0; i < AUDIO_USECASE_MAX; i++)
1172          switch_device[i] = false;
1173  
1174      list_for_each(node, &adev->usecase_list) {
1175          usecase = node_to_item(node, struct audio_usecase, list);
1176          if (usecase->type == PCM_CAPTURE || usecase == uc_info)
1177              continue;
1178  
1179          if (force_routing ||
1180              (usecase->out_snd_device != snd_device &&
1181               (usecase->devices & AUDIO_DEVICE_OUT_ALL_CODEC_BACKEND ||
1182                usecase->devices & (AUDIO_DEVICE_OUT_USB_DEVICE|AUDIO_DEVICE_OUT_USB_HEADSET)) &&
1183               platform_check_backends_match(snd_device, usecase->out_snd_device))) {
1184              ALOGV("%s: Usecase (%s) is active on (%s) - disabling ..",
1185                    __func__, use_case_table[usecase->id],
1186                    platform_get_snd_device_name(usecase->out_snd_device));
1187              disable_audio_route(adev, usecase);
1188              switch_device[usecase->id] = true;
1189              num_uc_to_switch++;
1190          }
1191      }
1192  
1193      if (num_uc_to_switch) {
1194          list_for_each(node, &adev->usecase_list) {
1195              usecase = node_to_item(node, struct audio_usecase, list);
1196              if (switch_device[usecase->id]) {
1197                  disable_snd_device(adev, usecase->out_snd_device);
1198              }
1199          }
1200  
1201          snd_device_t d_device;
1202          list_for_each(node, &adev->usecase_list) {
1203              usecase = node_to_item(node, struct audio_usecase, list);
1204              if (switch_device[usecase->id]) {
1205                  d_device = derive_playback_snd_device(usecase, uc_info,
1206                                                        snd_device);
1207                  enable_snd_device(adev, d_device);
1208                  /* Update the out_snd_device before enabling the audio route */
1209                  usecase->out_snd_device = d_device;
1210              }
1211          }
1212  
1213          /* Re-route all the usecases on the shared backend other than the
1214             specified usecase to new snd devices */
1215          list_for_each(node, &adev->usecase_list) {
1216              usecase = node_to_item(node, struct audio_usecase, list);
1217              if (switch_device[usecase->id] ) {
1218                  enable_audio_route(adev, usecase);
1219                  if (usecase->stream.out && usecase->id == USECASE_AUDIO_PLAYBACK_VOIP) {
1220                      struct stream_out *out = usecase->stream.out;
1221                      audio_extn_utils_send_app_type_gain(out->dev,
1222                                                          out->app_type_cfg.app_type,
1223                                                          &out->app_type_cfg.gain[0]);
1224                  }
1225              }
1226          }
1227      }
1228  }
1229  
check_and_route_capture_usecases(struct audio_device * adev,struct audio_usecase * uc_info,snd_device_t snd_device)1230  static void check_and_route_capture_usecases(struct audio_device *adev,
1231                                               struct audio_usecase *uc_info,
1232                                               snd_device_t snd_device)
1233  {
1234      struct listnode *node;
1235      struct audio_usecase *usecase;
1236      bool switch_device[AUDIO_USECASE_MAX];
1237      int i, num_uc_to_switch = 0;
1238  
1239      platform_check_and_set_capture_backend_cfg(adev, uc_info, snd_device);
1240  
1241      /*
1242       * This function is to make sure that all the active capture usecases
1243       * are always routed to the same input sound device.
1244       * For example, if audio-record and voice-call usecases are currently
1245       * active on speaker(rx) and speaker-mic (tx) and out_set_parameters(earpiece)
1246       * is received for voice call then we have to make sure that audio-record
1247       * usecase is also switched to earpiece i.e. voice-dmic-ef,
1248       * because of the limitation that two devices cannot be enabled
1249       * at the same time if they share the same backend.
1250       */
1251      for (i = 0; i < AUDIO_USECASE_MAX; i++)
1252          switch_device[i] = false;
1253  
1254      list_for_each(node, &adev->usecase_list) {
1255          usecase = node_to_item(node, struct audio_usecase, list);
1256          if (usecase->type != PCM_PLAYBACK &&
1257                  usecase != uc_info &&
1258                  usecase->in_snd_device != snd_device &&
1259                  ((uc_info->type == VOICE_CALL &&
1260                    usecase->devices == AUDIO_DEVICE_IN_VOICE_CALL) ||
1261                   platform_check_backends_match(snd_device,\
1262                                                usecase->in_snd_device)) &&
1263                  (usecase->id != USECASE_AUDIO_SPKR_CALIB_TX)) {
1264              ALOGV("%s: Usecase (%s) is active on (%s) - disabling ..",
1265                    __func__, use_case_table[usecase->id],
1266                    platform_get_snd_device_name(usecase->in_snd_device));
1267              disable_audio_route(adev, usecase);
1268              switch_device[usecase->id] = true;
1269              num_uc_to_switch++;
1270          }
1271      }
1272  
1273      if (num_uc_to_switch) {
1274          list_for_each(node, &adev->usecase_list) {
1275              usecase = node_to_item(node, struct audio_usecase, list);
1276              if (switch_device[usecase->id]) {
1277                  disable_snd_device(adev, usecase->in_snd_device);
1278              }
1279          }
1280  
1281          list_for_each(node, &adev->usecase_list) {
1282              usecase = node_to_item(node, struct audio_usecase, list);
1283              if (switch_device[usecase->id]) {
1284                  enable_snd_device(adev, snd_device);
1285              }
1286          }
1287  
1288          /* Re-route all the usecases on the shared backend other than the
1289             specified usecase to new snd devices */
1290          list_for_each(node, &adev->usecase_list) {
1291              usecase = node_to_item(node, struct audio_usecase, list);
1292              /* Update the in_snd_device only before enabling the audio route */
1293              if (switch_device[usecase->id] ) {
1294                  usecase->in_snd_device = snd_device;
1295                  enable_audio_route(adev, usecase);
1296              }
1297          }
1298      }
1299  }
1300  
1301  /* must be called with hw device mutex locked */
read_hdmi_channel_masks(struct stream_out * out)1302  static int read_hdmi_channel_masks(struct stream_out *out)
1303  {
1304      int ret = 0;
1305      int channels = platform_edid_get_max_channels(out->dev->platform);
1306  
1307      switch (channels) {
1308          /*
1309           * Do not handle stereo output in Multi-channel cases
1310           * Stereo case is handled in normal playback path
1311           */
1312      case 6:
1313          ALOGV("%s: HDMI supports 5.1", __func__);
1314          out->supported_channel_masks[0] = AUDIO_CHANNEL_OUT_5POINT1;
1315          break;
1316      case 8:
1317          ALOGV("%s: HDMI supports 5.1 and 7.1 channels", __func__);
1318          out->supported_channel_masks[0] = AUDIO_CHANNEL_OUT_5POINT1;
1319          out->supported_channel_masks[1] = AUDIO_CHANNEL_OUT_7POINT1;
1320          break;
1321      default:
1322          ALOGE("HDMI does not support multi channel playback");
1323          ret = -ENOSYS;
1324          break;
1325      }
1326      return ret;
1327  }
1328  
read_usb_sup_sample_rates(bool is_playback,uint32_t * supported_sample_rates,uint32_t max_rates)1329  static ssize_t read_usb_sup_sample_rates(bool is_playback,
1330                                           uint32_t *supported_sample_rates,
1331                                           uint32_t max_rates)
1332  {
1333      ssize_t count = audio_extn_usb_sup_sample_rates(is_playback,
1334                                                      supported_sample_rates,
1335                                                      max_rates);
1336  #if !LOG_NDEBUG
1337      for (ssize_t i=0; i<count; i++) {
1338          ALOGV("%s %s %d", __func__, is_playback ? "P" : "C",
1339                supported_sample_rates[i]);
1340      }
1341  #endif
1342      return count;
1343  }
1344  
read_usb_sup_channel_masks(bool is_playback,audio_channel_mask_t * supported_channel_masks,uint32_t max_masks)1345  static int read_usb_sup_channel_masks(bool is_playback,
1346                                        audio_channel_mask_t *supported_channel_masks,
1347                                        uint32_t max_masks)
1348  {
1349      int channels = audio_extn_usb_get_max_channels(is_playback);
1350      int channel_count;
1351      uint32_t num_masks = 0;
1352      if (channels > MAX_HIFI_CHANNEL_COUNT) {
1353          channels = MAX_HIFI_CHANNEL_COUNT;
1354      }
1355      if (is_playback) {
1356          // start from 2 channels as framework currently doesn't support mono.
1357          if (channels >= FCC_2) {
1358              supported_channel_masks[num_masks++] = audio_channel_out_mask_from_count(FCC_2);
1359          }
1360          for (channel_count = FCC_2;
1361                  channel_count <= channels && num_masks < max_masks;
1362                  ++channel_count) {
1363              supported_channel_masks[num_masks++] =
1364                      audio_channel_mask_for_index_assignment_from_count(channel_count);
1365          }
1366      } else {
1367          // For capture we report all supported channel masks from 1 channel up.
1368          channel_count = MIN_CHANNEL_COUNT;
1369          // audio_channel_in_mask_from_count() does the right conversion to either positional or
1370          // indexed mask
1371          for ( ; channel_count <= channels && num_masks < max_masks; channel_count++) {
1372              audio_channel_mask_t mask = AUDIO_CHANNEL_NONE;
1373              if (channel_count <= FCC_2) {
1374                  mask = audio_channel_in_mask_from_count(channel_count);
1375                  supported_channel_masks[num_masks++] = mask;
1376              }
1377              const audio_channel_mask_t index_mask =
1378                      audio_channel_mask_for_index_assignment_from_count(channel_count);
1379              if (mask != index_mask && num_masks < max_masks) { // ensure index mask added.
1380                  supported_channel_masks[num_masks++] = index_mask;
1381              }
1382          }
1383      }
1384  #ifdef NDEBUG
1385      for (size_t i = 0; i < num_masks; ++i) {
1386          ALOGV("%s: %s supported ch %d supported_channel_masks[%zu] %08x num_masks %d", __func__,
1387                is_playback ? "P" : "C", channels, i, supported_channel_masks[i], num_masks);
1388      }
1389  #endif
1390      return num_masks;
1391  }
1392  
read_usb_sup_formats(bool is_playback __unused,audio_format_t * supported_formats,uint32_t max_formats __unused)1393  static int read_usb_sup_formats(bool is_playback __unused,
1394                                  audio_format_t *supported_formats,
1395                                  uint32_t max_formats __unused)
1396  {
1397      int bitwidth = audio_extn_usb_get_max_bit_width(is_playback);
1398      switch (bitwidth) {
1399          case 24:
1400              // XXX : usb.c returns 24 for s24 and s24_le?
1401              supported_formats[0] = AUDIO_FORMAT_PCM_24_BIT_PACKED;
1402              break;
1403          case 32:
1404              supported_formats[0] = AUDIO_FORMAT_PCM_32_BIT;
1405              break;
1406          case 16:
1407          default :
1408              supported_formats[0] = AUDIO_FORMAT_PCM_16_BIT;
1409              break;
1410      }
1411      ALOGV("%s: %s supported format %d", __func__,
1412            is_playback ? "P" : "C", bitwidth);
1413      return 1;
1414  }
1415  
read_usb_sup_params_and_compare(bool is_playback,audio_format_t * format,audio_format_t * supported_formats,uint32_t max_formats,audio_channel_mask_t * mask,audio_channel_mask_t * supported_channel_masks,uint32_t max_masks,uint32_t * rate,uint32_t * supported_sample_rates,uint32_t max_rates)1416  static int read_usb_sup_params_and_compare(bool is_playback,
1417                                             audio_format_t *format,
1418                                             audio_format_t *supported_formats,
1419                                             uint32_t max_formats,
1420                                             audio_channel_mask_t *mask,
1421                                             audio_channel_mask_t *supported_channel_masks,
1422                                             uint32_t max_masks,
1423                                             uint32_t *rate,
1424                                             uint32_t *supported_sample_rates,
1425                                             uint32_t max_rates) {
1426      int ret = 0;
1427      int num_formats;
1428      int num_masks;
1429      int num_rates;
1430      int i;
1431  
1432      num_formats = read_usb_sup_formats(is_playback, supported_formats,
1433                                         max_formats);
1434      num_masks = read_usb_sup_channel_masks(is_playback, supported_channel_masks,
1435                                             max_masks);
1436  
1437      num_rates = read_usb_sup_sample_rates(is_playback,
1438                                            supported_sample_rates, max_rates);
1439  
1440  #define LUT(table, len, what, dflt)                  \
1441      for (i=0; i<len && (table[i] != what); i++);    \
1442      if (i==len) { ret |= (what == dflt ? 0 : -1); what=table[0]; }
1443  
1444      LUT(supported_formats, num_formats, *format, AUDIO_FORMAT_DEFAULT);
1445      LUT(supported_channel_masks, num_masks, *mask, AUDIO_CHANNEL_NONE);
1446      LUT(supported_sample_rates, num_rates, *rate, 0);
1447  
1448  #undef LUT
1449      return ret < 0 ? -EINVAL : 0; // HACK TBD
1450  }
1451  
is_usb_ready(struct audio_device * adev,bool is_playback)1452  static bool is_usb_ready(struct audio_device *adev, bool is_playback)
1453  {
1454      // Check if usb is ready.
1455      // The usb device may have been removed quickly after insertion and hence
1456      // no longer available.  This will show up as empty channel masks, or rates.
1457  
1458      pthread_mutex_lock(&adev->lock);
1459      uint32_t supported_sample_rate;
1460  
1461      // we consider usb ready if we can fetch at least one sample rate.
1462      const bool ready = read_usb_sup_sample_rates(
1463              is_playback, &supported_sample_rate, 1 /* max_rates */) > 0;
1464      pthread_mutex_unlock(&adev->lock);
1465      return ready;
1466  }
1467  
get_voice_usecase_id_from_list(struct audio_device * adev)1468  static audio_usecase_t get_voice_usecase_id_from_list(struct audio_device *adev)
1469  {
1470      struct audio_usecase *usecase;
1471      struct listnode *node;
1472  
1473      list_for_each(node, &adev->usecase_list) {
1474          usecase = node_to_item(node, struct audio_usecase, list);
1475          if (usecase->type == VOICE_CALL) {
1476              ALOGV("%s: usecase id %d", __func__, usecase->id);
1477              return usecase->id;
1478          }
1479      }
1480      return USECASE_INVALID;
1481  }
1482  
get_usecase_from_list(struct audio_device * adev,audio_usecase_t uc_id)1483  struct audio_usecase *get_usecase_from_list(struct audio_device *adev,
1484                                              audio_usecase_t uc_id)
1485  {
1486      struct audio_usecase *usecase;
1487      struct listnode *node;
1488  
1489      list_for_each(node, &adev->usecase_list) {
1490          usecase = node_to_item(node, struct audio_usecase, list);
1491          if (usecase->id == uc_id)
1492              return usecase;
1493      }
1494      return NULL;
1495  }
1496  
force_device_switch(struct audio_usecase * usecase)1497  static bool force_device_switch(struct audio_usecase *usecase)
1498  {
1499      if (usecase->type == PCM_CAPTURE || usecase->stream.out == NULL) {
1500          return false;
1501      }
1502  
1503      // Force all A2DP output devices to reconfigure for proper AFE encode format
1504      // Also handle a case where in earlier A2DP start failed as A2DP stream was
1505      // in suspended state, hence try to trigger a retry when we again get a routing request.
1506      if ((usecase->stream.out->devices & AUDIO_DEVICE_OUT_ALL_A2DP) &&
1507          audio_extn_a2dp_is_force_device_switch()) {
1508           ALOGD("%s: Force A2DP device switch to update new encoder config", __func__);
1509           return true;
1510      }
1511  
1512      return false;
1513  }
1514  
adev_get_active_input(const struct audio_device * adev)1515  struct stream_in *adev_get_active_input(const struct audio_device *adev)
1516  {
1517      struct listnode *node;
1518      struct stream_in *last_active_in = NULL;
1519  
1520      /* Get last added active input.
1521       * TODO: We may use a priority mechanism to pick highest priority active source */
1522      list_for_each(node, &adev->usecase_list)
1523      {
1524          struct audio_usecase *usecase = node_to_item(node, struct audio_usecase, list);
1525          if (usecase->type == PCM_CAPTURE && usecase->stream.in != NULL) {
1526              last_active_in =  usecase->stream.in;
1527          }
1528      }
1529  
1530      return last_active_in;
1531  }
1532  
get_voice_communication_input(const struct audio_device * adev)1533  struct stream_in *get_voice_communication_input(const struct audio_device *adev)
1534  {
1535      struct listnode *node;
1536  
1537      /* First check active inputs with voice communication source and then
1538       * any input if audio mode is in communication */
1539      list_for_each(node, &adev->usecase_list)
1540      {
1541          struct audio_usecase *usecase = node_to_item(node, struct audio_usecase, list);
1542          if (usecase->type == PCM_CAPTURE && usecase->stream.in != NULL &&
1543              usecase->stream.in->source == AUDIO_SOURCE_VOICE_COMMUNICATION) {
1544              return usecase->stream.in;
1545          }
1546      }
1547      if (adev->mode == AUDIO_MODE_IN_COMMUNICATION) {
1548          return adev_get_active_input(adev);
1549      }
1550      return NULL;
1551  }
1552  
1553  /*
1554   * Aligned with policy.h
1555   */
source_priority(int inputSource)1556  static inline int source_priority(int inputSource)
1557  {
1558      switch (inputSource) {
1559      case AUDIO_SOURCE_VOICE_COMMUNICATION:
1560          return 9;
1561      case AUDIO_SOURCE_CAMCORDER:
1562          return 8;
1563      case AUDIO_SOURCE_VOICE_PERFORMANCE:
1564          return 7;
1565      case AUDIO_SOURCE_UNPROCESSED:
1566          return 6;
1567      case AUDIO_SOURCE_MIC:
1568          return 5;
1569      case AUDIO_SOURCE_ECHO_REFERENCE:
1570          return 4;
1571      case AUDIO_SOURCE_FM_TUNER:
1572          return 3;
1573      case AUDIO_SOURCE_VOICE_RECOGNITION:
1574          return 2;
1575      case AUDIO_SOURCE_HOTWORD:
1576          return 1;
1577      default:
1578          break;
1579      }
1580      return 0;
1581  }
1582  
get_priority_input(struct audio_device * adev)1583  static struct stream_in *get_priority_input(struct audio_device *adev)
1584  {
1585      struct listnode *node;
1586      struct audio_usecase *usecase;
1587      int last_priority = 0, priority;
1588      struct stream_in *priority_in = NULL;
1589      struct stream_in *in;
1590  
1591      list_for_each(node, &adev->usecase_list) {
1592          usecase = node_to_item(node, struct audio_usecase, list);
1593          if (usecase->type == PCM_CAPTURE) {
1594              in = usecase->stream.in;
1595              if (!in)
1596                  continue;
1597              priority = source_priority(in->source);
1598  
1599              if (priority > last_priority) {
1600                  last_priority = priority;
1601                  priority_in = in;
1602              }
1603          }
1604      }
1605      return priority_in;
1606  }
1607  
select_devices_with_force_switch(struct audio_device * adev,audio_usecase_t uc_id,bool force_switch)1608  int select_devices_with_force_switch(struct audio_device *adev,
1609                                       audio_usecase_t uc_id,
1610                                       bool force_switch)
1611  {
1612      snd_device_t out_snd_device = SND_DEVICE_NONE;
1613      snd_device_t in_snd_device = SND_DEVICE_NONE;
1614      struct audio_usecase *usecase = NULL;
1615      struct audio_usecase *vc_usecase = NULL;
1616      struct audio_usecase *hfp_usecase = NULL;
1617      audio_usecase_t hfp_ucid;
1618      struct listnode *node;
1619      int status = 0;
1620      struct audio_usecase *voip_usecase = get_usecase_from_list(adev,
1621                                               USECASE_AUDIO_PLAYBACK_VOIP);
1622  
1623      usecase = get_usecase_from_list(adev, uc_id);
1624      if (usecase == NULL) {
1625          ALOGE("%s: Could not find the usecase(%d)", __func__, uc_id);
1626          return -EINVAL;
1627      }
1628  
1629      if ((usecase->type == VOICE_CALL) ||
1630          (usecase->type == PCM_HFP_CALL)) {
1631          out_snd_device = platform_get_output_snd_device(adev->platform,
1632                                                          usecase->stream.out->devices);
1633          in_snd_device = platform_get_input_snd_device(adev->platform,
1634                                                        NULL,
1635                                                        usecase->stream.out->devices);
1636          usecase->devices = usecase->stream.out->devices;
1637      } else {
1638          /*
1639           * If the voice call is active, use the sound devices of voice call usecase
1640           * so that it would not result any device switch. All the usecases will
1641           * be switched to new device when select_devices() is called for voice call
1642           * usecase. This is to avoid switching devices for voice call when
1643           * check_and_route_playback_usecases() is called below.
1644           */
1645          if (voice_is_in_call(adev)) {
1646              vc_usecase = get_usecase_from_list(adev,
1647                                                 get_voice_usecase_id_from_list(adev));
1648              if ((vc_usecase != NULL) &&
1649                  ((vc_usecase->devices & AUDIO_DEVICE_OUT_ALL_CODEC_BACKEND) ||
1650                   (vc_usecase->devices == AUDIO_DEVICE_OUT_HEARING_AID) ||
1651                   (usecase->devices == AUDIO_DEVICE_IN_VOICE_CALL))) {
1652                  in_snd_device = vc_usecase->in_snd_device;
1653                  out_snd_device = vc_usecase->out_snd_device;
1654              }
1655          } else if (audio_extn_hfp_is_active(adev)) {
1656              hfp_ucid = audio_extn_hfp_get_usecase();
1657              hfp_usecase = get_usecase_from_list(adev, hfp_ucid);
1658              if (hfp_usecase->devices & AUDIO_DEVICE_OUT_ALL_CODEC_BACKEND) {
1659                     in_snd_device = hfp_usecase->in_snd_device;
1660                     out_snd_device = hfp_usecase->out_snd_device;
1661              }
1662          }
1663          if (usecase->type == PCM_PLAYBACK) {
1664              usecase->devices = usecase->stream.out->devices;
1665              in_snd_device = SND_DEVICE_NONE;
1666              if (out_snd_device == SND_DEVICE_NONE) {
1667                  struct stream_out *voip_out = adev->primary_output;
1668                  struct stream_in *voip_in = get_voice_communication_input(adev);
1669  
1670                  out_snd_device = platform_get_output_snd_device(adev->platform,
1671                                              usecase->stream.out->devices);
1672  
1673                  if (voip_usecase)
1674                      voip_out = voip_usecase->stream.out;
1675  
1676                  if (usecase->stream.out == voip_out && voip_in != NULL) {
1677                      select_devices(adev, voip_in->usecase);
1678                  }
1679              }
1680          } else if (usecase->type == PCM_CAPTURE) {
1681              usecase->devices = usecase->stream.in->device;
1682              out_snd_device = SND_DEVICE_NONE;
1683              if (in_snd_device == SND_DEVICE_NONE) {
1684                  audio_devices_t out_device = AUDIO_DEVICE_NONE;
1685                  struct stream_in *voip_in = get_voice_communication_input(adev);
1686                  struct stream_in *priority_in = NULL;
1687  
1688                  if (voip_in != NULL) {
1689                      struct audio_usecase *voip_usecase = get_usecase_from_list(adev,
1690                                                               USECASE_AUDIO_PLAYBACK_VOIP);
1691  
1692                      usecase->stream.in->enable_ec_port = false;
1693  
1694                      if (usecase->id == USECASE_AUDIO_RECORD_AFE_PROXY) {
1695                          out_device = AUDIO_DEVICE_OUT_TELEPHONY_TX;
1696                      } else if (voip_usecase) {
1697                          out_device = voip_usecase->stream.out->devices;
1698                      } else if (adev->primary_output &&
1699                                    !adev->primary_output->standby) {
1700                          out_device = adev->primary_output->devices;
1701                      } else {
1702                          /* forcing speaker o/p device to get matching i/p pair
1703                             in case o/p is not routed from same primary HAL */
1704                          out_device = AUDIO_DEVICE_OUT_SPEAKER;
1705                      }
1706                      priority_in = voip_in;
1707                  } else {
1708                      /* get the input with the highest priority source*/
1709                      priority_in = get_priority_input(adev);
1710  
1711                      if (!priority_in)
1712                          priority_in = usecase->stream.in;
1713                  }
1714  
1715                  in_snd_device = platform_get_input_snd_device(adev->platform,
1716                                                                priority_in,
1717                                                                out_device);
1718              }
1719          }
1720      }
1721  
1722      if (out_snd_device == usecase->out_snd_device &&
1723          in_snd_device == usecase->in_snd_device) {
1724          if (!force_device_switch(usecase) && !force_switch)
1725              return 0;
1726      }
1727  
1728      if (is_a2dp_device(out_snd_device) && !audio_extn_a2dp_is_ready()) {
1729            ALOGD("SCO/A2DP is selected but they are not connected/ready hence dont route");
1730            return 0;
1731      }
1732  
1733      if ((out_snd_device == SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP ||
1734           out_snd_device == SND_DEVICE_OUT_SPEAKER_SAFE_AND_BT_A2DP) &&
1735          (!audio_extn_a2dp_is_ready())) {
1736          ALOGW("%s: A2DP profile is not ready, routing to speaker only", __func__);
1737          if (out_snd_device == SND_DEVICE_OUT_SPEAKER_SAFE_AND_BT_A2DP)
1738              out_snd_device = SND_DEVICE_OUT_SPEAKER_SAFE;
1739          else
1740              out_snd_device = SND_DEVICE_OUT_SPEAKER;
1741      }
1742  
1743      if (usecase->id == USECASE_INCALL_MUSIC_UPLINK ||
1744          usecase->id == USECASE_INCALL_MUSIC_UPLINK2) {
1745          out_snd_device = SND_DEVICE_OUT_VOICE_MUSIC_TX;
1746      }
1747  
1748      if (out_snd_device != SND_DEVICE_NONE &&
1749              out_snd_device != adev->last_logged_snd_device[uc_id][0]) {
1750          ALOGD("%s: changing use case %s output device from(%d: %s, acdb %d) to (%d: %s, acdb %d)",
1751                __func__,
1752                use_case_table[uc_id],
1753                adev->last_logged_snd_device[uc_id][0],
1754                platform_get_snd_device_name(adev->last_logged_snd_device[uc_id][0]),
1755                adev->last_logged_snd_device[uc_id][0] != SND_DEVICE_NONE ?
1756                        platform_get_snd_device_acdb_id(adev->last_logged_snd_device[uc_id][0]) :
1757                        -1,
1758                out_snd_device,
1759                platform_get_snd_device_name(out_snd_device),
1760                platform_get_snd_device_acdb_id(out_snd_device));
1761          adev->last_logged_snd_device[uc_id][0] = out_snd_device;
1762      }
1763      if (in_snd_device != SND_DEVICE_NONE &&
1764              in_snd_device != adev->last_logged_snd_device[uc_id][1]) {
1765          ALOGD("%s: changing use case %s input device from(%d: %s, acdb %d) to (%d: %s, acdb %d)",
1766                __func__,
1767                use_case_table[uc_id],
1768                adev->last_logged_snd_device[uc_id][1],
1769                platform_get_snd_device_name(adev->last_logged_snd_device[uc_id][1]),
1770                adev->last_logged_snd_device[uc_id][1] != SND_DEVICE_NONE ?
1771                        platform_get_snd_device_acdb_id(adev->last_logged_snd_device[uc_id][1]) :
1772                        -1,
1773                in_snd_device,
1774                platform_get_snd_device_name(in_snd_device),
1775                platform_get_snd_device_acdb_id(in_snd_device));
1776          adev->last_logged_snd_device[uc_id][1] = in_snd_device;
1777      }
1778  
1779      /*
1780       * Limitation: While in call, to do a device switch we need to disable
1781       * and enable both RX and TX devices though one of them is same as current
1782       * device.
1783       */
1784      if ((usecase->type == VOICE_CALL) &&
1785          (usecase->in_snd_device != SND_DEVICE_NONE) &&
1786          (usecase->out_snd_device != SND_DEVICE_NONE)) {
1787          status = platform_switch_voice_call_device_pre(adev->platform);
1788          /* Disable sidetone only if voice call already exists */
1789          if (voice_is_call_state_active(adev))
1790              voice_set_sidetone(adev, usecase->out_snd_device, false);
1791      }
1792  
1793      /* Disable current sound devices */
1794      if (usecase->out_snd_device != SND_DEVICE_NONE) {
1795          disable_audio_route(adev, usecase);
1796          disable_snd_device(adev, usecase->out_snd_device);
1797      }
1798  
1799      if (usecase->in_snd_device != SND_DEVICE_NONE) {
1800          disable_audio_route(adev, usecase);
1801          disable_snd_device(adev, usecase->in_snd_device);
1802      }
1803  
1804      /* Applicable only on the targets that has external modem.
1805       * New device information should be sent to modem before enabling
1806       * the devices to reduce in-call device switch time.
1807       */
1808      if ((usecase->type == VOICE_CALL) &&
1809          (usecase->in_snd_device != SND_DEVICE_NONE) &&
1810          (usecase->out_snd_device != SND_DEVICE_NONE)) {
1811          status = platform_switch_voice_call_enable_device_config(adev->platform,
1812                                                                   out_snd_device,
1813                                                                   in_snd_device);
1814      }
1815  
1816      /* Enable new sound devices */
1817      if (out_snd_device != SND_DEVICE_NONE) {
1818          if ((usecase->devices & AUDIO_DEVICE_OUT_ALL_CODEC_BACKEND) ||
1819              (usecase->devices & (AUDIO_DEVICE_OUT_USB_DEVICE|AUDIO_DEVICE_OUT_USB_HEADSET)) ||
1820              (usecase->devices & AUDIO_DEVICE_OUT_ALL_A2DP))
1821              check_and_route_playback_usecases(adev, usecase, out_snd_device);
1822          enable_snd_device(adev, out_snd_device);
1823      }
1824  
1825      if (in_snd_device != SND_DEVICE_NONE) {
1826          check_and_route_capture_usecases(adev, usecase, in_snd_device);
1827          enable_snd_device(adev, in_snd_device);
1828      }
1829  
1830      if (usecase->type == VOICE_CALL)
1831          status = platform_switch_voice_call_device_post(adev->platform,
1832                                                          out_snd_device,
1833                                                          in_snd_device);
1834  
1835      usecase->in_snd_device = in_snd_device;
1836      usecase->out_snd_device = out_snd_device;
1837  
1838      audio_extn_tfa_98xx_set_mode();
1839  
1840      enable_audio_route(adev, usecase);
1841  
1842      /* If input stream is already running the effect needs to be
1843         applied on the new input device that's being enabled here.  */
1844      if (in_snd_device != SND_DEVICE_NONE)
1845          check_and_enable_effect(adev);
1846  
1847      /* Applicable only on the targets that has external modem.
1848       * Enable device command should be sent to modem only after
1849       * enabling voice call mixer controls
1850       */
1851      if (usecase->type == VOICE_CALL) {
1852          status = platform_switch_voice_call_usecase_route_post(adev->platform,
1853                                                                 out_snd_device,
1854                                                                 in_snd_device);
1855           /* Enable sidetone only if voice call already exists */
1856          if (voice_is_call_state_active(adev))
1857              voice_set_sidetone(adev, out_snd_device, true);
1858      }
1859  
1860      if (usecase->type != PCM_CAPTURE && voip_usecase) {
1861          struct stream_out *voip_out = voip_usecase->stream.out;
1862          audio_extn_utils_send_app_type_gain(adev,
1863                                              voip_out->app_type_cfg.app_type,
1864                                              &voip_out->app_type_cfg.gain[0]);
1865      }
1866      return status;
1867  }
1868  
select_devices(struct audio_device * adev,audio_usecase_t uc_id)1869  int select_devices(struct audio_device *adev,
1870                     audio_usecase_t uc_id)
1871  {
1872      return select_devices_with_force_switch(adev, uc_id, false);
1873  }
1874  
stop_input_stream(struct stream_in * in)1875  static int stop_input_stream(struct stream_in *in)
1876  {
1877      int i, ret = 0;
1878      struct audio_usecase *uc_info;
1879      struct audio_device *adev = in->dev;
1880      struct stream_in *priority_in = NULL;
1881  
1882      ALOGV("%s: enter: usecase(%d: %s)", __func__,
1883            in->usecase, use_case_table[in->usecase]);
1884  
1885      uc_info = get_usecase_from_list(adev, in->usecase);
1886      if (uc_info == NULL) {
1887          ALOGE("%s: Could not find the usecase (%d) in the list",
1888                __func__, in->usecase);
1889          return -EINVAL;
1890      }
1891  
1892      priority_in = get_priority_input(adev);
1893  
1894      /* Close in-call recording streams */
1895      voice_check_and_stop_incall_rec_usecase(adev, in);
1896  
1897      /* 1. Disable stream specific mixer controls */
1898      disable_audio_route(adev, uc_info);
1899  
1900      /* 2. Disable the tx device */
1901      disable_snd_device(adev, uc_info->in_snd_device);
1902  
1903      list_remove(&uc_info->list);
1904      free(uc_info);
1905  
1906      if (priority_in == in) {
1907          priority_in = get_priority_input(adev);
1908          if (priority_in)
1909              select_devices(adev, priority_in->usecase);
1910      }
1911  
1912      ALOGV("%s: exit: status(%d)", __func__, ret);
1913      return ret;
1914  }
1915  
start_input_stream(struct stream_in * in)1916  int start_input_stream(struct stream_in *in)
1917  {
1918      /* 1. Enable output device and stream routing controls */
1919      int ret = 0;
1920      struct audio_usecase *uc_info;
1921      struct audio_device *adev = in->dev;
1922  
1923      ALOGV("%s: enter: usecase(%d)", __func__, in->usecase);
1924  
1925      if (audio_extn_tfa_98xx_is_supported() && !audio_ssr_status(adev))
1926          return -EIO;
1927  
1928      if (in->card_status == CARD_STATUS_OFFLINE ||
1929          adev->card_status == CARD_STATUS_OFFLINE) {
1930          ALOGW("in->card_status or adev->card_status offline, try again");
1931          ret = -EAGAIN;
1932          goto error_config;
1933      }
1934  
1935      /* Check if source matches incall recording usecase criteria */
1936      ret = voice_check_and_set_incall_rec_usecase(adev, in);
1937      if (ret)
1938          goto error_config;
1939      else
1940          ALOGV("%s: usecase(%d)", __func__, in->usecase);
1941  
1942      in->pcm_device_id = platform_get_pcm_device_id(in->usecase, PCM_CAPTURE);
1943      if (in->pcm_device_id < 0) {
1944          ALOGE("%s: Could not find PCM device id for the usecase(%d)",
1945                __func__, in->usecase);
1946          ret = -EINVAL;
1947          goto error_config;
1948      }
1949  
1950      uc_info = (struct audio_usecase *)calloc(1, sizeof(struct audio_usecase));
1951      uc_info->id = in->usecase;
1952      uc_info->type = PCM_CAPTURE;
1953      uc_info->stream.in = in;
1954      uc_info->devices = in->device;
1955      uc_info->in_snd_device = SND_DEVICE_NONE;
1956      uc_info->out_snd_device = SND_DEVICE_NONE;
1957  
1958      list_add_tail(&adev->usecase_list, &uc_info->list);
1959  
1960      audio_streaming_hint_start();
1961      audio_extn_perf_lock_acquire();
1962  
1963      select_devices(adev, in->usecase);
1964  
1965      if (in->usecase == USECASE_AUDIO_RECORD_MMAP) {
1966          if (in->pcm == NULL || !pcm_is_ready(in->pcm)) {
1967              ALOGE("%s: pcm stream not ready", __func__);
1968              goto error_open;
1969          }
1970          ret = pcm_start(in->pcm);
1971          if (ret < 0) {
1972              ALOGE("%s: MMAP pcm_start failed ret %d", __func__, ret);
1973              goto error_open;
1974          }
1975      } else {
1976          unsigned int flags = PCM_IN | PCM_MONOTONIC;
1977          unsigned int pcm_open_retry_count = 0;
1978  
1979          if (in->usecase == USECASE_AUDIO_RECORD_AFE_PROXY) {
1980              flags |= PCM_MMAP | PCM_NOIRQ;
1981              pcm_open_retry_count = PROXY_OPEN_RETRY_COUNT;
1982          } else if (in->realtime) {
1983              flags |= PCM_MMAP | PCM_NOIRQ;
1984          }
1985  
1986          ALOGV("%s: Opening PCM device card_id(%d) device_id(%d), channels %d",
1987                __func__, adev->snd_card, in->pcm_device_id, in->config.channels);
1988  
1989          while (1) {
1990              in->pcm = pcm_open(adev->snd_card, in->pcm_device_id,
1991                                 flags, &in->config);
1992              if (in->pcm == NULL || !pcm_is_ready(in->pcm)) {
1993                  ALOGE("%s: %s", __func__, pcm_get_error(in->pcm));
1994                  if (in->pcm != NULL) {
1995                      pcm_close(in->pcm);
1996                      in->pcm = NULL;
1997                  }
1998                  if (pcm_open_retry_count-- == 0) {
1999                      ret = -EIO;
2000                      goto error_open;
2001                  }
2002                  usleep(PROXY_OPEN_WAIT_TIME * 1000);
2003                  continue;
2004              }
2005              break;
2006          }
2007  
2008          ALOGV("%s: pcm_prepare", __func__);
2009          ret = pcm_prepare(in->pcm);
2010          if (ret < 0) {
2011              ALOGE("%s: pcm_prepare returned %d", __func__, ret);
2012              pcm_close(in->pcm);
2013              in->pcm = NULL;
2014              goto error_open;
2015          }
2016          if (in->realtime) {
2017              ret = pcm_start(in->pcm);
2018              if (ret < 0) {
2019                  ALOGE("%s: RT pcm_start failed ret %d", __func__, ret);
2020                  pcm_close(in->pcm);
2021                  in->pcm = NULL;
2022                  goto error_open;
2023              }
2024          }
2025      }
2026      register_in_stream(in);
2027      check_and_enable_effect(adev);
2028      audio_extn_audiozoom_set_microphone_direction(in, in->zoom);
2029      audio_extn_audiozoom_set_microphone_field_dimension(in, in->direction);
2030      audio_streaming_hint_end();
2031      audio_extn_perf_lock_release();
2032      ALOGV("%s: exit", __func__);
2033  
2034      return 0;
2035  
2036  error_open:
2037      stop_input_stream(in);
2038      audio_streaming_hint_end();
2039      audio_extn_perf_lock_release();
2040  
2041  error_config:
2042      ALOGW("%s: exit: status(%d)", __func__, ret);
2043      return ret;
2044  }
2045  
lock_input_stream(struct stream_in * in)2046  void lock_input_stream(struct stream_in *in)
2047  {
2048      pthread_mutex_lock(&in->pre_lock);
2049      pthread_mutex_lock(&in->lock);
2050      pthread_mutex_unlock(&in->pre_lock);
2051  }
2052  
lock_output_stream(struct stream_out * out)2053  void lock_output_stream(struct stream_out *out)
2054  {
2055      pthread_mutex_lock(&out->pre_lock);
2056      pthread_mutex_lock(&out->lock);
2057      pthread_mutex_unlock(&out->pre_lock);
2058  }
2059  
2060  /* must be called with out->lock locked */
send_offload_cmd_l(struct stream_out * out,int command)2061  static int send_offload_cmd_l(struct stream_out* out, int command)
2062  {
2063      struct offload_cmd *cmd = (struct offload_cmd *)calloc(1, sizeof(struct offload_cmd));
2064  
2065      ALOGVV("%s %d", __func__, command);
2066  
2067      cmd->cmd = command;
2068      list_add_tail(&out->offload_cmd_list, &cmd->node);
2069      pthread_cond_signal(&out->offload_cond);
2070      return 0;
2071  }
2072  
2073  /* must be called iwth out->lock locked */
stop_compressed_output_l(struct stream_out * out)2074  static void stop_compressed_output_l(struct stream_out *out)
2075  {
2076      out->offload_state = OFFLOAD_STATE_IDLE;
2077      out->playback_started = 0;
2078      out->send_new_metadata = 1;
2079      if (out->compr != NULL) {
2080          compress_stop(out->compr);
2081          while (out->offload_thread_blocked) {
2082              pthread_cond_wait(&out->cond, &out->lock);
2083          }
2084      }
2085  }
2086  
offload_thread_loop(void * context)2087  static void *offload_thread_loop(void *context)
2088  {
2089      struct stream_out *out = (struct stream_out *) context;
2090      struct listnode *item;
2091  
2092      setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_AUDIO);
2093      set_sched_policy(0, SP_FOREGROUND);
2094      prctl(PR_SET_NAME, (unsigned long)"Offload Callback", 0, 0, 0);
2095  
2096      ALOGV("%s", __func__);
2097  
2098      lock_output_stream(out);
2099      out->offload_state = OFFLOAD_STATE_IDLE;
2100      out->playback_started = 0;
2101      for (;;) {
2102          struct offload_cmd *cmd = NULL;
2103          stream_callback_event_t event;
2104          bool send_callback = false;
2105  
2106          ALOGVV("%s offload_cmd_list %d out->offload_state %d",
2107                __func__, list_empty(&out->offload_cmd_list),
2108                out->offload_state);
2109          if (list_empty(&out->offload_cmd_list)) {
2110              ALOGV("%s SLEEPING", __func__);
2111              pthread_cond_wait(&out->offload_cond, &out->lock);
2112              ALOGV("%s RUNNING", __func__);
2113              continue;
2114          }
2115  
2116          item = list_head(&out->offload_cmd_list);
2117          cmd = node_to_item(item, struct offload_cmd, node);
2118          list_remove(item);
2119  
2120          ALOGVV("%s STATE %d CMD %d out->compr %p",
2121                 __func__, out->offload_state, cmd->cmd, out->compr);
2122  
2123          if (cmd->cmd == OFFLOAD_CMD_EXIT) {
2124              free(cmd);
2125              break;
2126          }
2127  
2128          if (out->compr == NULL) {
2129              ALOGE("%s: Compress handle is NULL", __func__);
2130              free(cmd);
2131              pthread_cond_signal(&out->cond);
2132              continue;
2133          }
2134          out->offload_thread_blocked = true;
2135          pthread_mutex_unlock(&out->lock);
2136          send_callback = false;
2137          switch (cmd->cmd) {
2138          case OFFLOAD_CMD_WAIT_FOR_BUFFER:
2139              compress_wait(out->compr, -1);
2140              send_callback = true;
2141              event = STREAM_CBK_EVENT_WRITE_READY;
2142              break;
2143          case OFFLOAD_CMD_PARTIAL_DRAIN:
2144              compress_next_track(out->compr);
2145              compress_partial_drain(out->compr);
2146              send_callback = true;
2147              event = STREAM_CBK_EVENT_DRAIN_READY;
2148              /* Resend the metadata for next iteration */
2149              out->send_new_metadata = 1;
2150              break;
2151          case OFFLOAD_CMD_DRAIN:
2152              compress_drain(out->compr);
2153              send_callback = true;
2154              event = STREAM_CBK_EVENT_DRAIN_READY;
2155              break;
2156          case OFFLOAD_CMD_ERROR:
2157              send_callback = true;
2158              event = STREAM_CBK_EVENT_ERROR;
2159              break;
2160          default:
2161              ALOGE("%s unknown command received: %d", __func__, cmd->cmd);
2162              break;
2163          }
2164          lock_output_stream(out);
2165          out->offload_thread_blocked = false;
2166          pthread_cond_signal(&out->cond);
2167          if (send_callback) {
2168              ALOGVV("%s: sending offload_callback event %d", __func__, event);
2169              out->offload_callback(event, NULL, out->offload_cookie);
2170          }
2171          free(cmd);
2172      }
2173  
2174      pthread_cond_signal(&out->cond);
2175      while (!list_empty(&out->offload_cmd_list)) {
2176          item = list_head(&out->offload_cmd_list);
2177          list_remove(item);
2178          free(node_to_item(item, struct offload_cmd, node));
2179      }
2180      pthread_mutex_unlock(&out->lock);
2181  
2182      return NULL;
2183  }
2184  
create_offload_callback_thread(struct stream_out * out)2185  static int create_offload_callback_thread(struct stream_out *out)
2186  {
2187      pthread_cond_init(&out->offload_cond, (const pthread_condattr_t *) NULL);
2188      list_init(&out->offload_cmd_list);
2189      pthread_create(&out->offload_thread, (const pthread_attr_t *) NULL,
2190                      offload_thread_loop, out);
2191      return 0;
2192  }
2193  
destroy_offload_callback_thread(struct stream_out * out)2194  static int destroy_offload_callback_thread(struct stream_out *out)
2195  {
2196      lock_output_stream(out);
2197      stop_compressed_output_l(out);
2198      send_offload_cmd_l(out, OFFLOAD_CMD_EXIT);
2199  
2200      pthread_mutex_unlock(&out->lock);
2201      pthread_join(out->offload_thread, (void **) NULL);
2202      pthread_cond_destroy(&out->offload_cond);
2203  
2204      return 0;
2205  }
2206  
allow_hdmi_channel_config(struct audio_device * adev)2207  static bool allow_hdmi_channel_config(struct audio_device *adev)
2208  {
2209      struct listnode *node;
2210      struct audio_usecase *usecase;
2211      bool ret = true;
2212  
2213      list_for_each(node, &adev->usecase_list) {
2214          usecase = node_to_item(node, struct audio_usecase, list);
2215          if (usecase->devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
2216              /*
2217               * If voice call is already existing, do not proceed further to avoid
2218               * disabling/enabling both RX and TX devices, CSD calls, etc.
2219               * Once the voice call done, the HDMI channels can be configured to
2220               * max channels of remaining use cases.
2221               */
2222              if (usecase->id == USECASE_VOICE_CALL) {
2223                  ALOGV("%s: voice call is active, no change in HDMI channels",
2224                        __func__);
2225                  ret = false;
2226                  break;
2227              } else if (usecase->id == USECASE_AUDIO_PLAYBACK_HIFI) {
2228                  ALOGV("%s: hifi playback is active, "
2229                        "no change in HDMI channels", __func__);
2230                  ret = false;
2231                  break;
2232              }
2233          }
2234      }
2235      return ret;
2236  }
2237  
check_and_set_hdmi_channels(struct audio_device * adev,unsigned int channels)2238  static int check_and_set_hdmi_channels(struct audio_device *adev,
2239                                         unsigned int channels)
2240  {
2241      struct listnode *node;
2242      struct audio_usecase *usecase;
2243  
2244      /* Check if change in HDMI channel config is allowed */
2245      if (!allow_hdmi_channel_config(adev))
2246          return 0;
2247  
2248      if (channels == adev->cur_hdmi_channels) {
2249          ALOGV("%s: Requested channels are same as current", __func__);
2250          return 0;
2251      }
2252  
2253      platform_set_hdmi_channels(adev->platform, channels);
2254      adev->cur_hdmi_channels = channels;
2255  
2256      /*
2257       * Deroute all the playback streams routed to HDMI so that
2258       * the back end is deactivated. Note that backend will not
2259       * be deactivated if any one stream is connected to it.
2260       */
2261      list_for_each(node, &adev->usecase_list) {
2262          usecase = node_to_item(node, struct audio_usecase, list);
2263          if (usecase->type == PCM_PLAYBACK &&
2264                  usecase->devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
2265              disable_audio_route(adev, usecase);
2266          }
2267      }
2268  
2269      /*
2270       * Enable all the streams disabled above. Now the HDMI backend
2271       * will be activated with new channel configuration
2272       */
2273      list_for_each(node, &adev->usecase_list) {
2274          usecase = node_to_item(node, struct audio_usecase, list);
2275          if (usecase->type == PCM_PLAYBACK &&
2276                  usecase->devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
2277              enable_audio_route(adev, usecase);
2278          }
2279      }
2280  
2281      return 0;
2282  }
2283  
check_and_set_usb_service_interval(struct audio_device * adev,struct audio_usecase * uc_info,bool min)2284  static int check_and_set_usb_service_interval(struct audio_device *adev,
2285                                                struct audio_usecase *uc_info,
2286                                                bool min)
2287  {
2288      struct listnode *node;
2289      struct audio_usecase *usecase;
2290      bool switch_usecases = false;
2291      bool reconfig = false;
2292  
2293      if ((uc_info->id != USECASE_AUDIO_PLAYBACK_MMAP) &&
2294          (uc_info->id != USECASE_AUDIO_PLAYBACK_ULL))
2295          return -1;
2296  
2297      /* set if the valid usecase do not already exist */
2298      list_for_each(node, &adev->usecase_list) {
2299          usecase = node_to_item(node, struct audio_usecase, list);
2300          if (usecase->type == PCM_PLAYBACK &&
2301              (audio_is_usb_out_device(usecase->devices & AUDIO_DEVICE_OUT_ALL_USB))) {
2302              switch (usecase->id) {
2303                  case USECASE_AUDIO_PLAYBACK_MMAP:
2304                  case USECASE_AUDIO_PLAYBACK_ULL:
2305                      // cannot reconfig while mmap/ull is present.
2306                      return -1;
2307                  default:
2308                      switch_usecases = true;
2309                      break;
2310              }
2311          }
2312          if (switch_usecases)
2313              break;
2314      }
2315      /*
2316       * client can try to set service interval in start_output_stream
2317       * to min or to 0 (i.e reset) in stop_output_stream .
2318       */
2319      unsigned long service_interval =
2320              audio_extn_usb_find_service_interval(min, true /*playback*/);
2321      int ret = platform_set_usb_service_interval(adev->platform,
2322                                                  true /*playback*/,
2323                                                  service_interval,
2324                                                  &reconfig);
2325      /* no change or not supported or no active usecases */
2326      if (ret || !reconfig || !switch_usecases)
2327          return -1;
2328      return 0;
2329  #undef VALID_USECASE
2330  }
2331  
stop_output_stream(struct stream_out * out)2332  static int stop_output_stream(struct stream_out *out)
2333  {
2334      int i, ret = 0;
2335      struct audio_usecase *uc_info;
2336      struct audio_device *adev = out->dev;
2337  
2338      ALOGV("%s: enter: usecase(%d: %s)", __func__,
2339            out->usecase, use_case_table[out->usecase]);
2340      uc_info = get_usecase_from_list(adev, out->usecase);
2341      if (uc_info == NULL) {
2342          ALOGE("%s: Could not find the usecase (%d) in the list",
2343                __func__, out->usecase);
2344          return -EINVAL;
2345      }
2346  
2347      if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
2348          if (adev->visualizer_stop_output != NULL)
2349              adev->visualizer_stop_output(out->handle, out->pcm_device_id);
2350          if (adev->offload_effects_stop_output != NULL)
2351              adev->offload_effects_stop_output(out->handle, out->pcm_device_id);
2352      } else if (out->usecase == USECASE_AUDIO_PLAYBACK_ULL ||
2353                 out->usecase == USECASE_AUDIO_PLAYBACK_MMAP) {
2354          audio_low_latency_hint_end();
2355      }
2356  
2357      if (out->usecase == USECASE_INCALL_MUSIC_UPLINK ||
2358          out->usecase == USECASE_INCALL_MUSIC_UPLINK2) {
2359          voice_set_device_mute_flag(adev, false);
2360      }
2361  
2362      /* 1. Get and set stream specific mixer controls */
2363      disable_audio_route(adev, uc_info);
2364  
2365      /* 2. Disable the rx device */
2366      disable_snd_device(adev, uc_info->out_snd_device);
2367  
2368      list_remove(&uc_info->list);
2369  
2370      audio_extn_extspk_update(adev->extspk);
2371  
2372      /* Must be called after removing the usecase from list */
2373      if (out->devices & AUDIO_DEVICE_OUT_AUX_DIGITAL)
2374          check_and_set_hdmi_channels(adev, DEFAULT_HDMI_OUT_CHANNELS);
2375      else if (audio_is_usb_out_device(out->devices & AUDIO_DEVICE_OUT_ALL_USB)) {
2376          ret = check_and_set_usb_service_interval(adev, uc_info, false /*min*/);
2377          if (ret == 0) {
2378              /* default service interval was successfully updated,
2379                 reopen USB backend with new service interval */
2380              check_and_route_playback_usecases(adev, uc_info, uc_info->out_snd_device);
2381          }
2382          ret = 0;
2383      }
2384      /* 1) media + voip output routing to handset must route media back to
2385            speaker when voip stops.
2386         2) trigger voip input to reroute when voip output changes to
2387            hearing aid. */
2388      if (out->usecase == USECASE_AUDIO_PLAYBACK_VOIP ||
2389          out->devices & AUDIO_DEVICE_OUT_SPEAKER_SAFE) {
2390          struct listnode *node;
2391          struct audio_usecase *usecase;
2392          list_for_each(node, &adev->usecase_list) {
2393              usecase = node_to_item(node, struct audio_usecase, list);
2394              if ((usecase->type == PCM_CAPTURE &&
2395                       usecase->id != USECASE_AUDIO_RECORD_VOIP)
2396                  || usecase == uc_info)
2397                  continue;
2398  
2399              ALOGD("%s: select_devices at usecase(%d: %s) after removing the usecase(%d: %s)",
2400                  __func__, usecase->id, use_case_table[usecase->id],
2401                  out->usecase, use_case_table[out->usecase]);
2402              select_devices(adev, usecase->id);
2403          }
2404      }
2405  
2406      free(uc_info);
2407      ALOGV("%s: exit: status(%d)", __func__, ret);
2408      return ret;
2409  }
2410  
pcm_open_prepare_helper(unsigned int snd_card,unsigned int pcm_device_id,unsigned int flags,unsigned int pcm_open_retry_count,struct pcm_config * config)2411  struct pcm* pcm_open_prepare_helper(unsigned int snd_card, unsigned int pcm_device_id,
2412                                     unsigned int flags, unsigned int pcm_open_retry_count,
2413                                     struct pcm_config *config)
2414  {
2415      struct pcm* pcm = NULL;
2416  
2417      while (1) {
2418          pcm = pcm_open(snd_card, pcm_device_id, flags, config);
2419          if (pcm == NULL || !pcm_is_ready(pcm)) {
2420              ALOGE("%s: %s", __func__, pcm_get_error(pcm));
2421              if (pcm != NULL) {
2422                  pcm_close(pcm);
2423                  pcm = NULL;
2424              }
2425              if (pcm_open_retry_count-- == 0)
2426                  return NULL;
2427  
2428              usleep(PROXY_OPEN_WAIT_TIME * 1000);
2429              continue;
2430          }
2431          break;
2432      }
2433  
2434      if (pcm_is_ready(pcm)) {
2435          int ret = pcm_prepare(pcm);
2436          if (ret < 0) {
2437              ALOGE("%s: pcm_prepare returned %d", __func__, ret);
2438              pcm_close(pcm);
2439              pcm = NULL;
2440          }
2441      }
2442  
2443      return pcm;
2444  }
2445  
start_output_stream(struct stream_out * out)2446  int start_output_stream(struct stream_out *out)
2447  {
2448      int ret = 0;
2449      struct audio_usecase *uc_info;
2450      struct audio_device *adev = out->dev;
2451      bool a2dp_combo = false;
2452  
2453      ALOGV("%s: enter: usecase(%d: %s) %s devices(%#x)",
2454            __func__, out->usecase, use_case_table[out->usecase],
2455            out->usecase == USECASE_AUDIO_PLAYBACK_WITH_HAPTICS ? "(with haptics)" : "",
2456            out->devices);
2457  
2458      if (out->card_status == CARD_STATUS_OFFLINE ||
2459          adev->card_status == CARD_STATUS_OFFLINE) {
2460          ALOGW("out->card_status or adev->card_status offline, try again");
2461          ret = -EAGAIN;
2462          goto error_config;
2463      }
2464  
2465      //Update incall music usecase to reflect correct voice session
2466      if (out->flags & AUDIO_OUTPUT_FLAG_INCALL_MUSIC) {
2467          ret = voice_extn_check_and_set_incall_music_usecase(adev, out);
2468          if (ret != 0) {
2469              ALOGE("%s: Incall music delivery usecase cannot be set error:%d",
2470                  __func__, ret);
2471              goto error_config;
2472          }
2473      }
2474  
2475      if (out->devices & AUDIO_DEVICE_OUT_ALL_A2DP) {
2476          if (out->devices & (AUDIO_DEVICE_OUT_SPEAKER | AUDIO_DEVICE_OUT_SPEAKER_SAFE)) {
2477              a2dp_combo = true;
2478          } else if (!audio_extn_a2dp_is_ready() &&
2479                  !(out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD)) {
2480              ALOGE("%s: A2DP profile is not ready, return error", __func__);
2481              ret = -EAGAIN;
2482              goto error_config;
2483          }
2484      }
2485      out->pcm_device_id = platform_get_pcm_device_id(out->usecase, PCM_PLAYBACK);
2486      if (out->pcm_device_id < 0) {
2487          ALOGE("%s: Invalid PCM device id(%d) for the usecase(%d)",
2488                __func__, out->pcm_device_id, out->usecase);
2489          ret = -EINVAL;
2490          goto error_config;
2491      }
2492  
2493      uc_info = (struct audio_usecase *)calloc(1, sizeof(struct audio_usecase));
2494      uc_info->id = out->usecase;
2495      uc_info->type = PCM_PLAYBACK;
2496      uc_info->stream.out = out;
2497      uc_info->devices = out->devices;
2498      uc_info->in_snd_device = SND_DEVICE_NONE;
2499      uc_info->out_snd_device = SND_DEVICE_NONE;
2500  
2501      /* This must be called before adding this usecase to the list */
2502      if (out->devices & AUDIO_DEVICE_OUT_AUX_DIGITAL)
2503          check_and_set_hdmi_channels(adev, out->config.channels);
2504      else if (audio_is_usb_out_device(out->devices & AUDIO_DEVICE_OUT_ALL_USB)) {
2505          check_and_set_usb_service_interval(adev, uc_info, true /*min*/);
2506          /* USB backend is not reopened immediately.
2507             This is eventually done as part of select_devices */
2508      }
2509  
2510      list_add_tail(&adev->usecase_list, &uc_info->list);
2511  
2512      audio_streaming_hint_start();
2513      audio_extn_perf_lock_acquire();
2514  
2515      if (!(out->devices & AUDIO_DEVICE_OUT_ALL_A2DP) ||
2516              audio_extn_a2dp_is_ready()) {
2517          select_devices(adev, out->usecase);
2518      }
2519  
2520      if ((out->devices & AUDIO_DEVICE_OUT_ALL_A2DP) &&
2521              (!audio_extn_a2dp_is_ready() || !adev->a2dp_started)) {
2522          if (a2dp_combo) {
2523              audio_devices_t dev = out->devices;
2524              if (dev & AUDIO_DEVICE_OUT_SPEAKER_SAFE)
2525                  out->devices = AUDIO_DEVICE_OUT_SPEAKER_SAFE;
2526              else
2527                  out->devices = AUDIO_DEVICE_OUT_SPEAKER;
2528              select_devices(adev, out->usecase);
2529              out->devices = dev;
2530          } else if (!audio_extn_a2dp_is_ready()) {
2531              check_a2dp_restore_l(adev, out, false);
2532          } else {
2533              ALOGE("%s: A2DP is not started, return error", __func__);
2534              ret = -EINVAL;
2535              goto error_open;
2536          }
2537      }
2538  
2539      audio_extn_extspk_update(adev->extspk);
2540  
2541      if (out->usecase == USECASE_INCALL_MUSIC_UPLINK ||
2542          out->usecase == USECASE_INCALL_MUSIC_UPLINK2) {
2543          voice_set_device_mute_flag(adev, true);
2544      }
2545  
2546      ALOGV("%s: Opening PCM device card_id(%d) device_id(%d) format(%#x)",
2547            __func__, adev->snd_card, out->pcm_device_id, out->config.format);
2548      if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
2549          out->pcm = NULL;
2550          out->compr = compress_open(adev->snd_card, out->pcm_device_id,
2551                                     COMPRESS_IN, &out->compr_config);
2552          if (out->compr && !is_compress_ready(out->compr)) {
2553              ALOGE("%s: %s", __func__, compress_get_error(out->compr));
2554              compress_close(out->compr);
2555              out->compr = NULL;
2556              ret = -EIO;
2557              goto error_open;
2558          }
2559          if (out->offload_callback)
2560              compress_nonblock(out->compr, out->non_blocking);
2561  
2562          if (adev->visualizer_start_output != NULL) {
2563              int capture_device_id =
2564                  platform_get_pcm_device_id(USECASE_AUDIO_RECORD_AFE_PROXY,
2565                                             PCM_CAPTURE);
2566              adev->visualizer_start_output(out->handle, out->pcm_device_id,
2567                                            adev->snd_card, capture_device_id);
2568          }
2569          if (adev->offload_effects_start_output != NULL)
2570              adev->offload_effects_start_output(out->handle, out->pcm_device_id);
2571      } else if (out->usecase == USECASE_AUDIO_PLAYBACK_MMAP) {
2572          if (out->pcm == NULL || !pcm_is_ready(out->pcm)) {
2573              ALOGE("%s: pcm stream not ready", __func__);
2574              goto error_open;
2575          }
2576          ret = pcm_start(out->pcm);
2577          if (ret < 0) {
2578              ALOGE("%s: MMAP pcm_start failed ret %d", __func__, ret);
2579              goto error_open;
2580          }
2581      } else {
2582          unsigned int flags = PCM_OUT | PCM_MONOTONIC;
2583          unsigned int pcm_open_retry_count = 0;
2584  
2585          if (out->usecase == USECASE_AUDIO_PLAYBACK_AFE_PROXY) {
2586              flags |= PCM_MMAP | PCM_NOIRQ;
2587              pcm_open_retry_count = PROXY_OPEN_RETRY_COUNT;
2588          } else if (out->realtime) {
2589              flags |= PCM_MMAP | PCM_NOIRQ;
2590          }
2591  
2592          out->pcm = pcm_open_prepare_helper(adev->snd_card, out->pcm_device_id,
2593                                         flags, pcm_open_retry_count,
2594                                         &(out->config));
2595          if (out->pcm == NULL) {
2596             ret = -EIO;
2597             goto error_open;
2598          }
2599  
2600          if (out->usecase == USECASE_AUDIO_PLAYBACK_WITH_HAPTICS) {
2601              if (adev->haptic_pcm != NULL) {
2602                  pcm_close(adev->haptic_pcm);
2603                  adev->haptic_pcm = NULL;
2604              }
2605              adev->haptic_pcm = pcm_open_prepare_helper(adev->snd_card,
2606                                     adev->haptic_pcm_device_id,
2607                                     flags, pcm_open_retry_count,
2608                                     &(adev->haptics_config));
2609              // failure to open haptics pcm shouldnt stop audio,
2610              // so do not close audio pcm in case of error
2611          }
2612  
2613          if (out->realtime) {
2614              ret = pcm_start(out->pcm);
2615              if (ret < 0) {
2616                  ALOGE("%s: RT pcm_start failed ret %d", __func__, ret);
2617                  pcm_close(out->pcm);
2618                  out->pcm = NULL;
2619                  goto error_open;
2620              }
2621          }
2622          if ((out->usecase == USECASE_AUDIO_PLAYBACK_LOW_LATENCY
2623                  || out->usecase == USECASE_AUDIO_PLAYBACK_DEEP_BUFFER
2624                  || out->usecase == USECASE_AUDIO_PLAYBACK_ULL)) {
2625             out_set_pcm_volume(&out->stream, out->volume_l, out->volume_r);
2626           }
2627      }
2628  
2629      register_out_stream(out);
2630      audio_streaming_hint_end();
2631      audio_extn_perf_lock_release();
2632      audio_extn_tfa_98xx_enable_speaker();
2633  
2634      if (out->usecase == USECASE_AUDIO_PLAYBACK_ULL ||
2635          out->usecase == USECASE_AUDIO_PLAYBACK_MMAP) {
2636          audio_low_latency_hint_start();
2637      }
2638  
2639      // consider a scenario where on pause lower layers are tear down.
2640      // so on resume, swap mixer control need to be sent only when
2641      // backend is active, hence rather than sending from enable device
2642      // sending it from start of stream
2643  
2644      platform_set_swap_channels(adev, true);
2645  
2646      ALOGV("%s: exit", __func__);
2647      return 0;
2648  error_open:
2649      if (adev->haptic_pcm) {
2650          pcm_close(adev->haptic_pcm);
2651          adev->haptic_pcm = NULL;
2652      }
2653      audio_streaming_hint_end();
2654      audio_extn_perf_lock_release();
2655      stop_output_stream(out);
2656  error_config:
2657      return ret;
2658  }
2659  
check_input_parameters(uint32_t sample_rate,audio_format_t format,int channel_count,bool is_usb_hifi)2660  static int check_input_parameters(uint32_t sample_rate,
2661                                    audio_format_t format,
2662                                    int channel_count, bool is_usb_hifi)
2663  {
2664      if ((format != AUDIO_FORMAT_PCM_16_BIT) &&
2665          (format != AUDIO_FORMAT_PCM_8_24_BIT) &&
2666          (format != AUDIO_FORMAT_PCM_24_BIT_PACKED) &&
2667          !(is_usb_hifi && (format == AUDIO_FORMAT_PCM_32_BIT))) {
2668          ALOGE("%s: unsupported AUDIO FORMAT (%d) ", __func__, format);
2669          return -EINVAL;
2670      }
2671  
2672      int max_channel_count = is_usb_hifi ? MAX_HIFI_CHANNEL_COUNT : MAX_CHANNEL_COUNT;
2673      if ((channel_count < MIN_CHANNEL_COUNT) || (channel_count > max_channel_count)) {
2674          ALOGE("%s: unsupported channel count (%d) passed  Min / Max (%d / %d)", __func__,
2675                 channel_count, MIN_CHANNEL_COUNT, max_channel_count);
2676          return -EINVAL;
2677      }
2678  
2679      switch (sample_rate) {
2680      case 8000:
2681      case 11025:
2682      case 12000:
2683      case 16000:
2684      case 22050:
2685      case 24000:
2686      case 32000:
2687      case 44100:
2688      case 48000:
2689      case 96000:
2690          break;
2691      default:
2692          ALOGE("%s: unsupported (%d) samplerate passed ", __func__, sample_rate);
2693          return -EINVAL;
2694      }
2695  
2696      return 0;
2697  }
2698  
2699  /** Add a value in a list if not already present.
2700   * @return true if value was successfully inserted or already present,
2701   *         false if the list is full and does not contain the value.
2702   */
register_uint(uint32_t value,uint32_t * list,size_t list_length)2703  static bool register_uint(uint32_t value, uint32_t* list, size_t list_length) {
2704      for (size_t i = 0; i < list_length; i++) {
2705          if (list[i] == value) return true; // value is already present
2706          if (list[i] == 0) { // no values in this slot
2707              list[i] = value;
2708              return true; // value inserted
2709          }
2710      }
2711      return false; // could not insert value
2712  }
2713  
2714  /** Add channel_mask in supported_channel_masks if not already present.
2715   * @return true if channel_mask was successfully inserted or already present,
2716   *         false if supported_channel_masks is full and does not contain channel_mask.
2717   */
register_channel_mask(audio_channel_mask_t channel_mask,audio_channel_mask_t supported_channel_masks[static MAX_SUPPORTED_CHANNEL_MASKS])2718  static void register_channel_mask(audio_channel_mask_t channel_mask,
2719              audio_channel_mask_t supported_channel_masks[static MAX_SUPPORTED_CHANNEL_MASKS]) {
2720      ALOGE_IF(!register_uint(channel_mask, supported_channel_masks, MAX_SUPPORTED_CHANNEL_MASKS),
2721          "%s: stream can not declare supporting its channel_mask %x", __func__, channel_mask);
2722  }
2723  
2724  /** Add format in supported_formats if not already present.
2725   * @return true if format was successfully inserted or already present,
2726   *         false if supported_formats is full and does not contain format.
2727   */
register_format(audio_format_t format,audio_format_t supported_formats[static MAX_SUPPORTED_FORMATS])2728  static void register_format(audio_format_t format,
2729              audio_format_t supported_formats[static MAX_SUPPORTED_FORMATS]) {
2730      ALOGE_IF(!register_uint(format, supported_formats, MAX_SUPPORTED_FORMATS),
2731               "%s: stream can not declare supporting its format %x", __func__, format);
2732  }
2733  /** Add sample_rate in supported_sample_rates if not already present.
2734   * @return true if sample_rate was successfully inserted or already present,
2735   *         false if supported_sample_rates is full and does not contain sample_rate.
2736   */
register_sample_rate(uint32_t sample_rate,uint32_t supported_sample_rates[static MAX_SUPPORTED_SAMPLE_RATES])2737  static void register_sample_rate(uint32_t sample_rate,
2738              uint32_t supported_sample_rates[static MAX_SUPPORTED_SAMPLE_RATES]) {
2739      ALOGE_IF(!register_uint(sample_rate, supported_sample_rates, MAX_SUPPORTED_SAMPLE_RATES),
2740               "%s: stream can not declare supporting its sample rate %x", __func__, sample_rate);
2741  }
2742  
get_stream_buffer_size(size_t duration_ms,uint32_t sample_rate,audio_format_t format,int channel_count,bool is_low_latency)2743  static size_t get_stream_buffer_size(size_t duration_ms,
2744                                       uint32_t sample_rate,
2745                                       audio_format_t format,
2746                                       int channel_count,
2747                                       bool is_low_latency)
2748  {
2749      // Compute target frames based on time or period size.
2750      size_t target_frames = is_low_latency
2751               ? configured_low_latency_capture_period_size // record only
2752               : (sample_rate * duration_ms) / 1000;
2753  
2754      // Round up to a multiple of 16 frames in case sizing for the MixerThread.
2755      if (!is_low_latency) { // low latency flag set for record only
2756          target_frames = (target_frames + 0xf) & ~0xf;
2757      }
2758  
2759      // Buffer size is the target frames multiplied by the frame size in bytes.
2760      const size_t frame_size = channel_count * audio_bytes_per_sample(format);
2761      const size_t buffer_size = target_frames * frame_size;
2762  
2763      return buffer_size;
2764  }
2765  
out_get_sample_rate(const struct audio_stream * stream)2766  static uint32_t out_get_sample_rate(const struct audio_stream *stream)
2767  {
2768      struct stream_out *out = (struct stream_out *)stream;
2769  
2770      return out->sample_rate;
2771  }
2772  
out_set_sample_rate(struct audio_stream * stream __unused,uint32_t rate __unused)2773  static int out_set_sample_rate(struct audio_stream *stream __unused, uint32_t rate __unused)
2774  {
2775      return -ENOSYS;
2776  }
2777  
out_get_buffer_size(const struct audio_stream * stream)2778  static size_t out_get_buffer_size(const struct audio_stream *stream)
2779  {
2780      struct stream_out *out = (struct stream_out *)stream;
2781  
2782      if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
2783          return out->compr_config.fragment_size;
2784      }
2785      return out->config.period_size * out->af_period_multiplier *
2786                  audio_stream_out_frame_size((const struct audio_stream_out *)stream);
2787  }
2788  
out_get_channels(const struct audio_stream * stream)2789  static uint32_t out_get_channels(const struct audio_stream *stream)
2790  {
2791      struct stream_out *out = (struct stream_out *)stream;
2792  
2793      return out->channel_mask;
2794  }
2795  
out_get_format(const struct audio_stream * stream)2796  static audio_format_t out_get_format(const struct audio_stream *stream)
2797  {
2798      struct stream_out *out = (struct stream_out *)stream;
2799  
2800      return out->format;
2801  }
2802  
out_set_format(struct audio_stream * stream __unused,audio_format_t format __unused)2803  static int out_set_format(struct audio_stream *stream __unused, audio_format_t format __unused)
2804  {
2805      return -ENOSYS;
2806  }
2807  
2808  /* must be called with out->lock locked */
out_standby_l(struct audio_stream * stream)2809  static int out_standby_l(struct audio_stream *stream)
2810  {
2811      struct stream_out *out = (struct stream_out *)stream;
2812      struct audio_device *adev = out->dev;
2813      bool do_stop = true;
2814  
2815      if (!out->standby) {
2816          if (adev->adm_deregister_stream)
2817              adev->adm_deregister_stream(adev->adm_data, out->handle);
2818          pthread_mutex_lock(&adev->lock);
2819          out->standby = true;
2820          if (out->usecase != USECASE_AUDIO_PLAYBACK_OFFLOAD) {
2821              if (out->pcm) {
2822                  pcm_close(out->pcm);
2823                  out->pcm = NULL;
2824  
2825                  if (out->usecase == USECASE_AUDIO_PLAYBACK_WITH_HAPTICS) {
2826                      if (adev->haptic_pcm) {
2827                          pcm_close(adev->haptic_pcm);
2828                          adev->haptic_pcm = NULL;
2829                      }
2830  
2831                      if (adev->haptic_buffer != NULL) {
2832                          free(adev->haptic_buffer);
2833                          adev->haptic_buffer = NULL;
2834                          adev->haptic_buffer_size = 0;
2835                      }
2836                  }
2837              }
2838              if (out->usecase == USECASE_AUDIO_PLAYBACK_MMAP) {
2839                  do_stop = out->playback_started;
2840                  out->playback_started = false;
2841  
2842                  if (out->mmap_shared_memory_fd >= 0) {
2843                      ALOGV("%s: closing mmap_shared_memory_fd = %d",
2844                            __func__, out->mmap_shared_memory_fd);
2845                      close(out->mmap_shared_memory_fd);
2846                      out->mmap_shared_memory_fd = -1;
2847                  }
2848  
2849              }
2850          } else {
2851              stop_compressed_output_l(out);
2852              out->gapless_mdata.encoder_delay = 0;
2853              out->gapless_mdata.encoder_padding = 0;
2854              if (out->compr != NULL) {
2855                  compress_close(out->compr);
2856                  out->compr = NULL;
2857              }
2858          }
2859          if (do_stop) {
2860              stop_output_stream(out);
2861          }
2862          pthread_mutex_unlock(&adev->lock);
2863      }
2864      return 0;
2865  }
2866  
out_standby(struct audio_stream * stream)2867  static int out_standby(struct audio_stream *stream)
2868  {
2869      struct stream_out *out = (struct stream_out *)stream;
2870  
2871      ALOGV("%s: enter: usecase(%d: %s)", __func__,
2872            out->usecase, use_case_table[out->usecase]);
2873  
2874      lock_output_stream(out);
2875      out_standby_l(stream);
2876      pthread_mutex_unlock(&out->lock);
2877      ALOGV("%s: exit", __func__);
2878      return 0;
2879  }
2880  
out_on_error(struct audio_stream * stream)2881  static int out_on_error(struct audio_stream *stream)
2882  {
2883      struct stream_out *out = (struct stream_out *)stream;
2884      struct audio_device *adev = out->dev;
2885      bool do_standby = false;
2886  
2887      lock_output_stream(out);
2888      if (!out->standby) {
2889          if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
2890              stop_compressed_output_l(out);
2891              send_offload_cmd_l(out, OFFLOAD_CMD_ERROR);
2892          } else
2893              do_standby = true;
2894      }
2895      pthread_mutex_unlock(&out->lock);
2896  
2897      if (do_standby)
2898          return out_standby(&out->stream.common);
2899  
2900      return 0;
2901  }
2902  
out_dump(const struct audio_stream * stream,int fd)2903  static int out_dump(const struct audio_stream *stream, int fd)
2904  {
2905      struct stream_out *out = (struct stream_out *)stream;
2906  
2907      // We try to get the lock for consistency,
2908      // but it isn't necessary for these variables.
2909      // If we're not in standby, we may be blocked on a write.
2910      const bool locked = (pthread_mutex_trylock(&out->lock) == 0);
2911      dprintf(fd, "      Standby: %s\n", out->standby ? "yes" : "no");
2912      dprintf(fd, "      Frames written: %lld\n", (long long)out->written);
2913  
2914      char buffer[256]; // for statistics formatting
2915      simple_stats_to_string(&out->fifo_underruns, buffer, sizeof(buffer));
2916      dprintf(fd, "      Fifo frame underruns: %s\n", buffer);
2917  
2918      if (out->start_latency_ms.n > 0) {
2919          simple_stats_to_string(&out->start_latency_ms, buffer, sizeof(buffer));
2920          dprintf(fd, "      Start latency ms: %s\n", buffer);
2921      }
2922  
2923      if (locked) {
2924          pthread_mutex_unlock(&out->lock);
2925      }
2926  
2927      // dump error info
2928      (void)error_log_dump(
2929              out->error_log, fd, "      " /* prefix */, 0 /* lines */, 0 /* limit_ns */);
2930  
2931      return 0;
2932  }
2933  
parse_compress_metadata(struct stream_out * out,struct str_parms * parms)2934  static int parse_compress_metadata(struct stream_out *out, struct str_parms *parms)
2935  {
2936      int ret = 0;
2937      char value[32];
2938      struct compr_gapless_mdata tmp_mdata;
2939  
2940      if (!out || !parms) {
2941          return -EINVAL;
2942      }
2943  
2944      ret = str_parms_get_str(parms, AUDIO_OFFLOAD_CODEC_DELAY_SAMPLES, value, sizeof(value));
2945      if (ret >= 0) {
2946          tmp_mdata.encoder_delay = atoi(value); //whats a good limit check?
2947      } else {
2948          return -EINVAL;
2949      }
2950  
2951      ret = str_parms_get_str(parms, AUDIO_OFFLOAD_CODEC_PADDING_SAMPLES, value, sizeof(value));
2952      if (ret >= 0) {
2953          tmp_mdata.encoder_padding = atoi(value);
2954      } else {
2955          return -EINVAL;
2956      }
2957  
2958      out->gapless_mdata = tmp_mdata;
2959      out->send_new_metadata = 1;
2960      ALOGV("%s new encoder delay %u and padding %u", __func__,
2961            out->gapless_mdata.encoder_delay, out->gapless_mdata.encoder_padding);
2962  
2963      return 0;
2964  }
2965  
output_drives_call(struct audio_device * adev,struct stream_out * out)2966  static bool output_drives_call(struct audio_device *adev, struct stream_out *out)
2967  {
2968      return out == adev->primary_output || out == adev->voice_tx_output;
2969  }
2970  
get_alive_usb_card(struct str_parms * parms)2971  static int get_alive_usb_card(struct str_parms* parms) {
2972      int card;
2973      if ((str_parms_get_int(parms, "card", &card) >= 0) &&
2974          !audio_extn_usb_alive(card)) {
2975          return card;
2976      }
2977      return -ENODEV;
2978  }
2979  
out_set_parameters(struct audio_stream * stream,const char * kvpairs)2980  static int out_set_parameters(struct audio_stream *stream, const char *kvpairs)
2981  {
2982      struct stream_out *out = (struct stream_out *)stream;
2983      struct audio_device *adev = out->dev;
2984      struct audio_usecase *usecase;
2985      struct listnode *node;
2986      struct str_parms *parms;
2987      char value[32];
2988      int ret, val = 0;
2989      bool select_new_device = false;
2990      int status = 0;
2991      bool bypass_a2dp = false;
2992      bool forced_speaker_fallback = false;
2993  
2994      ALOGD("%s: enter: usecase(%d: %s) kvpairs: %s",
2995            __func__, out->usecase, use_case_table[out->usecase], kvpairs);
2996      parms = str_parms_create_str(kvpairs);
2997      ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_ROUTING, value, sizeof(value));
2998      if (ret >= 0) {
2999          val = atoi(value);
3000  
3001          lock_output_stream(out);
3002  
3003          if (val == AUDIO_DEVICE_NONE &&
3004                  audio_is_usb_out_device(out->devices)) {
3005              val = AUDIO_DEVICE_OUT_SPEAKER;
3006              forced_speaker_fallback = true;
3007          }
3008  
3009          pthread_mutex_lock(&adev->lock);
3010  
3011          /*
3012           * When HDMI cable is unplugged the music playback is paused and
3013           * the policy manager sends routing=0. But the audioflinger
3014           * continues to write data until standby time (3sec).
3015           * As the HDMI core is turned off, the write gets blocked.
3016           * Avoid this by routing audio to speaker until standby.
3017           */
3018          if (out->devices == AUDIO_DEVICE_OUT_AUX_DIGITAL &&
3019                  val == AUDIO_DEVICE_NONE) {
3020              val = AUDIO_DEVICE_OUT_SPEAKER;
3021              forced_speaker_fallback = true;
3022          }
3023  
3024          /*
3025           * When A2DP is disconnected the
3026           * music playback is paused and the policy manager sends routing=0
3027           * But the audioflingercontinues to write data until standby time
3028           * (3sec). As BT is turned off, the write gets blocked.
3029           * Avoid this by routing audio to speaker until standby.
3030           */
3031          if ((out->devices & AUDIO_DEVICE_OUT_BLUETOOTH_A2DP) &&
3032                  (val == AUDIO_DEVICE_NONE) &&
3033                  !audio_extn_a2dp_is_ready() &&
3034                  !adev->bt_sco_on) {
3035                  val = AUDIO_DEVICE_OUT_SPEAKER;
3036                  forced_speaker_fallback = true;
3037          }
3038  
3039          /* To avoid a2dp to sco overlapping / BT device improper state
3040           * check with BT lib about a2dp streaming support before routing
3041           */
3042          if (val & AUDIO_DEVICE_OUT_ALL_A2DP) {
3043              if (!audio_extn_a2dp_is_ready()) {
3044                  if (val & (AUDIO_DEVICE_OUT_SPEAKER | AUDIO_DEVICE_OUT_SPEAKER_SAFE)) {
3045                      //combo usecase just by pass a2dp
3046                      ALOGW("%s: A2DP profile is not ready,routing to speaker only", __func__);
3047                      bypass_a2dp = true;
3048                  } else {
3049                      ALOGE("%s: A2DP profile is not ready,ignoring routing request", __func__);
3050                      /* update device to a2dp and don't route as BT returned error
3051                       * However it is still possible a2dp routing called because
3052                       * of current active device disconnection (like wired headset)
3053                       */
3054                      out->devices = val;
3055                      pthread_mutex_unlock(&out->lock);
3056                      pthread_mutex_unlock(&adev->lock);
3057                      status = -ENOSYS;
3058                      goto routing_fail;
3059                  }
3060              }
3061          }
3062  
3063          audio_devices_t new_dev = val;
3064  
3065          // Workaround: If routing to an non existing usb device, fail gracefully
3066          // The routing request will otherwise block during 10 second
3067          int card;
3068          if (audio_is_usb_out_device(new_dev) &&
3069              (card = get_alive_usb_card(parms)) >= 0) {
3070  
3071              ALOGW("out_set_parameters() ignoring rerouting to non existing USB card %d", card);
3072              pthread_mutex_unlock(&adev->lock);
3073              pthread_mutex_unlock(&out->lock);
3074              status = -ENOSYS;
3075              goto routing_fail;
3076          }
3077  
3078          /*
3079           * select_devices() call below switches all the usecases on the same
3080           * backend to the new device. Refer to check_and_route_playback_usecases() in
3081           * the select_devices(). But how do we undo this?
3082           *
3083           * For example, music playback is active on headset (deep-buffer usecase)
3084           * and if we go to ringtones and select a ringtone, low-latency usecase
3085           * will be started on headset+speaker. As we can't enable headset+speaker
3086           * and headset devices at the same time, select_devices() switches the music
3087           * playback to headset+speaker while starting low-lateny usecase for ringtone.
3088           * So when the ringtone playback is completed, how do we undo the same?
3089           *
3090           * We are relying on the out_set_parameters() call on deep-buffer output,
3091           * once the ringtone playback is ended.
3092           * NOTE: We should not check if the current devices are same as new devices.
3093           *       Because select_devices() must be called to switch back the music
3094           *       playback to headset.
3095           */
3096          if (new_dev != AUDIO_DEVICE_NONE) {
3097              bool same_dev = out->devices == new_dev;
3098              out->devices = new_dev;
3099  
3100              if (output_drives_call(adev, out)) {
3101                  if (!voice_is_call_state_active(adev)) {
3102                      if (adev->mode == AUDIO_MODE_IN_CALL) {
3103                          adev->current_call_output = out;
3104                          ret = voice_start_call(adev);
3105                      }
3106                  } else {
3107                      adev->current_call_output = out;
3108                      voice_update_devices_for_all_voice_usecases(adev);
3109                  }
3110              }
3111  
3112              if (!out->standby) {
3113                  int volume_delay_us = 0;
3114                  if (out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) {
3115                      pthread_mutex_lock(&out->compr_mute_lock);
3116                      if (out->a2dp_compress_mute &&
3117                          (!(new_dev & AUDIO_DEVICE_OUT_ALL_A2DP) ||
3118                           audio_extn_a2dp_is_ready())) {
3119                          out->a2dp_compress_mute = false;
3120                      }
3121                      float volume_l = out->volume_l;
3122                      float volume_r = out->volume_r;
3123                      if (out->a2dp_compress_mute || forced_speaker_fallback) {
3124                          volume_l = 0.0;
3125                          volume_r = 0.0;
3126                      }
3127                      if (volume_l != out->applied_volume_l || volume_r != out->applied_volume_r)
3128                          volume_delay_us = COMPRESS_OFFLOAD_PLAYBACK_LATENCY * 2000;
3129  
3130                      out_set_compr_volume(&out->stream, volume_l, volume_r);
3131                      pthread_mutex_unlock(&out->compr_mute_lock);
3132                  } else if (out->usecase == USECASE_AUDIO_PLAYBACK_LOW_LATENCY ||
3133                          out->usecase == USECASE_AUDIO_PLAYBACK_DEEP_BUFFER ||
3134                          out->usecase == USECASE_AUDIO_PLAYBACK_ULL) {
3135                      float volume_l = out->volume_l;
3136                      float volume_r = out->volume_r;
3137                      if (forced_speaker_fallback) {
3138                          volume_l = 0.0;
3139                          volume_r = 0.0;
3140                      }
3141                      if (volume_l != out->applied_volume_l || volume_r != out->applied_volume_r)
3142                          volume_delay_us = (int)platform_render_latency(out) * 2;
3143  
3144                      out_set_pcm_volume(&out->stream, volume_l, volume_r);
3145                  }
3146                  if (volume_delay_us > 0)
3147                      usleep(volume_delay_us * 2);
3148  
3149                  if (!same_dev) {
3150                      ALOGV("update routing change");
3151                      // inform adm before actual routing to prevent glitches.
3152                      if (adev->adm_on_routing_change) {
3153                          adev->adm_on_routing_change(adev->adm_data,
3154                                                      out->handle);
3155                      }
3156                  }
3157                  if (!bypass_a2dp) {
3158                      select_devices(adev, out->usecase);
3159                  } else {
3160                      if (new_dev & AUDIO_DEVICE_OUT_SPEAKER_SAFE)
3161                          out->devices = AUDIO_DEVICE_OUT_SPEAKER_SAFE;
3162                      else
3163                          out->devices = AUDIO_DEVICE_OUT_SPEAKER;
3164                      select_devices(adev, out->usecase);
3165                      out->devices = new_dev;
3166                  }
3167                  audio_extn_tfa_98xx_update();
3168  
3169                  // on device switch force swap, lower functions will make sure
3170                  // to check if swap is allowed or not.
3171  
3172                  if (!same_dev)
3173                      platform_set_swap_channels(adev, true);
3174  
3175  
3176              }
3177  
3178          }
3179  
3180          pthread_mutex_unlock(&adev->lock);
3181          pthread_mutex_unlock(&out->lock);
3182  
3183          /*handles device and call state changes*/
3184          audio_extn_extspk_update(adev->extspk);
3185      }
3186      routing_fail:
3187  
3188      if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
3189          parse_compress_metadata(out, parms);
3190      }
3191  
3192      str_parms_destroy(parms);
3193      ALOGV("%s: exit: code(%d)", __func__, status);
3194      return status;
3195  }
3196  
stream_get_parameter_channels(struct str_parms * query,struct str_parms * reply,audio_channel_mask_t * supported_channel_masks)3197  static bool stream_get_parameter_channels(struct str_parms *query,
3198                                            struct str_parms *reply,
3199                                            audio_channel_mask_t *supported_channel_masks) {
3200      int ret = -1;
3201      char value[ARRAY_SIZE(channels_name_to_enum_table) * 32 /* max channel name size */];
3202      bool first = true;
3203      size_t i, j;
3204  
3205      if (str_parms_has_key(query, AUDIO_PARAMETER_STREAM_SUP_CHANNELS)) {
3206          ret = 0;
3207          value[0] = '\0';
3208          i = 0;
3209          while (supported_channel_masks[i] != 0) {
3210              for (j = 0; j < ARRAY_SIZE(channels_name_to_enum_table); j++) {
3211                  if (channels_name_to_enum_table[j].value == supported_channel_masks[i]) {
3212                      if (!first) {
3213                          strcat(value, "|");
3214                      }
3215                      strcat(value, channels_name_to_enum_table[j].name);
3216                      first = false;
3217                      break;
3218                  }
3219              }
3220              i++;
3221          }
3222          str_parms_add_str(reply, AUDIO_PARAMETER_STREAM_SUP_CHANNELS, value);
3223      }
3224      return ret >= 0;
3225  }
3226  
stream_get_parameter_formats(struct str_parms * query,struct str_parms * reply,audio_format_t * supported_formats)3227  static bool stream_get_parameter_formats(struct str_parms *query,
3228                                           struct str_parms *reply,
3229                                           audio_format_t *supported_formats) {
3230      int ret = -1;
3231      char value[256];
3232      int i;
3233  
3234      if (str_parms_has_key(query, AUDIO_PARAMETER_STREAM_SUP_FORMATS)) {
3235          ret = 0;
3236          value[0] = '\0';
3237          switch (supported_formats[0]) {
3238              case AUDIO_FORMAT_PCM_16_BIT:
3239                  strcat(value, "AUDIO_FORMAT_PCM_16_BIT");
3240                  break;
3241              case AUDIO_FORMAT_PCM_24_BIT_PACKED:
3242                  strcat(value, "AUDIO_FORMAT_PCM_24_BIT_PACKED");
3243                  break;
3244              case AUDIO_FORMAT_PCM_32_BIT:
3245                  strcat(value, "AUDIO_FORMAT_PCM_32_BIT");
3246                  break;
3247              default:
3248                  ALOGE("%s: unsupported format %#x", __func__,
3249                        supported_formats[0]);
3250                  break;
3251          }
3252          str_parms_add_str(reply, AUDIO_PARAMETER_STREAM_SUP_FORMATS, value);
3253      }
3254      return ret >= 0;
3255  }
3256  
stream_get_parameter_rates(struct str_parms * query,struct str_parms * reply,uint32_t * supported_sample_rates)3257  static bool stream_get_parameter_rates(struct str_parms *query,
3258                                         struct str_parms *reply,
3259                                         uint32_t *supported_sample_rates) {
3260  
3261      int i;
3262      char value[256];
3263      int ret = -1;
3264      if (str_parms_has_key(query, AUDIO_PARAMETER_STREAM_SUP_SAMPLING_RATES)) {
3265          ret = 0;
3266          value[0] = '\0';
3267          i=0;
3268          int cursor = 0;
3269          while (supported_sample_rates[i]) {
3270              int avail = sizeof(value) - cursor;
3271              ret = snprintf(value + cursor, avail, "%s%d",
3272                             cursor > 0 ? "|" : "",
3273                             supported_sample_rates[i]);
3274              if (ret < 0 || ret >= avail) {
3275                  // if cursor is at the last element of the array
3276                  //    overwrite with \0 is duplicate work as
3277                  //    snprintf already put a \0 in place.
3278                  // else
3279                  //    we had space to write the '|' at value[cursor]
3280                  //    (which will be overwritten) or no space to fill
3281                  //    the first element (=> cursor == 0)
3282                  value[cursor] = '\0';
3283                  break;
3284              }
3285              cursor += ret;
3286              ++i;
3287          }
3288          str_parms_add_str(reply, AUDIO_PARAMETER_STREAM_SUP_SAMPLING_RATES,
3289                            value);
3290      }
3291      return ret >= 0;
3292  }
3293  
out_get_parameters(const struct audio_stream * stream,const char * keys)3294  static char* out_get_parameters(const struct audio_stream *stream, const char *keys)
3295  {
3296      struct stream_out *out = (struct stream_out *)stream;
3297      struct str_parms *query = str_parms_create_str(keys);
3298      char *str;
3299      struct str_parms *reply = str_parms_create();
3300      bool replied = false;
3301      ALOGV("%s: enter: keys - %s", __func__, keys);
3302  
3303      replied |= stream_get_parameter_channels(query, reply,
3304                                               &out->supported_channel_masks[0]);
3305      replied |= stream_get_parameter_formats(query, reply,
3306                                              &out->supported_formats[0]);
3307      replied |= stream_get_parameter_rates(query, reply,
3308                                            &out->supported_sample_rates[0]);
3309      if (replied) {
3310          str = str_parms_to_str(reply);
3311      } else {
3312          str = strdup("");
3313      }
3314      str_parms_destroy(query);
3315      str_parms_destroy(reply);
3316      ALOGV("%s: exit: returns - %s", __func__, str);
3317      return str;
3318  }
3319  
out_get_latency(const struct audio_stream_out * stream)3320  static uint32_t out_get_latency(const struct audio_stream_out *stream)
3321  {
3322      uint32_t hw_delay, period_ms;
3323      struct stream_out *out = (struct stream_out *)stream;
3324      uint32_t latency;
3325  
3326      if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD)
3327          return COMPRESS_OFFLOAD_PLAYBACK_LATENCY;
3328      else if ((out->realtime) ||
3329              (out->usecase == USECASE_AUDIO_PLAYBACK_MMAP)) {
3330          // since the buffer won't be filled up faster than realtime,
3331          // return a smaller number
3332          period_ms = (out->af_period_multiplier * out->config.period_size *
3333                       1000) / (out->config.rate);
3334          hw_delay = platform_render_latency(out)/1000;
3335          return period_ms + hw_delay;
3336      }
3337  
3338      latency = (out->config.period_count * out->config.period_size * 1000) /
3339                (out->config.rate);
3340  
3341      if (AUDIO_DEVICE_OUT_ALL_A2DP & out->devices)
3342          latency += audio_extn_a2dp_get_encoder_latency();
3343  
3344      return latency;
3345  }
3346  
out_set_compr_volume(struct audio_stream_out * stream,float left,float right)3347  static int out_set_compr_volume(struct audio_stream_out *stream, float left,
3348                            float right)
3349  {
3350      struct stream_out *out = (struct stream_out *)stream;
3351      int volume[2];
3352      char mixer_ctl_name[128];
3353      struct audio_device *adev = out->dev;
3354      struct mixer_ctl *ctl;
3355      int pcm_device_id = platform_get_pcm_device_id(out->usecase,
3356                                                 PCM_PLAYBACK);
3357  
3358      if (left == out->applied_volume_l && right == out->applied_volume_r)
3359         return 0;
3360  
3361      snprintf(mixer_ctl_name, sizeof(mixer_ctl_name),
3362               "Compress Playback %d Volume", pcm_device_id);
3363      ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
3364      if (!ctl) {
3365          ALOGE("%s: Could not get ctl for mixer cmd - %s",
3366                __func__, mixer_ctl_name);
3367          return -EINVAL;
3368      }
3369      ALOGV("%s: ctl for mixer cmd - %s, left %f, right %f",
3370             __func__, mixer_ctl_name, left, right);
3371      volume[0] = (int)(left * COMPRESS_PLAYBACK_VOLUME_MAX);
3372      volume[1] = (int)(right * COMPRESS_PLAYBACK_VOLUME_MAX);
3373      mixer_ctl_set_array(ctl, volume, sizeof(volume) / sizeof(volume[0]));
3374  
3375      out->applied_volume_l = left;
3376      out->applied_volume_r = right;
3377      return 0;
3378  }
3379  
out_set_pcm_volume(struct audio_stream_out * stream,float left,float right)3380  static int out_set_pcm_volume(struct audio_stream_out *stream, float left,
3381                                float right)
3382  {
3383      struct stream_out *out = (struct stream_out *)stream;
3384  
3385      if (left == out->applied_volume_l && right == out->applied_volume_r)
3386         return 0;
3387  
3388      /* Volume control for pcm playback */
3389      if (left != right) {
3390          return -EINVAL;
3391      } else {
3392          char mixer_ctl_name[128];
3393          struct audio_device *adev = out->dev;
3394          struct mixer_ctl *ctl;
3395          int pcm_device_id = platform_get_pcm_device_id(out->usecase, PCM_PLAYBACK);
3396          snprintf(mixer_ctl_name, sizeof(mixer_ctl_name), "Playback %d Volume", pcm_device_id);
3397          ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
3398          if (!ctl) {
3399              ALOGE("%s : Could not get ctl for mixer cmd - %s", __func__, mixer_ctl_name);
3400              return -EINVAL;
3401          }
3402  
3403          int volume = (int) (left * PCM_PLAYBACK_VOLUME_MAX);
3404          int ret = mixer_ctl_set_value(ctl, 0, volume);
3405          if (ret < 0) {
3406              ALOGE("%s: Could not set ctl, error:%d ", __func__, ret);
3407              return -EINVAL;
3408          }
3409  
3410          ALOGV("%s : Pcm set volume value %d left %f", __func__, volume, left);
3411  
3412          out->applied_volume_l = left;
3413          out->applied_volume_r = right;
3414          return 0;
3415      }
3416  }
3417  
out_set_volume(struct audio_stream_out * stream,float left,float right)3418  static int out_set_volume(struct audio_stream_out *stream, float left,
3419                            float right)
3420  {
3421      struct stream_out *out = (struct stream_out *)stream;
3422      int ret = 0;
3423  
3424      if (out->usecase == USECASE_AUDIO_PLAYBACK_HIFI) {
3425          /* only take left channel into account: the API is for stereo anyway */
3426          out->muted = (left == 0.0f);
3427          return 0;
3428      } else if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
3429          pthread_mutex_lock(&out->compr_mute_lock);
3430          ALOGV("%s: compress mute %d", __func__, out->a2dp_compress_mute);
3431          if (!out->a2dp_compress_mute)
3432              ret = out_set_compr_volume(stream, left, right);
3433          out->volume_l = left;
3434          out->volume_r = right;
3435          pthread_mutex_unlock(&out->compr_mute_lock);
3436          return ret;
3437      } else if (out->usecase == USECASE_AUDIO_PLAYBACK_VOIP) {
3438          out->app_type_cfg.gain[0] = (int)(left * VOIP_PLAYBACK_VOLUME_MAX);
3439          out->app_type_cfg.gain[1] = (int)(right * VOIP_PLAYBACK_VOLUME_MAX);
3440          if (!out->standby) {
3441              // if in standby, cached volume will be sent after stream is opened
3442              audio_extn_utils_send_app_type_gain(out->dev,
3443                                                  out->app_type_cfg.app_type,
3444                                                  &out->app_type_cfg.gain[0]);
3445          }
3446          return 0;
3447      }
3448  
3449      return -ENOSYS;
3450  }
3451  
3452  // note: this call is safe only if the stream_cb is
3453  // removed first in close_output_stream (as is done now).
out_snd_mon_cb(void * stream,struct str_parms * parms)3454  static void out_snd_mon_cb(void * stream, struct str_parms * parms)
3455  {
3456      if (!stream || !parms)
3457          return;
3458  
3459      struct stream_out *out = (struct stream_out *)stream;
3460      struct audio_device *adev = out->dev;
3461  
3462      card_status_t status;
3463      int card;
3464      if (parse_snd_card_status(parms, &card, &status) < 0)
3465          return;
3466  
3467      pthread_mutex_lock(&adev->lock);
3468      bool valid_cb = (card == adev->snd_card);
3469      pthread_mutex_unlock(&adev->lock);
3470  
3471      if (!valid_cb)
3472          return;
3473  
3474      lock_output_stream(out);
3475      if (out->card_status != status)
3476          out->card_status = status;
3477      pthread_mutex_unlock(&out->lock);
3478  
3479      ALOGW("out_snd_mon_cb for card %d usecase %s, status %s", card,
3480            use_case_table[out->usecase],
3481            status == CARD_STATUS_OFFLINE ? "offline" : "online");
3482  
3483      if (status == CARD_STATUS_OFFLINE)
3484          out_on_error(stream);
3485  
3486      return;
3487  }
3488  
3489  #ifdef NO_AUDIO_OUT
out_write_for_no_output(struct audio_stream_out * stream,const void * buffer __unused,size_t bytes)3490  static ssize_t out_write_for_no_output(struct audio_stream_out *stream,
3491                                         const void *buffer __unused, size_t bytes)
3492  {
3493      struct stream_out *out = (struct stream_out *)stream;
3494  
3495      /* No Output device supported other than BT for playback.
3496       * Sleep for the amount of buffer duration
3497       */
3498      lock_output_stream(out);
3499      usleep(bytes * 1000000 / audio_stream_out_frame_size(
3500              (const struct audio_stream_out *)&out->stream) /
3501              out_get_sample_rate(&out->stream.common));
3502      pthread_mutex_unlock(&out->lock);
3503      return bytes;
3504  }
3505  #endif
3506  
out_write(struct audio_stream_out * stream,const void * buffer,size_t bytes)3507  static ssize_t out_write(struct audio_stream_out *stream, const void *buffer,
3508                           size_t bytes)
3509  {
3510      struct stream_out *out = (struct stream_out *)stream;
3511      struct audio_device *adev = out->dev;
3512      ssize_t ret = 0;
3513      int error_code = ERROR_CODE_STANDBY;
3514  
3515      lock_output_stream(out);
3516      // this is always nonzero
3517      const size_t frame_size = audio_stream_out_frame_size(stream);
3518      const size_t frames = bytes / frame_size;
3519  
3520      if (out->usecase == USECASE_AUDIO_PLAYBACK_MMAP) {
3521          error_code = ERROR_CODE_WRITE;
3522          goto exit;
3523      }
3524  
3525      if ((out->devices & AUDIO_DEVICE_OUT_ALL_A2DP) &&
3526          (audio_extn_a2dp_is_suspended())) {
3527          if (!(out->devices & (AUDIO_DEVICE_OUT_SPEAKER | AUDIO_DEVICE_OUT_SPEAKER_SAFE))) {
3528              if (!(out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD)) {
3529                  ret = -EIO;
3530                  goto exit;
3531              }
3532          }
3533      }
3534  
3535      const bool was_in_standby = out->standby;
3536      if (out->standby) {
3537          out->standby = false;
3538          const int64_t startNs = systemTime(SYSTEM_TIME_MONOTONIC);
3539  
3540          pthread_mutex_lock(&adev->lock);
3541          ret = start_output_stream(out);
3542  
3543          /* ToDo: If use case is compress offload should return 0 */
3544          if (ret != 0) {
3545              out->standby = true;
3546              pthread_mutex_unlock(&adev->lock);
3547              goto exit;
3548          }
3549  
3550          // after standby always force set last known cal step
3551          // dont change level anywhere except at the audio_hw_send_gain_dep_calibration
3552          ALOGD("%s: retry previous failed cal level set", __func__);
3553          send_gain_dep_calibration_l();
3554          pthread_mutex_unlock(&adev->lock);
3555  
3556          // log startup time in ms.
3557          simple_stats_log(
3558                  &out->start_latency_ms, (systemTime(SYSTEM_TIME_MONOTONIC) - startNs) * 1e-6);
3559          out->last_fifo_valid = false; // we're coming out of standby, last_fifo isn't valid.
3560      }
3561  
3562      if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
3563          ALOGVV("%s: writing buffer (%zu bytes) to compress device", __func__, bytes);
3564          if (out->send_new_metadata) {
3565              ALOGVV("send new gapless metadata");
3566              compress_set_gapless_metadata(out->compr, &out->gapless_mdata);
3567              out->send_new_metadata = 0;
3568          }
3569          unsigned int avail;
3570          struct timespec tstamp;
3571          ret = compress_get_hpointer(out->compr, &avail, &tstamp);
3572          /* Do not limit write size if the available frames count is unknown */
3573          if (ret != 0) {
3574              avail = bytes;
3575          }
3576          if (avail == 0) {
3577              ret = 0;
3578          } else {
3579              // check for compressed format underrun, essentially an empty buffer check
3580              // for a lack of better measurement.
3581              if (!was_in_standby && avail == out->kernel_buffer_size) {
3582                  ALOGW("%s: compressed buffer empty (underrun)", __func__);
3583                  simple_stats_log(&out->fifo_underruns, 1.); // Note: log one frame for compressed.
3584              }
3585  
3586              if (avail > bytes) {
3587                  avail = bytes;
3588              }
3589              ret = compress_write(out->compr, buffer, avail);
3590              ALOGVV("%s: writing buffer (%d bytes) to compress device returned %zd",
3591                     __func__, avail, ret);
3592          }
3593  
3594          if (ret >= 0 && ret < (ssize_t)bytes) {
3595              send_offload_cmd_l(out, OFFLOAD_CMD_WAIT_FOR_BUFFER);
3596          }
3597          if (ret > 0 && !out->playback_started) {
3598              compress_start(out->compr);
3599              out->playback_started = 1;
3600              out->offload_state = OFFLOAD_STATE_PLAYING;
3601          }
3602          if (ret < 0) {
3603              error_log_log(out->error_log, ERROR_CODE_WRITE, audio_utils_get_real_time_ns());
3604          } else {
3605              out->written += ret; // accumulate bytes written for offload.
3606          }
3607          pthread_mutex_unlock(&out->lock);
3608          // TODO: consider logging offload pcm
3609          return ret;
3610      } else {
3611          error_code = ERROR_CODE_WRITE;
3612          if (out->pcm) {
3613              size_t bytes_to_write = bytes;
3614  
3615              if (out->muted)
3616                  memset((void *)buffer, 0, bytes);
3617              // FIXME: this can be removed once audio flinger mixer supports mono output
3618              if (out->usecase == USECASE_AUDIO_PLAYBACK_VOIP ||
3619                  out->usecase == USECASE_INCALL_MUSIC_UPLINK ||
3620                  out->usecase == USECASE_INCALL_MUSIC_UPLINK2) {
3621                  size_t channel_count = audio_channel_count_from_out_mask(out->channel_mask);
3622                  int16_t *src = (int16_t *)buffer;
3623                  int16_t *dst = (int16_t *)buffer;
3624  
3625                  LOG_ALWAYS_FATAL_IF(out->config.channels != 1 || channel_count != 2 ||
3626                                      out->format != AUDIO_FORMAT_PCM_16_BIT,
3627                                      "out_write called for VOIP use case with wrong properties");
3628  
3629                  for (size_t i = 0; i < frames ; i++, dst++, src += 2) {
3630                      *dst = (int16_t)(((int32_t)src[0] + (int32_t)src[1]) >> 1);
3631                  }
3632                  bytes_to_write /= 2;
3633              }
3634  
3635              // Note: since out_get_presentation_position() is called alternating with out_write()
3636              // by AudioFlinger, we can check underruns using the prior timestamp read.
3637              // (Alternately we could check if the buffer is empty using pcm_get_htimestamp().
3638              if (out->last_fifo_valid) {
3639                  // compute drain to see if there is an underrun.
3640                  const int64_t current_ns = systemTime(SYSTEM_TIME_MONOTONIC); // sys call
3641                  const int64_t frames_by_time =
3642                          (current_ns - out->last_fifo_time_ns) * out->config.rate / NANOS_PER_SECOND;
3643                  const int64_t underrun = frames_by_time - out->last_fifo_frames_remaining;
3644  
3645                  if (underrun > 0) {
3646                      simple_stats_log(&out->fifo_underruns, underrun);
3647  
3648                      ALOGW("%s: underrun(%lld) "
3649                              "frames_by_time(%lld) > out->last_fifo_frames_remaining(%lld)",
3650                              __func__,
3651                              (long long)out->fifo_underruns.n,
3652                              (long long)frames_by_time,
3653                              (long long)out->last_fifo_frames_remaining);
3654                  }
3655                  out->last_fifo_valid = false;  // we're writing below, mark fifo info as stale.
3656              }
3657  
3658              long ns = (frames * (int64_t) NANOS_PER_SECOND) / out->config.rate;
3659              request_out_focus(out, ns);
3660  
3661              bool use_mmap = is_mmap_usecase(out->usecase) || out->realtime;
3662              if (use_mmap) {
3663                  ret = pcm_mmap_write(out->pcm, (void *)buffer, bytes_to_write);
3664              } else {
3665                  if (out->usecase == USECASE_AUDIO_PLAYBACK_WITH_HAPTICS) {
3666                      size_t channel_count = audio_channel_count_from_out_mask(out->channel_mask);
3667                      size_t bytes_per_sample = audio_bytes_per_sample(out->format);
3668                      size_t frame_size = channel_count * bytes_per_sample;
3669                      size_t frame_count = bytes_to_write / frame_size;
3670  
3671                      bool force_haptic_path =
3672                           property_get_bool("vendor.audio.test_haptic", false);
3673  
3674                      // extract Haptics data from Audio buffer
3675                      bool   alloc_haptic_buffer = false;
3676                      int    haptic_channel_count = adev->haptics_config.channels;
3677                      size_t haptic_frame_size = bytes_per_sample * haptic_channel_count;
3678                      size_t audio_frame_size = frame_size - haptic_frame_size;
3679                      size_t total_haptic_buffer_size = frame_count * haptic_frame_size;
3680  
3681                      if (adev->haptic_buffer == NULL) {
3682                          alloc_haptic_buffer = true;
3683                      } else if (adev->haptic_buffer_size < total_haptic_buffer_size) {
3684                          free(adev->haptic_buffer);
3685                          adev->haptic_buffer_size = 0;
3686                          alloc_haptic_buffer = true;
3687                      }
3688  
3689                      if (alloc_haptic_buffer) {
3690                          adev->haptic_buffer = (uint8_t *)calloc(1, total_haptic_buffer_size);
3691                          adev->haptic_buffer_size = total_haptic_buffer_size;
3692                      }
3693  
3694                      size_t src_index = 0, aud_index = 0, hap_index = 0;
3695                      uint8_t *audio_buffer = (uint8_t *)buffer;
3696                      uint8_t *haptic_buffer  = adev->haptic_buffer;
3697  
3698                      // This is required for testing only. This works for stereo data only.
3699                      // One channel is fed to audio stream and other to haptic stream for testing.
3700                      if (force_haptic_path) {
3701                         audio_frame_size = haptic_frame_size = bytes_per_sample;
3702                      }
3703  
3704                      for (size_t i = 0; i < frame_count; i++) {
3705                          for (size_t j = 0; j < audio_frame_size; j++)
3706                              audio_buffer[aud_index++] = audio_buffer[src_index++];
3707  
3708                          for (size_t j = 0; j < haptic_frame_size; j++)
3709                              haptic_buffer[hap_index++] = audio_buffer[src_index++];
3710                          }
3711  
3712                          // This is required for testing only.
3713                          // Discard haptic channel data.
3714                          if (force_haptic_path) {
3715                              src_index += haptic_frame_size;
3716                      }
3717  
3718                      // write to audio pipeline
3719                      ret = pcm_write(out->pcm,
3720                                      (void *)audio_buffer,
3721                                      frame_count * audio_frame_size);
3722  
3723                      // write to haptics pipeline
3724                      if (adev->haptic_pcm)
3725                          ret = pcm_write(adev->haptic_pcm,
3726                                          (void *)adev->haptic_buffer,
3727                                          frame_count * haptic_frame_size);
3728  
3729                  } else {
3730                      ret = pcm_write(out->pcm, (void *)buffer, bytes_to_write);
3731                  }
3732              }
3733              release_out_focus(out, ns);
3734          } else {
3735              LOG_ALWAYS_FATAL("out->pcm is NULL after starting output stream");
3736          }
3737      }
3738  
3739  exit:
3740      // For PCM we always consume the buffer and return #bytes regardless of ret.
3741      if (out->usecase != USECASE_AUDIO_PLAYBACK_OFFLOAD) {
3742          out->written += frames;
3743      }
3744      long long sleeptime_us = 0;
3745  
3746      if (ret != 0) {
3747          error_log_log(out->error_log, error_code, audio_utils_get_real_time_ns());
3748          if (out->usecase != USECASE_AUDIO_PLAYBACK_OFFLOAD) {
3749              ALOGE_IF(out->pcm != NULL,
3750                      "%s: error %zd - %s", __func__, ret, pcm_get_error(out->pcm));
3751              sleeptime_us = frames * 1000000LL / out_get_sample_rate(&out->stream.common);
3752              // usleep not guaranteed for values over 1 second but we don't limit here.
3753          }
3754      }
3755  
3756      pthread_mutex_unlock(&out->lock);
3757  
3758      if (ret != 0) {
3759          out_on_error(&out->stream.common);
3760          if (sleeptime_us != 0)
3761              usleep(sleeptime_us);
3762      }
3763      return bytes;
3764  }
3765  
out_get_render_position(const struct audio_stream_out * stream,uint32_t * dsp_frames)3766  static int out_get_render_position(const struct audio_stream_out *stream,
3767                                     uint32_t *dsp_frames)
3768  {
3769      struct stream_out *out = (struct stream_out *)stream;
3770      *dsp_frames = 0;
3771      if ((out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) && (dsp_frames != NULL)) {
3772          lock_output_stream(out);
3773          if (out->compr != NULL) {
3774              unsigned long frames = 0;
3775              // TODO: check return value
3776              compress_get_tstamp(out->compr, &frames, &out->sample_rate);
3777              *dsp_frames = (uint32_t)frames;
3778              ALOGVV("%s rendered frames %d sample_rate %d",
3779                     __func__, *dsp_frames, out->sample_rate);
3780          }
3781          pthread_mutex_unlock(&out->lock);
3782          return 0;
3783      } else
3784          return -ENODATA;
3785  }
3786  
out_add_audio_effect(const struct audio_stream * stream __unused,effect_handle_t effect __unused)3787  static int out_add_audio_effect(const struct audio_stream *stream __unused,
3788                                  effect_handle_t effect __unused)
3789  {
3790      return 0;
3791  }
3792  
out_remove_audio_effect(const struct audio_stream * stream __unused,effect_handle_t effect __unused)3793  static int out_remove_audio_effect(const struct audio_stream *stream __unused,
3794                                     effect_handle_t effect __unused)
3795  {
3796      return 0;
3797  }
3798  
out_get_next_write_timestamp(const struct audio_stream_out * stream __unused,int64_t * timestamp __unused)3799  static int out_get_next_write_timestamp(const struct audio_stream_out *stream __unused,
3800                                          int64_t *timestamp __unused)
3801  {
3802      return -ENOSYS;
3803  }
3804  
out_get_presentation_position(const struct audio_stream_out * stream,uint64_t * frames,struct timespec * timestamp)3805  static int out_get_presentation_position(const struct audio_stream_out *stream,
3806                                     uint64_t *frames, struct timespec *timestamp)
3807  {
3808      struct stream_out *out = (struct stream_out *)stream;
3809      int ret = -ENODATA;
3810      unsigned long dsp_frames;
3811  
3812      lock_output_stream(out);
3813  
3814      if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
3815          if (out->compr != NULL) {
3816              // TODO: check return value
3817              compress_get_tstamp(out->compr, &dsp_frames,
3818                      &out->sample_rate);
3819              // Adjustment accounts for A2DP encoder latency with offload usecases
3820              // Note: Encoder latency is returned in ms.
3821              if (AUDIO_DEVICE_OUT_ALL_A2DP & out->devices) {
3822                  unsigned long offset =
3823                              (audio_extn_a2dp_get_encoder_latency() * out->sample_rate / 1000);
3824                  dsp_frames = (dsp_frames > offset) ? (dsp_frames - offset) : 0;
3825              }
3826              ALOGVV("%s rendered frames %ld sample_rate %d",
3827                     __func__, dsp_frames, out->sample_rate);
3828              *frames = dsp_frames;
3829              ret = 0;
3830              /* this is the best we can do */
3831              clock_gettime(CLOCK_MONOTONIC, timestamp);
3832          }
3833      } else {
3834          if (out->pcm) {
3835              unsigned int avail;
3836              if (pcm_get_htimestamp(out->pcm, &avail, timestamp) == 0) {
3837  
3838                  // pcm_get_htimestamp() computes the available frames by comparing
3839                  // the alsa driver hw_ptr and the appl_ptr levels.
3840                  // In underrun, the hw_ptr may keep running and report an excessively
3841                  // large number available number.
3842                  if (avail > out->kernel_buffer_size) {
3843                      ALOGW("%s: avail:%u > kernel_buffer_size:%zu clamping!",
3844                              __func__, avail, out->kernel_buffer_size);
3845                      avail = out->kernel_buffer_size;
3846                      out->last_fifo_frames_remaining = 0;
3847                  } else {
3848                      out->last_fifo_frames_remaining = out->kernel_buffer_size - avail;
3849                  }
3850                  out->last_fifo_valid = true;
3851                  out->last_fifo_time_ns = audio_utils_ns_from_timespec(timestamp);
3852  
3853                  int64_t signed_frames = out->written - out->last_fifo_frames_remaining;
3854  
3855                  ALOGVV("%s: frames:%lld  avail:%u  kernel_buffer_size:%zu",
3856                          __func__, (long long)signed_frames, avail, out->kernel_buffer_size);
3857  
3858                  // This adjustment accounts for buffering after app processor.
3859                  // It is based on estimated DSP latency per use case, rather than exact.
3860                  signed_frames -=
3861                      (platform_render_latency(out) * out->sample_rate / 1000000LL);
3862  
3863                  // Adjustment accounts for A2DP encoder latency with non-offload usecases
3864                  // Note: Encoder latency is returned in ms, while platform_render_latency in us.
3865                  if (AUDIO_DEVICE_OUT_ALL_A2DP & out->devices) {
3866                      signed_frames -=
3867                              (audio_extn_a2dp_get_encoder_latency() * out->sample_rate / 1000);
3868                  }
3869  
3870                  // It would be unusual for this value to be negative, but check just in case ...
3871                  if (signed_frames >= 0) {
3872                      *frames = signed_frames;
3873                      ret = 0;
3874                  }
3875              }
3876          }
3877      }
3878  
3879      pthread_mutex_unlock(&out->lock);
3880  
3881      return ret;
3882  }
3883  
out_set_callback(struct audio_stream_out * stream,stream_callback_t callback,void * cookie)3884  static int out_set_callback(struct audio_stream_out *stream,
3885              stream_callback_t callback, void *cookie)
3886  {
3887      struct stream_out *out = (struct stream_out *)stream;
3888  
3889      ALOGV("%s", __func__);
3890      lock_output_stream(out);
3891      out->offload_callback = callback;
3892      out->offload_cookie = cookie;
3893      pthread_mutex_unlock(&out->lock);
3894      return 0;
3895  }
3896  
out_pause(struct audio_stream_out * stream)3897  static int out_pause(struct audio_stream_out* stream)
3898  {
3899      struct stream_out *out = (struct stream_out *)stream;
3900      int status = -ENOSYS;
3901      ALOGV("%s", __func__);
3902      if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
3903          status = -ENODATA;
3904          lock_output_stream(out);
3905          if (out->compr != NULL && out->offload_state == OFFLOAD_STATE_PLAYING) {
3906              status = compress_pause(out->compr);
3907              out->offload_state = OFFLOAD_STATE_PAUSED;
3908          }
3909          pthread_mutex_unlock(&out->lock);
3910      }
3911      return status;
3912  }
3913  
out_resume(struct audio_stream_out * stream)3914  static int out_resume(struct audio_stream_out* stream)
3915  {
3916      struct stream_out *out = (struct stream_out *)stream;
3917      int status = -ENOSYS;
3918      ALOGV("%s", __func__);
3919      if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
3920          status = -ENODATA;
3921          lock_output_stream(out);
3922          if (out->compr != NULL && out->offload_state == OFFLOAD_STATE_PAUSED) {
3923              status = compress_resume(out->compr);
3924              out->offload_state = OFFLOAD_STATE_PLAYING;
3925          }
3926          pthread_mutex_unlock(&out->lock);
3927      }
3928      return status;
3929  }
3930  
out_drain(struct audio_stream_out * stream,audio_drain_type_t type)3931  static int out_drain(struct audio_stream_out* stream, audio_drain_type_t type )
3932  {
3933      struct stream_out *out = (struct stream_out *)stream;
3934      int status = -ENOSYS;
3935      ALOGV("%s", __func__);
3936      if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
3937          lock_output_stream(out);
3938          if (type == AUDIO_DRAIN_EARLY_NOTIFY)
3939              status = send_offload_cmd_l(out, OFFLOAD_CMD_PARTIAL_DRAIN);
3940          else
3941              status = send_offload_cmd_l(out, OFFLOAD_CMD_DRAIN);
3942          pthread_mutex_unlock(&out->lock);
3943      }
3944      return status;
3945  }
3946  
out_flush(struct audio_stream_out * stream)3947  static int out_flush(struct audio_stream_out* stream)
3948  {
3949      struct stream_out *out = (struct stream_out *)stream;
3950      ALOGV("%s", __func__);
3951      if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
3952          lock_output_stream(out);
3953          stop_compressed_output_l(out);
3954          pthread_mutex_unlock(&out->lock);
3955          return 0;
3956      }
3957      return -ENOSYS;
3958  }
3959  
out_stop(const struct audio_stream_out * stream)3960  static int out_stop(const struct audio_stream_out* stream)
3961  {
3962      struct stream_out *out = (struct stream_out *)stream;
3963      struct audio_device *adev = out->dev;
3964      int ret = -ENOSYS;
3965  
3966      ALOGV("%s", __func__);
3967      pthread_mutex_lock(&adev->lock);
3968      if (out->usecase == USECASE_AUDIO_PLAYBACK_MMAP && !out->standby &&
3969              out->playback_started && out->pcm != NULL) {
3970          pcm_stop(out->pcm);
3971          ret = stop_output_stream(out);
3972          out->playback_started = false;
3973      }
3974      pthread_mutex_unlock(&adev->lock);
3975      return ret;
3976  }
3977  
out_start(const struct audio_stream_out * stream)3978  static int out_start(const struct audio_stream_out* stream)
3979  {
3980      struct stream_out *out = (struct stream_out *)stream;
3981      struct audio_device *adev = out->dev;
3982      int ret = -ENOSYS;
3983  
3984      ALOGV("%s", __func__);
3985      pthread_mutex_lock(&adev->lock);
3986      if (out->usecase == USECASE_AUDIO_PLAYBACK_MMAP && !out->standby &&
3987              !out->playback_started && out->pcm != NULL) {
3988          ret = start_output_stream(out);
3989          if (ret == 0) {
3990              out->playback_started = true;
3991          }
3992      }
3993      pthread_mutex_unlock(&adev->lock);
3994      return ret;
3995  }
3996  
3997  /*
3998   * Modify config->period_count based on min_size_frames
3999   */
adjust_mmap_period_count(struct pcm_config * config,int32_t min_size_frames)4000  static void adjust_mmap_period_count(struct pcm_config *config, int32_t min_size_frames)
4001  {
4002      int periodCountRequested = (min_size_frames + config->period_size - 1)
4003                                 / config->period_size;
4004      int periodCount = MMAP_PERIOD_COUNT_MIN;
4005  
4006      ALOGV("%s original config.period_size = %d config.period_count = %d",
4007            __func__, config->period_size, config->period_count);
4008  
4009      while (periodCount < periodCountRequested && (periodCount * 2) < MMAP_PERIOD_COUNT_MAX) {
4010          periodCount *= 2;
4011      }
4012      config->period_count = periodCount;
4013  
4014      ALOGV("%s requested config.period_count = %d", __func__, config->period_count);
4015  }
4016  
4017  // Read offset for the positional timestamp from a persistent vendor property.
4018  // This is to workaround apparent inaccuracies in the timing information that
4019  // is used by the AAudio timing model. The inaccuracies can cause glitches.
get_mmap_out_time_offset()4020  static int64_t get_mmap_out_time_offset() {
4021      const int32_t kDefaultOffsetMicros = 0;
4022      int32_t mmap_time_offset_micros = property_get_int32(
4023          "persist.audio.out_mmap_delay_micros", kDefaultOffsetMicros);
4024      ALOGI("mmap_time_offset_micros = %d for output", mmap_time_offset_micros);
4025      return mmap_time_offset_micros * (int64_t)1000;
4026  }
4027  
out_create_mmap_buffer(const struct audio_stream_out * stream,int32_t min_size_frames,struct audio_mmap_buffer_info * info)4028  static int out_create_mmap_buffer(const struct audio_stream_out *stream,
4029                                    int32_t min_size_frames,
4030                                    struct audio_mmap_buffer_info *info)
4031  {
4032      struct stream_out *out = (struct stream_out *)stream;
4033      struct audio_device *adev = out->dev;
4034      int ret = 0;
4035      unsigned int offset1;
4036      unsigned int frames1;
4037      const char *step = "";
4038      uint32_t mmap_size;
4039      uint32_t buffer_size;
4040  
4041      ALOGV("%s", __func__);
4042      lock_output_stream(out);
4043      pthread_mutex_lock(&adev->lock);
4044  
4045      if (info == NULL || min_size_frames <= 0 || min_size_frames > MMAP_MIN_SIZE_FRAMES_MAX) {
4046          ALOGE("%s: info = %p, min_size_frames = %d", __func__, info, min_size_frames);
4047          ret = -EINVAL;
4048          goto exit;
4049      }
4050      if (out->usecase != USECASE_AUDIO_PLAYBACK_MMAP || !out->standby) {
4051          ALOGE("%s: usecase = %d, standby = %d", __func__, out->usecase, out->standby);
4052          ret = -ENOSYS;
4053          goto exit;
4054      }
4055      out->pcm_device_id = platform_get_pcm_device_id(out->usecase, PCM_PLAYBACK);
4056      if (out->pcm_device_id < 0) {
4057          ALOGE("%s: Invalid PCM device id(%d) for the usecase(%d)",
4058                __func__, out->pcm_device_id, out->usecase);
4059          ret = -EINVAL;
4060          goto exit;
4061      }
4062  
4063      adjust_mmap_period_count(&out->config, min_size_frames);
4064  
4065      ALOGV("%s: Opening PCM device card_id(%d) device_id(%d), channels %d",
4066            __func__, adev->snd_card, out->pcm_device_id, out->config.channels);
4067      out->pcm = pcm_open(adev->snd_card, out->pcm_device_id,
4068                          (PCM_OUT | PCM_MMAP | PCM_NOIRQ | PCM_MONOTONIC), &out->config);
4069      if (out->pcm == NULL || !pcm_is_ready(out->pcm)) {
4070          step = "open";
4071          ret = -ENODEV;
4072          goto exit;
4073      }
4074      ret = pcm_mmap_begin(out->pcm, &info->shared_memory_address, &offset1, &frames1);
4075      if (ret < 0)  {
4076          step = "begin";
4077          goto exit;
4078      }
4079      info->buffer_size_frames = pcm_get_buffer_size(out->pcm);
4080      buffer_size = pcm_frames_to_bytes(out->pcm, info->buffer_size_frames);
4081      info->burst_size_frames = out->config.period_size;
4082      ret = platform_get_mmap_data_fd(adev->platform,
4083                                      out->pcm_device_id, 0 /*playback*/,
4084                                      &info->shared_memory_fd,
4085                                      &mmap_size);
4086      if (ret < 0) {
4087          // Fall back to non exclusive mode
4088          info->shared_memory_fd = pcm_get_poll_fd(out->pcm);
4089      } else {
4090          out->mmap_shared_memory_fd = info->shared_memory_fd; // for closing later
4091          ALOGV("%s: opened mmap_shared_memory_fd = %d", __func__, out->mmap_shared_memory_fd);
4092  
4093          if (mmap_size < buffer_size) {
4094              step = "mmap";
4095              goto exit;
4096          }
4097          // FIXME: indicate exclusive mode support by returning a negative buffer size
4098          info->buffer_size_frames *= -1;
4099      }
4100      memset(info->shared_memory_address, 0, buffer_size);
4101  
4102      ret = pcm_mmap_commit(out->pcm, 0, MMAP_PERIOD_SIZE);
4103      if (ret < 0) {
4104          step = "commit";
4105          goto exit;
4106      }
4107  
4108      out->mmap_time_offset_nanos = get_mmap_out_time_offset();
4109  
4110      out->standby = false;
4111      ret = 0;
4112  
4113      ALOGV("%s: got mmap buffer address %p info->buffer_size_frames %d",
4114            __func__, info->shared_memory_address, info->buffer_size_frames);
4115  
4116  exit:
4117      if (ret != 0) {
4118          if (out->pcm == NULL) {
4119              ALOGE("%s: %s - %d", __func__, step, ret);
4120          } else {
4121              ALOGE("%s: %s %s", __func__, step, pcm_get_error(out->pcm));
4122              pcm_close(out->pcm);
4123              out->pcm = NULL;
4124          }
4125      }
4126      pthread_mutex_unlock(&adev->lock);
4127      pthread_mutex_unlock(&out->lock);
4128      return ret;
4129  }
4130  
out_get_mmap_position(const struct audio_stream_out * stream,struct audio_mmap_position * position)4131  static int out_get_mmap_position(const struct audio_stream_out *stream,
4132                                    struct audio_mmap_position *position)
4133  {
4134      int ret = 0;
4135      struct stream_out *out = (struct stream_out *)stream;
4136      ALOGVV("%s", __func__);
4137      if (position == NULL) {
4138          return -EINVAL;
4139      }
4140      lock_output_stream(out);
4141      if (out->usecase != USECASE_AUDIO_PLAYBACK_MMAP ||
4142          out->pcm == NULL) {
4143          ret = -ENOSYS;
4144          goto exit;
4145      }
4146  
4147      struct timespec ts = { 0, 0 };
4148      ret = pcm_mmap_get_hw_ptr(out->pcm, (unsigned int *)&position->position_frames, &ts);
4149      if (ret < 0) {
4150          ALOGE("%s: %s", __func__, pcm_get_error(out->pcm));
4151          goto exit;
4152      }
4153      position->time_nanoseconds = audio_utils_ns_from_timespec(&ts)
4154              + out->mmap_time_offset_nanos;
4155  
4156  exit:
4157      pthread_mutex_unlock(&out->lock);
4158      return ret;
4159  }
4160  
4161  
4162  /** audio_stream_in implementation **/
in_get_sample_rate(const struct audio_stream * stream)4163  static uint32_t in_get_sample_rate(const struct audio_stream *stream)
4164  {
4165      struct stream_in *in = (struct stream_in *)stream;
4166  
4167      return in->config.rate;
4168  }
4169  
in_set_sample_rate(struct audio_stream * stream __unused,uint32_t rate __unused)4170  static int in_set_sample_rate(struct audio_stream *stream __unused, uint32_t rate __unused)
4171  {
4172      return -ENOSYS;
4173  }
4174  
in_get_buffer_size(const struct audio_stream * stream)4175  static size_t in_get_buffer_size(const struct audio_stream *stream)
4176  {
4177      struct stream_in *in = (struct stream_in *)stream;
4178      return in->config.period_size * in->af_period_multiplier *
4179          audio_stream_in_frame_size((const struct audio_stream_in *)stream);
4180  }
4181  
in_get_channels(const struct audio_stream * stream)4182  static uint32_t in_get_channels(const struct audio_stream *stream)
4183  {
4184      struct stream_in *in = (struct stream_in *)stream;
4185  
4186      return in->channel_mask;
4187  }
4188  
in_get_format(const struct audio_stream * stream)4189  static audio_format_t in_get_format(const struct audio_stream *stream)
4190  {
4191      struct stream_in *in = (struct stream_in *)stream;
4192      return in->format;
4193  }
4194  
in_set_format(struct audio_stream * stream __unused,audio_format_t format __unused)4195  static int in_set_format(struct audio_stream *stream __unused, audio_format_t format __unused)
4196  {
4197      return -ENOSYS;
4198  }
4199  
in_standby(struct audio_stream * stream)4200  static int in_standby(struct audio_stream *stream)
4201  {
4202      struct stream_in *in = (struct stream_in *)stream;
4203      struct audio_device *adev = in->dev;
4204      int status = 0;
4205      bool do_stop = true;
4206  
4207      ALOGV("%s: enter", __func__);
4208  
4209      lock_input_stream(in);
4210  
4211      if (!in->standby && (in->flags & AUDIO_INPUT_FLAG_HW_HOTWORD)) {
4212          ALOGV("%s: sound trigger pcm stop lab", __func__);
4213          audio_extn_sound_trigger_stop_lab(in);
4214          in->standby = true;
4215      }
4216  
4217      if (!in->standby) {
4218          if (adev->adm_deregister_stream)
4219              adev->adm_deregister_stream(adev->adm_data, in->capture_handle);
4220  
4221          pthread_mutex_lock(&adev->lock);
4222          in->standby = true;
4223          if (in->usecase == USECASE_AUDIO_RECORD_MMAP) {
4224              do_stop = in->capture_started;
4225              in->capture_started = false;
4226  
4227              if (in->mmap_shared_memory_fd >= 0) {
4228                  ALOGV("%s: closing mmap_shared_memory_fd = %d",
4229                        __func__, in->mmap_shared_memory_fd);
4230                  close(in->mmap_shared_memory_fd);
4231                  in->mmap_shared_memory_fd = -1;
4232              }
4233  
4234          }
4235          if (in->pcm) {
4236              pcm_close(in->pcm);
4237              in->pcm = NULL;
4238          }
4239  
4240          if (in->source == AUDIO_SOURCE_VOICE_COMMUNICATION)
4241              adev->enable_voicerx = false;
4242  
4243          if (do_stop) {
4244              status = stop_input_stream(in);
4245          }
4246  
4247          pthread_mutex_unlock(&adev->lock);
4248      }
4249      pthread_mutex_unlock(&in->lock);
4250      ALOGV("%s: exit:  status(%d)", __func__, status);
4251      return status;
4252  }
4253  
in_dump(const struct audio_stream * stream,int fd)4254  static int in_dump(const struct audio_stream *stream, int fd)
4255  {
4256      struct stream_in *in = (struct stream_in *)stream;
4257  
4258      // We try to get the lock for consistency,
4259      // but it isn't necessary for these variables.
4260      // If we're not in standby, we may be blocked on a read.
4261      const bool locked = (pthread_mutex_trylock(&in->lock) == 0);
4262      dprintf(fd, "      Standby: %s\n", in->standby ? "yes" : "no");
4263      dprintf(fd, "      Frames read: %lld\n", (long long)in->frames_read);
4264      dprintf(fd, "      Frames muted: %lld\n", (long long)in->frames_muted);
4265  
4266      char buffer[256]; // for statistics formatting
4267      if (in->start_latency_ms.n > 0) {
4268          simple_stats_to_string(&in->start_latency_ms, buffer, sizeof(buffer));
4269          dprintf(fd, "      Start latency ms: %s\n", buffer);
4270      }
4271  
4272      if (locked) {
4273          pthread_mutex_unlock(&in->lock);
4274      }
4275  
4276      // dump error info
4277      (void)error_log_dump(
4278              in->error_log, fd, "      " /* prefix */, 0 /* lines */, 0 /* limit_ns */);
4279      return 0;
4280  }
4281  
in_set_parameters(struct audio_stream * stream,const char * kvpairs)4282  static int in_set_parameters(struct audio_stream *stream, const char *kvpairs)
4283  {
4284      struct stream_in *in = (struct stream_in *)stream;
4285      struct audio_device *adev = in->dev;
4286      struct str_parms *parms;
4287      char *str;
4288      char value[32];
4289      int ret, val = 0;
4290      int status = 0;
4291  
4292      ALOGV("%s: enter: kvpairs=%s", __func__, kvpairs);
4293      parms = str_parms_create_str(kvpairs);
4294  
4295      ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_INPUT_SOURCE, value, sizeof(value));
4296  
4297      lock_input_stream(in);
4298  
4299      pthread_mutex_lock(&adev->lock);
4300      if (ret >= 0) {
4301          val = atoi(value);
4302          /* no audio source uses val == 0 */
4303          if ((in->source != val) && (val != 0)) {
4304              in->source = val;
4305          }
4306      }
4307  
4308      ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_ROUTING, value, sizeof(value));
4309  
4310      if (ret >= 0) {
4311          val = atoi(value);
4312          if (((int)in->device != val) && (val != 0) && audio_is_input_device(val) ) {
4313  
4314              // Workaround: If routing to an non existing usb device, fail gracefully
4315              // The routing request will otherwise block during 10 second
4316              int card;
4317              if (audio_is_usb_in_device(val) &&
4318                  (card = get_alive_usb_card(parms)) >= 0) {
4319  
4320                  ALOGW("in_set_parameters() ignoring rerouting to non existing USB card %d", card);
4321                  status = -ENOSYS;
4322              } else {
4323  
4324                  in->device = val;
4325                  /* If recording is in progress, change the tx device to new device */
4326                  if (!in->standby) {
4327                      ALOGV("update input routing change");
4328                      // inform adm before actual routing to prevent glitches.
4329                      if (adev->adm_on_routing_change) {
4330                          adev->adm_on_routing_change(adev->adm_data,
4331                                                      in->capture_handle);
4332                      }
4333                      select_devices(adev, in->usecase);
4334                  }
4335              }
4336          }
4337      }
4338  
4339      pthread_mutex_unlock(&adev->lock);
4340      pthread_mutex_unlock(&in->lock);
4341  
4342      str_parms_destroy(parms);
4343      ALOGV("%s: exit: status(%d)", __func__, status);
4344      return status;
4345  }
4346  
in_get_parameters(const struct audio_stream * stream,const char * keys)4347  static char* in_get_parameters(const struct audio_stream *stream,
4348                                 const char *keys)
4349  {
4350      struct stream_in *in = (struct stream_in *)stream;
4351      struct str_parms *query = str_parms_create_str(keys);
4352      char *str;
4353      struct str_parms *reply = str_parms_create();
4354      bool replied = false;
4355  
4356      ALOGV("%s: enter: keys - %s", __func__, keys);
4357      replied |= stream_get_parameter_channels(query, reply,
4358                                               &in->supported_channel_masks[0]);
4359      replied |= stream_get_parameter_formats(query, reply,
4360                                              &in->supported_formats[0]);
4361      replied |= stream_get_parameter_rates(query, reply,
4362                                            &in->supported_sample_rates[0]);
4363      if (replied) {
4364          str = str_parms_to_str(reply);
4365      } else {
4366          str = strdup("");
4367      }
4368      str_parms_destroy(query);
4369      str_parms_destroy(reply);
4370      ALOGV("%s: exit: returns - %s", __func__, str);
4371      return str;
4372  }
4373  
in_set_gain(struct audio_stream_in * stream,float gain)4374  static int in_set_gain(struct audio_stream_in *stream, float gain)
4375  {
4376      struct stream_in *in = (struct stream_in *)stream;
4377      char mixer_ctl_name[128];
4378      struct mixer_ctl *ctl;
4379      int ctl_value;
4380  
4381      ALOGV("%s: gain %f", __func__, gain);
4382  
4383      if (stream == NULL)
4384          return -EINVAL;
4385  
4386      /* in_set_gain() only used to silence MMAP capture for now */
4387      if (in->usecase != USECASE_AUDIO_RECORD_MMAP)
4388          return -ENOSYS;
4389  
4390      snprintf(mixer_ctl_name, sizeof(mixer_ctl_name), "Capture %d Volume", in->pcm_device_id);
4391  
4392      ctl = mixer_get_ctl_by_name(in->dev->mixer, mixer_ctl_name);
4393      if (!ctl) {
4394          ALOGW("%s: Could not get ctl for mixer cmd - %s",
4395                __func__, mixer_ctl_name);
4396          return -ENOSYS;
4397      }
4398  
4399      if (gain < RECORD_GAIN_MIN)
4400          gain  = RECORD_GAIN_MIN;
4401      else if (gain > RECORD_GAIN_MAX)
4402           gain = RECORD_GAIN_MAX;
4403      ctl_value = (int)(RECORD_VOLUME_CTL_MAX * gain);
4404  
4405      mixer_ctl_set_value(ctl, 0, ctl_value);
4406      return 0;
4407  }
4408  
in_snd_mon_cb(void * stream,struct str_parms * parms)4409  static void in_snd_mon_cb(void * stream, struct str_parms * parms)
4410  {
4411      if (!stream || !parms)
4412          return;
4413  
4414      struct stream_in *in = (struct stream_in *)stream;
4415      struct audio_device *adev = in->dev;
4416  
4417      card_status_t status;
4418      int card;
4419      if (parse_snd_card_status(parms, &card, &status) < 0)
4420          return;
4421  
4422      pthread_mutex_lock(&adev->lock);
4423      bool valid_cb = (card == adev->snd_card);
4424      pthread_mutex_unlock(&adev->lock);
4425  
4426      if (!valid_cb)
4427          return;
4428  
4429      lock_input_stream(in);
4430      if (in->card_status != status)
4431          in->card_status = status;
4432      pthread_mutex_unlock(&in->lock);
4433  
4434      ALOGW("in_snd_mon_cb for card %d usecase %s, status %s", card,
4435            use_case_table[in->usecase],
4436            status == CARD_STATUS_OFFLINE ? "offline" : "online");
4437  
4438      // a better solution would be to report error back to AF and let
4439      // it put the stream to standby
4440      if (status == CARD_STATUS_OFFLINE)
4441          in_standby(&in->stream.common);
4442  
4443      return;
4444  }
4445  
in_read(struct audio_stream_in * stream,void * buffer,size_t bytes)4446  static ssize_t in_read(struct audio_stream_in *stream, void *buffer,
4447                         size_t bytes)
4448  {
4449      struct stream_in *in = (struct stream_in *)stream;
4450      struct audio_device *adev = in->dev;
4451      int i, ret = -1;
4452      int *int_buf_stream = NULL;
4453      int error_code = ERROR_CODE_STANDBY; // initial errors are considered coming out of standby.
4454  
4455      lock_input_stream(in);
4456      const size_t frame_size = audio_stream_in_frame_size(stream);
4457      const size_t frames = bytes / frame_size;
4458  
4459      if (in->flags & AUDIO_INPUT_FLAG_HW_HOTWORD) {
4460          ALOGVV(" %s: reading on st session bytes=%zu", __func__, bytes);
4461          /* Read from sound trigger HAL */
4462          audio_extn_sound_trigger_read(in, buffer, bytes);
4463          pthread_mutex_unlock(&in->lock);
4464          return bytes;
4465      }
4466  
4467      if (in->usecase == USECASE_AUDIO_RECORD_MMAP) {
4468          ret = -ENOSYS;
4469          goto exit;
4470      }
4471  
4472      if (in->standby) {
4473          const int64_t startNs = systemTime(SYSTEM_TIME_MONOTONIC);
4474  
4475          pthread_mutex_lock(&adev->lock);
4476          ret = start_input_stream(in);
4477          pthread_mutex_unlock(&adev->lock);
4478          if (ret != 0) {
4479              goto exit;
4480          }
4481          in->standby = 0;
4482  
4483          // log startup time in ms.
4484          simple_stats_log(
4485                  &in->start_latency_ms, (systemTime(SYSTEM_TIME_MONOTONIC) - startNs) * 1e-6);
4486      }
4487  
4488      // errors that occur here are read errors.
4489      error_code = ERROR_CODE_READ;
4490  
4491      //what's the duration requested by the client?
4492      long ns = pcm_bytes_to_frames(in->pcm, bytes)*1000000000LL/
4493                                                  in->config.rate;
4494      request_in_focus(in, ns);
4495  
4496      bool use_mmap = is_mmap_usecase(in->usecase) || in->realtime;
4497      if (in->pcm) {
4498          if (use_mmap) {
4499              ret = pcm_mmap_read(in->pcm, buffer, bytes);
4500          } else {
4501              ret = pcm_read(in->pcm, buffer, bytes);
4502          }
4503          if (ret < 0) {
4504              ALOGE("Failed to read w/err %s", strerror(errno));
4505              ret = -errno;
4506          }
4507          if (!ret && bytes > 0 && (in->format == AUDIO_FORMAT_PCM_8_24_BIT)) {
4508              if (bytes % 4 == 0) {
4509                  /* data from DSP comes in 24_8 format, convert it to 8_24 */
4510                  int_buf_stream = buffer;
4511                  for (size_t itt=0; itt < bytes/4 ; itt++) {
4512                      int_buf_stream[itt] >>= 8;
4513                  }
4514              } else {
4515                  ALOGE("%s: !!! something wrong !!! ... data not 32 bit aligned ", __func__);
4516                  ret = -EINVAL;
4517                  goto exit;
4518              }
4519          }
4520      }
4521  
4522      release_in_focus(in, ns);
4523  
4524      /*
4525       * Instead of writing zeroes here, we could trust the hardware
4526       * to always provide zeroes when muted.
4527       * No need to acquire adev->lock to read mic_muted here as we don't change its state.
4528       */
4529      if (ret == 0 && adev->mic_muted &&
4530          !voice_is_in_call_rec_stream(in) &&
4531          in->usecase != USECASE_AUDIO_RECORD_AFE_PROXY) {
4532          memset(buffer, 0, bytes);
4533          in->frames_muted += frames;
4534      }
4535  
4536  exit:
4537      pthread_mutex_unlock(&in->lock);
4538  
4539      if (ret != 0) {
4540          error_log_log(in->error_log, error_code, audio_utils_get_real_time_ns());
4541          in_standby(&in->stream.common);
4542          ALOGV("%s: read failed - sleeping for buffer duration", __func__);
4543          usleep(frames * 1000000LL / in_get_sample_rate(&in->stream.common));
4544          memset(buffer, 0, bytes); // clear return data
4545          in->frames_muted += frames;
4546      }
4547      if (bytes > 0) {
4548          in->frames_read += frames;
4549      }
4550      return bytes;
4551  }
4552  
in_get_input_frames_lost(struct audio_stream_in * stream __unused)4553  static uint32_t in_get_input_frames_lost(struct audio_stream_in *stream __unused)
4554  {
4555      return 0;
4556  }
4557  
in_get_capture_position(const struct audio_stream_in * stream,int64_t * frames,int64_t * time)4558  static int in_get_capture_position(const struct audio_stream_in *stream,
4559                                     int64_t *frames, int64_t *time)
4560  {
4561      if (stream == NULL || frames == NULL || time == NULL) {
4562          return -EINVAL;
4563      }
4564      struct stream_in *in = (struct stream_in *)stream;
4565      int ret = -ENOSYS;
4566  
4567      lock_input_stream(in);
4568      // note: ST sessions do not close the alsa pcm driver synchronously
4569      // on standby. Therefore, we may return an error even though the
4570      // pcm stream is still opened.
4571      if (in->standby) {
4572          ALOGE_IF(in->pcm != NULL && !(in->flags & AUDIO_INPUT_FLAG_HW_HOTWORD),
4573                   "%s stream in standby but pcm not NULL for non ST session", __func__);
4574          goto exit;
4575      }
4576      if (in->pcm) {
4577          struct timespec timestamp;
4578          unsigned int avail;
4579          if (pcm_get_htimestamp(in->pcm, &avail, &timestamp) == 0) {
4580              *frames = in->frames_read + avail;
4581              *time = timestamp.tv_sec * 1000000000LL + timestamp.tv_nsec
4582                      - platform_capture_latency(in) * 1000LL;
4583              ret = 0;
4584          }
4585      }
4586  exit:
4587      pthread_mutex_unlock(&in->lock);
4588      return ret;
4589  }
4590  
in_update_effect_list(bool add,effect_handle_t effect,struct listnode * head)4591  static int in_update_effect_list(bool add, effect_handle_t effect,
4592                              struct listnode *head)
4593  {
4594      struct listnode *node;
4595      struct in_effect_list *elist = NULL;
4596      struct in_effect_list *target = NULL;
4597      int ret = 0;
4598  
4599      if (!head)
4600          return ret;
4601  
4602      list_for_each(node, head) {
4603          elist = node_to_item(node, struct in_effect_list, list);
4604          if (elist->handle == effect) {
4605              target = elist;
4606              break;
4607          }
4608      }
4609  
4610      if (add) {
4611          if (target) {
4612              ALOGD("effect %p already exist", effect);
4613              return ret;
4614          }
4615  
4616          target = (struct in_effect_list *)
4617                       calloc(1, sizeof(struct in_effect_list));
4618  
4619          if (!target) {
4620              ALOGE("%s:fail to allocate memory", __func__);
4621              return -ENOMEM;
4622          }
4623  
4624          target->handle = effect;
4625          list_add_tail(head, &target->list);
4626      } else {
4627          if (target) {
4628              list_remove(&target->list);
4629              free(target);
4630          }
4631      }
4632  
4633      return ret;
4634  }
4635  
add_remove_audio_effect(const struct audio_stream * stream,effect_handle_t effect,bool enable)4636  static int add_remove_audio_effect(const struct audio_stream *stream,
4637                                     effect_handle_t effect,
4638                                     bool enable)
4639  {
4640      struct stream_in *in = (struct stream_in *)stream;
4641      struct audio_device *adev = in->dev;
4642      int status = 0;
4643      effect_descriptor_t desc;
4644  
4645      status = (*effect)->get_descriptor(effect, &desc);
4646      ALOGV("%s: status %d in->standby %d enable:%d", __func__, status, in->standby, enable);
4647  
4648      if (status != 0)
4649          return status;
4650  
4651      lock_input_stream(in);
4652      pthread_mutex_lock(&in->dev->lock);
4653      if ((in->source == AUDIO_SOURCE_VOICE_COMMUNICATION ||
4654              in->source == AUDIO_SOURCE_VOICE_RECOGNITION ||
4655              adev->mode == AUDIO_MODE_IN_COMMUNICATION) &&
4656              (memcmp(&desc.type, FX_IID_AEC, sizeof(effect_uuid_t)) == 0)) {
4657  
4658          in_update_effect_list(enable, effect, &in->aec_list);
4659          enable = !list_empty(&in->aec_list);
4660          if (enable == in->enable_aec)
4661              goto exit;
4662  
4663          in->enable_aec = enable;
4664          ALOGD("AEC enable %d", enable);
4665  
4666          if (in->source == AUDIO_SOURCE_VOICE_COMMUNICATION ||
4667              adev->mode == AUDIO_MODE_IN_COMMUNICATION) {
4668              adev->enable_voicerx = enable;
4669              struct audio_usecase *usecase;
4670              struct listnode *node;
4671              list_for_each(node, &adev->usecase_list) {
4672                  usecase = node_to_item(node, struct audio_usecase, list);
4673                  if (usecase->type == PCM_PLAYBACK)
4674                      select_devices(adev, usecase->id);
4675              }
4676          }
4677          if (!in->standby
4678              && enable_disable_effect(in->dev, in, EFFECT_AEC, enable) == -ENOSYS)
4679              select_devices(in->dev, in->usecase);
4680      }
4681      if (memcmp(&desc.type, FX_IID_NS, sizeof(effect_uuid_t)) == 0) {
4682  
4683          in_update_effect_list(enable, effect, &in->ns_list);
4684          enable = !list_empty(&in->ns_list);
4685          if (enable == in->enable_ns)
4686              goto exit;
4687  
4688          in->enable_ns = enable;
4689          ALOGD("NS enable %d", enable);
4690          if (!in->standby) {
4691              if (in->source != AUDIO_SOURCE_VOICE_COMMUNICATION
4692                  || enable_disable_effect(in->dev, in, EFFECT_NS, enable) == -ENOSYS)
4693                  select_devices(in->dev, in->usecase);
4694          }
4695      }
4696  exit:
4697      pthread_mutex_unlock(&in->dev->lock);
4698      pthread_mutex_unlock(&in->lock);
4699  
4700      return 0;
4701  }
4702  
in_add_audio_effect(const struct audio_stream * stream,effect_handle_t effect)4703  static int in_add_audio_effect(const struct audio_stream *stream,
4704                                 effect_handle_t effect)
4705  {
4706      ALOGV("%s: effect %p", __func__, effect);
4707      return add_remove_audio_effect(stream, effect, true);
4708  }
4709  
in_remove_audio_effect(const struct audio_stream * stream,effect_handle_t effect)4710  static int in_remove_audio_effect(const struct audio_stream *stream,
4711                                    effect_handle_t effect)
4712  {
4713      ALOGV("%s: effect %p", __func__, effect);
4714      return add_remove_audio_effect(stream, effect, false);
4715  }
4716  
in_stop(const struct audio_stream_in * stream)4717  static int in_stop(const struct audio_stream_in* stream)
4718  {
4719      struct stream_in *in = (struct stream_in *)stream;
4720      struct audio_device *adev = in->dev;
4721  
4722      int ret = -ENOSYS;
4723      ALOGV("%s", __func__);
4724      pthread_mutex_lock(&adev->lock);
4725      if (in->usecase == USECASE_AUDIO_RECORD_MMAP && !in->standby &&
4726              in->capture_started && in->pcm != NULL) {
4727          pcm_stop(in->pcm);
4728          ret = stop_input_stream(in);
4729          in->capture_started = false;
4730      }
4731      pthread_mutex_unlock(&adev->lock);
4732      return ret;
4733  }
4734  
in_start(const struct audio_stream_in * stream)4735  static int in_start(const struct audio_stream_in* stream)
4736  {
4737      struct stream_in *in = (struct stream_in *)stream;
4738      struct audio_device *adev = in->dev;
4739      int ret = -ENOSYS;
4740  
4741      ALOGV("%s in %p", __func__, in);
4742      pthread_mutex_lock(&adev->lock);
4743      if (in->usecase == USECASE_AUDIO_RECORD_MMAP && !in->standby &&
4744              !in->capture_started && in->pcm != NULL) {
4745          if (!in->capture_started) {
4746              ret = start_input_stream(in);
4747              if (ret == 0) {
4748                  in->capture_started = true;
4749              }
4750          }
4751      }
4752      pthread_mutex_unlock(&adev->lock);
4753      return ret;
4754  }
4755  
4756  // Read offset for the positional timestamp from a persistent vendor property.
4757  // This is to workaround apparent inaccuracies in the timing information that
4758  // is used by the AAudio timing model. The inaccuracies can cause glitches.
in_get_mmap_time_offset()4759  static int64_t in_get_mmap_time_offset() {
4760      const int32_t kDefaultOffsetMicros = 0;
4761      int32_t mmap_time_offset_micros = property_get_int32(
4762              "persist.audio.in_mmap_delay_micros", kDefaultOffsetMicros);
4763      ALOGI("in_get_mmap_time_offset set to %d micros", mmap_time_offset_micros);
4764      return mmap_time_offset_micros * (int64_t)1000;
4765  }
4766  
in_create_mmap_buffer(const struct audio_stream_in * stream,int32_t min_size_frames,struct audio_mmap_buffer_info * info)4767  static int in_create_mmap_buffer(const struct audio_stream_in *stream,
4768                                    int32_t min_size_frames,
4769                                    struct audio_mmap_buffer_info *info)
4770  {
4771      struct stream_in *in = (struct stream_in *)stream;
4772      struct audio_device *adev = in->dev;
4773      int ret = 0;
4774      unsigned int offset1;
4775      unsigned int frames1;
4776      const char *step = "";
4777      uint32_t mmap_size;
4778      uint32_t buffer_size;
4779  
4780      lock_input_stream(in);
4781      pthread_mutex_lock(&adev->lock);
4782      ALOGV("%s in %p", __func__, in);
4783  
4784      if (info == NULL || min_size_frames <= 0 || min_size_frames > MMAP_MIN_SIZE_FRAMES_MAX) {
4785          ALOGE("%s invalid argument info %p min_size_frames %d", __func__, info, min_size_frames);
4786          ret = -EINVAL;
4787          goto exit;
4788      }
4789      if (in->usecase != USECASE_AUDIO_RECORD_MMAP || !in->standby) {
4790          ALOGE("%s: usecase = %d, standby = %d", __func__, in->usecase, in->standby);
4791          ALOGV("%s in %p", __func__, in);
4792          ret = -ENOSYS;
4793          goto exit;
4794      }
4795      in->pcm_device_id = platform_get_pcm_device_id(in->usecase, PCM_CAPTURE);
4796      if (in->pcm_device_id < 0) {
4797          ALOGE("%s: Invalid PCM device id(%d) for the usecase(%d)",
4798                __func__, in->pcm_device_id, in->usecase);
4799          ret = -EINVAL;
4800          goto exit;
4801      }
4802  
4803      adjust_mmap_period_count(&in->config, min_size_frames);
4804  
4805      ALOGV("%s: Opening PCM device card_id(%d) device_id(%d), channels %d",
4806            __func__, adev->snd_card, in->pcm_device_id, in->config.channels);
4807      in->pcm = pcm_open(adev->snd_card, in->pcm_device_id,
4808                          (PCM_IN | PCM_MMAP | PCM_NOIRQ | PCM_MONOTONIC), &in->config);
4809      if (in->pcm == NULL || !pcm_is_ready(in->pcm)) {
4810          step = "open";
4811          ret = -ENODEV;
4812          goto exit;
4813      }
4814  
4815      ret = pcm_mmap_begin(in->pcm, &info->shared_memory_address, &offset1, &frames1);
4816      if (ret < 0)  {
4817          step = "begin";
4818          goto exit;
4819      }
4820      info->buffer_size_frames = pcm_get_buffer_size(in->pcm);
4821      buffer_size = pcm_frames_to_bytes(in->pcm, info->buffer_size_frames);
4822      info->burst_size_frames = in->config.period_size;
4823      ret = platform_get_mmap_data_fd(adev->platform,
4824                                      in->pcm_device_id, 1 /*capture*/,
4825                                      &info->shared_memory_fd,
4826                                      &mmap_size);
4827      if (ret < 0) {
4828          // Fall back to non exclusive mode
4829          info->shared_memory_fd = pcm_get_poll_fd(in->pcm);
4830      } else {
4831          in->mmap_shared_memory_fd = info->shared_memory_fd; // for closing later
4832          ALOGV("%s: opened mmap_shared_memory_fd = %d", __func__, in->mmap_shared_memory_fd);
4833  
4834          if (mmap_size < buffer_size) {
4835              step = "mmap";
4836              goto exit;
4837          }
4838          // FIXME: indicate exclusive mode support by returning a negative buffer size
4839          info->buffer_size_frames *= -1;
4840      }
4841  
4842      memset(info->shared_memory_address, 0, buffer_size);
4843  
4844      ret = pcm_mmap_commit(in->pcm, 0, MMAP_PERIOD_SIZE);
4845      if (ret < 0) {
4846          step = "commit";
4847          goto exit;
4848      }
4849  
4850      in->mmap_time_offset_nanos = in_get_mmap_time_offset();
4851  
4852      in->standby = false;
4853      ret = 0;
4854  
4855      ALOGV("%s: got mmap buffer address %p info->buffer_size_frames %d",
4856            __func__, info->shared_memory_address, info->buffer_size_frames);
4857  
4858  exit:
4859      if (ret != 0) {
4860          if (in->pcm == NULL) {
4861              ALOGE("%s: %s - %d", __func__, step, ret);
4862          } else {
4863              ALOGE("%s: %s %s", __func__, step, pcm_get_error(in->pcm));
4864              pcm_close(in->pcm);
4865              in->pcm = NULL;
4866          }
4867      }
4868      pthread_mutex_unlock(&adev->lock);
4869      pthread_mutex_unlock(&in->lock);
4870      return ret;
4871  }
4872  
in_get_mmap_position(const struct audio_stream_in * stream,struct audio_mmap_position * position)4873  static int in_get_mmap_position(const struct audio_stream_in *stream,
4874                                    struct audio_mmap_position *position)
4875  {
4876      int ret = 0;
4877      struct stream_in *in = (struct stream_in *)stream;
4878      ALOGVV("%s", __func__);
4879      if (position == NULL) {
4880          return -EINVAL;
4881      }
4882      lock_input_stream(in);
4883      if (in->usecase != USECASE_AUDIO_RECORD_MMAP ||
4884          in->pcm == NULL) {
4885          ret = -ENOSYS;
4886          goto exit;
4887      }
4888      struct timespec ts = { 0, 0 };
4889      ret = pcm_mmap_get_hw_ptr(in->pcm, (unsigned int *)&position->position_frames, &ts);
4890      if (ret < 0) {
4891          ALOGE("%s: %s", __func__, pcm_get_error(in->pcm));
4892          goto exit;
4893      }
4894      position->time_nanoseconds = audio_utils_ns_from_timespec(&ts)
4895              + in->mmap_time_offset_nanos;
4896  
4897  exit:
4898      pthread_mutex_unlock(&in->lock);
4899      return ret;
4900  }
4901  
in_get_active_microphones(const struct audio_stream_in * stream,struct audio_microphone_characteristic_t * mic_array,size_t * mic_count)4902  static int in_get_active_microphones(const struct audio_stream_in *stream,
4903                                       struct audio_microphone_characteristic_t *mic_array,
4904                                       size_t *mic_count) {
4905      struct stream_in *in = (struct stream_in *)stream;
4906      struct audio_device *adev = in->dev;
4907      ALOGVV("%s", __func__);
4908  
4909      lock_input_stream(in);
4910      pthread_mutex_lock(&adev->lock);
4911      int ret = platform_get_active_microphones(adev->platform,
4912                                                audio_channel_count_from_in_mask(in->channel_mask),
4913                                                in->usecase, mic_array, mic_count);
4914      pthread_mutex_unlock(&adev->lock);
4915      pthread_mutex_unlock(&in->lock);
4916  
4917      return ret;
4918  }
4919  
adev_get_microphones(const struct audio_hw_device * dev,struct audio_microphone_characteristic_t * mic_array,size_t * mic_count)4920  static int adev_get_microphones(const struct audio_hw_device *dev,
4921                                  struct audio_microphone_characteristic_t *mic_array,
4922                                  size_t *mic_count) {
4923      struct audio_device *adev = (struct audio_device *)dev;
4924      ALOGVV("%s", __func__);
4925  
4926      pthread_mutex_lock(&adev->lock);
4927      int ret = platform_get_microphones(adev->platform, mic_array, mic_count);
4928      pthread_mutex_unlock(&adev->lock);
4929  
4930      return ret;
4931  }
4932  
in_set_microphone_direction(const struct audio_stream_in * stream,audio_microphone_direction_t dir)4933  static int in_set_microphone_direction(const struct audio_stream_in *stream,
4934                                             audio_microphone_direction_t dir) {
4935      struct stream_in *in = (struct stream_in *)stream;
4936  
4937      ALOGVV("%s: standby %d source %d dir %d", __func__, in->standby, in->source, dir);
4938  
4939      in->direction = dir;
4940  
4941      if (in->standby)
4942          return 0;
4943  
4944      return audio_extn_audiozoom_set_microphone_direction(in, dir);
4945  }
4946  
in_set_microphone_field_dimension(const struct audio_stream_in * stream,float zoom)4947  static int in_set_microphone_field_dimension(const struct audio_stream_in *stream, float zoom) {
4948      struct stream_in *in = (struct stream_in *)stream;
4949  
4950      ALOGVV("%s: standby %d source %d zoom %f", __func__, in->standby, in->source, zoom);
4951  
4952      if (zoom > 1.0 || zoom < -1.0)
4953          return -EINVAL;
4954  
4955      in->zoom = zoom;
4956  
4957      if (in->standby)
4958          return 0;
4959  
4960      return audio_extn_audiozoom_set_microphone_field_dimension(in, zoom);
4961  }
4962  
in_update_sink_metadata(struct audio_stream_in * stream,const struct sink_metadata * sink_metadata)4963  static void in_update_sink_metadata(struct audio_stream_in *stream,
4964                                      const struct sink_metadata *sink_metadata) {
4965  
4966      if (stream == NULL
4967              || sink_metadata == NULL
4968              || sink_metadata->tracks == NULL) {
4969          return;
4970      }
4971  
4972      int error = 0;
4973      struct stream_in *in = (struct stream_in *)stream;
4974      struct audio_device *adev = in->dev;
4975      audio_devices_t device = AUDIO_DEVICE_NONE;
4976  
4977      if (sink_metadata->track_count != 0)
4978          device = sink_metadata->tracks->dest_device;
4979  
4980      lock_input_stream(in);
4981      pthread_mutex_lock(&adev->lock);
4982      ALOGV("%s: in->usecase: %d, device: %x", __func__, in->usecase, device);
4983  
4984      if (in->usecase == USECASE_AUDIO_RECORD_AFE_PROXY
4985              && device != AUDIO_DEVICE_NONE
4986              && adev->voice_tx_output != NULL) {
4987          /* Use the rx device from afe-proxy record to route voice call because
4988             there is no routing if tx device is on primary hal and rx device
4989             is on other hal during voice call. */
4990          adev->voice_tx_output->devices = device;
4991  
4992          if (!voice_is_call_state_active(adev)) {
4993              if (adev->mode == AUDIO_MODE_IN_CALL) {
4994                  adev->current_call_output = adev->voice_tx_output;
4995                  error = voice_start_call(adev);
4996                  if (error != 0)
4997                      ALOGE("%s: start voice call failed %d", __func__, error);
4998              }
4999          } else {
5000              adev->current_call_output = adev->voice_tx_output;
5001              voice_update_devices_for_all_voice_usecases(adev);
5002          }
5003      }
5004  
5005      pthread_mutex_unlock(&adev->lock);
5006      pthread_mutex_unlock(&in->lock);
5007  }
5008  
check_and_set_gapless_mode(struct audio_device * adev)5009  static int check_and_set_gapless_mode(struct audio_device *adev)
5010  {
5011      bool gapless_enabled = false;
5012      const char *mixer_ctl_name = "Compress Gapless Playback";
5013      struct mixer_ctl *ctl;
5014  
5015      ALOGV("%s:", __func__);
5016      gapless_enabled = property_get_bool("vendor.audio.offload.gapless.enabled", false);
5017  
5018      ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
5019      if (!ctl) {
5020          ALOGE("%s: Could not get ctl for mixer cmd - %s",
5021                                 __func__, mixer_ctl_name);
5022          return -EINVAL;
5023      }
5024  
5025      if (mixer_ctl_set_value(ctl, 0, gapless_enabled) < 0) {
5026          ALOGE("%s: Could not set gapless mode %d",
5027                         __func__, gapless_enabled);
5028          return -EINVAL;
5029      }
5030      return 0;
5031  }
5032  
adev_open_output_stream(struct audio_hw_device * dev,audio_io_handle_t handle,audio_devices_t devices,audio_output_flags_t flags,struct audio_config * config,struct audio_stream_out ** stream_out,const char * address __unused)5033  static int adev_open_output_stream(struct audio_hw_device *dev,
5034                                     audio_io_handle_t handle,
5035                                     audio_devices_t devices,
5036                                     audio_output_flags_t flags,
5037                                     struct audio_config *config,
5038                                     struct audio_stream_out **stream_out,
5039                                     const char *address __unused)
5040  {
5041      struct audio_device *adev = (struct audio_device *)dev;
5042      struct stream_out *out;
5043      int i, ret = 0;
5044      bool is_hdmi = devices & AUDIO_DEVICE_OUT_AUX_DIGITAL;
5045      bool is_usb_dev = audio_is_usb_out_device(devices) &&
5046                        (devices != AUDIO_DEVICE_OUT_USB_ACCESSORY);
5047      bool force_haptic_path =
5048              property_get_bool("vendor.audio.test_haptic", false);
5049  
5050      if (is_usb_dev && !is_usb_ready(adev, true /* is_playback */)) {
5051          return -ENOSYS;
5052      }
5053  
5054      ALOGV("%s: enter: format(%#x) sample_rate(%d) channel_mask(%#x) devices(%#x) flags(%#x)",
5055            __func__, config->format, config->sample_rate, config->channel_mask, devices, flags);
5056  
5057      *stream_out = NULL;
5058      out = (struct stream_out *)calloc(1, sizeof(struct stream_out));
5059  
5060      pthread_mutex_init(&out->compr_mute_lock, (const pthread_mutexattr_t *) NULL);
5061  
5062      if (devices == AUDIO_DEVICE_NONE)
5063          devices = AUDIO_DEVICE_OUT_SPEAKER;
5064  
5065      out->flags = flags;
5066      out->devices = devices;
5067      out->dev = adev;
5068      out->handle = handle;
5069      out->a2dp_compress_mute = false;
5070      out->mmap_shared_memory_fd = -1; // not open
5071  
5072      /* Init use case and pcm_config */
5073      if ((is_hdmi || is_usb_dev) &&
5074          (audio_is_linear_pcm(config->format) || config->format == AUDIO_FORMAT_DEFAULT) &&
5075          (flags == AUDIO_OUTPUT_FLAG_NONE ||
5076          (flags & AUDIO_OUTPUT_FLAG_DIRECT) != 0)) {
5077          audio_format_t req_format = config->format;
5078          audio_channel_mask_t req_channel_mask = config->channel_mask;
5079          uint32_t req_sample_rate = config->sample_rate;
5080  
5081          pthread_mutex_lock(&adev->lock);
5082          if (is_hdmi) {
5083              ret = read_hdmi_channel_masks(out);
5084              if (config->sample_rate == 0)
5085                  config->sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
5086              if (config->channel_mask == AUDIO_CHANNEL_NONE)
5087                  config->channel_mask = AUDIO_CHANNEL_OUT_5POINT1;
5088              if (config->format == AUDIO_FORMAT_DEFAULT)
5089                  config->format = AUDIO_FORMAT_PCM_16_BIT;
5090          } else if (is_usb_dev) {
5091              ret = read_usb_sup_params_and_compare(true /*is_playback*/,
5092                                                    &config->format,
5093                                                    &out->supported_formats[0],
5094                                                    MAX_SUPPORTED_FORMATS,
5095                                                    &config->channel_mask,
5096                                                    &out->supported_channel_masks[0],
5097                                                    MAX_SUPPORTED_CHANNEL_MASKS,
5098                                                    &config->sample_rate,
5099                                                    &out->supported_sample_rates[0],
5100                                                    MAX_SUPPORTED_SAMPLE_RATES);
5101              ALOGV("plugged dev USB ret %d", ret);
5102          }
5103          pthread_mutex_unlock(&adev->lock);
5104          if (ret != 0) {
5105              // For MMAP NO IRQ, allow conversions in ADSP
5106              if (is_hdmi || (flags & AUDIO_OUTPUT_FLAG_MMAP_NOIRQ) == 0)
5107                  goto error_open;
5108  
5109              if (req_sample_rate != 0 && config->sample_rate != req_sample_rate)
5110                  config->sample_rate = req_sample_rate;
5111              if (req_channel_mask != AUDIO_CHANNEL_NONE && config->channel_mask != req_channel_mask)
5112                  config->channel_mask = req_channel_mask;
5113              if (req_format != AUDIO_FORMAT_DEFAULT && config->format != req_format)
5114                  config->format = req_format;
5115          }
5116  
5117          out->sample_rate = config->sample_rate;
5118          out->channel_mask = config->channel_mask;
5119          out->format = config->format;
5120          if (is_hdmi) {
5121              out->usecase = USECASE_AUDIO_PLAYBACK_HIFI;
5122              out->config = pcm_config_hdmi_multi;
5123          } else if (flags & AUDIO_OUTPUT_FLAG_MMAP_NOIRQ) {
5124              out->usecase = USECASE_AUDIO_PLAYBACK_MMAP;
5125              out->config = pcm_config_mmap_playback;
5126              out->stream.start = out_start;
5127              out->stream.stop = out_stop;
5128              out->stream.create_mmap_buffer = out_create_mmap_buffer;
5129              out->stream.get_mmap_position = out_get_mmap_position;
5130          } else {
5131              out->usecase = USECASE_AUDIO_PLAYBACK_HIFI;
5132              out->config = pcm_config_hifi;
5133          }
5134  
5135          out->config.rate = out->sample_rate;
5136          out->config.channels = audio_channel_count_from_out_mask(out->channel_mask);
5137          if (is_hdmi) {
5138              out->config.period_size = HDMI_MULTI_PERIOD_BYTES / (out->config.channels *
5139                                                           audio_bytes_per_sample(out->format));
5140          }
5141          out->config.format = pcm_format_from_audio_format(out->format);
5142      } else if (flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) {
5143          pthread_mutex_lock(&adev->lock);
5144          bool offline = (adev->card_status == CARD_STATUS_OFFLINE);
5145          pthread_mutex_unlock(&adev->lock);
5146  
5147          // reject offload during card offline to allow
5148          // fallback to s/w paths
5149          if (offline) {
5150              ret = -ENODEV;
5151              goto error_open;
5152          }
5153  
5154          if (config->offload_info.version != AUDIO_INFO_INITIALIZER.version ||
5155              config->offload_info.size != AUDIO_INFO_INITIALIZER.size) {
5156              ALOGE("%s: Unsupported Offload information", __func__);
5157              ret = -EINVAL;
5158              goto error_open;
5159          }
5160          if (!is_supported_format(config->offload_info.format)) {
5161              ALOGE("%s: Unsupported audio format", __func__);
5162              ret = -EINVAL;
5163              goto error_open;
5164          }
5165          out->sample_rate = config->offload_info.sample_rate;
5166          if (config->offload_info.channel_mask != AUDIO_CHANNEL_NONE)
5167              out->channel_mask = config->offload_info.channel_mask;
5168          else if (config->channel_mask != AUDIO_CHANNEL_NONE)
5169              out->channel_mask = config->channel_mask;
5170          else
5171              out->channel_mask = AUDIO_CHANNEL_OUT_STEREO;
5172  
5173          out->format = config->offload_info.format;
5174  
5175          out->compr_config.codec = (struct snd_codec *)
5176                                      calloc(1, sizeof(struct snd_codec));
5177  
5178          out->usecase = USECASE_AUDIO_PLAYBACK_OFFLOAD;
5179  
5180          out->stream.set_callback = out_set_callback;
5181          out->stream.pause = out_pause;
5182          out->stream.resume = out_resume;
5183          out->stream.drain = out_drain;
5184          out->stream.flush = out_flush;
5185  
5186          out->compr_config.codec->id =
5187                  get_snd_codec_id(config->offload_info.format);
5188          out->compr_config.fragment_size = COMPRESS_OFFLOAD_FRAGMENT_SIZE;
5189          out->compr_config.fragments = COMPRESS_OFFLOAD_NUM_FRAGMENTS;
5190          out->compr_config.codec->sample_rate = out->sample_rate;
5191          out->compr_config.codec->bit_rate =
5192                      config->offload_info.bit_rate;
5193          out->compr_config.codec->ch_in =
5194                  audio_channel_count_from_out_mask(out->channel_mask);
5195          out->compr_config.codec->ch_out = out->compr_config.codec->ch_in;
5196  
5197          if (flags & AUDIO_OUTPUT_FLAG_NON_BLOCKING)
5198              out->non_blocking = 1;
5199  
5200          out->send_new_metadata = 1;
5201  
5202          check_and_set_gapless_mode(adev);
5203  
5204          create_offload_callback_thread(out);
5205          ALOGV("%s: offloaded output offload_info version %04x bit rate %d",
5206                  __func__, config->offload_info.version,
5207                  config->offload_info.bit_rate);
5208      } else if (out->flags & AUDIO_OUTPUT_FLAG_INCALL_MUSIC) {
5209          switch (config->sample_rate) {
5210              case 0:
5211                  out->sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
5212                  break;
5213              case 8000:
5214              case 16000:
5215              case 48000:
5216                  out->sample_rate = config->sample_rate;
5217                  break;
5218              default:
5219                  ALOGE("%s: Unsupported sampling rate %d for Incall Music", __func__,
5220                        config->sample_rate);
5221                  config->sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
5222                  ret = -EINVAL;
5223                  goto error_open;
5224          }
5225          //FIXME: add support for MONO stream configuration when audioflinger mixer supports it
5226          switch (config->channel_mask) {
5227              case AUDIO_CHANNEL_NONE:
5228              case AUDIO_CHANNEL_OUT_STEREO:
5229                  out->channel_mask = AUDIO_CHANNEL_OUT_STEREO;
5230                  break;
5231              default:
5232                  ALOGE("%s: Unsupported channel mask %#x for Incall Music", __func__,
5233                        config->channel_mask);
5234                  config->channel_mask = AUDIO_CHANNEL_OUT_STEREO;
5235                  ret = -EINVAL;
5236                  goto error_open;
5237          }
5238          switch (config->format) {
5239              case AUDIO_FORMAT_DEFAULT:
5240              case AUDIO_FORMAT_PCM_16_BIT:
5241                  out->format = AUDIO_FORMAT_PCM_16_BIT;
5242                  break;
5243              default:
5244                  ALOGE("%s: Unsupported format %#x for Incall Music", __func__,
5245                        config->format);
5246                  config->format = AUDIO_FORMAT_PCM_16_BIT;
5247                  ret = -EINVAL;
5248                  goto error_open;
5249          }
5250  
5251          voice_extn_check_and_set_incall_music_usecase(adev, out);
5252      } else  if (out->devices == AUDIO_DEVICE_OUT_TELEPHONY_TX) {
5253          switch (config->sample_rate) {
5254              case 0:
5255                  out->sample_rate = AFE_PROXY_SAMPLING_RATE;
5256                  break;
5257              case 8000:
5258              case 16000:
5259              case 48000:
5260                  out->sample_rate = config->sample_rate;
5261                  break;
5262              default:
5263                  ALOGE("%s: Unsupported sampling rate %d for Telephony TX", __func__,
5264                        config->sample_rate);
5265                  config->sample_rate = AFE_PROXY_SAMPLING_RATE;
5266                  ret = -EINVAL;
5267                  break;
5268          }
5269          //FIXME: add support for MONO stream configuration when audioflinger mixer supports it
5270          switch (config->channel_mask) {
5271              case AUDIO_CHANNEL_NONE:
5272                  out->channel_mask = AUDIO_CHANNEL_OUT_STEREO;
5273                  break;
5274              case AUDIO_CHANNEL_OUT_STEREO:
5275                  out->channel_mask = config->channel_mask;
5276                  break;
5277              default:
5278                  ALOGE("%s: Unsupported channel mask %#x for Telephony TX", __func__,
5279                        config->channel_mask);
5280                  config->channel_mask = AUDIO_CHANNEL_OUT_STEREO;
5281                  ret = -EINVAL;
5282                  break;
5283          }
5284          switch (config->format) {
5285              case AUDIO_FORMAT_DEFAULT:
5286                  out->format = AUDIO_FORMAT_PCM_16_BIT;
5287                  break;
5288              case AUDIO_FORMAT_PCM_16_BIT:
5289                  out->format = config->format;
5290                  break;
5291              default:
5292                  ALOGE("%s: Unsupported format %#x for Telephony TX", __func__,
5293                        config->format);
5294                  config->format = AUDIO_FORMAT_PCM_16_BIT;
5295                  ret = -EINVAL;
5296                  break;
5297          }
5298          if (ret != 0)
5299              goto error_open;
5300  
5301          out->usecase = USECASE_AUDIO_PLAYBACK_AFE_PROXY;
5302          out->config = pcm_config_afe_proxy_playback;
5303          out->config.rate = out->sample_rate;
5304          out->config.channels =
5305                  audio_channel_count_from_out_mask(out->channel_mask);
5306          out->config.format = pcm_format_from_audio_format(out->format);
5307          adev->voice_tx_output = out;
5308      } else if (flags == AUDIO_OUTPUT_FLAG_VOIP_RX) {
5309          switch (config->sample_rate) {
5310              case 0:
5311                  out->sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
5312                  break;
5313              case 8000:
5314              case 16000:
5315              case 32000:
5316              case 48000:
5317                  out->sample_rate = config->sample_rate;
5318                  break;
5319              default:
5320                  ALOGE("%s: Unsupported sampling rate %d for Voip RX", __func__,
5321                        config->sample_rate);
5322                  config->sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
5323                  ret = -EINVAL;
5324                  break;
5325          }
5326          //FIXME: add support for MONO stream configuration when audioflinger mixer supports it
5327          switch (config->channel_mask) {
5328              case AUDIO_CHANNEL_NONE:
5329                  out->channel_mask = AUDIO_CHANNEL_OUT_STEREO;
5330                  break;
5331              case AUDIO_CHANNEL_OUT_STEREO:
5332                  out->channel_mask = config->channel_mask;
5333                  break;
5334              default:
5335                  ALOGE("%s: Unsupported channel mask %#x for Voip RX", __func__,
5336                        config->channel_mask);
5337                  config->channel_mask = AUDIO_CHANNEL_OUT_STEREO;
5338                  ret = -EINVAL;
5339                  break;
5340          }
5341          switch (config->format) {
5342              case AUDIO_FORMAT_DEFAULT:
5343                  out->format = AUDIO_FORMAT_PCM_16_BIT;
5344                  break;
5345              case AUDIO_FORMAT_PCM_16_BIT:
5346                  out->format = config->format;
5347                  break;
5348              default:
5349                  ALOGE("%s: Unsupported format %#x for Voip RX", __func__,
5350                        config->format);
5351                  config->format = AUDIO_FORMAT_PCM_16_BIT;
5352                  ret = -EINVAL;
5353                  break;
5354          }
5355          if (ret != 0)
5356              goto error_open;
5357  
5358          uint32_t buffer_size, frame_size;
5359          out->usecase = USECASE_AUDIO_PLAYBACK_VOIP;
5360          out->config = pcm_config_voip;
5361          out->config.rate = out->sample_rate;
5362          out->config.format = pcm_format_from_audio_format(out->format);
5363          buffer_size = get_stream_buffer_size(VOIP_PLAYBACK_PERIOD_DURATION_MSEC,
5364                                               out->sample_rate,
5365                                               out->format,
5366                                               out->config.channels,
5367                                               false /*is_low_latency*/);
5368          frame_size = audio_bytes_per_sample(out->format) * out->config.channels;
5369          out->config.period_size = buffer_size / frame_size;
5370          out->config.period_count = VOIP_PLAYBACK_PERIOD_COUNT;
5371          out->af_period_multiplier = 1;
5372      } else {
5373          if (flags & AUDIO_OUTPUT_FLAG_DEEP_BUFFER) {
5374              out->usecase = USECASE_AUDIO_PLAYBACK_DEEP_BUFFER;
5375              out->config = pcm_config_deep_buffer;
5376          } else if (flags & AUDIO_OUTPUT_FLAG_TTS) {
5377              out->usecase = USECASE_AUDIO_PLAYBACK_TTS;
5378              out->config = pcm_config_deep_buffer;
5379          } else if (flags & AUDIO_OUTPUT_FLAG_RAW) {
5380              out->usecase = USECASE_AUDIO_PLAYBACK_ULL;
5381              out->realtime = may_use_noirq_mode(adev, USECASE_AUDIO_PLAYBACK_ULL, out->flags);
5382              out->config = out->realtime ? pcm_config_rt : pcm_config_low_latency;
5383          } else if (flags & AUDIO_OUTPUT_FLAG_MMAP_NOIRQ) {
5384              out->usecase = USECASE_AUDIO_PLAYBACK_MMAP;
5385              out->config = pcm_config_mmap_playback;
5386              out->stream.start = out_start;
5387              out->stream.stop = out_stop;
5388              out->stream.create_mmap_buffer = out_create_mmap_buffer;
5389              out->stream.get_mmap_position = out_get_mmap_position;
5390          } else {
5391              if (config->channel_mask & AUDIO_CHANNEL_HAPTIC_ALL) {
5392                  out->usecase = USECASE_AUDIO_PLAYBACK_WITH_HAPTICS;
5393                  adev->haptic_pcm_device_id = platform_get_haptics_pcm_device_id();
5394                  if (adev->haptic_pcm_device_id < 0) {
5395                      ALOGE("%s: Invalid Haptics pcm device id(%d) for the usecase(%d)",
5396                            __func__, adev->haptic_pcm_device_id, out->usecase);
5397                      ret = -ENOSYS;
5398                      goto error_open;
5399                  }
5400                  out->config = pcm_config_haptics_audio;
5401                  if (force_haptic_path)
5402                      adev->haptics_config = pcm_config_haptics_audio;
5403                  else
5404                      adev->haptics_config = pcm_config_haptics;
5405              } else {
5406                  out->usecase = USECASE_AUDIO_PLAYBACK_LOW_LATENCY;
5407                  out->config = pcm_config_low_latency;
5408              }
5409          }
5410  
5411          if (out->usecase == USECASE_AUDIO_PLAYBACK_LOW_LATENCY ||
5412                 out->usecase == USECASE_AUDIO_PLAYBACK_DEEP_BUFFER ||
5413                 out->usecase == USECASE_AUDIO_PLAYBACK_ULL) {
5414              out->volume_l = 1.0;
5415              out->volume_r = 1.0;
5416          }
5417  
5418          if (config->sample_rate == 0) {
5419              out->sample_rate = out->config.rate;
5420          } else {
5421              out->sample_rate = config->sample_rate;
5422          }
5423  
5424          if (config->channel_mask == AUDIO_CHANNEL_NONE) {
5425              out->channel_mask = audio_channel_out_mask_from_count(out->config.channels);
5426          } else {
5427              out->channel_mask = config->channel_mask;
5428          }
5429  
5430          if (config->format == AUDIO_FORMAT_DEFAULT)
5431              out->format = audio_format_from_pcm_format(out->config.format);
5432          else if (!audio_is_linear_pcm(config->format)) {
5433              config->format = AUDIO_FORMAT_PCM_16_BIT;
5434              ret = -EINVAL;
5435              goto error_open;
5436          } else {
5437              out->format = config->format;
5438          }
5439  
5440          out->config.rate = out->sample_rate;
5441  
5442          if (config->channel_mask & AUDIO_CHANNEL_HAPTIC_ALL) {
5443               out->config.channels =
5444                  audio_channel_count_from_out_mask(out->channel_mask &
5445                                                    ~AUDIO_CHANNEL_HAPTIC_ALL);
5446  
5447               if (force_haptic_path) {
5448                   out->config.channels = 1;
5449                   adev->haptics_config.channels = 1;
5450               } else {
5451                   adev->haptics_config.channels =
5452                       audio_channel_count_from_out_mask(out->channel_mask &
5453                                                        AUDIO_CHANNEL_HAPTIC_ALL);
5454               }
5455          } else {
5456               out->config.channels =
5457                      audio_channel_count_from_out_mask(out->channel_mask);
5458          }
5459  
5460          if (out->format != audio_format_from_pcm_format(out->config.format)) {
5461              out->config.format = pcm_format_from_audio_format(out->format);
5462          }
5463      }
5464  
5465      if ((config->sample_rate != 0 && config->sample_rate != out->sample_rate) ||
5466          (config->format != AUDIO_FORMAT_DEFAULT && config->format != out->format) ||
5467          (config->channel_mask != AUDIO_CHANNEL_NONE && config->channel_mask != out->channel_mask)) {
5468          ALOGI("%s: Unsupported output config. sample_rate:%u format:%#x channel_mask:%#x",
5469                __func__, config->sample_rate, config->format, config->channel_mask);
5470          config->sample_rate = out->sample_rate;
5471          config->format = out->format;
5472          config->channel_mask = out->channel_mask;
5473          ret = -EINVAL;
5474          goto error_open;
5475      }
5476  
5477      ALOGV("%s: Usecase(%s) config->format %#x  out->config.format %#x\n",
5478              __func__, use_case_table[out->usecase], config->format, out->config.format);
5479  
5480      if (flags & AUDIO_OUTPUT_FLAG_PRIMARY) {
5481          if (adev->primary_output == NULL)
5482              adev->primary_output = out;
5483          else {
5484              ALOGE("%s: Primary output is already opened", __func__);
5485              ret = -EEXIST;
5486              goto error_open;
5487          }
5488      }
5489  
5490      /* Check if this usecase is already existing */
5491      pthread_mutex_lock(&adev->lock);
5492      if (get_usecase_from_list(adev, out->usecase) != NULL) {
5493          ALOGE("%s: Usecase (%d) is already present", __func__, out->usecase);
5494          pthread_mutex_unlock(&adev->lock);
5495          ret = -EEXIST;
5496          goto error_open;
5497      }
5498      pthread_mutex_unlock(&adev->lock);
5499  
5500      out->applied_volume_l = INVALID_OUT_VOLUME;
5501      out->applied_volume_r = INVALID_OUT_VOLUME;
5502  
5503      out->stream.common.get_sample_rate = out_get_sample_rate;
5504      out->stream.common.set_sample_rate = out_set_sample_rate;
5505      out->stream.common.get_buffer_size = out_get_buffer_size;
5506      out->stream.common.get_channels = out_get_channels;
5507      out->stream.common.get_format = out_get_format;
5508      out->stream.common.set_format = out_set_format;
5509      out->stream.common.standby = out_standby;
5510      out->stream.common.dump = out_dump;
5511      out->stream.common.set_parameters = out_set_parameters;
5512      out->stream.common.get_parameters = out_get_parameters;
5513      out->stream.common.add_audio_effect = out_add_audio_effect;
5514      out->stream.common.remove_audio_effect = out_remove_audio_effect;
5515      out->stream.get_latency = out_get_latency;
5516      out->stream.set_volume = out_set_volume;
5517  #ifdef NO_AUDIO_OUT
5518      out->stream.write = out_write_for_no_output;
5519  #else
5520      out->stream.write = out_write;
5521  #endif
5522      out->stream.get_render_position = out_get_render_position;
5523      out->stream.get_next_write_timestamp = out_get_next_write_timestamp;
5524      out->stream.get_presentation_position = out_get_presentation_position;
5525  
5526      if (out->realtime)
5527          out->af_period_multiplier = af_period_multiplier;
5528      else
5529          out->af_period_multiplier = 1;
5530  
5531      out->kernel_buffer_size = out->config.period_size * out->config.period_count;
5532  
5533      out->standby = 1;
5534      /* out->muted = false; by calloc() */
5535      /* out->written = 0; by calloc() */
5536  
5537      pthread_mutex_init(&out->lock, (const pthread_mutexattr_t *) NULL);
5538      pthread_mutex_init(&out->pre_lock, (const pthread_mutexattr_t *) NULL);
5539      pthread_cond_init(&out->cond, (const pthread_condattr_t *) NULL);
5540  
5541      config->format = out->stream.common.get_format(&out->stream.common);
5542      config->channel_mask = out->stream.common.get_channels(&out->stream.common);
5543      config->sample_rate = out->stream.common.get_sample_rate(&out->stream.common);
5544  
5545      register_format(out->format, out->supported_formats);
5546      register_channel_mask(out->channel_mask, out->supported_channel_masks);
5547      register_sample_rate(out->sample_rate, out->supported_sample_rates);
5548  
5549      out->error_log = error_log_create(
5550              ERROR_LOG_ENTRIES,
5551              1000000000 /* aggregate consecutive identical errors within one second in ns */);
5552  
5553      /*
5554         By locking output stream before registering, we allow the callback
5555         to update stream's state only after stream's initial state is set to
5556         adev state.
5557      */
5558      lock_output_stream(out);
5559      audio_extn_snd_mon_register_listener(out, out_snd_mon_cb);
5560      pthread_mutex_lock(&adev->lock);
5561      out->card_status = adev->card_status;
5562      pthread_mutex_unlock(&adev->lock);
5563      pthread_mutex_unlock(&out->lock);
5564  
5565      stream_app_type_cfg_init(&out->app_type_cfg);
5566  
5567      *stream_out = &out->stream;
5568  
5569      ALOGV("%s: exit", __func__);
5570      return 0;
5571  
5572  error_open:
5573      free(out);
5574      *stream_out = NULL;
5575      ALOGW("%s: exit: ret %d", __func__, ret);
5576      return ret;
5577  }
5578  
adev_close_output_stream(struct audio_hw_device * dev __unused,struct audio_stream_out * stream)5579  static void adev_close_output_stream(struct audio_hw_device *dev __unused,
5580                                       struct audio_stream_out *stream)
5581  {
5582      struct stream_out *out = (struct stream_out *)stream;
5583      struct audio_device *adev = out->dev;
5584  
5585      ALOGV("%s: enter", __func__);
5586  
5587      // must deregister from sndmonitor first to prevent races
5588      // between the callback and close_stream
5589      audio_extn_snd_mon_unregister_listener(out);
5590      out_standby(&stream->common);
5591      if (out->usecase == USECASE_AUDIO_PLAYBACK_OFFLOAD) {
5592          destroy_offload_callback_thread(out);
5593  
5594          if (out->compr_config.codec != NULL)
5595              free(out->compr_config.codec);
5596      }
5597  
5598      out->a2dp_compress_mute = false;
5599  
5600      if (adev->voice_tx_output == out)
5601          adev->voice_tx_output = NULL;
5602  
5603      error_log_destroy(out->error_log);
5604      out->error_log = NULL;
5605  
5606      pthread_cond_destroy(&out->cond);
5607      pthread_mutex_destroy(&out->pre_lock);
5608      pthread_mutex_destroy(&out->lock);
5609      free(stream);
5610      ALOGV("%s: exit", __func__);
5611  }
5612  
adev_set_parameters(struct audio_hw_device * dev,const char * kvpairs)5613  static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs)
5614  {
5615      struct audio_device *adev = (struct audio_device *)dev;
5616      struct str_parms *parms;
5617      char *str;
5618      char value[32];
5619      int val;
5620      int ret;
5621      int status = 0;
5622      bool a2dp_reconfig = false;
5623  
5624      ALOGV("%s: enter: %s", __func__, kvpairs);
5625  
5626      pthread_mutex_lock(&adev->lock);
5627  
5628      parms = str_parms_create_str(kvpairs);
5629      status = voice_set_parameters(adev, parms);
5630      if (status != 0) {
5631          goto done;
5632      }
5633  
5634      ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_BT_NREC, value, sizeof(value));
5635      if (ret >= 0) {
5636          /* When set to false, HAL should disable EC and NS */
5637          if (strcmp(value, AUDIO_PARAMETER_VALUE_ON) == 0)
5638              adev->bluetooth_nrec = true;
5639          else
5640              adev->bluetooth_nrec = false;
5641      }
5642  
5643      ret = str_parms_get_str(parms, "screen_state", value, sizeof(value));
5644      if (ret >= 0) {
5645          if (strcmp(value, AUDIO_PARAMETER_VALUE_ON) == 0)
5646              adev->screen_off = false;
5647          else
5648              adev->screen_off = true;
5649      }
5650  
5651      ret = str_parms_get_int(parms, "rotation", &val);
5652      if (ret >= 0) {
5653          bool reverse_speakers = false;
5654          int camera_rotation = CAMERA_ROTATION_LANDSCAPE;
5655          switch (val) {
5656          // FIXME: note that the code below assumes that the speakers are in the correct placement
5657          //   relative to the user when the device is rotated 90deg from its default rotation. This
5658          //   assumption is device-specific, not platform-specific like this code.
5659          case 270:
5660              reverse_speakers = true;
5661              camera_rotation = CAMERA_ROTATION_INVERT_LANDSCAPE;
5662              break;
5663          case 0:
5664          case 180:
5665              camera_rotation = CAMERA_ROTATION_PORTRAIT;
5666              break;
5667          case 90:
5668              camera_rotation = CAMERA_ROTATION_LANDSCAPE;
5669              break;
5670          default:
5671              ALOGE("%s: unexpected rotation of %d", __func__, val);
5672              status = -EINVAL;
5673          }
5674          if (status == 0) {
5675              // check and set swap
5676              //   - check if orientation changed and speaker active
5677              //   - set rotation and cache the rotation value
5678              adev->camera_orientation =
5679                             (adev->camera_orientation & ~CAMERA_ROTATION_MASK) | camera_rotation;
5680  #ifndef MAXXAUDIO_QDSP_ENABLED
5681              platform_check_and_set_swap_lr_channels(adev, reverse_speakers);
5682  #endif
5683          }
5684      }
5685  
5686      ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_BT_SCO_WB, value, sizeof(value));
5687      if (ret >= 0) {
5688          adev->bt_wb_speech_enabled = !strcmp(value, AUDIO_PARAMETER_VALUE_ON);
5689      }
5690  
5691      ret = str_parms_get_str(parms, "BT_SCO", value, sizeof(value));
5692      if (ret >= 0) {
5693          if (strcmp(value, AUDIO_PARAMETER_VALUE_ON) == 0)
5694              adev->bt_sco_on = true;
5695          else
5696              adev->bt_sco_on = false;
5697      }
5698  
5699      ret = str_parms_get_str(parms, AUDIO_PARAMETER_DEVICE_CONNECT, value, sizeof(value));
5700      if (ret >= 0) {
5701          audio_devices_t device = (audio_devices_t)strtoul(value, NULL, 10);
5702          if (audio_is_usb_out_device(device)) {
5703              ret = str_parms_get_str(parms, "card", value, sizeof(value));
5704              if (ret >= 0) {
5705                  const int card = atoi(value);
5706                  audio_extn_usb_add_device(device, card);
5707              }
5708          } else if (audio_is_usb_in_device(device)) {
5709              ret = str_parms_get_str(parms, "card", value, sizeof(value));
5710              if (ret >= 0) {
5711                  const int card = atoi(value);
5712                  audio_extn_usb_add_device(device, card);
5713              }
5714          }
5715      }
5716  
5717      ret = str_parms_get_str(parms, AUDIO_PARAMETER_DEVICE_DISCONNECT, value, sizeof(value));
5718      if (ret >= 0) {
5719          audio_devices_t device = (audio_devices_t)strtoul(value, NULL, 10);
5720          if (audio_is_usb_out_device(device)) {
5721              ret = str_parms_get_str(parms, "card", value, sizeof(value));
5722              if (ret >= 0) {
5723                  const int card = atoi(value);
5724                  audio_extn_usb_remove_device(device, card);
5725              }
5726          } else if (audio_is_usb_in_device(device)) {
5727              ret = str_parms_get_str(parms, "card", value, sizeof(value));
5728              if (ret >= 0) {
5729                  const int card = atoi(value);
5730                  audio_extn_usb_remove_device(device, card);
5731              }
5732          }
5733      }
5734  
5735      audio_extn_hfp_set_parameters(adev, parms);
5736      audio_extn_ma_set_parameters(adev, parms);
5737  
5738      status = audio_extn_a2dp_set_parameters(parms, &a2dp_reconfig);
5739      if (status >= 0 && a2dp_reconfig) {
5740          struct audio_usecase *usecase;
5741          struct listnode *node;
5742          list_for_each(node, &adev->usecase_list) {
5743              usecase = node_to_item(node, struct audio_usecase, list);
5744              if ((usecase->type == PCM_PLAYBACK) &&
5745                  (usecase->devices & AUDIO_DEVICE_OUT_ALL_A2DP)) {
5746                  ALOGD("%s: reconfigure A2DP... forcing device switch", __func__);
5747  
5748                  pthread_mutex_unlock(&adev->lock);
5749                  lock_output_stream(usecase->stream.out);
5750                  pthread_mutex_lock(&adev->lock);
5751                  audio_extn_a2dp_set_handoff_mode(true);
5752                  // force device switch to reconfigure encoder
5753                  select_devices(adev, usecase->id);
5754                  audio_extn_a2dp_set_handoff_mode(false);
5755                  pthread_mutex_unlock(&usecase->stream.out->lock);
5756                  break;
5757              }
5758          }
5759      }
5760  
5761      //FIXME: to be replaced by proper video capture properties API
5762      ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_CAMERA_FACING, value, sizeof(value));
5763      if (ret >= 0) {
5764          int camera_facing = CAMERA_FACING_BACK;
5765          if (strcmp(value, AUDIO_PARAMETER_VALUE_FRONT) == 0)
5766              camera_facing = CAMERA_FACING_FRONT;
5767          else if (strcmp(value, AUDIO_PARAMETER_VALUE_BACK) == 0)
5768              camera_facing = CAMERA_FACING_BACK;
5769          else {
5770              ALOGW("%s: invalid camera facing value: %s", __func__, value);
5771              goto done;
5772          }
5773          adev->camera_orientation =
5774                         (adev->camera_orientation & ~CAMERA_FACING_MASK) | camera_facing;
5775          struct audio_usecase *usecase;
5776          struct listnode *node;
5777          list_for_each(node, &adev->usecase_list) {
5778              usecase = node_to_item(node, struct audio_usecase, list);
5779              struct stream_in *in = usecase->stream.in;
5780              if (usecase->type == PCM_CAPTURE && in != NULL &&
5781                      in->source == AUDIO_SOURCE_CAMCORDER && !in->standby) {
5782                  select_devices(adev, in->usecase);
5783              }
5784          }
5785      }
5786  
5787  done:
5788      str_parms_destroy(parms);
5789      pthread_mutex_unlock(&adev->lock);
5790      ALOGV("%s: exit with code(%d)", __func__, status);
5791      return status;
5792  }
5793  
adev_get_parameters(const struct audio_hw_device * dev,const char * keys)5794  static char* adev_get_parameters(const struct audio_hw_device *dev,
5795                                   const char *keys)
5796  {
5797      struct audio_device *adev = (struct audio_device *)dev;
5798      struct str_parms *reply = str_parms_create();
5799      struct str_parms *query = str_parms_create_str(keys);
5800      char *str;
5801  
5802      pthread_mutex_lock(&adev->lock);
5803  
5804      voice_get_parameters(adev, query, reply);
5805      audio_extn_a2dp_get_parameters(query, reply);
5806  
5807      str = str_parms_to_str(reply);
5808      str_parms_destroy(query);
5809      str_parms_destroy(reply);
5810  
5811      pthread_mutex_unlock(&adev->lock);
5812      ALOGV("%s: exit: returns - %s", __func__, str);
5813      return str;
5814  }
5815  
adev_init_check(const struct audio_hw_device * dev __unused)5816  static int adev_init_check(const struct audio_hw_device *dev __unused)
5817  {
5818      return 0;
5819  }
5820  
adev_set_voice_volume(struct audio_hw_device * dev,float volume)5821  static int adev_set_voice_volume(struct audio_hw_device *dev, float volume)
5822  {
5823      int ret;
5824      struct audio_device *adev = (struct audio_device *)dev;
5825  
5826      audio_extn_extspk_set_voice_vol(adev->extspk, volume);
5827  
5828      pthread_mutex_lock(&adev->lock);
5829      ret = voice_set_volume(adev, volume);
5830      pthread_mutex_unlock(&adev->lock);
5831  
5832      return ret;
5833  }
5834  
adev_set_master_volume(struct audio_hw_device * dev __unused,float volume __unused)5835  static int adev_set_master_volume(struct audio_hw_device *dev __unused, float volume __unused)
5836  {
5837      return -ENOSYS;
5838  }
5839  
adev_get_master_volume(struct audio_hw_device * dev __unused,float * volume __unused)5840  static int adev_get_master_volume(struct audio_hw_device *dev __unused,
5841                                    float *volume __unused)
5842  {
5843      return -ENOSYS;
5844  }
5845  
adev_set_master_mute(struct audio_hw_device * dev __unused,bool muted __unused)5846  static int adev_set_master_mute(struct audio_hw_device *dev __unused, bool muted __unused)
5847  {
5848      return -ENOSYS;
5849  }
5850  
adev_get_master_mute(struct audio_hw_device * dev __unused,bool * muted __unused)5851  static int adev_get_master_mute(struct audio_hw_device *dev __unused, bool *muted __unused)
5852  {
5853      return -ENOSYS;
5854  }
5855  
adev_set_mode(struct audio_hw_device * dev,audio_mode_t mode)5856  static int adev_set_mode(struct audio_hw_device *dev, audio_mode_t mode)
5857  {
5858      struct audio_device *adev = (struct audio_device *)dev;
5859  
5860      pthread_mutex_lock(&adev->lock);
5861      if (adev->mode != mode) {
5862          ALOGD("%s: mode %d", __func__, (int)mode);
5863          adev->mode = mode;
5864          if ((mode == AUDIO_MODE_NORMAL || mode == AUDIO_MODE_IN_COMMUNICATION) &&
5865                  voice_is_in_call(adev)) {
5866              voice_stop_call(adev);
5867              adev->current_call_output = NULL;
5868  
5869              /*
5870               * After stopping the call, it must check if any active capture
5871               * activity device needs to be re-selected.
5872               */
5873              struct audio_usecase *usecase;
5874              struct listnode *node;
5875              list_for_each(node, &adev->usecase_list) {
5876                  usecase = node_to_item(node, struct audio_usecase, list);
5877                  if (usecase->type == PCM_CAPTURE && usecase->stream.in != NULL) {
5878                      select_devices_with_force_switch(adev, usecase->id, true);
5879                  }
5880              }
5881          }
5882      }
5883      pthread_mutex_unlock(&adev->lock);
5884  
5885      audio_extn_extspk_set_mode(adev->extspk, mode);
5886  
5887      return 0;
5888  }
5889  
adev_set_mic_mute(struct audio_hw_device * dev,bool state)5890  static int adev_set_mic_mute(struct audio_hw_device *dev, bool state)
5891  {
5892      int ret;
5893      struct audio_device *adev = (struct audio_device *)dev;
5894  
5895      ALOGD("%s: state %d", __func__, (int)state);
5896      pthread_mutex_lock(&adev->lock);
5897      if (audio_extn_tfa_98xx_is_supported() && adev->enable_hfp) {
5898          ret = audio_extn_hfp_set_mic_mute(adev, state);
5899      } else {
5900          ret = voice_set_mic_mute(adev, state);
5901      }
5902      adev->mic_muted = state;
5903      pthread_mutex_unlock(&adev->lock);
5904  
5905      return ret;
5906  }
5907  
adev_get_mic_mute(const struct audio_hw_device * dev,bool * state)5908  static int adev_get_mic_mute(const struct audio_hw_device *dev, bool *state)
5909  {
5910      *state = voice_get_mic_mute((struct audio_device *)dev);
5911      return 0;
5912  }
5913  
adev_get_input_buffer_size(const struct audio_hw_device * dev __unused,const struct audio_config * config)5914  static size_t adev_get_input_buffer_size(const struct audio_hw_device *dev __unused,
5915                                           const struct audio_config *config)
5916  {
5917      int channel_count = audio_channel_count_from_in_mask(config->channel_mask);
5918  
5919      /* Don't know if USB HIFI in this context so use true to be conservative */
5920      if (check_input_parameters(config->sample_rate, config->format, channel_count,
5921                                 true /*is_usb_hifi */) != 0)
5922          return 0;
5923  
5924      return get_stream_buffer_size(AUDIO_CAPTURE_PERIOD_DURATION_MSEC,
5925                                   config->sample_rate, config->format,
5926                                   channel_count,
5927                                   false /* is_low_latency: since we don't know, be conservative */);
5928  }
5929  
adev_input_allow_hifi_record(struct audio_device * adev,audio_devices_t devices,audio_input_flags_t flags,audio_source_t source)5930  static bool adev_input_allow_hifi_record(struct audio_device *adev,
5931                                           audio_devices_t devices,
5932                                           audio_input_flags_t flags,
5933                                           audio_source_t source) {
5934      const bool allowed = true;
5935  
5936      if (!audio_is_usb_in_device(devices))
5937          return !allowed;
5938  
5939      switch (flags) {
5940          case AUDIO_INPUT_FLAG_NONE:
5941          case AUDIO_INPUT_FLAG_FAST: // just fast, not fast|raw || fast|mmap
5942              break;
5943          default:
5944              return !allowed;
5945      }
5946  
5947      switch (source) {
5948          case AUDIO_SOURCE_DEFAULT:
5949          case AUDIO_SOURCE_MIC:
5950          case AUDIO_SOURCE_UNPROCESSED:
5951              break;
5952          default:
5953              return !allowed;
5954      }
5955  
5956      switch (adev->mode) {
5957          case 0:
5958              break;
5959          default:
5960              return !allowed;
5961      }
5962  
5963      return allowed;
5964  }
5965  
adev_open_input_stream(struct audio_hw_device * dev,audio_io_handle_t handle,audio_devices_t devices,struct audio_config * config,struct audio_stream_in ** stream_in,audio_input_flags_t flags,const char * address __unused,audio_source_t source)5966  static int adev_open_input_stream(struct audio_hw_device *dev,
5967                                    audio_io_handle_t handle,
5968                                    audio_devices_t devices,
5969                                    struct audio_config *config,
5970                                    struct audio_stream_in **stream_in,
5971                                    audio_input_flags_t flags,
5972                                    const char *address __unused,
5973                                    audio_source_t source )
5974  {
5975      struct audio_device *adev = (struct audio_device *)dev;
5976      struct stream_in *in;
5977      int ret = 0, buffer_size, frame_size;
5978      int channel_count;
5979      bool is_low_latency = false;
5980      bool is_usb_dev = audio_is_usb_in_device(devices);
5981      bool may_use_hifi_record = adev_input_allow_hifi_record(adev,
5982                                                              devices,
5983                                                              flags,
5984                                                              source);
5985      ALOGV("%s: enter: flags %#x, is_usb_dev %d, may_use_hifi_record %d,"
5986              " sample_rate %u, channel_mask %#x, format %#x",
5987              __func__, flags, is_usb_dev, may_use_hifi_record,
5988              config->sample_rate, config->channel_mask, config->format);
5989      *stream_in = NULL;
5990  
5991      if (is_usb_dev && !is_usb_ready(adev, false /* is_playback */)) {
5992          return -ENOSYS;
5993      }
5994  
5995      if (!(is_usb_dev && may_use_hifi_record)) {
5996          if (config->sample_rate == 0)
5997              config->sample_rate = DEFAULT_INPUT_SAMPLING_RATE;
5998          if (config->channel_mask == AUDIO_CHANNEL_NONE)
5999              config->channel_mask = AUDIO_CHANNEL_IN_MONO;
6000          if (config->format == AUDIO_FORMAT_DEFAULT)
6001              config->format = AUDIO_FORMAT_PCM_16_BIT;
6002  
6003          channel_count = audio_channel_count_from_in_mask(config->channel_mask);
6004  
6005          if (check_input_parameters(config->sample_rate, config->format, channel_count, false) != 0)
6006              return -EINVAL;
6007      }
6008  
6009      if (audio_extn_tfa_98xx_is_supported() &&
6010          (audio_extn_hfp_is_active(adev) || voice_is_in_call(adev)))
6011          return -EINVAL;
6012  
6013      in = (struct stream_in *)calloc(1, sizeof(struct stream_in));
6014  
6015      pthread_mutex_init(&in->lock, (const pthread_mutexattr_t *) NULL);
6016      pthread_mutex_init(&in->pre_lock, (const pthread_mutexattr_t *) NULL);
6017  
6018      in->stream.common.get_sample_rate = in_get_sample_rate;
6019      in->stream.common.set_sample_rate = in_set_sample_rate;
6020      in->stream.common.get_buffer_size = in_get_buffer_size;
6021      in->stream.common.get_channels = in_get_channels;
6022      in->stream.common.get_format = in_get_format;
6023      in->stream.common.set_format = in_set_format;
6024      in->stream.common.standby = in_standby;
6025      in->stream.common.dump = in_dump;
6026      in->stream.common.set_parameters = in_set_parameters;
6027      in->stream.common.get_parameters = in_get_parameters;
6028      in->stream.common.add_audio_effect = in_add_audio_effect;
6029      in->stream.common.remove_audio_effect = in_remove_audio_effect;
6030      in->stream.set_gain = in_set_gain;
6031      in->stream.read = in_read;
6032      in->stream.get_input_frames_lost = in_get_input_frames_lost;
6033      in->stream.get_capture_position = in_get_capture_position;
6034      in->stream.get_active_microphones = in_get_active_microphones;
6035      in->stream.set_microphone_direction = in_set_microphone_direction;
6036      in->stream.set_microphone_field_dimension = in_set_microphone_field_dimension;
6037      in->stream.update_sink_metadata = in_update_sink_metadata;
6038  
6039      in->device = devices;
6040      in->source = source;
6041      in->dev = adev;
6042      in->standby = 1;
6043      in->capture_handle = handle;
6044      in->flags = flags;
6045      in->direction = MIC_DIRECTION_UNSPECIFIED;
6046      in->zoom = 0;
6047      in->mmap_shared_memory_fd = -1; // not open
6048      list_init(&in->aec_list);
6049      list_init(&in->ns_list);
6050  
6051      ALOGV("%s: source %d, config->channel_mask %#x", __func__, source, config->channel_mask);
6052      if (source == AUDIO_SOURCE_VOICE_UPLINK ||
6053           source == AUDIO_SOURCE_VOICE_DOWNLINK) {
6054          /* Force channel config requested to mono if incall
6055             record is being requested for only uplink/downlink */
6056          if (config->channel_mask != AUDIO_CHANNEL_IN_MONO) {
6057              config->channel_mask = AUDIO_CHANNEL_IN_MONO;
6058              ret = -EINVAL;
6059              goto err_open;
6060          }
6061      }
6062  
6063      if (is_usb_dev && may_use_hifi_record) {
6064          /* HiFi record selects an appropriate format, channel, rate combo
6065             depending on sink capabilities*/
6066          ret = read_usb_sup_params_and_compare(false /*is_playback*/,
6067                                                &config->format,
6068                                                &in->supported_formats[0],
6069                                                MAX_SUPPORTED_FORMATS,
6070                                                &config->channel_mask,
6071                                                &in->supported_channel_masks[0],
6072                                                MAX_SUPPORTED_CHANNEL_MASKS,
6073                                                &config->sample_rate,
6074                                                &in->supported_sample_rates[0],
6075                                                MAX_SUPPORTED_SAMPLE_RATES);
6076          if (ret != 0) {
6077              ret = -EINVAL;
6078              goto err_open;
6079          }
6080          channel_count = audio_channel_count_from_in_mask(config->channel_mask);
6081      } else if (config->format == AUDIO_FORMAT_DEFAULT) {
6082          config->format = AUDIO_FORMAT_PCM_16_BIT;
6083      } else if (config->format == AUDIO_FORMAT_PCM_FLOAT ||
6084                 config->format == AUDIO_FORMAT_PCM_24_BIT_PACKED ||
6085                 config->format == AUDIO_FORMAT_PCM_8_24_BIT) {
6086          bool ret_error = false;
6087          /* 24 bit is restricted to UNPROCESSED source only,also format supported
6088             from HAL is 8_24
6089             *> In case of UNPROCESSED source, for 24 bit, if format requested is other than
6090                8_24 return error indicating supported format is 8_24
6091             *> In case of any other source requesting 24 bit or float return error
6092                indicating format supported is 16 bit only.
6093  
6094             on error flinger will retry with supported format passed
6095           */
6096          if (!is_supported_24bits_audiosource(source)) {
6097              config->format = AUDIO_FORMAT_PCM_16_BIT;
6098              ret_error = true;
6099          } else if (config->format != AUDIO_FORMAT_PCM_8_24_BIT) {
6100              config->format = AUDIO_FORMAT_PCM_8_24_BIT;
6101              ret_error = true;
6102          }
6103  
6104          if (ret_error) {
6105              ret = -EINVAL;
6106              goto err_open;
6107          }
6108      }
6109  
6110      in->format = config->format;
6111      in->channel_mask = config->channel_mask;
6112  
6113      /* Update config params with the requested sample rate and channels */
6114      if (in->device == AUDIO_DEVICE_IN_TELEPHONY_RX) {
6115          if (config->sample_rate == 0)
6116              config->sample_rate = AFE_PROXY_SAMPLING_RATE;
6117          if (config->sample_rate != 48000 && config->sample_rate != 16000 &&
6118                  config->sample_rate != 8000) {
6119              config->sample_rate = AFE_PROXY_SAMPLING_RATE;
6120              ret = -EINVAL;
6121              goto err_open;
6122          }
6123  
6124          if (config->format != AUDIO_FORMAT_PCM_16_BIT) {
6125              config->format = AUDIO_FORMAT_PCM_16_BIT;
6126              ret = -EINVAL;
6127              goto err_open;
6128          }
6129  
6130          in->usecase = USECASE_AUDIO_RECORD_AFE_PROXY;
6131          in->config = pcm_config_afe_proxy_record;
6132          in->af_period_multiplier = 1;
6133      } else if (is_usb_dev && may_use_hifi_record) {
6134          in->usecase = USECASE_AUDIO_RECORD_HIFI;
6135          in->config = pcm_config_audio_capture;
6136          frame_size = audio_stream_in_frame_size(&in->stream);
6137          buffer_size = get_stream_buffer_size(AUDIO_CAPTURE_PERIOD_DURATION_MSEC,
6138                                               config->sample_rate,
6139                                               config->format,
6140                                               channel_count,
6141                                               false /*is_low_latency*/);
6142          in->config.period_size = buffer_size / frame_size;
6143          in->config.rate = config->sample_rate;
6144          in->af_period_multiplier = 1;
6145          in->config.format = pcm_format_from_audio_format(config->format);
6146      } else {
6147          in->usecase = USECASE_AUDIO_RECORD;
6148          if (config->sample_rate == LOW_LATENCY_CAPTURE_SAMPLE_RATE &&
6149                  (in->flags & AUDIO_INPUT_FLAG_FAST) != 0) {
6150              is_low_latency = true;
6151  #if LOW_LATENCY_CAPTURE_USE_CASE
6152              in->usecase = USECASE_AUDIO_RECORD_LOW_LATENCY;
6153  #endif
6154              in->realtime = may_use_noirq_mode(adev, in->usecase, in->flags);
6155              if (!in->realtime) {
6156                  in->config = pcm_config_audio_capture;
6157                  frame_size = audio_stream_in_frame_size(&in->stream);
6158                  buffer_size = get_stream_buffer_size(AUDIO_CAPTURE_PERIOD_DURATION_MSEC,
6159                                                       config->sample_rate,
6160                                                       config->format,
6161                                                       channel_count,
6162                                                       is_low_latency);
6163                  in->config.period_size = buffer_size / frame_size;
6164                  in->config.rate = config->sample_rate;
6165                  in->af_period_multiplier = 1;
6166              } else {
6167                  // period size is left untouched for rt mode playback
6168                  in->config = pcm_config_audio_capture_rt;
6169                  in->af_period_multiplier = af_period_multiplier;
6170              }
6171          } else if ((config->sample_rate == LOW_LATENCY_CAPTURE_SAMPLE_RATE) &&
6172                  ((in->flags & AUDIO_INPUT_FLAG_MMAP_NOIRQ) != 0)) {
6173              // FIXME: Add support for multichannel capture over USB using MMAP
6174              in->usecase = USECASE_AUDIO_RECORD_MMAP;
6175              in->config = pcm_config_mmap_capture;
6176              in->stream.start = in_start;
6177              in->stream.stop = in_stop;
6178              in->stream.create_mmap_buffer = in_create_mmap_buffer;
6179              in->stream.get_mmap_position = in_get_mmap_position;
6180              in->af_period_multiplier = 1;
6181              ALOGV("%s: USECASE_AUDIO_RECORD_MMAP", __func__);
6182          } else if (in->source == AUDIO_SOURCE_VOICE_COMMUNICATION &&
6183                     in->flags & AUDIO_INPUT_FLAG_VOIP_TX &&
6184                     (config->sample_rate == 8000 ||
6185                      config->sample_rate == 16000 ||
6186                      config->sample_rate == 32000 ||
6187                      config->sample_rate == 48000) &&
6188                     channel_count == 1) {
6189              in->usecase = USECASE_AUDIO_RECORD_VOIP;
6190              in->config = pcm_config_audio_capture;
6191              frame_size = audio_stream_in_frame_size(&in->stream);
6192              buffer_size = get_stream_buffer_size(VOIP_CAPTURE_PERIOD_DURATION_MSEC,
6193                                                   config->sample_rate,
6194                                                   config->format,
6195                                                   channel_count, false /*is_low_latency*/);
6196              in->config.period_size = buffer_size / frame_size;
6197              in->config.period_count = VOIP_CAPTURE_PERIOD_COUNT;
6198              in->config.rate = config->sample_rate;
6199              in->af_period_multiplier = 1;
6200          } else {
6201              in->config = pcm_config_audio_capture;
6202              frame_size = audio_stream_in_frame_size(&in->stream);
6203              buffer_size = get_stream_buffer_size(AUDIO_CAPTURE_PERIOD_DURATION_MSEC,
6204                                                   config->sample_rate,
6205                                                   config->format,
6206                                                   channel_count,
6207                                                   is_low_latency);
6208              in->config.period_size = buffer_size / frame_size;
6209              in->config.rate = config->sample_rate;
6210              in->af_period_multiplier = 1;
6211          }
6212          if (config->format == AUDIO_FORMAT_PCM_8_24_BIT)
6213              in->config.format = PCM_FORMAT_S24_LE;
6214      }
6215  
6216      in->config.channels = channel_count;
6217      in->sample_rate  = in->config.rate;
6218  
6219  
6220      register_format(in->format, in->supported_formats);
6221      register_channel_mask(in->channel_mask, in->supported_channel_masks);
6222      register_sample_rate(in->sample_rate, in->supported_sample_rates);
6223  
6224      in->error_log = error_log_create(
6225              ERROR_LOG_ENTRIES,
6226              NANOS_PER_SECOND /* aggregate consecutive identical errors within one second */);
6227  
6228      /* This stream could be for sound trigger lab,
6229         get sound trigger pcm if present */
6230      audio_extn_sound_trigger_check_and_get_session(in);
6231  
6232      if (in->is_st_session)
6233          in->flags |= AUDIO_INPUT_FLAG_HW_HOTWORD;
6234  
6235      lock_input_stream(in);
6236      audio_extn_snd_mon_register_listener(in, in_snd_mon_cb);
6237      pthread_mutex_lock(&adev->lock);
6238      in->card_status = adev->card_status;
6239      pthread_mutex_unlock(&adev->lock);
6240      pthread_mutex_unlock(&in->lock);
6241  
6242      stream_app_type_cfg_init(&in->app_type_cfg);
6243  
6244      *stream_in = &in->stream;
6245      ALOGV("%s: exit", __func__);
6246      return 0;
6247  
6248  err_open:
6249      free(in);
6250      *stream_in = NULL;
6251      return ret;
6252  }
6253  
adev_close_input_stream(struct audio_hw_device * dev __unused,struct audio_stream_in * stream)6254  static void adev_close_input_stream(struct audio_hw_device *dev __unused,
6255                                      struct audio_stream_in *stream)
6256  {
6257      struct stream_in *in = (struct stream_in *)stream;
6258      ALOGV("%s", __func__);
6259  
6260      // must deregister from sndmonitor first to prevent races
6261      // between the callback and close_stream
6262      audio_extn_snd_mon_unregister_listener(stream);
6263      in_standby(&stream->common);
6264  
6265      error_log_destroy(in->error_log);
6266      in->error_log = NULL;
6267  
6268      pthread_mutex_destroy(&in->pre_lock);
6269      pthread_mutex_destroy(&in->lock);
6270  
6271      free(stream);
6272  
6273      return;
6274  }
6275  
adev_dump(const audio_hw_device_t * device __unused,int fd __unused)6276  static int adev_dump(const audio_hw_device_t *device __unused, int fd __unused)
6277  {
6278      return 0;
6279  }
6280  
6281  /* verifies input and output devices and their capabilities.
6282   *
6283   * This verification is required when enabling extended bit-depth or
6284   * sampling rates, as not all qcom products support it.
6285   *
6286   * Suitable for calling only on initialization such as adev_open().
6287   * It fills the audio_device use_case_table[] array.
6288   *
6289   * Has a side-effect that it needs to configure audio routing / devices
6290   * in order to power up the devices and read the device parameters.
6291   * It does not acquire any hw device lock. Should restore the devices
6292   * back to "normal state" upon completion.
6293   */
adev_verify_devices(struct audio_device * adev)6294  static int adev_verify_devices(struct audio_device *adev)
6295  {
6296      /* enumeration is a bit difficult because one really wants to pull
6297       * the use_case, device id, etc from the hidden pcm_device_table[].
6298       * In this case there are the following use cases and device ids.
6299       *
6300       * [USECASE_AUDIO_PLAYBACK_DEEP_BUFFER] = {0, 0},
6301       * [USECASE_AUDIO_PLAYBACK_LOW_LATENCY] = {15, 15},
6302       * [USECASE_AUDIO_PLAYBACK_HIFI] = {1, 1},
6303       * [USECASE_AUDIO_PLAYBACK_OFFLOAD] = {9, 9},
6304       * [USECASE_AUDIO_RECORD] = {0, 0},
6305       * [USECASE_AUDIO_RECORD_LOW_LATENCY] = {15, 15},
6306       * [USECASE_VOICE_CALL] = {2, 2},
6307       *
6308       * USECASE_AUDIO_PLAYBACK_OFFLOAD, USECASE_AUDIO_PLAYBACK_HIFI omitted.
6309       * USECASE_VOICE_CALL omitted, but possible for either input or output.
6310       */
6311  
6312      /* should be the usecases enabled in adev_open_input_stream() */
6313      static const int test_in_usecases[] = {
6314               USECASE_AUDIO_RECORD,
6315               USECASE_AUDIO_RECORD_LOW_LATENCY, /* does not appear to be used */
6316      };
6317      /* should be the usecases enabled in adev_open_output_stream()*/
6318      static const int test_out_usecases[] = {
6319              USECASE_AUDIO_PLAYBACK_DEEP_BUFFER,
6320              USECASE_AUDIO_PLAYBACK_LOW_LATENCY,
6321      };
6322      static const usecase_type_t usecase_type_by_dir[] = {
6323              PCM_PLAYBACK,
6324              PCM_CAPTURE,
6325      };
6326      static const unsigned flags_by_dir[] = {
6327              PCM_OUT,
6328              PCM_IN,
6329      };
6330  
6331      size_t i;
6332      unsigned dir;
6333      const unsigned card_id = adev->snd_card;
6334      char info[512]; /* for possible debug info */
6335  
6336      for (dir = 0; dir < 2; ++dir) {
6337          const usecase_type_t usecase_type = usecase_type_by_dir[dir];
6338          const unsigned flags_dir = flags_by_dir[dir];
6339          const size_t testsize =
6340                  dir ? ARRAY_SIZE(test_in_usecases) : ARRAY_SIZE(test_out_usecases);
6341          const int *testcases =
6342                  dir ? test_in_usecases : test_out_usecases;
6343          const audio_devices_t audio_device =
6344                  dir ? AUDIO_DEVICE_IN_BUILTIN_MIC : AUDIO_DEVICE_OUT_SPEAKER;
6345  
6346          for (i = 0; i < testsize; ++i) {
6347              const audio_usecase_t audio_usecase = testcases[i];
6348              int device_id;
6349              snd_device_t snd_device;
6350              struct pcm_params **pparams;
6351              struct stream_out out;
6352              struct stream_in in;
6353              struct audio_usecase uc_info;
6354              int retval;
6355  
6356              pparams = &adev->use_case_table[audio_usecase];
6357              pcm_params_free(*pparams); /* can accept null input */
6358              *pparams = NULL;
6359  
6360              /* find the device ID for the use case (signed, for error) */
6361              device_id = platform_get_pcm_device_id(audio_usecase, usecase_type);
6362              if (device_id < 0)
6363                  continue;
6364  
6365              /* prepare structures for device probing */
6366              memset(&uc_info, 0, sizeof(uc_info));
6367              uc_info.id = audio_usecase;
6368              uc_info.type = usecase_type;
6369              if (dir) {
6370                  memset(&in, 0, sizeof(in));
6371                  in.device = audio_device;
6372                  in.source = AUDIO_SOURCE_VOICE_COMMUNICATION;
6373                  uc_info.stream.in = &in;
6374              }
6375              memset(&out, 0, sizeof(out));
6376              out.devices = audio_device; /* only field needed in select_devices */
6377              uc_info.stream.out = &out;
6378              uc_info.devices = audio_device;
6379              uc_info.in_snd_device = SND_DEVICE_NONE;
6380              uc_info.out_snd_device = SND_DEVICE_NONE;
6381              list_add_tail(&adev->usecase_list, &uc_info.list);
6382  
6383              /* select device - similar to start_(in/out)put_stream() */
6384              retval = select_devices(adev, audio_usecase);
6385              if (retval >= 0) {
6386                  *pparams = pcm_params_get(card_id, device_id, flags_dir);
6387  #if LOG_NDEBUG == 0
6388                  if (*pparams) {
6389                      ALOGV("%s: (%s) card %d  device %d", __func__,
6390                              dir ? "input" : "output", card_id, device_id);
6391                      pcm_params_to_string(*pparams, info, ARRAY_SIZE(info));
6392                  } else {
6393                      ALOGV("%s: cannot locate card %d  device %d", __func__, card_id, device_id);
6394                  }
6395  #endif
6396              }
6397  
6398              /* deselect device - similar to stop_(in/out)put_stream() */
6399              /* 1. Get and set stream specific mixer controls */
6400              retval = disable_audio_route(adev, &uc_info);
6401              /* 2. Disable the rx device */
6402              retval = disable_snd_device(adev,
6403                      dir ? uc_info.in_snd_device : uc_info.out_snd_device);
6404              list_remove(&uc_info.list);
6405          }
6406      }
6407      return 0;
6408  }
6409  
adev_close(hw_device_t * device)6410  static int adev_close(hw_device_t *device)
6411  {
6412      size_t i;
6413  
6414      pthread_mutex_lock(&adev_init_lock);
6415      if (!device || ((struct audio_device *)device != adev))
6416          goto done;
6417  
6418      if ((--audio_device_ref_count) == 0) {
6419          audio_extn_snd_mon_unregister_listener(adev);
6420          audio_extn_tfa_98xx_deinit();
6421          audio_extn_ma_deinit();
6422          audio_route_free(adev->audio_route);
6423          free(adev->snd_dev_ref_cnt);
6424          platform_deinit(adev->platform);
6425          audio_extn_extspk_deinit(adev->extspk);
6426          audio_extn_sound_trigger_deinit(adev);
6427          audio_extn_snd_mon_deinit();
6428          for (i = 0; i < ARRAY_SIZE(adev->use_case_table); ++i) {
6429              pcm_params_free(adev->use_case_table[i]);
6430          }
6431          if (adev->adm_deinit)
6432              adev->adm_deinit(adev->adm_data);
6433          pthread_mutex_destroy(&adev->lock);
6434          free(device);
6435          adev = NULL;
6436      }
6437  
6438  done:
6439      pthread_mutex_unlock(&adev_init_lock);
6440      return 0;
6441  }
6442  
6443  /* This returns 1 if the input parameter looks at all plausible as a low latency period size,
6444   * or 0 otherwise.  A return value of 1 doesn't mean the value is guaranteed to work,
6445   * just that it _might_ work.
6446   */
period_size_is_plausible_for_low_latency(int period_size)6447  static int period_size_is_plausible_for_low_latency(int period_size)
6448  {
6449      switch (period_size) {
6450      case 48:
6451      case 96:
6452      case 144:
6453      case 160:
6454      case 192:
6455      case 240:
6456      case 320:
6457      case 480:
6458          return 1;
6459      default:
6460          return 0;
6461      }
6462  }
6463  
adev_snd_mon_cb(void * stream __unused,struct str_parms * parms)6464  static void adev_snd_mon_cb(void * stream __unused, struct str_parms * parms)
6465  {
6466      int card;
6467      card_status_t status;
6468  
6469      if (!parms)
6470          return;
6471  
6472      if (parse_snd_card_status(parms, &card, &status) < 0)
6473          return;
6474  
6475      pthread_mutex_lock(&adev->lock);
6476      bool valid_cb = (card == adev->snd_card);
6477      if (valid_cb) {
6478          if (adev->card_status != status) {
6479              adev->card_status = status;
6480              platform_snd_card_update(adev->platform, status);
6481          }
6482      }
6483      pthread_mutex_unlock(&adev->lock);
6484      return;
6485  }
6486  
6487  /* out and adev lock held */
check_a2dp_restore_l(struct audio_device * adev,struct stream_out * out,bool restore)6488  static int check_a2dp_restore_l(struct audio_device *adev, struct stream_out *out, bool restore)
6489  {
6490      struct audio_usecase *uc_info;
6491      float left_p;
6492      float right_p;
6493      audio_devices_t devices;
6494  
6495      uc_info = get_usecase_from_list(adev, out->usecase);
6496      if (uc_info == NULL) {
6497          ALOGE("%s: Could not find the usecase (%d) in the list",
6498                __func__, out->usecase);
6499          return -EINVAL;
6500      }
6501  
6502      ALOGD("%s: enter: usecase(%d: %s)", __func__,
6503            out->usecase, use_case_table[out->usecase]);
6504  
6505      if (restore) {
6506          // restore A2DP device for active usecases and unmute if required
6507          if ((out->devices & AUDIO_DEVICE_OUT_ALL_A2DP) &&
6508              !is_a2dp_device(uc_info->out_snd_device)) {
6509              ALOGD("%s: restoring A2DP and unmuting stream", __func__);
6510              select_devices(adev, uc_info->id);
6511              pthread_mutex_lock(&out->compr_mute_lock);
6512              if ((out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) &&
6513                  (out->a2dp_compress_mute)) {
6514                  out->a2dp_compress_mute = false;
6515                  out_set_compr_volume(&out->stream, out->volume_l, out->volume_r);
6516              }
6517              pthread_mutex_unlock(&out->compr_mute_lock);
6518          }
6519      } else {
6520          // mute compress stream if suspended
6521          pthread_mutex_lock(&out->compr_mute_lock);
6522          if ((out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) &&
6523              (!out->a2dp_compress_mute)) {
6524              if (!out->standby) {
6525                  ALOGD("%s: selecting speaker and muting stream", __func__);
6526                  devices = out->devices;
6527                  out->devices = AUDIO_DEVICE_OUT_SPEAKER;
6528                  left_p = out->volume_l;
6529                  right_p = out->volume_r;
6530                  if (out->offload_state == OFFLOAD_STATE_PLAYING)
6531                      compress_pause(out->compr);
6532                  out_set_compr_volume(&out->stream, 0.0f, 0.0f);
6533                  out->a2dp_compress_mute = true;
6534                  select_devices(adev, out->usecase);
6535                  if (out->offload_state == OFFLOAD_STATE_PLAYING)
6536                      compress_resume(out->compr);
6537                  out->devices = devices;
6538                  out->volume_l = left_p;
6539                  out->volume_r = right_p;
6540              }
6541          }
6542          pthread_mutex_unlock(&out->compr_mute_lock);
6543      }
6544      ALOGV("%s: exit", __func__);
6545      return 0;
6546  }
6547  
check_a2dp_restore(struct audio_device * adev,struct stream_out * out,bool restore)6548  int check_a2dp_restore(struct audio_device *adev, struct stream_out *out, bool restore)
6549  {
6550      int ret = 0;
6551  
6552      lock_output_stream(out);
6553      pthread_mutex_lock(&adev->lock);
6554  
6555      ret = check_a2dp_restore_l(adev, out, restore);
6556  
6557      pthread_mutex_unlock(&adev->lock);
6558      pthread_mutex_unlock(&out->lock);
6559      return ret;
6560  }
6561  
adev_open(const hw_module_t * module,const char * name,hw_device_t ** device)6562  static int adev_open(const hw_module_t *module, const char *name,
6563                       hw_device_t **device)
6564  {
6565      int i, ret;
6566  
6567      ALOGD("%s: enter", __func__);
6568      if (strcmp(name, AUDIO_HARDWARE_INTERFACE) != 0) return -EINVAL;
6569      pthread_mutex_lock(&adev_init_lock);
6570      if (audio_device_ref_count != 0) {
6571          *device = &adev->device.common;
6572          audio_device_ref_count++;
6573          ALOGV("%s: returning existing instance of adev", __func__);
6574          ALOGV("%s: exit", __func__);
6575          pthread_mutex_unlock(&adev_init_lock);
6576          return 0;
6577      }
6578      adev = calloc(1, sizeof(struct audio_device));
6579  
6580      pthread_mutex_init(&adev->lock, (const pthread_mutexattr_t *) NULL);
6581  
6582      adev->device.common.tag = HARDWARE_DEVICE_TAG;
6583      adev->device.common.version = AUDIO_DEVICE_API_VERSION_2_0;
6584      adev->device.common.module = (struct hw_module_t *)module;
6585      adev->device.common.close = adev_close;
6586  
6587      adev->device.init_check = adev_init_check;
6588      adev->device.set_voice_volume = adev_set_voice_volume;
6589      adev->device.set_master_volume = adev_set_master_volume;
6590      adev->device.get_master_volume = adev_get_master_volume;
6591      adev->device.set_master_mute = adev_set_master_mute;
6592      adev->device.get_master_mute = adev_get_master_mute;
6593      adev->device.set_mode = adev_set_mode;
6594      adev->device.set_mic_mute = adev_set_mic_mute;
6595      adev->device.get_mic_mute = adev_get_mic_mute;
6596      adev->device.set_parameters = adev_set_parameters;
6597      adev->device.get_parameters = adev_get_parameters;
6598      adev->device.get_input_buffer_size = adev_get_input_buffer_size;
6599      adev->device.open_output_stream = adev_open_output_stream;
6600      adev->device.close_output_stream = adev_close_output_stream;
6601      adev->device.open_input_stream = adev_open_input_stream;
6602  
6603      adev->device.close_input_stream = adev_close_input_stream;
6604      adev->device.dump = adev_dump;
6605      adev->device.get_microphones = adev_get_microphones;
6606  
6607      /* Set the default route before the PCM stream is opened */
6608      pthread_mutex_lock(&adev->lock);
6609      adev->mode = AUDIO_MODE_NORMAL;
6610      adev->primary_output = NULL;
6611      adev->bluetooth_nrec = true;
6612      adev->acdb_settings = TTY_MODE_OFF;
6613      adev->a2dp_started = false;
6614      /* adev->cur_hdmi_channels = 0;  by calloc() */
6615      adev->snd_dev_ref_cnt = calloc(SND_DEVICE_MAX, sizeof(int));
6616      voice_init(adev);
6617      list_init(&adev->usecase_list);
6618      pthread_mutex_unlock(&adev->lock);
6619  
6620      /* Loads platform specific libraries dynamically */
6621      adev->platform = platform_init(adev);
6622      if (!adev->platform) {
6623          free(adev->snd_dev_ref_cnt);
6624          free(adev);
6625          ALOGE("%s: Failed to init platform data, aborting.", __func__);
6626          *device = NULL;
6627          pthread_mutex_unlock(&adev_init_lock);
6628          return -EINVAL;
6629      }
6630      adev->extspk = audio_extn_extspk_init(adev);
6631  
6632      adev->visualizer_lib = dlopen(VISUALIZER_LIBRARY_PATH, RTLD_NOW);
6633      if (adev->visualizer_lib == NULL) {
6634          ALOGW("%s: DLOPEN failed for %s", __func__, VISUALIZER_LIBRARY_PATH);
6635      } else {
6636          ALOGV("%s: DLOPEN successful for %s", __func__, VISUALIZER_LIBRARY_PATH);
6637          adev->visualizer_start_output =
6638                      (int (*)(audio_io_handle_t, int, int, int))dlsym(adev->visualizer_lib,
6639                                                      "visualizer_hal_start_output");
6640          adev->visualizer_stop_output =
6641                      (int (*)(audio_io_handle_t, int))dlsym(adev->visualizer_lib,
6642                                                      "visualizer_hal_stop_output");
6643      }
6644  
6645      adev->offload_effects_lib = dlopen(OFFLOAD_EFFECTS_BUNDLE_LIBRARY_PATH, RTLD_NOW);
6646      if (adev->offload_effects_lib == NULL) {
6647          ALOGW("%s: DLOPEN failed for %s", __func__,
6648                OFFLOAD_EFFECTS_BUNDLE_LIBRARY_PATH);
6649      } else {
6650          ALOGV("%s: DLOPEN successful for %s", __func__,
6651                OFFLOAD_EFFECTS_BUNDLE_LIBRARY_PATH);
6652          adev->offload_effects_start_output =
6653                      (int (*)(audio_io_handle_t, int))dlsym(adev->offload_effects_lib,
6654                                       "offload_effects_bundle_hal_start_output");
6655          adev->offload_effects_stop_output =
6656                      (int (*)(audio_io_handle_t, int))dlsym(adev->offload_effects_lib,
6657                                       "offload_effects_bundle_hal_stop_output");
6658      }
6659  
6660      adev->adm_lib = dlopen(ADM_LIBRARY_PATH, RTLD_NOW);
6661      if (adev->adm_lib == NULL) {
6662          ALOGW("%s: DLOPEN failed for %s", __func__, ADM_LIBRARY_PATH);
6663      } else {
6664          ALOGV("%s: DLOPEN successful for %s", __func__, ADM_LIBRARY_PATH);
6665          adev->adm_init = (adm_init_t)
6666                                  dlsym(adev->adm_lib, "adm_init");
6667          adev->adm_deinit = (adm_deinit_t)
6668                                  dlsym(adev->adm_lib, "adm_deinit");
6669          adev->adm_register_input_stream = (adm_register_input_stream_t)
6670                                  dlsym(adev->adm_lib, "adm_register_input_stream");
6671          adev->adm_register_output_stream = (adm_register_output_stream_t)
6672                                  dlsym(adev->adm_lib, "adm_register_output_stream");
6673          adev->adm_deregister_stream = (adm_deregister_stream_t)
6674                                  dlsym(adev->adm_lib, "adm_deregister_stream");
6675          adev->adm_request_focus = (adm_request_focus_t)
6676                                  dlsym(adev->adm_lib, "adm_request_focus");
6677          adev->adm_abandon_focus = (adm_abandon_focus_t)
6678                                  dlsym(adev->adm_lib, "adm_abandon_focus");
6679          adev->adm_set_config = (adm_set_config_t)
6680                                      dlsym(adev->adm_lib, "adm_set_config");
6681          adev->adm_request_focus_v2 = (adm_request_focus_v2_t)
6682                                      dlsym(adev->adm_lib, "adm_request_focus_v2");
6683          adev->adm_is_noirq_avail = (adm_is_noirq_avail_t)
6684                                      dlsym(adev->adm_lib, "adm_is_noirq_avail");
6685          adev->adm_on_routing_change = (adm_on_routing_change_t)
6686                                      dlsym(adev->adm_lib, "adm_on_routing_change");
6687      }
6688  
6689      adev->bt_wb_speech_enabled = false;
6690      adev->enable_voicerx = false;
6691  
6692      *device = &adev->device.common;
6693  
6694      if (k_enable_extended_precision)
6695          adev_verify_devices(adev);
6696  
6697      char value[PROPERTY_VALUE_MAX];
6698      int trial;
6699      if ((property_get("vendor.audio_hal.period_size", value, NULL) > 0) ||
6700          (property_get("audio_hal.period_size", value, NULL) > 0)) {
6701          trial = atoi(value);
6702          if (period_size_is_plausible_for_low_latency(trial)) {
6703              pcm_config_low_latency.period_size = trial;
6704              pcm_config_low_latency.start_threshold = trial / 4;
6705              pcm_config_low_latency.avail_min = trial / 4;
6706              configured_low_latency_capture_period_size = trial;
6707          }
6708      }
6709      if ((property_get("vendor.audio_hal.in_period_size", value, NULL) > 0) ||
6710          (property_get("audio_hal.in_period_size", value, NULL) > 0)) {
6711          trial = atoi(value);
6712          if (period_size_is_plausible_for_low_latency(trial)) {
6713              configured_low_latency_capture_period_size = trial;
6714          }
6715      }
6716  
6717      adev->mic_break_enabled = property_get_bool("vendor.audio.mic_break", false);
6718  
6719      adev->camera_orientation = CAMERA_DEFAULT;
6720  
6721      // commented as full set of app type cfg is sent from platform
6722      // audio_extn_utils_send_default_app_type_cfg(adev->platform, adev->mixer);
6723      audio_device_ref_count++;
6724  
6725      if ((property_get("vendor.audio_hal.period_multiplier", value, NULL) > 0) ||
6726          (property_get("audio_hal.period_multiplier", value, NULL) > 0)) {
6727          af_period_multiplier = atoi(value);
6728          if (af_period_multiplier < 0) {
6729              af_period_multiplier = 2;
6730          } else if (af_period_multiplier > 4) {
6731              af_period_multiplier = 4;
6732          }
6733          ALOGV("new period_multiplier = %d", af_period_multiplier);
6734      }
6735  
6736      audio_extn_tfa_98xx_init(adev);
6737      audio_extn_ma_init(adev->platform);
6738      audio_extn_audiozoom_init();
6739  
6740      pthread_mutex_unlock(&adev_init_lock);
6741  
6742      if (adev->adm_init)
6743          adev->adm_data = adev->adm_init();
6744  
6745      audio_extn_perf_lock_init();
6746      audio_extn_snd_mon_init();
6747      pthread_mutex_lock(&adev->lock);
6748      audio_extn_snd_mon_register_listener(NULL, adev_snd_mon_cb);
6749      adev->card_status = CARD_STATUS_ONLINE;
6750      pthread_mutex_unlock(&adev->lock);
6751      audio_extn_sound_trigger_init(adev);/* dependent on snd_mon_init() */
6752  
6753      ALOGD("%s: exit", __func__);
6754      return 0;
6755  }
6756  
6757  static struct hw_module_methods_t hal_module_methods = {
6758      .open = adev_open,
6759  };
6760  
6761  struct audio_module HAL_MODULE_INFO_SYM = {
6762      .common = {
6763          .tag = HARDWARE_MODULE_TAG,
6764          .module_api_version = AUDIO_MODULE_API_VERSION_0_1,
6765          .hal_api_version = HARDWARE_HAL_API_VERSION,
6766          .id = AUDIO_HARDWARE_MODULE_ID,
6767          .name = "QCOM Audio HAL",
6768          .author = "Code Aurora Forum",
6769          .methods = &hal_module_methods,
6770      },
6771  };
6772