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