Home | History | Annotate | Download | only in audio_extn
      1 /*
      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>
     22 #include <log/log.h>
     23 #include <cutils/str_parms.h>
     24 #include <sys/ioctl.h>
     25 #include <unistd.h>
     26 #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 DATA_PACKET_INTERVAL_STR "Data packet interval: "
     41 #define USB_SIDETONE_GAIN_STR   "usb_sidetone_gain"
     42 #define ABS_SUB(A, B) (((A) > (B)) ? ((A) - (B)):((B) - (A)))
     43 #define SAMPLE_RATE_8000          8000
     44 #define SAMPLE_RATE_11025         11025
     45 #define DEFAULT_SERVICE_INTERVAL_US    1000
     46 
     47 /* TODO: dynamically populate supported sample rates */
     48 static uint32_t supported_sample_rates[] =
     49     {192000, 176400, 96000, 88200, 64000, 48000, 44100};
     50 static uint32_t supported_sample_rates_mask[2];
     51 static const uint32_t MAX_SAMPLE_RATE_SIZE =
     52         (sizeof(supported_sample_rates)/sizeof(supported_sample_rates[0]));
     53 
     54 // assert on sizeof bm v/s size of rates if needed
     55 
     56 typedef enum usb_usecase_type{
     57     USB_PLAYBACK = 0,
     58     USB_CAPTURE,
     59 } usb_usecase_type_t;
     60 
     61 enum {
     62     USB_SIDETONE_ENABLE_INDEX = 0,
     63     USB_SIDETONE_VOLUME_INDEX,
     64     USB_SIDETONE_MAX_INDEX,
     65 };
     66 
     67 struct usb_device_config {
     68     struct listnode list;
     69     unsigned int bit_width;
     70     unsigned int channel_count;
     71     unsigned int rate_size;
     72     unsigned int rates[MAX_SAMPLE_RATE_SIZE];
     73     unsigned long service_interval_us;
     74     usb_usecase_type_t type;
     75 };
     76 
     77 struct usb_card_config {
     78     struct listnode list;
     79     audio_devices_t usb_device_type;
     80     int usb_card;
     81     struct listnode usb_device_conf_list;
     82     struct mixer *usb_snd_mixer;
     83     int usb_sidetone_index[USB_SIDETONE_MAX_INDEX];
     84     int usb_sidetone_vol_min;
     85     int usb_sidetone_vol_max;
     86 };
     87 
     88 struct usb_module {
     89     struct listnode usb_card_conf_list;
     90     struct audio_device *adev;
     91     int sidetone_gain;
     92     bool is_capture_supported;
     93 };
     94 
     95 static struct usb_module *usbmod = NULL;
     96 static bool usb_audio_debug_enable = false;
     97 static int usb_sidetone_gain = 0;
     98 
     99 static const char * const usb_sidetone_enable_str[] = {
    100     "Sidetone Playback Switch",
    101     "Mic Playback Switch",
    102 };
    103 
    104 static const char * const usb_sidetone_volume_str[] = {
    105     "Sidetone Playback Volume",
    106     "Mic Playback Volume",
    107 };
    108 
    109 static void usb_mixer_print_enum(struct mixer_ctl *ctl)
    110 {
    111     unsigned int num_enums;
    112     unsigned int i;
    113     const char *string;
    114 
    115     num_enums = mixer_ctl_get_num_enums(ctl);
    116 
    117     for (i = 0; i < num_enums; i++) {
    118         string = mixer_ctl_get_enum_string(ctl, i);
    119         ALOGI("\t%s%s", mixer_ctl_get_value(ctl, 0) == (int)i ? ">" : "", string);
    120     }
    121 }
    122 
    123 static void usb_soundcard_detail_control(struct mixer *mixer, const char *control)
    124 {
    125     struct mixer_ctl *ctl;
    126     enum mixer_ctl_type type;
    127     unsigned int num_values;
    128     unsigned int i;
    129     int min, max;
    130 
    131     if (isdigit(control[0]))
    132         ctl = mixer_get_ctl(mixer, atoi(control));
    133     else
    134         ctl = mixer_get_ctl_by_name(mixer, control);
    135 
    136     if (!ctl) {
    137         fprintf(stderr, "Invalid mixer control\n");
    138         return;
    139     }
    140 
    141     type = mixer_ctl_get_type(ctl);
    142     num_values = mixer_ctl_get_num_values(ctl);
    143 
    144     ALOGV("%s:", mixer_ctl_get_name(ctl));
    145 
    146     for (i = 0; i < num_values; i++) {
    147         switch (type) {
    148             case MIXER_CTL_TYPE_INT:
    149                 ALOGV(" %d", mixer_ctl_get_value(ctl, i));
    150                 break;
    151             case MIXER_CTL_TYPE_BOOL:
    152                 ALOGV(" %s", mixer_ctl_get_value(ctl, i) ? "On" : "Off");
    153                 break;
    154             case MIXER_CTL_TYPE_ENUM:
    155                 usb_mixer_print_enum(ctl);
    156                 break;
    157             case MIXER_CTL_TYPE_BYTE:
    158                 ALOGV(" 0x%02x", mixer_ctl_get_value(ctl, i));
    159                 break;
    160             default:
    161                 ALOGV(" unknown");
    162                 break;
    163         }
    164     }
    165 
    166     if (type == MIXER_CTL_TYPE_INT) {
    167         min = mixer_ctl_get_range_min(ctl);
    168         max = mixer_ctl_get_range_max(ctl);
    169         ALOGV(" (range %d->%d)", min, max);
    170     }
    171 }
    172 
    173 static void usb_soundcard_list_controls(struct mixer *mixer)
    174 {
    175     struct mixer_ctl *ctl;
    176     const char *name, *type;
    177     unsigned int num_ctls, num_values;
    178     unsigned int i;
    179 
    180     num_ctls = mixer_get_num_ctls(mixer);
    181 
    182     ALOGV("Number of controls: %d\n", num_ctls);
    183 
    184     ALOGV("ctl\ttype\tnum\t%-40s value\n", "name");
    185     for (i = 0; i < num_ctls; i++) {
    186         ctl = mixer_get_ctl(mixer, i);
    187         if (ctl != NULL) {
    188             name = mixer_ctl_get_name(ctl);
    189             type = mixer_ctl_get_type_string(ctl);
    190             num_values = mixer_ctl_get_num_values(ctl);
    191             ALOGV("%d\t%s\t%d\t%-40s", i, type, num_values, name);
    192             if (name != NULL)
    193                 usb_soundcard_detail_control(mixer, name);
    194         }
    195     }
    196 }
    197 
    198 static int usb_set_dev_id_mixer_ctl(unsigned int usb_usecase_type, int card,
    199                                     char *dev_mixer_ctl_name)
    200 {
    201     struct mixer_ctl *ctl;
    202     unsigned int dev_token;
    203     const unsigned int pcm_device_number = 0;
    204 
    205     /*
    206      * usb_dev_token_id is 32 bit number and is defined as below:
    207      * usb_sound_card_idx(31:16) | usb PCM device ID(15:8) | usb_usecase_type(7:0)
    208      */
    209     dev_token = (card << 16 ) |
    210                 (pcm_device_number << 8) | (usb_usecase_type & 0xFF);
    211 
    212     ctl = mixer_get_ctl_by_name(usbmod->adev->mixer, dev_mixer_ctl_name);
    213     if (!ctl) {
    214        ALOGE("%s: Could not get ctl for mixer cmd - %s",
    215              __func__, dev_mixer_ctl_name);
    216        return -EINVAL;
    217     }
    218     mixer_ctl_set_value(ctl, 0, dev_token);
    219 
    220     return 0;
    221 }
    222 
    223 static int usb_get_sample_rates(int type, char *rates_str,
    224                                 struct usb_device_config *config)
    225 {
    226     uint32_t i;
    227     char *next_sr_string, *temp_ptr;
    228     uint32_t sr, min_sr, max_sr, sr_size = 0;
    229 
    230     /* Sample rate string can be in any of the folloing two bit_widthes:
    231      * Rates: 8000 - 48000 (continuous)
    232      * Rates: 8000, 44100, 48000
    233      * Support both the bit_widths
    234      */
    235     ALOGV("%s: rates_str %s", __func__, rates_str);
    236     next_sr_string = strtok_r(rates_str, "Rates: ", &temp_ptr);
    237     if (next_sr_string == NULL) {
    238         ALOGE("%s: could not find min rates string", __func__);
    239         return -EINVAL;
    240     }
    241     if (strstr(rates_str, "continuous") != NULL) {
    242         min_sr = (uint32_t)atoi(next_sr_string);
    243         next_sr_string = strtok_r(NULL, " ,.-", &temp_ptr);
    244         if (next_sr_string == NULL) {
    245             ALOGE("%s: could not find max rates string", __func__);
    246             return -EINVAL;
    247         }
    248         max_sr = (uint32_t)atoi(next_sr_string);
    249 
    250         for (i = 0; i < MAX_SAMPLE_RATE_SIZE; i++) {
    251             if (supported_sample_rates[i] >= min_sr &&
    252                 supported_sample_rates[i] <= max_sr) {
    253                 config->rates[sr_size++] = supported_sample_rates[i];
    254                 supported_sample_rates_mask[type] |= (1<<i);
    255                 ALOGI_IF(usb_audio_debug_enable,
    256                     "%s: continuous sample rate supported_sample_rates[%d] %d",
    257                     __func__, i, supported_sample_rates[i]);
    258             }
    259         }
    260     } else {
    261         do {
    262             sr = (uint32_t)atoi(next_sr_string);
    263             for (i = 0; i < MAX_SAMPLE_RATE_SIZE; i++) {
    264                 if (supported_sample_rates[i] == sr) {
    265                     ALOGI_IF(usb_audio_debug_enable,
    266                         "%s: sr %d, supported_sample_rates[%d] %d -> matches!!",
    267                         __func__, sr, i, supported_sample_rates[i]);
    268                     config->rates[sr_size++] = supported_sample_rates[i];
    269                     supported_sample_rates_mask[type] |= (1<<i);
    270                 }
    271             }
    272             next_sr_string = strtok_r(NULL, " ,.-", &temp_ptr);
    273         } while (next_sr_string != NULL);
    274     }
    275     config->rate_size = sr_size;
    276     return 0;
    277 }
    278 
    279 static int usb_get_service_interval(const char *interval_str_start,
    280                                     struct usb_device_config *usb_device_info)
    281 {
    282     unsigned long interval = 0;
    283     char time_unit[8] = {0};
    284     int multiplier = 0;
    285     char *eol = strchr(interval_str_start, '\n');
    286     if (!eol) {
    287         ALOGE("%s: No EOL found", __func__);
    288         return -1;
    289     }
    290     char *tmp = (char *)calloc(1, eol-interval_str_start+1);
    291     if (!tmp) {
    292         ALOGE("%s: failed to allocate tmp", __func__);
    293         return -1;
    294     }
    295     memcpy(tmp, interval_str_start, eol-interval_str_start);
    296     sscanf(tmp, "%lu %2s", &interval, &time_unit[0]);
    297     if (!strcmp(time_unit, "us")) {
    298         multiplier = 1;
    299     } else if (!strcmp(time_unit, "ms")) {
    300         multiplier = 1000;
    301     } else if (!strcmp(time_unit, "s")) {
    302         multiplier = 1000000;
    303     } else {
    304         ALOGE("%s: unknown time_unit %s, assume default", __func__, time_unit);
    305         interval = DEFAULT_SERVICE_INTERVAL_US;
    306         multiplier = 1;
    307     }
    308     interval *= multiplier;
    309     ALOGV("%s: set service_interval_us %lu", __func__, interval);
    310     usb_device_info->service_interval_us = interval;
    311     free(tmp);
    312     return 0;
    313 }
    314 
    315 
    316 static int usb_get_capability(int type,
    317                               struct usb_card_config *usb_card_info,
    318                               int card)
    319 {
    320     int32_t size = 0;
    321     int32_t fd=-1;
    322     int32_t channels_no;
    323     char *str_start = NULL;
    324     char *str_end = NULL;
    325     char *channel_start = NULL;
    326     char *bit_width_start = NULL;
    327     char *rates_str_start = NULL;
    328     char *target = NULL;
    329     char *read_buf = NULL;
    330     char *rates_str = NULL;
    331     char *interval_str_start = NULL;
    332     char path[128];
    333     int ret = 0;
    334     char *bit_width_str = NULL;
    335     struct usb_device_config * usb_device_info;
    336     bool check = false;
    337     int tries=5;
    338 
    339     memset(path, 0, sizeof(path));
    340     ALOGV("%s: for %s", __func__, (type == USB_PLAYBACK) ?
    341           PLAYBACK_PROFILE_STR : CAPTURE_PROFILE_STR);
    342 
    343     /* TODO: convert the below to using alsa_utils */
    344     ret = snprintf(path, sizeof(path), "/proc/asound/card%u/stream0",
    345              card);
    346     if (ret < 0) {
    347         ALOGE("%s: failed on snprintf (%d) to path %s\n",
    348           __func__, ret, path);
    349         goto done;
    350     }
    351 
    352     // TODO: figure up if this wait is needed any more
    353     while (tries--) {
    354         if (access(path, F_OK) < 0) {
    355             ALOGW("stream %s doesn't exist retrying\n", path);
    356             sleep(1);
    357             continue;
    358         }
    359     }
    360 
    361     fd = open(path, O_RDONLY);
    362     if (fd <0) {
    363         ALOGE("%s: error failed to open config file %s error: %d\n",
    364               __func__, path, errno);
    365         ret = -EINVAL;
    366         goto done;
    367     }
    368 
    369     read_buf = (char *)calloc(1, USB_BUFF_SIZE + 1);
    370 
    371     if (!read_buf) {
    372         ALOGE("Failed to create read_buf");
    373         ret = -ENOMEM;
    374         goto done;
    375     }
    376 
    377     if(read(fd, read_buf, USB_BUFF_SIZE) < 0) {
    378         ALOGE("file read error\n");
    379         goto done;
    380     }
    381     str_start = strstr(read_buf, ((type == USB_PLAYBACK) ?
    382                        PLAYBACK_PROFILE_STR : CAPTURE_PROFILE_STR));
    383     if (str_start == NULL) {
    384         ALOGE("%s: error %s section not found in usb config file",
    385                __func__, ((type == USB_PLAYBACK) ?
    386                PLAYBACK_PROFILE_STR : CAPTURE_PROFILE_STR));
    387         ret = -EINVAL;
    388         goto done;
    389     }
    390     str_end = strstr(read_buf, ((type == USB_PLAYBACK) ?
    391                        CAPTURE_PROFILE_STR : PLAYBACK_PROFILE_STR));
    392     if (str_end > str_start)
    393         check = true;
    394 
    395     ALOGV("%s: usb_config = %s, check %d\n", __func__, str_start, check);
    396 
    397     while (str_start != NULL) {
    398         str_start = strstr(str_start, "Altset");
    399         if ((str_start == NULL) || (check  && (str_start >= str_end))) {
    400             ALOGV("%s: done parsing %s\n", __func__, str_start);
    401             break;
    402         }
    403         ALOGV("%s: remaining string %s\n", __func__, str_start);
    404         str_start += sizeof("Altset");
    405         usb_device_info = calloc(1, sizeof(struct usb_device_config));
    406         if (usb_device_info == NULL) {
    407             ALOGE("%s: error unable to allocate memory",
    408                   __func__);
    409             ret = -ENOMEM;
    410             break;
    411         }
    412         usb_device_info->type = type;
    413         /* Bit bit_width parsing */
    414         bit_width_start = strstr(str_start, "Format: ");
    415         if (bit_width_start == NULL) {
    416             ALOGI("%s: Could not find bit_width string", __func__);
    417             free(usb_device_info);
    418             continue;
    419         }
    420         target = strchr(bit_width_start, '\n');
    421         if (target == NULL) {
    422             ALOGI("%s:end of line not found", __func__);
    423             free(usb_device_info);
    424             continue;
    425         }
    426         size = target - bit_width_start;
    427         if ((bit_width_str = (char *)malloc(size + 1)) == NULL) {
    428             ALOGE("%s: unable to allocate memory to hold bit width strings",
    429                   __func__);
    430             ret = -EINVAL;
    431             free(usb_device_info);
    432             break;
    433         }
    434         memcpy(bit_width_str, bit_width_start, size);
    435         bit_width_str[size] = '\0';
    436         if (strstr(bit_width_str, "S16_LE"))
    437             usb_device_info->bit_width = 16;
    438         else if (strstr(bit_width_str, "S24_LE"))
    439             usb_device_info->bit_width = 24;
    440         else if (strstr(bit_width_str, "S24_3LE"))
    441             usb_device_info->bit_width = 24;
    442         else if (strstr(bit_width_str, "S32_LE"))
    443             usb_device_info->bit_width = 32;
    444 
    445         if (bit_width_str)
    446             free(bit_width_str);
    447 
    448         /* channels parsing */
    449         channel_start = strstr(str_start, CHANNEL_NUMBER_STR);
    450         if (channel_start == NULL) {
    451             ALOGI("%s: could not find Channels string", __func__);
    452             free(usb_device_info);
    453             continue;
    454         }
    455         channels_no = atoi(channel_start + strlen(CHANNEL_NUMBER_STR));
    456         usb_device_info->channel_count =  channels_no;
    457 
    458         /* Sample rates parsing */
    459         rates_str_start = strstr(str_start, "Rates: ");
    460         if (rates_str_start == NULL) {
    461             ALOGI("%s: cant find rates string", __func__);
    462             free(usb_device_info);
    463             continue;
    464         }
    465         target = strchr(rates_str_start, '\n');
    466         if (target == NULL) {
    467             ALOGI("%s: end of line not found", __func__);
    468             free(usb_device_info);
    469             continue;
    470         }
    471         size = target - rates_str_start;
    472         if ((rates_str = (char *)malloc(size + 1)) == NULL) {
    473             ALOGE("%s: unable to allocate memory to hold sample rate strings",
    474                   __func__);
    475             ret = -EINVAL;
    476             free(usb_device_info);
    477             break;
    478         }
    479         memcpy(rates_str, rates_str_start, size);
    480         rates_str[size] = '\0';
    481         ret = usb_get_sample_rates(type, rates_str, usb_device_info);
    482         if (rates_str)
    483             free(rates_str);
    484         if (ret < 0) {
    485             ALOGE("%s: error unable to get sample rate values",
    486                   __func__);
    487             free(usb_device_info);
    488             continue;
    489         }
    490         // Data packet interval is an optional field.
    491         // Assume 1ms interval if this cannot be read
    492         usb_device_info->service_interval_us = DEFAULT_SERVICE_INTERVAL_US;
    493         interval_str_start = strstr(str_start, DATA_PACKET_INTERVAL_STR);
    494         if (interval_str_start != NULL) {
    495             interval_str_start += strlen(DATA_PACKET_INTERVAL_STR);
    496             ret = usb_get_service_interval(interval_str_start, usb_device_info);
    497             if (ret < 0) {
    498                 ALOGE("%s: error unable to get service interval, assume default",
    499                       __func__);
    500             }
    501         }
    502         /* Add to list if every field is valid */
    503         list_add_tail(&usb_card_info->usb_device_conf_list,
    504                       &usb_device_info->list);
    505     }
    506 
    507 done:
    508     if (fd >= 0) close(fd);
    509     if (read_buf) free(read_buf);
    510     return ret;
    511 }
    512 
    513 static int usb_get_device_playback_config(struct usb_card_config *usb_card_info,
    514                                     int card)
    515 {
    516     int ret;
    517 
    518     /* get capabilities */
    519     if ((ret = usb_get_capability(USB_PLAYBACK, usb_card_info, card))) {
    520         ALOGE("%s: could not get Playback capabilities from usb device",
    521                __func__);
    522         goto exit;
    523     }
    524     usb_set_dev_id_mixer_ctl(USB_PLAYBACK, card, "USB_AUDIO_RX dev_token");
    525 
    526 exit:
    527 
    528     return ret;
    529 }
    530 
    531 static int usb_get_device_capture_config(struct usb_card_config *usb_card_info,
    532                                       int card)
    533 {
    534     int ret;
    535 
    536     /* get capabilities */
    537     if ((ret = usb_get_capability(USB_CAPTURE, usb_card_info, card))) {
    538         ALOGE("%s: could not get Playback capabilities from usb device",
    539                __func__);
    540         goto exit;
    541     }
    542     usb_set_dev_id_mixer_ctl(USB_CAPTURE, card, "USB_AUDIO_TX dev_token");
    543 
    544 exit:
    545     return ret;
    546 }
    547 
    548 static void usb_get_sidetone_mixer(struct usb_card_config *usb_card_info)
    549 {
    550     struct mixer_ctl *ctl;
    551     unsigned int index;
    552 
    553     for (index = 0; index < USB_SIDETONE_MAX_INDEX; index++)
    554         usb_card_info->usb_sidetone_index[index] = -1;
    555 
    556     usb_card_info->usb_snd_mixer = mixer_open(usb_card_info->usb_card);
    557     for (index = 0;
    558          index < sizeof(usb_sidetone_enable_str)/sizeof(usb_sidetone_enable_str[0]);
    559          index++) {
    560         ctl = mixer_get_ctl_by_name(usb_card_info->usb_snd_mixer,
    561                                     usb_sidetone_enable_str[index]);
    562         if (ctl) {
    563             usb_card_info->usb_sidetone_index[USB_SIDETONE_ENABLE_INDEX] = index;
    564             /* Disable device sidetone by default */
    565             mixer_ctl_set_value(ctl, 0, false);
    566             ALOGV("%s:: sidetone mixer Control found(%s) ... disabling by default",
    567                    __func__, usb_sidetone_enable_str[index]);
    568             break;
    569         }
    570     }
    571 #ifdef USB_SIDETONE_VOLUME
    572     for (index = 0;
    573          index < sizeof(usb_sidetone_volume_str)/sizeof(usb_sidetone_volume_str[0]);
    574          index++) {
    575         ctl = mixer_get_ctl_by_name(usb_card_info->usb_snd_mixer,
    576                                     usb_sidetone_volume_str[index]);
    577         if (ctl) {
    578             usb_card_info->usb_sidetone_index[USB_SIDETONE_VOLUME_INDEX] = index;
    579             usb_card_info->usb_sidetone_vol_min = mixer_ctl_get_range_min(ctl);
    580             usb_card_info->usb_sidetone_vol_max = mixer_ctl_get_range_max(ctl);
    581             break;
    582         }
    583     }
    584 #endif // USB_SIDETONE_VOLUME
    585     if ((usb_card_info->usb_snd_mixer != NULL) && (usb_audio_debug_enable))
    586         usb_soundcard_list_controls(usb_card_info->usb_snd_mixer);
    587 
    588     return;
    589 }
    590 
    591 static inline bool usb_output_device(audio_devices_t device) {
    592     // ignore accessory for now
    593     if (device == AUDIO_DEVICE_OUT_USB_ACCESSORY) {
    594         return false;
    595     }
    596     return audio_is_usb_out_device(device);
    597 }
    598 
    599 static inline bool usb_input_device(audio_devices_t device) {
    600     // ignore accessory for now
    601     if (device == AUDIO_DEVICE_IN_USB_ACCESSORY) {
    602         return false;
    603     }
    604     return audio_is_usb_in_device(device);
    605 }
    606 
    607 static bool usb_valid_device(audio_devices_t device)
    608 {
    609     return usb_output_device(device) ||
    610            usb_input_device(device);
    611 }
    612 
    613 static void usb_print_active_device(void){
    614     struct listnode *node_i, *node_j;
    615     struct usb_device_config *dev_info;
    616     struct usb_card_config *card_info;
    617     unsigned int i;
    618 
    619     ALOGI("%s", __func__);
    620     list_for_each(node_i, &usbmod->usb_card_conf_list) {
    621         card_info = node_to_item(node_i, struct usb_card_config, list);
    622         ALOGI("%s: card_dev_type (0x%x), card_no(%d)",
    623                __func__,  card_info->usb_device_type, card_info->usb_card);
    624         list_for_each(node_j, &card_info->usb_device_conf_list) {
    625             dev_info = node_to_item(node_j, struct usb_device_config, list);
    626             ALOGI("%s: bit-width(%d) channel(%d)",
    627                    __func__, dev_info->bit_width, dev_info->channel_count);
    628             for (i =  0; i < dev_info->rate_size; i++)
    629                 ALOGI("%s: rate %d", __func__, dev_info->rates[i]);
    630         }
    631     }
    632 }
    633 
    634 static bool usb_get_best_bit_width(
    635                             struct listnode *dev_list,
    636                             unsigned int stream_bit_width,
    637                             unsigned int *bit_width)
    638 {
    639     struct listnode *node_i;
    640     struct usb_device_config *dev_info;
    641     unsigned int candidate = 0;
    642 
    643     list_for_each(node_i, dev_list) {
    644         dev_info = node_to_item(node_i, struct usb_device_config, list);
    645         ALOGI_IF(usb_audio_debug_enable,
    646                  "%s: USB bw(%d), stream bw(%d), candidate(%d)",
    647                  __func__, dev_info->bit_width,
    648                  stream_bit_width, candidate);
    649         if (candidate == 0) {
    650             ALOGV("%s: candidate bit-width (%d)",
    651                   __func__, dev_info->bit_width);
    652             candidate = dev_info->bit_width;
    653         } else if (dev_info->bit_width > candidate) {
    654             candidate = dev_info->bit_width;
    655             ALOGV("%s: Found better candidate bit-width (%d)",
    656                   __func__, dev_info->bit_width);
    657         }
    658     }
    659     ALOGV("%s: Use the best candidate bw(%d)",
    660           __func__, candidate);
    661     *bit_width = candidate;
    662 exit:
    663     return true;
    664 }
    665 
    666 static bool usb_get_best_match_for_channels(
    667                             struct listnode *dev_list,
    668                             unsigned int bit_width,
    669                             unsigned int stream_ch,
    670                             unsigned int *channel_count)
    671 {
    672     struct listnode *node_i;
    673     struct usb_device_config *dev_info;
    674     unsigned int candidate = 0;
    675 
    676     list_for_each(node_i, dev_list) {
    677         dev_info = node_to_item(node_i, struct usb_device_config, list);
    678         ALOGI_IF(usb_audio_debug_enable,
    679                  "%s: USB ch(%d)bw(%d), stream ch(%d)bw(%d), candidate(%d)",
    680                  __func__, dev_info->channel_count, dev_info->bit_width,
    681                  stream_ch, bit_width, candidate);
    682         if (dev_info->bit_width != bit_width)
    683             continue;
    684         if (dev_info->channel_count== stream_ch) {
    685             *channel_count = dev_info->channel_count;
    686             ALOGV("%s: Found match channels (%d)",
    687                   __func__, dev_info->channel_count);
    688             goto exit;
    689         } else if (candidate == 0)
    690                 candidate = dev_info->channel_count;
    691             /*
    692             * If stream channel is 4, USB supports both 3 and 5, then
    693             *  higher channel 5 is picked up instead of 3
    694             */
    695         else if (ABS_SUB(stream_ch, dev_info->channel_count) <
    696                  ABS_SUB(stream_ch, candidate)) {
    697             candidate = dev_info->channel_count;
    698         } else if ((ABS_SUB(stream_ch, dev_info->channel_count) ==
    699                     ABS_SUB(stream_ch, candidate)) &&
    700                    (dev_info->channel_count > candidate)) {
    701             candidate = dev_info->channel_count;
    702         }
    703     }
    704     ALOGV("%s: No match found, use the best candidate ch(%d)",
    705           __func__, candidate);
    706     *channel_count = candidate;
    707 exit:
    708     return true;
    709 
    710 }
    711 
    712 static bool usb_sample_rate_multiple(
    713                                      unsigned int stream_sample_rate,
    714                                      unsigned int base)
    715 {
    716     return (((stream_sample_rate / base) * base) == stream_sample_rate);
    717 }
    718 
    719 static bool usb_find_sample_rate_candidate(unsigned int base,
    720                                            unsigned stream_rate,
    721                                            unsigned int usb_rate,
    722                                            unsigned int cur_candidate,
    723                                            unsigned int *update_candidate)
    724 {
    725     /* For sample rate, we should consider  fracational sample rate as high priority.
    726     * For example, if the stream is 88.2kHz and USB device support both 44.1kH and
    727     * 48kHz sample rate, we should pick 44.1kHz instead of 48kHz
    728     */
    729     if (!usb_sample_rate_multiple(cur_candidate, base) &&
    730        usb_sample_rate_multiple(usb_rate, base)) {
    731         *update_candidate = usb_rate;
    732     } else if (usb_sample_rate_multiple(cur_candidate, base) &&
    733                usb_sample_rate_multiple(usb_rate, base)) {
    734         if (ABS_SUB(stream_rate, usb_rate) <
    735             ABS_SUB(stream_rate, cur_candidate)) {
    736             *update_candidate = usb_rate;
    737         } else if ((ABS_SUB(stream_rate, usb_rate) ==
    738                     ABS_SUB(stream_rate, cur_candidate)) &&
    739                    (usb_rate > cur_candidate)) {
    740             *update_candidate = usb_rate;
    741         }
    742     } else if (!usb_sample_rate_multiple(cur_candidate, base) &&
    743                !usb_sample_rate_multiple(usb_rate, base)) {
    744         if (ABS_SUB(stream_rate, usb_rate) <
    745             ABS_SUB(stream_rate, cur_candidate)) {
    746             *update_candidate = usb_rate;
    747         } else if ((ABS_SUB(stream_rate, usb_rate) ==
    748                     ABS_SUB(stream_rate, cur_candidate)) &&
    749                    (usb_rate > cur_candidate)) {
    750             *update_candidate = usb_rate;
    751         }
    752     }
    753     return true;
    754 }
    755 
    756 static bool usb_get_best_match_for_sample_rate (
    757                             struct listnode *dev_list,
    758                             unsigned int bit_width,
    759                             unsigned int channel_count,
    760                             unsigned int stream_sample_rate,
    761                             unsigned int *sr,
    762                             unsigned int service_interval,
    763                             bool do_service_interval_check)
    764 {
    765     struct listnode *node_i;
    766     struct usb_device_config *dev_info;
    767     unsigned int candidate = 48000;
    768     unsigned int base = SAMPLE_RATE_8000;
    769     bool multiple_8k = usb_sample_rate_multiple(stream_sample_rate, base);
    770     unsigned int i;
    771 
    772     ALOGV("%s: stm ch(%d)bw(%d)sr(%d), stream sample multiple of 8kHz(%d)",
    773         __func__, channel_count, bit_width, stream_sample_rate, multiple_8k);
    774 
    775     list_for_each(node_i, dev_list) {
    776         dev_info = node_to_item(node_i, struct usb_device_config, list);
    777         ALOGI_IF(usb_audio_debug_enable,
    778                  "%s: USB ch(%d)bw(%d), stm ch(%d)bw(%d)sr(%d), candidate(%d)",
    779                  __func__, dev_info->channel_count, dev_info->bit_width,
    780                  channel_count, bit_width, stream_sample_rate, candidate);
    781         if ((dev_info->bit_width != bit_width) ||
    782             (dev_info->channel_count != channel_count) ||
    783             (do_service_interval_check && (dev_info->service_interval_us !=
    784                                            service_interval)))
    785             continue;
    786 
    787         candidate = 0;
    788         for (i = 0; i < dev_info->rate_size; i++) {
    789             ALOGI_IF(usb_audio_debug_enable,
    790                      "%s: USB ch(%d)bw(%d)sr(%d), stm ch(%d)bw(%d)sr(%d), candidate(%d)",
    791                      __func__, dev_info->channel_count,
    792                      dev_info->bit_width, dev_info->rates[i],
    793                      channel_count, bit_width, stream_sample_rate, candidate);
    794             if (stream_sample_rate == dev_info->rates[i]) {
    795                 *sr = dev_info->rates[i];
    796                 ALOGV("%s: Found match sample rate (%d)",
    797                       __func__, dev_info->rates[i]);
    798                 goto exit;
    799             } else if (candidate == 0) {
    800                     candidate = dev_info->rates[i];
    801                 /*
    802                 * For sample rate, we should consider  fracational sample rate as high priority.
    803                 * For example, if the stream is 88.2kHz and USB device support both 44.1kH and
    804                 * 48kHz sample rate, we should pick 44.1kHz instead of 48kHz
    805                 */
    806             } else if (multiple_8k) {
    807                 usb_find_sample_rate_candidate(SAMPLE_RATE_8000,
    808                                                stream_sample_rate,
    809                                                dev_info->rates[i],
    810                                                candidate,
    811                                                &candidate);
    812             } else {
    813                 usb_find_sample_rate_candidate(SAMPLE_RATE_11025,
    814                                                stream_sample_rate,
    815                                                dev_info->rates[i],
    816                                                candidate,
    817                                                &candidate);
    818             }
    819         }
    820     }
    821     ALOGV("%s: No match found, use the best candidate sr(%d)",
    822           __func__, candidate);
    823     *sr = candidate;
    824 exit:
    825     return true;
    826 }
    827 
    828 static bool usb_audio_backend_apply_policy(struct listnode *dev_list,
    829                                            unsigned int *bit_width,
    830                                            unsigned int *sample_rate,
    831                                            unsigned int *channel_count)
    832 {
    833     ALOGV("%s: from stream: bit-width(%d) sample_rate(%d) channels (%d)",
    834            __func__, *bit_width, *sample_rate, *channel_count);
    835     if (list_empty(dev_list)) {
    836         *sample_rate = 48000;
    837         *bit_width = 16;
    838         *channel_count = 2;
    839         ALOGE("%s: list is empty,fall back to default setting", __func__);
    840         goto exit;
    841     }
    842     usb_get_best_bit_width(dev_list, *bit_width, bit_width);
    843     usb_get_best_match_for_channels(dev_list,
    844                                     *bit_width,
    845                                     *channel_count,
    846                                     channel_count);
    847     usb_get_best_match_for_sample_rate(dev_list,
    848                                        *bit_width,
    849                                        *channel_count,
    850                                        *sample_rate,
    851                                        sample_rate,
    852                                        0 /*service int*/,
    853                                        false /*do service int check*/);
    854 exit:
    855     ALOGV("%s: Updated sample rate per profile: bit-width(%d) rate(%d) chs(%d)",
    856            __func__, *bit_width, *sample_rate, *channel_count);
    857     return true;
    858 }
    859 
    860 static int usb_get_sidetone_gain(struct usb_card_config *card_info)
    861 {
    862     int gain = card_info->usb_sidetone_vol_min + usbmod->sidetone_gain;
    863     if (gain > card_info->usb_sidetone_vol_max)
    864         gain = card_info->usb_sidetone_vol_max;
    865     return gain;
    866 }
    867 
    868 void audio_extn_usb_set_sidetone_gain(struct str_parms *parms,
    869                                 char *value, int len)
    870 {
    871     int err;
    872 
    873     err = str_parms_get_str(parms, USB_SIDETONE_GAIN_STR,
    874                             value, len);
    875     if (err >= 0) {
    876         usb_sidetone_gain = pow(10.0, (float)(atoi(value))/10.0);
    877         ALOGV("%s: sidetone gain(%s) decimal %d",
    878               __func__, value, usb_sidetone_gain);
    879         str_parms_del(parms, USB_SIDETONE_GAIN_STR);
    880     }
    881     return;
    882 }
    883 
    884 int audio_extn_usb_enable_sidetone(int device, bool enable)
    885 {
    886     int ret = -ENODEV;
    887     struct listnode *node_i;
    888     struct usb_card_config *card_info;
    889     int i;
    890     ALOGV("%s: card_dev_type (0x%x), sidetone enable(%d)",
    891            __func__,  device, enable);
    892 
    893     list_for_each(node_i, &usbmod->usb_card_conf_list) {
    894         card_info = node_to_item(node_i, struct usb_card_config, list);
    895         ALOGV("%s: card_dev_type (0x%x), card_no(%d)",
    896                __func__,  card_info->usb_device_type, card_info->usb_card);
    897         if (usb_output_device(card_info->usb_device_type)) {
    898             if ((i = card_info->usb_sidetone_index[USB_SIDETONE_ENABLE_INDEX]) != -1) {
    899                 struct mixer_ctl *ctl = mixer_get_ctl_by_name(
    900                                 card_info->usb_snd_mixer,
    901                                 usb_sidetone_enable_str[i]);
    902                 if (ctl)
    903                     mixer_ctl_set_value(ctl, 0, enable);
    904                 else
    905                     break;
    906 
    907 #ifdef USB_SIDETONE_VOLUME
    908                 if ((i = card_info->usb_sidetone_index[USB_SIDETONE_VOLUME_INDEX]) != -1) {
    909                     ctl = mixer_get_ctl_by_name(
    910                                 card_info->usb_snd_mixer,
    911                                 usb_sidetone_volume_str[i]);
    912                     if (ctl == NULL)
    913                         ALOGV("%s: sidetone gain mixer command is not found",
    914                                __func__);
    915                     else if (enable)
    916                         mixer_ctl_set_value(ctl, 0,
    917                                             usb_get_sidetone_gain(card_info));
    918                 }
    919 #endif // USB_SIDETONE_VOLUME
    920                 ret = 0;
    921                 break;
    922             }
    923         }
    924     }
    925     return ret;
    926 }
    927 
    928 bool audio_extn_usb_is_config_supported(unsigned int *bit_width,
    929                                         unsigned int *sample_rate,
    930                                         unsigned int *channel_count,
    931                                         bool is_playback)
    932 {
    933     struct listnode *node_i;
    934     struct usb_card_config *card_info;
    935 
    936     ALOGV("%s: from stream: bit-width(%d) sample_rate(%d) ch(%d) is_playback(%d)",
    937            __func__, *bit_width, *sample_rate, *channel_count, is_playback);
    938     list_for_each(node_i, &usbmod->usb_card_conf_list) {
    939         card_info = node_to_item(node_i, struct usb_card_config, list);
    940         ALOGI_IF(usb_audio_debug_enable,
    941                  "%s: card_dev_type (0x%x), card_no(%d)",
    942                  __func__,  card_info->usb_device_type, card_info->usb_card);
    943         /* Currently only apply the first playback sound card configuration */
    944         if ((is_playback && usb_output_device(card_info->usb_device_type)) ||
    945             (!is_playback && usb_input_device(card_info->usb_device_type))) {
    946             usb_audio_backend_apply_policy(&card_info->usb_device_conf_list,
    947                                            bit_width,
    948                                            sample_rate,
    949                                            channel_count);
    950             break;
    951         }
    952     }
    953     ALOGV("%s: updated: bit-width(%d) sample_rate(%d) channels (%d)",
    954            __func__, *bit_width, *sample_rate, *channel_count);
    955 
    956     return true;
    957 }
    958 
    959 #define _MAX(x, y) (((x) >= (y)) ? (x) : (y))
    960 #define _MIN(x, y) (((x) <= (y)) ? (x) : (y))
    961 
    962 int audio_extn_usb_get_max_channels(bool is_playback)
    963 {
    964     struct listnode *node_i, *node_j;
    965     struct usb_device_config *dev_info;
    966     struct usb_card_config *card_info;
    967     unsigned int max_ch = 1;
    968     list_for_each(node_i, &usbmod->usb_card_conf_list) {
    969             card_info = node_to_item(node_i, struct usb_card_config, list);
    970             if (usb_output_device(card_info->usb_device_type) && !is_playback)
    971                 continue;
    972             else if (usb_input_device(card_info->usb_device_type) && is_playback)
    973                 continue;
    974 
    975             list_for_each(node_j, &card_info->usb_device_conf_list) {
    976                 dev_info = node_to_item(node_j, struct usb_device_config, list);
    977                 max_ch = _MAX(max_ch, dev_info->channel_count);
    978             }
    979     }
    980 
    981     return max_ch;
    982 }
    983 
    984 int audio_extn_usb_get_max_bit_width(bool is_playback)
    985 {
    986     struct listnode *node_i, *node_j;
    987     struct usb_device_config *dev_info;
    988     struct usb_card_config *card_info;
    989     unsigned int max_bw = 16;
    990     list_for_each(node_i, &usbmod->usb_card_conf_list) {
    991             card_info = node_to_item(node_i, struct usb_card_config, list);
    992             if (usb_output_device(card_info->usb_device_type) && !is_playback)
    993                 continue;
    994             else if (usb_input_device(card_info->usb_device_type) && is_playback)
    995                 continue;
    996 
    997             list_for_each(node_j, &card_info->usb_device_conf_list) {
    998                 dev_info = node_to_item(node_j, struct usb_device_config, list);
    999                 max_bw = _MAX(max_bw, dev_info->bit_width);
   1000             }
   1001     }
   1002 
   1003     return max_bw;
   1004 }
   1005 
   1006 int audio_extn_usb_sup_sample_rates(bool is_playback,
   1007                                     uint32_t *sample_rates,
   1008                                     uint32_t sample_rate_size)
   1009 {
   1010     struct listnode *node_i, *node_j;
   1011     struct usb_device_config *dev_info;
   1012     struct usb_card_config *card_info;
   1013 
   1014     int type = is_playback ? USB_PLAYBACK : USB_CAPTURE;
   1015 
   1016     ALOGV("%s supported_sample_rates_mask 0x%x", __func__, supported_sample_rates_mask[type]);
   1017     uint32_t bm = supported_sample_rates_mask[type];
   1018     uint32_t tries = _MIN(sample_rate_size, (uint32_t)__builtin_popcount(bm));
   1019 
   1020     int i = 0;
   1021     while (tries--) {
   1022         int idx = __builtin_ffs(bm) - 1;
   1023         sample_rates[i++] = supported_sample_rates[idx];
   1024         bm &= ~(1<<idx);
   1025     }
   1026 
   1027     return i;
   1028 }
   1029 
   1030 bool audio_extn_usb_is_capture_supported()
   1031 {
   1032     if (usbmod == NULL) {
   1033         ALOGE("%s: USB device object is NULL", __func__);
   1034         return false;
   1035     }
   1036     ALOGV("%s: capture_supported %d",__func__,usbmod->is_capture_supported);
   1037     return usbmod->is_capture_supported;
   1038 }
   1039 
   1040 void audio_extn_usb_add_device(audio_devices_t device, int card)
   1041 {
   1042     struct usb_card_config *usb_card_info;
   1043     char check_debug_enable[PROPERTY_VALUE_MAX];
   1044     struct listnode *node_i;
   1045 
   1046     property_get("audio.usb.enable.debug", check_debug_enable, NULL);
   1047     if (atoi(check_debug_enable)) {
   1048         usb_audio_debug_enable = true;
   1049     }
   1050 
   1051     ALOGI_IF(usb_audio_debug_enable,
   1052              "%s: parameters device(0x%x), card(%d)",
   1053              __func__, device, card);
   1054     if (usbmod == NULL) {
   1055         ALOGE("%s: USB device object is NULL", __func__);
   1056         goto exit;
   1057     }
   1058 
   1059     if (!(usb_valid_device(device)) || (card < 0)) {
   1060         ALOGE("%s:device(0x%x), card(%d)",
   1061               __func__, device, card);
   1062         goto exit;
   1063     }
   1064 
   1065     list_for_each(node_i, &usbmod->usb_card_conf_list) {
   1066         usb_card_info = node_to_item(node_i, struct usb_card_config, list);
   1067         ALOGI_IF(usb_audio_debug_enable,
   1068                  "%s: list has capability for card_dev_type (0x%x), card_no(%d)",
   1069                  __func__,  usb_card_info->usb_device_type, usb_card_info->usb_card);
   1070         /* If we have cached the capability */
   1071         if ((usb_card_info->usb_device_type == device) && (usb_card_info->usb_card == card)) {
   1072             ALOGV("%s: capability for device(0x%x), card(%d) is cached, no need to update",
   1073                   __func__, device, card);
   1074             goto exit;
   1075         }
   1076     }
   1077     usb_card_info = calloc(1, sizeof(struct usb_card_config));
   1078     if (usb_card_info == NULL) {
   1079         ALOGE("%s: error unable to allocate memory",
   1080               __func__);
   1081         goto exit;
   1082     }
   1083     list_init(&usb_card_info->usb_device_conf_list);
   1084     if (usb_output_device(device)) {
   1085         if (!usb_get_device_playback_config(usb_card_info, card)){
   1086             usb_card_info->usb_card = card;
   1087             usb_card_info->usb_device_type = device;
   1088             usb_get_sidetone_mixer(usb_card_info);
   1089             list_add_tail(&usbmod->usb_card_conf_list, &usb_card_info->list);
   1090             goto exit;
   1091         }
   1092     } else if (usb_input_device(device)) {
   1093         if (!usb_get_device_capture_config(usb_card_info, card)) {
   1094             usb_card_info->usb_card = card;
   1095             usb_card_info->usb_device_type = device;
   1096             usbmod->is_capture_supported = true;
   1097             list_add_tail(&usbmod->usb_card_conf_list, &usb_card_info->list);
   1098             goto exit;
   1099         }
   1100     } else {
   1101         ALOGW("%s: unknown device 0x%x", __func__, device);
   1102     }
   1103     /* free memory in error case */
   1104     if (usb_card_info != NULL)
   1105         free(usb_card_info);
   1106 exit:
   1107     if (usb_audio_debug_enable)
   1108         usb_print_active_device();
   1109     return;
   1110 }
   1111 
   1112 void audio_extn_usb_remove_device(audio_devices_t device, int card)
   1113 {
   1114     struct listnode *node_i, *temp_i;
   1115     struct listnode *node_j, *temp_j;
   1116     struct usb_device_config *dev_info;
   1117     struct usb_card_config *card_info;
   1118     unsigned int i;
   1119 
   1120     ALOGV("%s: device(0x%x), card(%d)",
   1121            __func__, device, card);
   1122 
   1123     if (usbmod == NULL) {
   1124         ALOGE("%s: USB device object is NULL", __func__);
   1125         goto exit;
   1126     }
   1127 
   1128     if (!(usb_valid_device(device)) || (card < 0)) {
   1129         ALOGE("%s: Invalid parameters device(0x%x), card(%d)",
   1130               __func__, device, card);
   1131         goto exit;
   1132     }
   1133     list_for_each_safe(node_i, temp_i, &usbmod->usb_card_conf_list) {
   1134         card_info = node_to_item(node_i, struct usb_card_config, list);
   1135         ALOGV("%s: card_dev_type (0x%x), card_no(%d)",
   1136                __func__,  card_info->usb_device_type, card_info->usb_card);
   1137         if ((device == card_info->usb_device_type) && (card == card_info->usb_card)){
   1138             list_for_each_safe(node_j, temp_j, &card_info->usb_device_conf_list) {
   1139                 dev_info = node_to_item(node_j, struct usb_device_config, list);
   1140                 ALOGV("%s: bit-width(%d) channel(%d)",
   1141                        __func__, dev_info->bit_width, dev_info->channel_count);
   1142                 for (i =  0; i < dev_info->rate_size; i++)
   1143                     ALOGV("%s: rate %d", __func__, dev_info->rates[i]);
   1144 
   1145                 list_remove(node_j);
   1146                 free(node_to_item(node_j, struct usb_device_config, list));
   1147             }
   1148             list_remove(node_i);
   1149             if (card_info->usb_snd_mixer) {
   1150                 mixer_close(card_info->usb_snd_mixer);
   1151             }
   1152             free(node_to_item(node_i, struct usb_card_config, list));
   1153         }
   1154     }
   1155     if (audio_is_usb_in_device(device)) { // XXX not sure if we need to check for card
   1156         usbmod->is_capture_supported = false;
   1157         supported_sample_rates_mask[USB_CAPTURE] = 0;
   1158     } else {
   1159         supported_sample_rates_mask[USB_PLAYBACK] = 0;
   1160     }
   1161 
   1162 exit:
   1163     if (usb_audio_debug_enable)
   1164         usb_print_active_device();
   1165 
   1166     return;
   1167 }
   1168 
   1169 bool audio_extn_usb_alive(int card) {
   1170     char path[PATH_MAX] = {0};
   1171     // snprintf should never fail
   1172     (void) snprintf(path, sizeof(path), "/proc/asound/card%u/stream0", card);
   1173     return access(path, F_OK) == 0;
   1174 }
   1175 
   1176 unsigned long audio_extn_usb_find_service_interval(bool min,
   1177                                                    bool playback) {
   1178     struct usb_card_config *card_info;
   1179     struct usb_device_config *dev_info;
   1180     struct listnode *node_i;
   1181     struct listnode *node_j;
   1182     unsigned long interval_us = min ? ULONG_MAX : 1; // 0 is invalid
   1183     list_for_each(node_i, &usbmod->usb_card_conf_list) {
   1184         card_info = node_to_item(node_i, struct usb_card_config, list);
   1185         list_for_each(node_j, &card_info->usb_device_conf_list) {
   1186             dev_info = node_to_item(node_j, struct usb_device_config, list);
   1187             if ((playback && (dev_info->type == USB_PLAYBACK)) ||
   1188                 (!playback && (dev_info->type == USB_CAPTURE))) {
   1189                 interval_us = min ?
   1190                         _MIN(interval_us, dev_info->service_interval_us) :
   1191                         _MAX(interval_us, dev_info->service_interval_us);
   1192             }
   1193         }
   1194         break;
   1195     }
   1196     return interval_us;
   1197 }
   1198 
   1199 int audio_extn_usb_altset_for_service_interval(bool playback,
   1200                                                unsigned long service_interval,
   1201                                                uint32_t *bit_width,
   1202                                                uint32_t *sample_rate,
   1203                                                uint32_t *channel_count)
   1204 {
   1205     struct usb_card_config *card_info;
   1206     struct usb_device_config *dev_info;
   1207     struct listnode *node_i;
   1208     struct listnode *node_j;
   1209     uint32_t bw = 0;
   1210     uint32_t ch = 0;
   1211     uint32_t sr = 0;
   1212     list_for_each(node_i, &usbmod->usb_card_conf_list) {
   1213         /* Currently only apply the first playback sound card configuration */
   1214         card_info = node_to_item(node_i, struct usb_card_config, list);
   1215         list_for_each(node_j, &card_info->usb_device_conf_list) {
   1216             dev_info = node_to_item(node_j, struct usb_device_config, list);
   1217             if ((playback && dev_info->type == USB_PLAYBACK) ||
   1218                 (!playback && dev_info->type == USB_CAPTURE)) {
   1219                 if (dev_info->service_interval_us != service_interval)
   1220                     continue;
   1221                 if (dev_info->bit_width > bw) {
   1222                     bw = dev_info->bit_width;
   1223                     ch = dev_info->channel_count;
   1224                 } else if (dev_info->bit_width == bw &&
   1225                            dev_info->channel_count > ch) {
   1226                     ch = dev_info->channel_count;
   1227                 }
   1228             }
   1229         }
   1230         break;
   1231     }
   1232     if (bw == 0 || ch == 0)
   1233         return -1;
   1234     list_for_each(node_i, &usbmod->usb_card_conf_list) {
   1235         /* Currently only apply the first playback sound card configuration */
   1236         card_info = node_to_item(node_i, struct usb_card_config, list);
   1237         if ((playback && usb_output_device(card_info->usb_device_type)) ||
   1238             (!playback && usb_input_device(card_info->usb_device_type))) {
   1239             usb_get_best_match_for_sample_rate(&card_info->usb_device_conf_list,
   1240                                                bw, ch, sr, &sr,
   1241                                                service_interval,
   1242                                                true);
   1243         }
   1244         break;
   1245     }
   1246     if (sr == 0)
   1247         return -1;
   1248     *bit_width = bw;
   1249     *sample_rate = sr;
   1250     *channel_count = ch;
   1251     return 0;
   1252 }
   1253 
   1254 void audio_extn_usb_init(void *adev)
   1255 {
   1256     if (usbmod == NULL) {
   1257         usbmod = calloc(1, sizeof(struct usb_module));
   1258         if (usbmod == NULL) {
   1259             ALOGE("%s: error unable to allocate memory", __func__);
   1260             goto exit;
   1261         }
   1262     } else {
   1263         memset(usbmod, 0, sizeof(*usbmod));
   1264     }
   1265 
   1266     list_init(&usbmod->usb_card_conf_list);
   1267     usbmod->adev = (struct audio_device*)adev;
   1268     usbmod->sidetone_gain = usb_sidetone_gain;
   1269     usbmod->is_capture_supported = false;
   1270 exit:
   1271     return;
   1272 }
   1273 
   1274 void audio_extn_usb_deinit(void)
   1275 {
   1276     if (NULL != usbmod){
   1277         free(usbmod);
   1278         usbmod = NULL;
   1279     }
   1280 }
   1281 #endif /*USB_HEADSET_ENABLED end*/
   1282