blob: aca4f17abeb18c536c3af2ba4329a83a96b746c1 [file] [log] [blame]
David Linee3fe402017-03-13 10:00:42 -07001/*
2 * Copyright (C) 2017 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_usb"
18
19#include <errno.h>
20#include <pthread.h>
21#include <stdlib.h>
Haynes Mathew Georgee6e2d442018-02-22 18:51:56 -080022#include <log/log.h>
David Linee3fe402017-03-13 10:00:42 -070023#include <cutils/str_parms.h>
24#include <sys/ioctl.h>
Jiyong Park6431fe62017-06-29 15:15:58 +090025#include <unistd.h>
David Linee3fe402017-03-13 10:00:42 -070026#include <fcntl.h>
27#include <sys/stat.h>
28#include <system/audio.h>
29#include <tinyalsa/asoundlib.h>
30#include <audio_hw.h>
31#include <cutils/properties.h>
32#include <ctype.h>
33#include <math.h>
34
35#ifdef USB_TUNNEL_ENABLED
36#define USB_BUFF_SIZE 2048
37#define CHANNEL_NUMBER_STR "Channels: "
38#define PLAYBACK_PROFILE_STR "Playback:"
39#define CAPTURE_PROFILE_STR "Capture:"
40#define USB_SIDETONE_GAIN_STR "usb_sidetone_gain"
41#define ABS_SUB(A, B) (((A) > (B)) ? ((A) - (B)):((B) - (A)))
42#define SAMPLE_RATE_8000 8000
43#define SAMPLE_RATE_11025 11025
44/* TODO: dynamically populate supported sample rates */
45static uint32_t supported_sample_rates[] =
Haynes Mathew Georgee5ff0fc2017-02-16 20:33:38 -080046 {192000, 176400, 96000, 88200, 64000, 48000, 44100};
47static uint32_t supported_sample_rates_mask[2];
48static const uint32_t MAX_SAMPLE_RATE_SIZE =
49 (sizeof(supported_sample_rates)/sizeof(supported_sample_rates[0]));
David Linee3fe402017-03-13 10:00:42 -070050
Haynes Mathew Georgee5ff0fc2017-02-16 20:33:38 -080051// assert on sizeof bm v/s size of rates if needed
David Linee3fe402017-03-13 10:00:42 -070052
53enum usb_usecase_type{
54 USB_PLAYBACK = 0,
55 USB_CAPTURE,
56};
57
58enum {
59 USB_SIDETONE_ENABLE_INDEX = 0,
60 USB_SIDETONE_VOLUME_INDEX,
61 USB_SIDETONE_MAX_INDEX,
62};
63
64struct usb_device_config {
65 struct listnode list;
66 unsigned int bit_width;
67 unsigned int channel_count;
68 unsigned int rate_size;
69 unsigned int rates[MAX_SAMPLE_RATE_SIZE];
70};
71
72struct usb_card_config {
73 struct listnode list;
74 audio_devices_t usb_device_type;
75 int usb_card;
76 struct listnode usb_device_conf_list;
77 struct mixer *usb_snd_mixer;
78 int usb_sidetone_index[USB_SIDETONE_MAX_INDEX];
79 int usb_sidetone_vol_min;
80 int usb_sidetone_vol_max;
81};
82
83struct usb_module {
84 struct listnode usb_card_conf_list;
85 struct audio_device *adev;
86 int sidetone_gain;
87 bool is_capture_supported;
88};
89
90static struct usb_module *usbmod = NULL;
91static bool usb_audio_debug_enable = false;
92static int usb_sidetone_gain = 0;
93
94static const char * const usb_sidetone_enable_str[] = {
95 "Sidetone Playback Switch",
96 "Mic Playback Switch",
97};
98
99static const char * const usb_sidetone_volume_str[] = {
100 "Sidetone Playback Volume",
101 "Mic Playback Volume",
102};
103
104static void usb_mixer_print_enum(struct mixer_ctl *ctl)
105{
106 unsigned int num_enums;
107 unsigned int i;
108 const char *string;
109
110 num_enums = mixer_ctl_get_num_enums(ctl);
111
112 for (i = 0; i < num_enums; i++) {
113 string = mixer_ctl_get_enum_string(ctl, i);
114 ALOGI("\t%s%s", mixer_ctl_get_value(ctl, 0) == (int)i ? ">" : "", string);
115 }
116}
117
118static void usb_soundcard_detail_control(struct mixer *mixer, const char *control)
119{
120 struct mixer_ctl *ctl;
121 enum mixer_ctl_type type;
122 unsigned int num_values;
123 unsigned int i;
124 int min, max;
125
126 if (isdigit(control[0]))
127 ctl = mixer_get_ctl(mixer, atoi(control));
128 else
129 ctl = mixer_get_ctl_by_name(mixer, control);
130
131 if (!ctl) {
132 fprintf(stderr, "Invalid mixer control\n");
133 return;
134 }
135
136 type = mixer_ctl_get_type(ctl);
137 num_values = mixer_ctl_get_num_values(ctl);
138
139 ALOGV("%s:", mixer_ctl_get_name(ctl));
140
141 for (i = 0; i < num_values; i++) {
142 switch (type) {
143 case MIXER_CTL_TYPE_INT:
144 ALOGV(" %d", mixer_ctl_get_value(ctl, i));
145 break;
146 case MIXER_CTL_TYPE_BOOL:
147 ALOGV(" %s", mixer_ctl_get_value(ctl, i) ? "On" : "Off");
148 break;
149 case MIXER_CTL_TYPE_ENUM:
150 usb_mixer_print_enum(ctl);
151 break;
152 case MIXER_CTL_TYPE_BYTE:
153 ALOGV(" 0x%02x", mixer_ctl_get_value(ctl, i));
154 break;
155 default:
156 ALOGV(" unknown");
157 break;
158 }
159 }
160
161 if (type == MIXER_CTL_TYPE_INT) {
162 min = mixer_ctl_get_range_min(ctl);
163 max = mixer_ctl_get_range_max(ctl);
164 ALOGV(" (range %d->%d)", min, max);
165 }
166}
167
168static void usb_soundcard_list_controls(struct mixer *mixer)
169{
170 struct mixer_ctl *ctl;
171 const char *name, *type;
172 unsigned int num_ctls, num_values;
173 unsigned int i;
174
175 num_ctls = mixer_get_num_ctls(mixer);
176
177 ALOGV("Number of controls: %d\n", num_ctls);
178
179 ALOGV("ctl\ttype\tnum\t%-40s value\n", "name");
180 for (i = 0; i < num_ctls; i++) {
181 ctl = mixer_get_ctl(mixer, i);
182 if (ctl != NULL) {
183 name = mixer_ctl_get_name(ctl);
184 type = mixer_ctl_get_type_string(ctl);
185 num_values = mixer_ctl_get_num_values(ctl);
186 ALOGV("%d\t%s\t%d\t%-40s", i, type, num_values, name);
187 if (name != NULL)
188 usb_soundcard_detail_control(mixer, name);
189 }
190 }
191}
192
193static int usb_set_dev_id_mixer_ctl(unsigned int usb_usecase_type, int card,
194 char *dev_mixer_ctl_name)
195{
196 struct mixer_ctl *ctl;
197 unsigned int dev_token;
198 const unsigned int pcm_device_number = 0;
199
200 /*
201 * usb_dev_token_id is 32 bit number and is defined as below:
202 * usb_sound_card_idx(31:16) | usb PCM device ID(15:8) | usb_usecase_type(7:0)
203 */
204 dev_token = (card << 16 ) |
205 (pcm_device_number << 8) | (usb_usecase_type & 0xFF);
206
207 ctl = mixer_get_ctl_by_name(usbmod->adev->mixer, dev_mixer_ctl_name);
208 if (!ctl) {
209 ALOGE("%s: Could not get ctl for mixer cmd - %s",
210 __func__, dev_mixer_ctl_name);
211 return -EINVAL;
212 }
213 mixer_ctl_set_value(ctl, 0, dev_token);
214
215 return 0;
216}
217
Haynes Mathew Georgee5ff0fc2017-02-16 20:33:38 -0800218static int usb_get_sample_rates(int type, char *rates_str,
David Linee3fe402017-03-13 10:00:42 -0700219 struct usb_device_config *config)
220{
221 uint32_t i;
222 char *next_sr_string, *temp_ptr;
223 uint32_t sr, min_sr, max_sr, sr_size = 0;
224
225 /* Sample rate string can be in any of the folloing two bit_widthes:
226 * Rates: 8000 - 48000 (continuous)
227 * Rates: 8000, 44100, 48000
228 * Support both the bit_widths
229 */
230 ALOGV("%s: rates_str %s", __func__, rates_str);
231 next_sr_string = strtok_r(rates_str, "Rates: ", &temp_ptr);
232 if (next_sr_string == NULL) {
233 ALOGE("%s: could not find min rates string", __func__);
234 return -EINVAL;
235 }
236 if (strstr(rates_str, "continuous") != NULL) {
237 min_sr = (uint32_t)atoi(next_sr_string);
238 next_sr_string = strtok_r(NULL, " ,.-", &temp_ptr);
239 if (next_sr_string == NULL) {
240 ALOGE("%s: could not find max rates string", __func__);
241 return -EINVAL;
242 }
243 max_sr = (uint32_t)atoi(next_sr_string);
244
245 for (i = 0; i < MAX_SAMPLE_RATE_SIZE; i++) {
246 if (supported_sample_rates[i] >= min_sr &&
247 supported_sample_rates[i] <= max_sr) {
248 config->rates[sr_size++] = supported_sample_rates[i];
Haynes Mathew Georgee5ff0fc2017-02-16 20:33:38 -0800249 supported_sample_rates_mask[type] |= (1<<i);
David Linee3fe402017-03-13 10:00:42 -0700250 ALOGI_IF(usb_audio_debug_enable,
251 "%s: continuous sample rate supported_sample_rates[%d] %d",
252 __func__, i, supported_sample_rates[i]);
253 }
254 }
255 } else {
256 do {
257 sr = (uint32_t)atoi(next_sr_string);
258 for (i = 0; i < MAX_SAMPLE_RATE_SIZE; i++) {
259 if (supported_sample_rates[i] == sr) {
260 ALOGI_IF(usb_audio_debug_enable,
261 "%s: sr %d, supported_sample_rates[%d] %d -> matches!!",
262 __func__, sr, i, supported_sample_rates[i]);
263 config->rates[sr_size++] = supported_sample_rates[i];
Haynes Mathew Georgee5ff0fc2017-02-16 20:33:38 -0800264 supported_sample_rates_mask[type] |= (1<<i);
David Linee3fe402017-03-13 10:00:42 -0700265 }
266 }
267 next_sr_string = strtok_r(NULL, " ,.-", &temp_ptr);
268 } while (next_sr_string != NULL);
269 }
270 config->rate_size = sr_size;
271 return 0;
272}
273
274static int usb_get_capability(int type,
275 struct usb_card_config *usb_card_info,
276 int card)
277{
278 int32_t size = 0;
279 int32_t fd=-1;
280 int32_t channels_no;
281 char *str_start = NULL;
282 char *str_end = NULL;
283 char *channel_start = NULL;
284 char *bit_width_start = NULL;
285 char *rates_str_start = NULL;
286 char *target = NULL;
287 char *read_buf = NULL;
288 char *rates_str = NULL;
289 char path[128];
290 int ret = 0;
291 char *bit_width_str = NULL;
292 struct usb_device_config * usb_device_info;
293 bool check = false;
Haynes Mathew George569b7482017-05-08 14:44:27 -0700294 int tries=5;
David Linee3fe402017-03-13 10:00:42 -0700295
296 memset(path, 0, sizeof(path));
297 ALOGV("%s: for %s", __func__, (type == USB_PLAYBACK) ?
298 PLAYBACK_PROFILE_STR : CAPTURE_PROFILE_STR);
299
300 /* TODO: convert the below to using alsa_utils */
301 ret = snprintf(path, sizeof(path), "/proc/asound/card%u/stream0",
302 card);
Haynes Mathew George569b7482017-05-08 14:44:27 -0700303 if (ret < 0) {
David Linee3fe402017-03-13 10:00:42 -0700304 ALOGE("%s: failed on snprintf (%d) to path %s\n",
305 __func__, ret, path);
306 goto done;
307 }
308
Kevin Rocardf9f241e2017-08-07 19:21:36 -0700309 // TODO: figure up if this wait is needed any more
Haynes Mathew George569b7482017-05-08 14:44:27 -0700310 while (tries--) {
311 if (access(path, F_OK) < 0) {
312 ALOGW("stream %s doesn't exist retrying\n", path);
313 sleep(1);
314 continue;
315 }
316 }
317
David Linee3fe402017-03-13 10:00:42 -0700318 fd = open(path, O_RDONLY);
319 if (fd <0) {
320 ALOGE("%s: error failed to open config file %s error: %d\n",
321 __func__, path, errno);
322 ret = -EINVAL;
323 goto done;
324 }
325
326 read_buf = (char *)calloc(1, USB_BUFF_SIZE + 1);
327
328 if (!read_buf) {
329 ALOGE("Failed to create read_buf");
330 ret = -ENOMEM;
331 goto done;
332 }
333
334 if(read(fd, read_buf, USB_BUFF_SIZE) < 0) {
335 ALOGE("file read error\n");
336 goto done;
337 }
338 str_start = strstr(read_buf, ((type == USB_PLAYBACK) ?
339 PLAYBACK_PROFILE_STR : CAPTURE_PROFILE_STR));
340 if (str_start == NULL) {
341 ALOGE("%s: error %s section not found in usb config file",
342 __func__, ((type == USB_PLAYBACK) ?
343 PLAYBACK_PROFILE_STR : CAPTURE_PROFILE_STR));
344 ret = -EINVAL;
345 goto done;
346 }
347 str_end = strstr(read_buf, ((type == USB_PLAYBACK) ?
348 CAPTURE_PROFILE_STR : PLAYBACK_PROFILE_STR));
349 if (str_end > str_start)
350 check = true;
351
352 ALOGV("%s: usb_config = %s, check %d\n", __func__, str_start, check);
353
354 while (str_start != NULL) {
355 str_start = strstr(str_start, "Altset");
356 if ((str_start == NULL) || (check && (str_start >= str_end))) {
357 ALOGV("%s: done parsing %s\n", __func__, str_start);
358 break;
359 }
360 ALOGV("%s: remaining string %s\n", __func__, str_start);
361 str_start += sizeof("Altset");
362 usb_device_info = calloc(1, sizeof(struct usb_device_config));
363 if (usb_device_info == NULL) {
364 ALOGE("%s: error unable to allocate memory",
365 __func__);
366 ret = -ENOMEM;
367 break;
368 }
369 /* Bit bit_width parsing */
370 bit_width_start = strstr(str_start, "Format: ");
371 if (bit_width_start == NULL) {
372 ALOGI("%s: Could not find bit_width string", __func__);
373 free(usb_device_info);
374 continue;
375 }
376 target = strchr(bit_width_start, '\n');
377 if (target == NULL) {
378 ALOGI("%s:end of line not found", __func__);
379 free(usb_device_info);
380 continue;
381 }
382 size = target - bit_width_start;
383 if ((bit_width_str = (char *)malloc(size + 1)) == NULL) {
384 ALOGE("%s: unable to allocate memory to hold bit width strings",
385 __func__);
386 ret = -EINVAL;
387 free(usb_device_info);
388 break;
389 }
390 memcpy(bit_width_str, bit_width_start, size);
391 bit_width_str[size] = '\0';
392 if (strstr(bit_width_str, "S16_LE"))
393 usb_device_info->bit_width = 16;
394 else if (strstr(bit_width_str, "S24_LE"))
395 usb_device_info->bit_width = 24;
396 else if (strstr(bit_width_str, "S24_3LE"))
397 usb_device_info->bit_width = 24;
398 else if (strstr(bit_width_str, "S32_LE"))
399 usb_device_info->bit_width = 32;
400
401 if (bit_width_str)
402 free(bit_width_str);
403
404 /* channels parsing */
405 channel_start = strstr(str_start, CHANNEL_NUMBER_STR);
406 if (channel_start == NULL) {
407 ALOGI("%s: could not find Channels string", __func__);
408 free(usb_device_info);
409 continue;
410 }
411 channels_no = atoi(channel_start + strlen(CHANNEL_NUMBER_STR));
412 usb_device_info->channel_count = channels_no;
413
414 /* Sample rates parsing */
415 rates_str_start = strstr(str_start, "Rates: ");
416 if (rates_str_start == NULL) {
417 ALOGI("%s: cant find rates string", __func__);
418 free(usb_device_info);
419 continue;
420 }
421 target = strchr(rates_str_start, '\n');
422 if (target == NULL) {
423 ALOGI("%s: end of line not found", __func__);
424 free(usb_device_info);
425 continue;
426 }
427 size = target - rates_str_start;
428 if ((rates_str = (char *)malloc(size + 1)) == NULL) {
429 ALOGE("%s: unable to allocate memory to hold sample rate strings",
430 __func__);
431 ret = -EINVAL;
432 free(usb_device_info);
433 break;
434 }
435 memcpy(rates_str, rates_str_start, size);
436 rates_str[size] = '\0';
Haynes Mathew Georgee5ff0fc2017-02-16 20:33:38 -0800437 ret = usb_get_sample_rates(type, rates_str, usb_device_info);
David Linee3fe402017-03-13 10:00:42 -0700438 if (rates_str)
439 free(rates_str);
440 if (ret < 0) {
441 ALOGE("%s: error unable to get sample rate values",
442 __func__);
443 free(usb_device_info);
444 continue;
445 }
446 /* Add to list if every field is valid */
447 list_add_tail(&usb_card_info->usb_device_conf_list,
448 &usb_device_info->list);
449 }
450
451done:
452 if (fd >= 0) close(fd);
453 if (read_buf) free(read_buf);
454 return ret;
455}
456
457static int usb_get_device_playback_config(struct usb_card_config *usb_card_info,
458 int card)
459{
460 int ret;
461
462 /* get capabilities */
463 if ((ret = usb_get_capability(USB_PLAYBACK, usb_card_info, card))) {
464 ALOGE("%s: could not get Playback capabilities from usb device",
465 __func__);
466 goto exit;
467 }
468 usb_set_dev_id_mixer_ctl(USB_PLAYBACK, card, "USB_AUDIO_RX dev_token");
469
470exit:
471
472 return ret;
473}
474
475static int usb_get_device_capture_config(struct usb_card_config *usb_card_info,
476 int card)
477{
478 int ret;
479
480 /* get capabilities */
481 if ((ret = usb_get_capability(USB_CAPTURE, usb_card_info, card))) {
482 ALOGE("%s: could not get Playback capabilities from usb device",
483 __func__);
484 goto exit;
485 }
486 usb_set_dev_id_mixer_ctl(USB_CAPTURE, card, "USB_AUDIO_TX dev_token");
487
488exit:
489 return ret;
490}
491
492static void usb_get_sidetone_mixer(struct usb_card_config *usb_card_info)
493{
494 struct mixer_ctl *ctl;
495 unsigned int index;
496
497 for (index = 0; index < USB_SIDETONE_MAX_INDEX; index++)
498 usb_card_info->usb_sidetone_index[index] = -1;
499
500 usb_card_info->usb_snd_mixer = mixer_open(usb_card_info->usb_card);
501 for (index = 0;
502 index < sizeof(usb_sidetone_enable_str)/sizeof(usb_sidetone_enable_str[0]);
503 index++) {
504 ctl = mixer_get_ctl_by_name(usb_card_info->usb_snd_mixer,
505 usb_sidetone_enable_str[index]);
506 if (ctl) {
507 usb_card_info->usb_sidetone_index[USB_SIDETONE_ENABLE_INDEX] = index;
508 /* Disable device sidetone by default */
509 mixer_ctl_set_value(ctl, 0, false);
vivek mehta90933872017-06-15 18:04:39 -0700510 ALOGV("%s:: sidetone mixer Control found(%s) ... disabling by default",
511 __func__, usb_sidetone_enable_str[index]);
David Linee3fe402017-03-13 10:00:42 -0700512 break;
513 }
514 }
vivek mehta90933872017-06-15 18:04:39 -0700515#ifdef USB_SIDETONE_VOLUME
David Linee3fe402017-03-13 10:00:42 -0700516 for (index = 0;
517 index < sizeof(usb_sidetone_volume_str)/sizeof(usb_sidetone_volume_str[0]);
518 index++) {
519 ctl = mixer_get_ctl_by_name(usb_card_info->usb_snd_mixer,
520 usb_sidetone_volume_str[index]);
521 if (ctl) {
522 usb_card_info->usb_sidetone_index[USB_SIDETONE_VOLUME_INDEX] = index;
523 usb_card_info->usb_sidetone_vol_min = mixer_ctl_get_range_min(ctl);
524 usb_card_info->usb_sidetone_vol_max = mixer_ctl_get_range_max(ctl);
525 break;
526 }
527 }
vivek mehta90933872017-06-15 18:04:39 -0700528#endif // USB_SIDETONE_VOLUME
David Linee3fe402017-03-13 10:00:42 -0700529 if ((usb_card_info->usb_snd_mixer != NULL) && (usb_audio_debug_enable))
530 usb_soundcard_list_controls(usb_card_info->usb_snd_mixer);
531
532 return;
533}
534
Haynes Mathew George569b7482017-05-08 14:44:27 -0700535static inline bool usb_output_device(audio_devices_t device) {
536 // ignore accessory for now
537 if (device == AUDIO_DEVICE_OUT_USB_ACCESSORY) {
538 return false;
539 }
540 return audio_is_usb_out_device(device);
541}
542
543static inline bool usb_input_device(audio_devices_t device) {
544 // ignore accessory for now
545 if (device == AUDIO_DEVICE_IN_USB_ACCESSORY) {
546 return false;
547 }
548 return audio_is_usb_in_device(device);
549}
550
David Linee3fe402017-03-13 10:00:42 -0700551static bool usb_valid_device(audio_devices_t device)
552{
Haynes Mathew George569b7482017-05-08 14:44:27 -0700553 return usb_output_device(device) ||
554 usb_input_device(device);
David Linee3fe402017-03-13 10:00:42 -0700555}
556
557static void usb_print_active_device(void){
558 struct listnode *node_i, *node_j;
559 struct usb_device_config *dev_info;
560 struct usb_card_config *card_info;
561 unsigned int i;
562
563 ALOGI("%s", __func__);
564 list_for_each(node_i, &usbmod->usb_card_conf_list) {
565 card_info = node_to_item(node_i, struct usb_card_config, list);
566 ALOGI("%s: card_dev_type (0x%x), card_no(%d)",
567 __func__, card_info->usb_device_type, card_info->usb_card);
568 list_for_each(node_j, &card_info->usb_device_conf_list) {
569 dev_info = node_to_item(node_j, struct usb_device_config, list);
570 ALOGI("%s: bit-width(%d) channel(%d)",
571 __func__, dev_info->bit_width, dev_info->channel_count);
572 for (i = 0; i < dev_info->rate_size; i++)
573 ALOGI("%s: rate %d", __func__, dev_info->rates[i]);
574 }
575 }
576}
577
Haynes Mathew Georgedf0f8862017-06-28 13:36:40 -0700578static bool usb_get_best_bit_width(
David Linee3fe402017-03-13 10:00:42 -0700579 struct listnode *dev_list,
580 unsigned int stream_bit_width,
581 unsigned int *bit_width)
582{
583 struct listnode *node_i;
584 struct usb_device_config *dev_info;
585 unsigned int candidate = 0;
586
587 list_for_each(node_i, dev_list) {
588 dev_info = node_to_item(node_i, struct usb_device_config, list);
589 ALOGI_IF(usb_audio_debug_enable,
590 "%s: USB bw(%d), stream bw(%d), candidate(%d)",
591 __func__, dev_info->bit_width,
592 stream_bit_width, candidate);
Haynes Mathew Georgedf0f8862017-06-28 13:36:40 -0700593 if (candidate == 0) {
594 ALOGV("%s: candidate bit-width (%d)",
David Linee3fe402017-03-13 10:00:42 -0700595 __func__, dev_info->bit_width);
David Linee3fe402017-03-13 10:00:42 -0700596 candidate = dev_info->bit_width;
Haynes Mathew Georgedf0f8862017-06-28 13:36:40 -0700597 } else if (dev_info->bit_width > candidate) {
David Linee3fe402017-03-13 10:00:42 -0700598 candidate = dev_info->bit_width;
Haynes Mathew Georgedf0f8862017-06-28 13:36:40 -0700599 ALOGV("%s: Found better candidate bit-width (%d)",
600 __func__, dev_info->bit_width);
David Linee3fe402017-03-13 10:00:42 -0700601 }
602 }
Haynes Mathew Georgedf0f8862017-06-28 13:36:40 -0700603 ALOGV("%s: Use the best candidate bw(%d)",
David Linee3fe402017-03-13 10:00:42 -0700604 __func__, candidate);
605 *bit_width = candidate;
606exit:
607 return true;
608}
609
610static bool usb_get_best_match_for_channels(
611 struct listnode *dev_list,
612 unsigned int bit_width,
613 unsigned int stream_ch,
614 unsigned int *channel_count)
615{
616 struct listnode *node_i;
617 struct usb_device_config *dev_info;
618 unsigned int candidate = 0;
619
620 list_for_each(node_i, dev_list) {
621 dev_info = node_to_item(node_i, struct usb_device_config, list);
622 ALOGI_IF(usb_audio_debug_enable,
623 "%s: USB ch(%d)bw(%d), stream ch(%d)bw(%d), candidate(%d)",
624 __func__, dev_info->channel_count, dev_info->bit_width,
625 stream_ch, bit_width, candidate);
626 if (dev_info->bit_width != bit_width)
627 continue;
628 if (dev_info->channel_count== stream_ch) {
629 *channel_count = dev_info->channel_count;
630 ALOGV("%s: Found match channels (%d)",
631 __func__, dev_info->channel_count);
632 goto exit;
633 } else if (candidate == 0)
634 candidate = dev_info->channel_count;
635 /*
636 * If stream channel is 4, USB supports both 3 and 5, then
637 * higher channel 5 is picked up instead of 3
638 */
639 else if (ABS_SUB(stream_ch, dev_info->channel_count) <
640 ABS_SUB(stream_ch, candidate)) {
641 candidate = dev_info->channel_count;
642 } else if ((ABS_SUB(stream_ch, dev_info->channel_count) ==
643 ABS_SUB(stream_ch, candidate)) &&
644 (dev_info->channel_count > candidate)) {
645 candidate = dev_info->channel_count;
646 }
647 }
648 ALOGV("%s: No match found, use the best candidate ch(%d)",
649 __func__, candidate);
650 *channel_count = candidate;
651exit:
652 return true;
653
654}
655
656static bool usb_sample_rate_multiple(
657 unsigned int stream_sample_rate,
658 unsigned int base)
659{
660 return (((stream_sample_rate / base) * base) == stream_sample_rate);
661}
662
663static bool usb_find_sample_rate_candidate(unsigned int base,
664 unsigned stream_rate,
665 unsigned int usb_rate,
666 unsigned int cur_candidate,
667 unsigned int *update_candidate)
668{
669 /* For sample rate, we should consider fracational sample rate as high priority.
670 * For example, if the stream is 88.2kHz and USB device support both 44.1kH and
671 * 48kHz sample rate, we should pick 44.1kHz instead of 48kHz
672 */
673 if (!usb_sample_rate_multiple(cur_candidate, base) &&
674 usb_sample_rate_multiple(usb_rate, base)) {
675 *update_candidate = usb_rate;
676 } else if (usb_sample_rate_multiple(cur_candidate, base) &&
677 usb_sample_rate_multiple(usb_rate, base)) {
678 if (ABS_SUB(stream_rate, usb_rate) <
679 ABS_SUB(stream_rate, cur_candidate)) {
680 *update_candidate = usb_rate;
681 } else if ((ABS_SUB(stream_rate, usb_rate) ==
682 ABS_SUB(stream_rate, cur_candidate)) &&
683 (usb_rate > cur_candidate)) {
684 *update_candidate = usb_rate;
685 }
686 } else if (!usb_sample_rate_multiple(cur_candidate, base) &&
687 !usb_sample_rate_multiple(usb_rate, base)) {
688 if (ABS_SUB(stream_rate, usb_rate) <
689 ABS_SUB(stream_rate, cur_candidate)) {
690 *update_candidate = usb_rate;
691 } else if ((ABS_SUB(stream_rate, usb_rate) ==
692 ABS_SUB(stream_rate, cur_candidate)) &&
693 (usb_rate > cur_candidate)) {
694 *update_candidate = usb_rate;
695 }
696 }
697 return true;
698}
699
700static bool usb_get_best_match_for_sample_rate(
701 struct listnode *dev_list,
702 unsigned int bit_width,
703 unsigned int channel_count,
704 unsigned int stream_sample_rate,
705 unsigned int *sr)
706{
707 struct listnode *node_i;
708 struct usb_device_config *dev_info;
709 unsigned int candidate = 48000;
710 unsigned int base = SAMPLE_RATE_8000;
711 bool multiple_8k = usb_sample_rate_multiple(stream_sample_rate, base);
712 unsigned int i;
713
714 ALOGV("%s: stm ch(%d)bw(%d)sr(%d), stream sample multiple of 8kHz(%d)",
715 __func__, channel_count, bit_width, stream_sample_rate, multiple_8k);
716
717 list_for_each(node_i, dev_list) {
718 dev_info = node_to_item(node_i, struct usb_device_config, list);
719 ALOGI_IF(usb_audio_debug_enable,
720 "%s: USB ch(%d)bw(%d), stm ch(%d)bw(%d)sr(%d), candidate(%d)",
721 __func__, dev_info->channel_count, dev_info->bit_width,
722 channel_count, bit_width, stream_sample_rate, candidate);
723 if ((dev_info->bit_width != bit_width) || dev_info->channel_count != channel_count)
724 continue;
725
726 candidate = 0;
727 for (i = 0; i < dev_info->rate_size; i++) {
728 ALOGI_IF(usb_audio_debug_enable,
729 "%s: USB ch(%d)bw(%d)sr(%d), stm ch(%d)bw(%d)sr(%d), candidate(%d)",
730 __func__, dev_info->channel_count,
731 dev_info->bit_width, dev_info->rates[i],
732 channel_count, bit_width, stream_sample_rate, candidate);
733 if (stream_sample_rate == dev_info->rates[i]) {
734 *sr = dev_info->rates[i];
735 ALOGV("%s: Found match sample rate (%d)",
736 __func__, dev_info->rates[i]);
737 goto exit;
738 } else if (candidate == 0) {
739 candidate = dev_info->rates[i];
740 /*
741 * For sample rate, we should consider fracational sample rate as high priority.
742 * For example, if the stream is 88.2kHz and USB device support both 44.1kH and
743 * 48kHz sample rate, we should pick 44.1kHz instead of 48kHz
744 */
745 } else if (multiple_8k) {
746 usb_find_sample_rate_candidate(SAMPLE_RATE_8000,
747 stream_sample_rate,
748 dev_info->rates[i],
749 candidate,
750 &candidate);
751 } else {
752 usb_find_sample_rate_candidate(SAMPLE_RATE_11025,
753 stream_sample_rate,
754 dev_info->rates[i],
755 candidate,
756 &candidate);
757 }
758 }
759 }
760 ALOGV("%s: No match found, use the best candidate sr(%d)",
761 __func__, candidate);
762 *sr = candidate;
763exit:
764 return true;
765}
766
767static bool usb_audio_backend_apply_policy(struct listnode *dev_list,
768 unsigned int *bit_width,
769 unsigned int *sample_rate,
770 unsigned int *channel_count)
771{
772 ALOGV("%s: from stream: bit-width(%d) sample_rate(%d) channels (%d)",
773 __func__, *bit_width, *sample_rate, *channel_count);
774 if (list_empty(dev_list)) {
775 *sample_rate = 48000;
776 *bit_width = 16;
777 *channel_count = 2;
778 ALOGE("%s: list is empty,fall back to default setting", __func__);
779 goto exit;
780 }
Haynes Mathew Georgedf0f8862017-06-28 13:36:40 -0700781 usb_get_best_bit_width(dev_list, *bit_width, bit_width);
David Linee3fe402017-03-13 10:00:42 -0700782 usb_get_best_match_for_channels(dev_list,
783 *bit_width,
784 *channel_count,
785 channel_count);
786 usb_get_best_match_for_sample_rate(dev_list,
787 *bit_width,
788 *channel_count,
789 *sample_rate,
790 sample_rate);
791exit:
792 ALOGV("%s: Updated sample rate per profile: bit-width(%d) rate(%d) chs(%d)",
793 __func__, *bit_width, *sample_rate, *channel_count);
794 return true;
795}
796
797static int usb_get_sidetone_gain(struct usb_card_config *card_info)
798{
799 int gain = card_info->usb_sidetone_vol_min + usbmod->sidetone_gain;
800 if (gain > card_info->usb_sidetone_vol_max)
801 gain = card_info->usb_sidetone_vol_max;
802 return gain;
803}
804
805void audio_extn_usb_set_sidetone_gain(struct str_parms *parms,
806 char *value, int len)
807{
808 int err;
809
810 err = str_parms_get_str(parms, USB_SIDETONE_GAIN_STR,
811 value, len);
812 if (err >= 0) {
813 usb_sidetone_gain = pow(10.0, (float)(atoi(value))/10.0);
814 ALOGV("%s: sidetone gain(%s) decimal %d",
815 __func__, value, usb_sidetone_gain);
816 str_parms_del(parms, USB_SIDETONE_GAIN_STR);
817 }
818 return;
819}
820
821int audio_extn_usb_enable_sidetone(int device, bool enable)
822{
823 int ret = -ENODEV;
824 struct listnode *node_i;
825 struct usb_card_config *card_info;
826 int i;
827 ALOGV("%s: card_dev_type (0x%x), sidetone enable(%d)",
828 __func__, device, enable);
829
830 list_for_each(node_i, &usbmod->usb_card_conf_list) {
831 card_info = node_to_item(node_i, struct usb_card_config, list);
832 ALOGV("%s: card_dev_type (0x%x), card_no(%d)",
833 __func__, card_info->usb_device_type, card_info->usb_card);
Haynes Mathew George569b7482017-05-08 14:44:27 -0700834 if (usb_output_device(card_info->usb_device_type)) {
David Linee3fe402017-03-13 10:00:42 -0700835 if ((i = card_info->usb_sidetone_index[USB_SIDETONE_ENABLE_INDEX]) != -1) {
836 struct mixer_ctl *ctl = mixer_get_ctl_by_name(
837 card_info->usb_snd_mixer,
838 usb_sidetone_enable_str[i]);
839 if (ctl)
840 mixer_ctl_set_value(ctl, 0, enable);
841 else
842 break;
843
vivek mehta90933872017-06-15 18:04:39 -0700844#ifdef USB_SIDETONE_VOLUME
David Linee3fe402017-03-13 10:00:42 -0700845 if ((i = card_info->usb_sidetone_index[USB_SIDETONE_VOLUME_INDEX]) != -1) {
846 ctl = mixer_get_ctl_by_name(
847 card_info->usb_snd_mixer,
848 usb_sidetone_volume_str[i]);
849 if (ctl == NULL)
850 ALOGV("%s: sidetone gain mixer command is not found",
851 __func__);
852 else if (enable)
853 mixer_ctl_set_value(ctl, 0,
854 usb_get_sidetone_gain(card_info));
855 }
vivek mehta90933872017-06-15 18:04:39 -0700856#endif // USB_SIDETONE_VOLUME
David Linee3fe402017-03-13 10:00:42 -0700857 ret = 0;
858 break;
859 }
860 }
861 }
862 return ret;
863}
864
865bool audio_extn_usb_is_config_supported(unsigned int *bit_width,
866 unsigned int *sample_rate,
867 unsigned int *channel_count,
868 bool is_playback)
869{
870 struct listnode *node_i;
871 struct usb_card_config *card_info;
872
873 ALOGV("%s: from stream: bit-width(%d) sample_rate(%d) ch(%d) is_playback(%d)",
874 __func__, *bit_width, *sample_rate, *channel_count, is_playback);
875 list_for_each(node_i, &usbmod->usb_card_conf_list) {
876 card_info = node_to_item(node_i, struct usb_card_config, list);
877 ALOGI_IF(usb_audio_debug_enable,
878 "%s: card_dev_type (0x%x), card_no(%d)",
879 __func__, card_info->usb_device_type, card_info->usb_card);
880 /* Currently only apply the first playback sound card configuration */
Haynes Mathew George569b7482017-05-08 14:44:27 -0700881 if ((is_playback && usb_output_device(card_info->usb_device_type)) ||
882 (!is_playback && usb_input_device(card_info->usb_device_type))) {
David Linee3fe402017-03-13 10:00:42 -0700883 usb_audio_backend_apply_policy(&card_info->usb_device_conf_list,
884 bit_width,
885 sample_rate,
886 channel_count);
887 break;
888 }
889 }
890 ALOGV("%s: updated: bit-width(%d) sample_rate(%d) channels (%d)",
891 __func__, *bit_width, *sample_rate, *channel_count);
892
893 return true;
894}
895
Haynes Mathew Georgee5ff0fc2017-02-16 20:33:38 -0800896#define _MAX(x, y) (((x) >= (y)) ? (x) : (y))
897#define _MIN(x, y) (((x) <= (y)) ? (x) : (y))
898
Haynes Mathew George569b7482017-05-08 14:44:27 -0700899int audio_extn_usb_get_max_channels(bool is_playback)
Haynes Mathew Georgee5ff0fc2017-02-16 20:33:38 -0800900{
901 struct listnode *node_i, *node_j;
902 struct usb_device_config *dev_info;
903 struct usb_card_config *card_info;
904 unsigned int max_ch = 1;
905 list_for_each(node_i, &usbmod->usb_card_conf_list) {
906 card_info = node_to_item(node_i, struct usb_card_config, list);
Haynes Mathew George569b7482017-05-08 14:44:27 -0700907 if (usb_output_device(card_info->usb_device_type) && !is_playback)
908 continue;
909 else if (usb_input_device(card_info->usb_device_type) && is_playback)
910 continue;
911
Haynes Mathew Georgee5ff0fc2017-02-16 20:33:38 -0800912 list_for_each(node_j, &card_info->usb_device_conf_list) {
913 dev_info = node_to_item(node_j, struct usb_device_config, list);
914 max_ch = _MAX(max_ch, dev_info->channel_count);
915 }
916 }
917
918 return max_ch;
919}
920
Haynes Mathew George569b7482017-05-08 14:44:27 -0700921int audio_extn_usb_get_max_bit_width(bool is_playback)
Haynes Mathew Georgee5ff0fc2017-02-16 20:33:38 -0800922{
923 struct listnode *node_i, *node_j;
924 struct usb_device_config *dev_info;
925 struct usb_card_config *card_info;
926 unsigned int max_bw = 16;
927 list_for_each(node_i, &usbmod->usb_card_conf_list) {
928 card_info = node_to_item(node_i, struct usb_card_config, list);
Haynes Mathew George569b7482017-05-08 14:44:27 -0700929 if (usb_output_device(card_info->usb_device_type) && !is_playback)
930 continue;
931 else if (usb_input_device(card_info->usb_device_type) && is_playback)
932 continue;
933
Haynes Mathew Georgee5ff0fc2017-02-16 20:33:38 -0800934 list_for_each(node_j, &card_info->usb_device_conf_list) {
935 dev_info = node_to_item(node_j, struct usb_device_config, list);
936 max_bw = _MAX(max_bw, dev_info->bit_width);
937 }
938 }
939
940 return max_bw;
941}
942
Haynes Mathew George569b7482017-05-08 14:44:27 -0700943int audio_extn_usb_sup_sample_rates(bool is_playback,
Haynes Mathew Georgee5ff0fc2017-02-16 20:33:38 -0800944 uint32_t *sample_rates,
945 uint32_t sample_rate_size)
946{
947 struct listnode *node_i, *node_j;
948 struct usb_device_config *dev_info;
949 struct usb_card_config *card_info;
950
Haynes Mathew George569b7482017-05-08 14:44:27 -0700951 int type = is_playback ? USB_PLAYBACK : USB_CAPTURE;
Haynes Mathew Georgee5ff0fc2017-02-16 20:33:38 -0800952
953 ALOGV("%s supported_sample_rates_mask 0x%x", __func__, supported_sample_rates_mask[type]);
954 uint32_t bm = supported_sample_rates_mask[type];
955 uint32_t tries = _MIN(sample_rate_size, (uint32_t)__builtin_popcount(bm));
956
957 int i = 0;
958 while (tries--) {
959 int idx = __builtin_ffs(bm) - 1;
960 sample_rates[i++] = supported_sample_rates[idx];
961 bm &= ~(1<<idx);
962 }
963
964 return i;
965}
966
David Linee3fe402017-03-13 10:00:42 -0700967bool audio_extn_usb_is_capture_supported()
968{
969 if (usbmod == NULL) {
970 ALOGE("%s: USB device object is NULL", __func__);
971 return false;
972 }
973 ALOGV("%s: capture_supported %d",__func__,usbmod->is_capture_supported);
974 return usbmod->is_capture_supported;
975}
976
977void audio_extn_usb_add_device(audio_devices_t device, int card)
978{
979 struct usb_card_config *usb_card_info;
980 char check_debug_enable[PROPERTY_VALUE_MAX];
981 struct listnode *node_i;
982
983 property_get("audio.usb.enable.debug", check_debug_enable, NULL);
984 if (atoi(check_debug_enable)) {
985 usb_audio_debug_enable = true;
986 }
987
988 ALOGI_IF(usb_audio_debug_enable,
989 "%s: parameters device(0x%x), card(%d)",
990 __func__, device, card);
991 if (usbmod == NULL) {
992 ALOGE("%s: USB device object is NULL", __func__);
993 goto exit;
994 }
995
996 if (!(usb_valid_device(device)) || (card < 0)) {
997 ALOGE("%s:device(0x%x), card(%d)",
998 __func__, device, card);
999 goto exit;
1000 }
1001
1002 list_for_each(node_i, &usbmod->usb_card_conf_list) {
1003 usb_card_info = node_to_item(node_i, struct usb_card_config, list);
1004 ALOGI_IF(usb_audio_debug_enable,
1005 "%s: list has capability for card_dev_type (0x%x), card_no(%d)",
1006 __func__, usb_card_info->usb_device_type, usb_card_info->usb_card);
1007 /* If we have cached the capability */
1008 if ((usb_card_info->usb_device_type == device) && (usb_card_info->usb_card == card)) {
1009 ALOGV("%s: capability for device(0x%x), card(%d) is cached, no need to update",
1010 __func__, device, card);
1011 goto exit;
1012 }
1013 }
1014 usb_card_info = calloc(1, sizeof(struct usb_card_config));
1015 if (usb_card_info == NULL) {
1016 ALOGE("%s: error unable to allocate memory",
1017 __func__);
1018 goto exit;
1019 }
1020 list_init(&usb_card_info->usb_device_conf_list);
Haynes Mathew George569b7482017-05-08 14:44:27 -07001021 if (usb_output_device(device)) {
David Linee3fe402017-03-13 10:00:42 -07001022 if (!usb_get_device_playback_config(usb_card_info, card)){
1023 usb_card_info->usb_card = card;
Haynes Mathew George569b7482017-05-08 14:44:27 -07001024 usb_card_info->usb_device_type = device;
David Linee3fe402017-03-13 10:00:42 -07001025 usb_get_sidetone_mixer(usb_card_info);
1026 list_add_tail(&usbmod->usb_card_conf_list, &usb_card_info->list);
1027 goto exit;
1028 }
Haynes Mathew George569b7482017-05-08 14:44:27 -07001029 } else if (usb_input_device(device)) {
David Linee3fe402017-03-13 10:00:42 -07001030 if (!usb_get_device_capture_config(usb_card_info, card)) {
1031 usb_card_info->usb_card = card;
Haynes Mathew George569b7482017-05-08 14:44:27 -07001032 usb_card_info->usb_device_type = device;
David Linee3fe402017-03-13 10:00:42 -07001033 usbmod->is_capture_supported = true;
1034 list_add_tail(&usbmod->usb_card_conf_list, &usb_card_info->list);
1035 goto exit;
1036 }
Haynes Mathew George569b7482017-05-08 14:44:27 -07001037 } else {
1038 ALOGW("%s: unknown device 0x%x", __func__, device);
David Linee3fe402017-03-13 10:00:42 -07001039 }
1040 /* free memory in error case */
1041 if (usb_card_info != NULL)
1042 free(usb_card_info);
1043exit:
1044 if (usb_audio_debug_enable)
1045 usb_print_active_device();
1046 return;
1047}
1048
1049void audio_extn_usb_remove_device(audio_devices_t device, int card)
1050{
1051 struct listnode *node_i, *temp_i;
1052 struct listnode *node_j, *temp_j;
1053 struct usb_device_config *dev_info;
1054 struct usb_card_config *card_info;
1055 unsigned int i;
1056
1057 ALOGV("%s: device(0x%x), card(%d)",
1058 __func__, device, card);
1059
1060 if (usbmod == NULL) {
1061 ALOGE("%s: USB device object is NULL", __func__);
1062 goto exit;
1063 }
1064
1065 if (!(usb_valid_device(device)) || (card < 0)) {
1066 ALOGE("%s: Invalid parameters device(0x%x), card(%d)",
1067 __func__, device, card);
1068 goto exit;
1069 }
1070 list_for_each_safe(node_i, temp_i, &usbmod->usb_card_conf_list) {
1071 card_info = node_to_item(node_i, struct usb_card_config, list);
1072 ALOGV("%s: card_dev_type (0x%x), card_no(%d)",
1073 __func__, card_info->usb_device_type, card_info->usb_card);
1074 if ((device == card_info->usb_device_type) && (card == card_info->usb_card)){
1075 list_for_each_safe(node_j, temp_j, &card_info->usb_device_conf_list) {
1076 dev_info = node_to_item(node_j, struct usb_device_config, list);
1077 ALOGV("%s: bit-width(%d) channel(%d)",
1078 __func__, dev_info->bit_width, dev_info->channel_count);
1079 for (i = 0; i < dev_info->rate_size; i++)
1080 ALOGV("%s: rate %d", __func__, dev_info->rates[i]);
1081
1082 list_remove(node_j);
1083 free(node_to_item(node_j, struct usb_device_config, list));
1084 }
1085 list_remove(node_i);
Haynes Mathew George569b7482017-05-08 14:44:27 -07001086 if (card_info->usb_snd_mixer) {
1087 mixer_close(card_info->usb_snd_mixer);
1088 }
David Linee3fe402017-03-13 10:00:42 -07001089 free(node_to_item(node_i, struct usb_card_config, list));
1090 }
1091 }
Haynes Mathew George98d8c152017-07-13 19:14:14 -07001092 if (audio_is_usb_in_device(device)) { // XXX not sure if we need to check for card
1093 usbmod->is_capture_supported = false;
1094 supported_sample_rates_mask[USB_CAPTURE] = 0;
1095 } else {
1096 supported_sample_rates_mask[USB_PLAYBACK] = 0;
1097 }
1098
David Linee3fe402017-03-13 10:00:42 -07001099exit:
1100 if (usb_audio_debug_enable)
1101 usb_print_active_device();
1102
1103 return;
1104}
1105
Kevin Rocardf9f241e2017-08-07 19:21:36 -07001106bool audio_extn_usb_alive(int card) {
1107 char path[PATH_MAX] = {0};
1108 // snprintf should never fail
1109 (void) snprintf(path, sizeof(path), "/proc/asound/card%u/stream0", card);
1110 return access(path, F_OK) == 0;
1111}
1112
David Linee3fe402017-03-13 10:00:42 -07001113void audio_extn_usb_init(void *adev)
1114{
1115 if (usbmod == NULL) {
1116 usbmod = calloc(1, sizeof(struct usb_module));
1117 if (usbmod == NULL) {
1118 ALOGE("%s: error unable to allocate memory", __func__);
1119 goto exit;
1120 }
1121 } else {
1122 memset(usbmod, 0, sizeof(*usbmod));
1123 }
1124
1125 list_init(&usbmod->usb_card_conf_list);
1126 usbmod->adev = (struct audio_device*)adev;
1127 usbmod->sidetone_gain = usb_sidetone_gain;
1128 usbmod->is_capture_supported = false;
1129exit:
1130 return;
1131}
1132
1133void audio_extn_usb_deinit(void)
1134{
1135 if (NULL != usbmod){
1136 free(usbmod);
1137 usbmod = NULL;
1138 }
1139}
1140#endif /*USB_HEADSET_ENABLED end*/