Home | History | Annotate | Download | only in usbaudio
      1 /*
      2  * Copyright (C) 2012 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 "modules.usbaudio.audio_hal"
     18 /* #define LOG_NDEBUG 0 */
     19 
     20 #include <errno.h>
     21 #include <inttypes.h>
     22 #include <pthread.h>
     23 #include <stdint.h>
     24 #include <stdlib.h>
     25 #include <sys/time.h>
     26 #include <unistd.h>
     27 
     28 #include <log/log.h>
     29 #include <cutils/list.h>
     30 #include <cutils/str_parms.h>
     31 #include <cutils/properties.h>
     32 
     33 #include <hardware/audio.h>
     34 #include <hardware/audio_alsaops.h>
     35 #include <hardware/hardware.h>
     36 
     37 #include <system/audio.h>
     38 
     39 #include <tinyalsa/asoundlib.h>
     40 
     41 #include <audio_utils/channels.h>
     42 
     43 #include "alsa_device_profile.h"
     44 #include "alsa_device_proxy.h"
     45 #include "alsa_logging.h"
     46 
     47 /* Lock play & record samples rates at or above this threshold */
     48 #define RATELOCK_THRESHOLD 96000
     49 
     50 #define max(a, b) ((a) > (b) ? (a) : (b))
     51 #define min(a, b) ((a) < (b) ? (a) : (b))
     52 
     53 struct audio_device {
     54     struct audio_hw_device hw_device;
     55 
     56     pthread_mutex_t lock; /* see note below on mutex acquisition order */
     57 
     58     /* output */
     59     struct listnode output_stream_list;
     60 
     61     /* input */
     62     struct listnode input_stream_list;
     63 
     64     /* lock input & output sample rates */
     65     /*FIXME - How do we address multiple output streams? */
     66     uint32_t device_sample_rate;    // this should be a rate that is common to both input & output
     67 
     68     bool mic_muted;
     69 
     70     int32_t inputs_open; /* number of input streams currently open. */
     71 };
     72 
     73 struct stream_lock {
     74     pthread_mutex_t lock;               /* see note below on mutex acquisition order */
     75     pthread_mutex_t pre_lock;           /* acquire before lock to avoid DOS by playback thread */
     76 };
     77 
     78 struct stream_out {
     79     struct audio_stream_out stream;
     80 
     81     struct stream_lock lock;
     82 
     83     bool standby;
     84 
     85     struct audio_device *adev;           /* hardware information - only using this for the lock */
     86 
     87     alsa_device_profile profile;        /* The profile of the ALSA device connected to the stream.
     88                                          */
     89 
     90     alsa_device_proxy proxy;            /* state of the stream */
     91 
     92     unsigned hal_channel_count;         /* channel count exposed to AudioFlinger.
     93                                          * This may differ from the device channel count when
     94                                          * the device is not compatible with AudioFlinger
     95                                          * capabilities, e.g. exposes too many channels or
     96                                          * too few channels. */
     97     audio_channel_mask_t hal_channel_mask;  /* USB devices deal in channel counts, not masks
     98                                              * so the proxy doesn't have a channel_mask, but
     99                                              * audio HALs need to talk about channel masks
    100                                              * so expose the one calculated by
    101                                              * adev_open_output_stream */
    102 
    103     struct listnode list_node;
    104 
    105     void * conversion_buffer;           /* any conversions are put into here
    106                                          * they could come from here too if
    107                                          * there was a previous conversion */
    108     size_t conversion_buffer_size;      /* in bytes */
    109 };
    110 
    111 struct stream_in {
    112     struct audio_stream_in stream;
    113 
    114     struct stream_lock  lock;
    115 
    116     bool standby;
    117 
    118     struct audio_device *adev;           /* hardware information - only using this for the lock */
    119 
    120     alsa_device_profile profile;        /* The profile of the ALSA device connected to the stream.
    121                                          */
    122 
    123     alsa_device_proxy proxy;            /* state of the stream */
    124 
    125     unsigned hal_channel_count;         /* channel count exposed to AudioFlinger.
    126                                          * This may differ from the device channel count when
    127                                          * the device is not compatible with AudioFlinger
    128                                          * capabilities, e.g. exposes too many channels or
    129                                          * too few channels. */
    130     audio_channel_mask_t hal_channel_mask;  /* USB devices deal in channel counts, not masks
    131                                              * so the proxy doesn't have a channel_mask, but
    132                                              * audio HALs need to talk about channel masks
    133                                              * so expose the one calculated by
    134                                              * adev_open_input_stream */
    135 
    136     struct listnode list_node;
    137 
    138     /* We may need to read more data from the device in order to data reduce to 16bit, 4chan */
    139     void * conversion_buffer;           /* any conversions are put into here
    140                                          * they could come from here too if
    141                                          * there was a previous conversion */
    142     size_t conversion_buffer_size;      /* in bytes */
    143 };
    144 
    145 /*
    146  * Locking Helpers
    147  */
    148 /*
    149  * NOTE: when multiple mutexes have to be acquired, always take the
    150  * stream_in or stream_out mutex first, followed by the audio_device mutex.
    151  * stream pre_lock is always acquired before stream lock to prevent starvation of control thread by
    152  * higher priority playback or capture thread.
    153  */
    154 
    155 static void stream_lock_init(struct stream_lock *lock) {
    156     pthread_mutex_init(&lock->lock, (const pthread_mutexattr_t *) NULL);
    157     pthread_mutex_init(&lock->pre_lock, (const pthread_mutexattr_t *) NULL);
    158 }
    159 
    160 static void stream_lock(struct stream_lock *lock) {
    161     pthread_mutex_lock(&lock->pre_lock);
    162     pthread_mutex_lock(&lock->lock);
    163     pthread_mutex_unlock(&lock->pre_lock);
    164 }
    165 
    166 static void stream_unlock(struct stream_lock *lock) {
    167     pthread_mutex_unlock(&lock->lock);
    168 }
    169 
    170 static void device_lock(struct audio_device *adev) {
    171     pthread_mutex_lock(&adev->lock);
    172 }
    173 
    174 static int device_try_lock(struct audio_device *adev) {
    175     return pthread_mutex_trylock(&adev->lock);
    176 }
    177 
    178 static void device_unlock(struct audio_device *adev) {
    179     pthread_mutex_unlock(&adev->lock);
    180 }
    181 
    182 /*
    183  * streams list management
    184  */
    185 static void adev_add_stream_to_list(
    186     struct audio_device* adev, struct listnode* list, struct listnode* stream_node) {
    187     device_lock(adev);
    188 
    189     list_add_tail(list, stream_node);
    190 
    191     device_unlock(adev);
    192 }
    193 
    194 static void adev_remove_stream_from_list(
    195     struct audio_device* adev, struct listnode* stream_node) {
    196     device_lock(adev);
    197 
    198     list_remove(stream_node);
    199 
    200     device_unlock(adev);
    201 }
    202 
    203 /*
    204  * Extract the card and device numbers from the supplied key/value pairs.
    205  *   kvpairs    A null-terminated string containing the key/value pairs or card and device.
    206  *              i.e. "card=1;device=42"
    207  *   card   A pointer to a variable to receive the parsed-out card number.
    208  *   device A pointer to a variable to receive the parsed-out device number.
    209  * NOTE: The variables pointed to by card and device return -1 (undefined) if the
    210  *  associated key/value pair is not found in the provided string.
    211  *  Return true if the kvpairs string contain a card/device spec, false otherwise.
    212  */
    213 static bool parse_card_device_params(const char *kvpairs, int *card, int *device)
    214 {
    215     struct str_parms * parms = str_parms_create_str(kvpairs);
    216     char value[32];
    217     int param_val;
    218 
    219     // initialize to "undefined" state.
    220     *card = -1;
    221     *device = -1;
    222 
    223     param_val = str_parms_get_str(parms, "card", value, sizeof(value));
    224     if (param_val >= 0) {
    225         *card = atoi(value);
    226     }
    227 
    228     param_val = str_parms_get_str(parms, "device", value, sizeof(value));
    229     if (param_val >= 0) {
    230         *device = atoi(value);
    231     }
    232 
    233     str_parms_destroy(parms);
    234 
    235     return *card >= 0 && *device >= 0;
    236 }
    237 
    238 static char *device_get_parameters(const alsa_device_profile *profile, const char * keys)
    239 {
    240     if (profile->card < 0 || profile->device < 0) {
    241         return strdup("");
    242     }
    243 
    244     struct str_parms *query = str_parms_create_str(keys);
    245     struct str_parms *result = str_parms_create();
    246 
    247     /* These keys are from hardware/libhardware/include/audio.h */
    248     /* supported sample rates */
    249     if (str_parms_has_key(query, AUDIO_PARAMETER_STREAM_SUP_SAMPLING_RATES)) {
    250         char* rates_list = profile_get_sample_rate_strs(profile);
    251         str_parms_add_str(result, AUDIO_PARAMETER_STREAM_SUP_SAMPLING_RATES,
    252                           rates_list);
    253         free(rates_list);
    254     }
    255 
    256     /* supported channel counts */
    257     if (str_parms_has_key(query, AUDIO_PARAMETER_STREAM_SUP_CHANNELS)) {
    258         char* channels_list = profile_get_channel_count_strs(profile);
    259         str_parms_add_str(result, AUDIO_PARAMETER_STREAM_SUP_CHANNELS,
    260                           channels_list);
    261         free(channels_list);
    262     }
    263 
    264     /* supported sample formats */
    265     if (str_parms_has_key(query, AUDIO_PARAMETER_STREAM_SUP_FORMATS)) {
    266         char * format_params = profile_get_format_strs(profile);
    267         str_parms_add_str(result, AUDIO_PARAMETER_STREAM_SUP_FORMATS,
    268                           format_params);
    269         free(format_params);
    270     }
    271     str_parms_destroy(query);
    272 
    273     char* result_str = str_parms_to_str(result);
    274     str_parms_destroy(result);
    275 
    276     ALOGV("device_get_parameters = %s", result_str);
    277 
    278     return result_str;
    279 }
    280 
    281 /*
    282  * HAl Functions
    283  */
    284 /**
    285  * NOTE: when multiple mutexes have to be acquired, always respect the
    286  * following order: hw device > out stream
    287  */
    288 
    289 /*
    290  * OUT functions
    291  */
    292 static uint32_t out_get_sample_rate(const struct audio_stream *stream)
    293 {
    294     uint32_t rate = proxy_get_sample_rate(&((struct stream_out*)stream)->proxy);
    295     ALOGV("out_get_sample_rate() = %d", rate);
    296     return rate;
    297 }
    298 
    299 static int out_set_sample_rate(struct audio_stream *stream, uint32_t rate)
    300 {
    301     return 0;
    302 }
    303 
    304 static size_t out_get_buffer_size(const struct audio_stream *stream)
    305 {
    306     const struct stream_out* out = (const struct stream_out*)stream;
    307     size_t buffer_size =
    308         proxy_get_period_size(&out->proxy) * audio_stream_out_frame_size(&(out->stream));
    309     return buffer_size;
    310 }
    311 
    312 static uint32_t out_get_channels(const struct audio_stream *stream)
    313 {
    314     const struct stream_out *out = (const struct stream_out*)stream;
    315     return out->hal_channel_mask;
    316 }
    317 
    318 static audio_format_t out_get_format(const struct audio_stream *stream)
    319 {
    320     /* Note: The HAL doesn't do any FORMAT conversion at this time. It
    321      * Relies on the framework to provide data in the specified format.
    322      * This could change in the future.
    323      */
    324     alsa_device_proxy * proxy = &((struct stream_out*)stream)->proxy;
    325     audio_format_t format = audio_format_from_pcm_format(proxy_get_format(proxy));
    326     return format;
    327 }
    328 
    329 static int out_set_format(struct audio_stream *stream, audio_format_t format)
    330 {
    331     return 0;
    332 }
    333 
    334 static int out_standby(struct audio_stream *stream)
    335 {
    336     struct stream_out *out = (struct stream_out *)stream;
    337 
    338     stream_lock(&out->lock);
    339     if (!out->standby) {
    340         proxy_close(&out->proxy);
    341         out->standby = true;
    342     }
    343     stream_unlock(&out->lock);
    344     return 0;
    345 }
    346 
    347 static int out_dump(const struct audio_stream *stream, int fd) {
    348     const struct stream_out* out_stream = (const struct stream_out*) stream;
    349 
    350     if (out_stream != NULL) {
    351         dprintf(fd, "Output Profile:\n");
    352         profile_dump(&out_stream->profile, fd);
    353 
    354         dprintf(fd, "Output Proxy:\n");
    355         proxy_dump(&out_stream->proxy, fd);
    356     }
    357 
    358     return 0;
    359 }
    360 
    361 static int out_set_parameters(struct audio_stream *stream, const char *kvpairs)
    362 {
    363     ALOGV("out_set_parameters() keys:%s", kvpairs);
    364 
    365     struct stream_out *out = (struct stream_out *)stream;
    366 
    367     int ret_value = 0;
    368     int card = -1;
    369     int device = -1;
    370 
    371     if (!parse_card_device_params(kvpairs, &card, &device)) {
    372         // nothing to do
    373         return ret_value;
    374     }
    375 
    376     stream_lock(&out->lock);
    377     if (!profile_is_cached_for(&out->profile, card, device)) {
    378         /* cannot read pcm device info if playback is active */
    379         if (!out->standby)
    380             ret_value = -ENOSYS;
    381         else {
    382             int saved_card = out->profile.card;
    383             int saved_device = out->profile.device;
    384             out->profile.card = card;
    385             out->profile.device = device;
    386             ret_value = profile_read_device_info(&out->profile) ? 0 : -EINVAL;
    387             if (ret_value != 0) {
    388                 out->profile.card = saved_card;
    389                 out->profile.device = saved_device;
    390             }
    391         }
    392     }
    393 
    394     stream_unlock(&out->lock);
    395 
    396     return ret_value;
    397 }
    398 
    399 static char * out_get_parameters(const struct audio_stream *stream, const char *keys)
    400 {
    401     struct stream_out *out = (struct stream_out *)stream;
    402     stream_lock(&out->lock);
    403     char * params_str =  device_get_parameters(&out->profile, keys);
    404     stream_unlock(&out->lock);
    405     return params_str;
    406 }
    407 
    408 static uint32_t out_get_latency(const struct audio_stream_out *stream)
    409 {
    410     alsa_device_proxy * proxy = &((struct stream_out*)stream)->proxy;
    411     return proxy_get_latency(proxy);
    412 }
    413 
    414 static int out_set_volume(struct audio_stream_out *stream, float left, float right)
    415 {
    416     return -ENOSYS;
    417 }
    418 
    419 /* must be called with hw device and output stream mutexes locked */
    420 static int start_output_stream(struct stream_out *out)
    421 {
    422     ALOGV("start_output_stream(card:%d device:%d)", out->profile.card, out->profile.device);
    423 
    424     return proxy_open(&out->proxy);
    425 }
    426 
    427 static ssize_t out_write(struct audio_stream_out *stream, const void* buffer, size_t bytes)
    428 {
    429     int ret;
    430     struct stream_out *out = (struct stream_out *)stream;
    431 
    432     stream_lock(&out->lock);
    433     if (out->standby) {
    434         ret = start_output_stream(out);
    435         if (ret != 0) {
    436             goto err;
    437         }
    438         out->standby = false;
    439     }
    440 
    441     alsa_device_proxy* proxy = &out->proxy;
    442     const void * write_buff = buffer;
    443     int num_write_buff_bytes = bytes;
    444     const int num_device_channels = proxy_get_channel_count(proxy); /* what we told alsa */
    445     const int num_req_channels = out->hal_channel_count; /* what we told AudioFlinger */
    446     if (num_device_channels != num_req_channels) {
    447         /* allocate buffer */
    448         const size_t required_conversion_buffer_size =
    449                  bytes * num_device_channels / num_req_channels;
    450         if (required_conversion_buffer_size > out->conversion_buffer_size) {
    451             out->conversion_buffer_size = required_conversion_buffer_size;
    452             out->conversion_buffer = realloc(out->conversion_buffer,
    453                                              out->conversion_buffer_size);
    454         }
    455         /* convert data */
    456         const audio_format_t audio_format = out_get_format(&(out->stream.common));
    457         const unsigned sample_size_in_bytes = audio_bytes_per_sample(audio_format);
    458         num_write_buff_bytes =
    459                 adjust_channels(write_buff, num_req_channels,
    460                                 out->conversion_buffer, num_device_channels,
    461                                 sample_size_in_bytes, num_write_buff_bytes);
    462         write_buff = out->conversion_buffer;
    463     }
    464 
    465     if (write_buff != NULL && num_write_buff_bytes != 0) {
    466         proxy_write(&out->proxy, write_buff, num_write_buff_bytes);
    467     }
    468 
    469     stream_unlock(&out->lock);
    470 
    471     return bytes;
    472 
    473 err:
    474     stream_unlock(&out->lock);
    475     if (ret != 0) {
    476         usleep(bytes * 1000000 / audio_stream_out_frame_size(stream) /
    477                out_get_sample_rate(&stream->common));
    478     }
    479 
    480     return bytes;
    481 }
    482 
    483 static int out_get_render_position(const struct audio_stream_out *stream, uint32_t *dsp_frames)
    484 {
    485     return -EINVAL;
    486 }
    487 
    488 static int out_get_presentation_position(const struct audio_stream_out *stream,
    489                                          uint64_t *frames, struct timespec *timestamp)
    490 {
    491     struct stream_out *out = (struct stream_out *)stream; // discard const qualifier
    492     stream_lock(&out->lock);
    493 
    494     const alsa_device_proxy *proxy = &out->proxy;
    495     const int ret = proxy_get_presentation_position(proxy, frames, timestamp);
    496 
    497     stream_unlock(&out->lock);
    498     return ret;
    499 }
    500 
    501 static int out_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
    502 {
    503     return 0;
    504 }
    505 
    506 static int out_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
    507 {
    508     return 0;
    509 }
    510 
    511 static int out_get_next_write_timestamp(const struct audio_stream_out *stream, int64_t *timestamp)
    512 {
    513     return -EINVAL;
    514 }
    515 
    516 static int adev_open_output_stream(struct audio_hw_device *hw_dev,
    517                                    audio_io_handle_t handle,
    518                                    audio_devices_t devicesSpec __unused,
    519                                    audio_output_flags_t flags,
    520                                    struct audio_config *config,
    521                                    struct audio_stream_out **stream_out,
    522                                    const char *address /*__unused*/)
    523 {
    524     ALOGV("adev_open_output_stream() handle:0x%X, devicesSpec:0x%X, flags:0x%X, addr:%s",
    525           handle, devicesSpec, flags, address);
    526 
    527     struct stream_out *out;
    528 
    529     out = (struct stream_out *)calloc(1, sizeof(struct stream_out));
    530     if (out == NULL) {
    531         return -ENOMEM;
    532     }
    533 
    534     /* setup function pointers */
    535     out->stream.common.get_sample_rate = out_get_sample_rate;
    536     out->stream.common.set_sample_rate = out_set_sample_rate;
    537     out->stream.common.get_buffer_size = out_get_buffer_size;
    538     out->stream.common.get_channels = out_get_channels;
    539     out->stream.common.get_format = out_get_format;
    540     out->stream.common.set_format = out_set_format;
    541     out->stream.common.standby = out_standby;
    542     out->stream.common.dump = out_dump;
    543     out->stream.common.set_parameters = out_set_parameters;
    544     out->stream.common.get_parameters = out_get_parameters;
    545     out->stream.common.add_audio_effect = out_add_audio_effect;
    546     out->stream.common.remove_audio_effect = out_remove_audio_effect;
    547     out->stream.get_latency = out_get_latency;
    548     out->stream.set_volume = out_set_volume;
    549     out->stream.write = out_write;
    550     out->stream.get_render_position = out_get_render_position;
    551     out->stream.get_presentation_position = out_get_presentation_position;
    552     out->stream.get_next_write_timestamp = out_get_next_write_timestamp;
    553 
    554     stream_lock_init(&out->lock);
    555 
    556     out->adev = (struct audio_device *)hw_dev;
    557 
    558     profile_init(&out->profile, PCM_OUT);
    559 
    560     // build this to hand to the alsa_device_proxy
    561     struct pcm_config proxy_config;
    562     memset(&proxy_config, 0, sizeof(proxy_config));
    563 
    564     /* Pull out the card/device pair */
    565     parse_card_device_params(address, &out->profile.card, &out->profile.device);
    566 
    567     profile_read_device_info(&out->profile);
    568 
    569     int ret = 0;
    570 
    571     /* Rate */
    572     if (config->sample_rate == 0) {
    573         proxy_config.rate = config->sample_rate = profile_get_default_sample_rate(&out->profile);
    574     } else if (profile_is_sample_rate_valid(&out->profile, config->sample_rate)) {
    575         proxy_config.rate = config->sample_rate;
    576     } else {
    577         proxy_config.rate = config->sample_rate = profile_get_default_sample_rate(&out->profile);
    578         ret = -EINVAL;
    579     }
    580 
    581     /* TODO: This is a problem if the input does not support this rate */
    582     device_lock(out->adev);
    583     out->adev->device_sample_rate = config->sample_rate;
    584     device_unlock(out->adev);
    585 
    586     /* Format */
    587     if (config->format == AUDIO_FORMAT_DEFAULT) {
    588         proxy_config.format = profile_get_default_format(&out->profile);
    589         config->format = audio_format_from_pcm_format(proxy_config.format);
    590     } else {
    591         enum pcm_format fmt = pcm_format_from_audio_format(config->format);
    592         if (profile_is_format_valid(&out->profile, fmt)) {
    593             proxy_config.format = fmt;
    594         } else {
    595             proxy_config.format = profile_get_default_format(&out->profile);
    596             config->format = audio_format_from_pcm_format(proxy_config.format);
    597             ret = -EINVAL;
    598         }
    599     }
    600 
    601     /* Channels */
    602     bool calc_mask = false;
    603     if (config->channel_mask == AUDIO_CHANNEL_NONE) {
    604         /* query case */
    605         out->hal_channel_count = profile_get_default_channel_count(&out->profile);
    606         calc_mask = true;
    607     } else {
    608         /* explicit case */
    609         out->hal_channel_count = audio_channel_count_from_out_mask(config->channel_mask);
    610     }
    611 
    612     /* The Framework is currently limited to no more than this number of channels */
    613     if (out->hal_channel_count > FCC_8) {
    614         out->hal_channel_count = FCC_8;
    615         calc_mask = true;
    616     }
    617 
    618     if (calc_mask) {
    619         /* need to calculate the mask from channel count either because this is the query case
    620          * or the specified mask isn't valid for this device, or is more then the FW can handle */
    621         config->channel_mask = out->hal_channel_count <= FCC_2
    622             /* position mask for mono and stereo*/
    623             ? audio_channel_out_mask_from_count(out->hal_channel_count)
    624             /* otherwise indexed */
    625             : audio_channel_mask_for_index_assignment_from_count(out->hal_channel_count);
    626     }
    627 
    628     out->hal_channel_mask = config->channel_mask;
    629 
    630     // Validate the "logical" channel count against support in the "actual" profile.
    631     // if they differ, choose the "actual" number of channels *closest* to the "logical".
    632     // and store THAT in proxy_config.channels
    633     proxy_config.channels =
    634             profile_get_closest_channel_count(&out->profile, out->hal_channel_count);
    635     proxy_prepare(&out->proxy, &out->profile, &proxy_config);
    636 
    637     /* TODO The retry mechanism isn't implemented in AudioPolicyManager/AudioFlinger
    638      * So clear any errors that may have occurred above.
    639      */
    640     ret = 0;
    641 
    642     out->conversion_buffer = NULL;
    643     out->conversion_buffer_size = 0;
    644 
    645     out->standby = true;
    646 
    647     /* Save the stream for adev_dump() */
    648     adev_add_stream_to_list(out->adev, &out->adev->output_stream_list, &out->list_node);
    649 
    650     *stream_out = &out->stream;
    651 
    652     return ret;
    653 }
    654 
    655 static void adev_close_output_stream(struct audio_hw_device *hw_dev,
    656                                      struct audio_stream_out *stream)
    657 {
    658     struct stream_out *out = (struct stream_out *)stream;
    659     ALOGV("adev_close_output_stream(c:%d d:%d)", out->profile.card, out->profile.device);
    660 
    661     /* Close the pcm device */
    662     out_standby(&stream->common);
    663 
    664     free(out->conversion_buffer);
    665 
    666     out->conversion_buffer = NULL;
    667     out->conversion_buffer_size = 0;
    668 
    669     adev_remove_stream_from_list(out->adev, &out->list_node);
    670 
    671     device_lock(out->adev);
    672     out->adev->device_sample_rate = 0;
    673     device_unlock(out->adev);
    674 
    675     free(stream);
    676 }
    677 
    678 static size_t adev_get_input_buffer_size(const struct audio_hw_device *hw_dev,
    679                                          const struct audio_config *config)
    680 {
    681     /* TODO This needs to be calculated based on format/channels/rate */
    682     return 320;
    683 }
    684 
    685 /*
    686  * IN functions
    687  */
    688 static uint32_t in_get_sample_rate(const struct audio_stream *stream)
    689 {
    690     uint32_t rate = proxy_get_sample_rate(&((const struct stream_in *)stream)->proxy);
    691     ALOGV("in_get_sample_rate() = %d", rate);
    692     return rate;
    693 }
    694 
    695 static int in_set_sample_rate(struct audio_stream *stream, uint32_t rate)
    696 {
    697     ALOGV("in_set_sample_rate(%d) - NOPE", rate);
    698     return -ENOSYS;
    699 }
    700 
    701 static size_t in_get_buffer_size(const struct audio_stream *stream)
    702 {
    703     const struct stream_in * in = ((const struct stream_in*)stream);
    704     return proxy_get_period_size(&in->proxy) * audio_stream_in_frame_size(&(in->stream));
    705 }
    706 
    707 static uint32_t in_get_channels(const struct audio_stream *stream)
    708 {
    709     const struct stream_in *in = (const struct stream_in*)stream;
    710     return in->hal_channel_mask;
    711 }
    712 
    713 static audio_format_t in_get_format(const struct audio_stream *stream)
    714 {
    715      alsa_device_proxy *proxy = &((struct stream_in*)stream)->proxy;
    716      audio_format_t format = audio_format_from_pcm_format(proxy_get_format(proxy));
    717      return format;
    718 }
    719 
    720 static int in_set_format(struct audio_stream *stream, audio_format_t format)
    721 {
    722     ALOGV("in_set_format(%d) - NOPE", format);
    723 
    724     return -ENOSYS;
    725 }
    726 
    727 static int in_standby(struct audio_stream *stream)
    728 {
    729     struct stream_in *in = (struct stream_in *)stream;
    730 
    731     stream_lock(&in->lock);
    732     if (!in->standby) {
    733         proxy_close(&in->proxy);
    734         in->standby = true;
    735     }
    736     stream_unlock(&in->lock);
    737 
    738     return 0;
    739 }
    740 
    741 static int in_dump(const struct audio_stream *stream, int fd)
    742 {
    743   const struct stream_in* in_stream = (const struct stream_in*)stream;
    744   if (in_stream != NULL) {
    745       dprintf(fd, "Input Profile:\n");
    746       profile_dump(&in_stream->profile, fd);
    747 
    748       dprintf(fd, "Input Proxy:\n");
    749       proxy_dump(&in_stream->proxy, fd);
    750   }
    751 
    752   return 0;
    753 }
    754 
    755 static int in_set_parameters(struct audio_stream *stream, const char *kvpairs)
    756 {
    757     ALOGV("in_set_parameters() keys:%s", kvpairs);
    758 
    759     struct stream_in *in = (struct stream_in *)stream;
    760 
    761     int ret_value = 0;
    762     int card = -1;
    763     int device = -1;
    764 
    765     if (!parse_card_device_params(kvpairs, &card, &device)) {
    766         // nothing to do
    767         return ret_value;
    768     }
    769 
    770     stream_lock(&in->lock);
    771     device_lock(in->adev);
    772 
    773     if (card >= 0 && device >= 0 && !profile_is_cached_for(&in->profile, card, device)) {
    774         /* cannot read pcm device info if capture is active, or more than one open stream */
    775         if (!in->standby || in->adev->inputs_open > 1)
    776             ret_value = -ENOSYS;
    777         else {
    778             int saved_card = in->profile.card;
    779             int saved_device = in->profile.device;
    780             in->profile.card = card;
    781             in->profile.device = device;
    782             ret_value = profile_read_device_info(&in->profile) ? 0 : -EINVAL;
    783             if (ret_value != 0) {
    784                 ALOGE("Can't read device profile. card:%d, device:%d", card, device);
    785                 in->profile.card = saved_card;
    786                 in->profile.device = saved_device;
    787             }
    788         }
    789     }
    790 
    791     device_unlock(in->adev);
    792     stream_unlock(&in->lock);
    793 
    794     return ret_value;
    795 }
    796 
    797 static char * in_get_parameters(const struct audio_stream *stream, const char *keys)
    798 {
    799     struct stream_in *in = (struct stream_in *)stream;
    800 
    801     stream_lock(&in->lock);
    802     char * params_str =  device_get_parameters(&in->profile, keys);
    803     stream_unlock(&in->lock);
    804 
    805     return params_str;
    806 }
    807 
    808 static int in_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
    809 {
    810     return 0;
    811 }
    812 
    813 static int in_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
    814 {
    815     return 0;
    816 }
    817 
    818 static int in_set_gain(struct audio_stream_in *stream, float gain)
    819 {
    820     return 0;
    821 }
    822 
    823 /* must be called with hw device and output stream mutexes locked */
    824 static int start_input_stream(struct stream_in *in)
    825 {
    826     ALOGV("start_input_stream(card:%d device:%d)", in->profile.card, in->profile.device);
    827 
    828     return proxy_open(&in->proxy);
    829 }
    830 
    831 /* TODO mutex stuff here (see out_write) */
    832 static ssize_t in_read(struct audio_stream_in *stream, void* buffer, size_t bytes)
    833 {
    834     size_t num_read_buff_bytes = 0;
    835     void * read_buff = buffer;
    836     void * out_buff = buffer;
    837     int ret = 0;
    838 
    839     struct stream_in * in = (struct stream_in *)stream;
    840 
    841     stream_lock(&in->lock);
    842     if (in->standby) {
    843         ret = start_input_stream(in);
    844         if (ret != 0) {
    845             goto err;
    846         }
    847         in->standby = false;
    848     }
    849 
    850     /*
    851      * OK, we need to figure out how much data to read to be able to output the requested
    852      * number of bytes in the HAL format (16-bit, stereo).
    853      */
    854     num_read_buff_bytes = bytes;
    855     int num_device_channels = proxy_get_channel_count(&in->proxy); /* what we told Alsa */
    856     int num_req_channels = in->hal_channel_count; /* what we told AudioFlinger */
    857 
    858     if (num_device_channels != num_req_channels) {
    859         num_read_buff_bytes = (num_device_channels * num_read_buff_bytes) / num_req_channels;
    860     }
    861 
    862     /* Setup/Realloc the conversion buffer (if necessary). */
    863     if (num_read_buff_bytes != bytes) {
    864         if (num_read_buff_bytes > in->conversion_buffer_size) {
    865             /*TODO Remove this when AudioPolicyManger/AudioFlinger support arbitrary formats
    866               (and do these conversions themselves) */
    867             in->conversion_buffer_size = num_read_buff_bytes;
    868             in->conversion_buffer = realloc(in->conversion_buffer, in->conversion_buffer_size);
    869         }
    870         read_buff = in->conversion_buffer;
    871     }
    872 
    873     ret = proxy_read(&in->proxy, read_buff, num_read_buff_bytes);
    874     if (ret == 0) {
    875         if (num_device_channels != num_req_channels) {
    876             // ALOGV("chans dev:%d req:%d", num_device_channels, num_req_channels);
    877 
    878             out_buff = buffer;
    879             /* Num Channels conversion */
    880             if (num_device_channels != num_req_channels) {
    881                 audio_format_t audio_format = in_get_format(&(in->stream.common));
    882                 unsigned sample_size_in_bytes = audio_bytes_per_sample(audio_format);
    883 
    884                 num_read_buff_bytes =
    885                     adjust_channels(read_buff, num_device_channels,
    886                                     out_buff, num_req_channels,
    887                                     sample_size_in_bytes, num_read_buff_bytes);
    888             }
    889         }
    890 
    891         /* no need to acquire in->adev->lock to read mic_muted here as we don't change its state */
    892         if (num_read_buff_bytes > 0 && in->adev->mic_muted)
    893             memset(buffer, 0, num_read_buff_bytes);
    894     } else {
    895         num_read_buff_bytes = 0; // reset the value after USB headset is unplugged
    896     }
    897 
    898 err:
    899     stream_unlock(&in->lock);
    900     return num_read_buff_bytes;
    901 }
    902 
    903 static uint32_t in_get_input_frames_lost(struct audio_stream_in *stream)
    904 {
    905     return 0;
    906 }
    907 
    908 static int in_get_capture_position(const struct audio_stream_in *stream,
    909                                    int64_t *frames, int64_t *time)
    910 {
    911     struct stream_in *in = (struct stream_in *)stream; // discard const qualifier
    912     stream_lock(&in->lock);
    913 
    914     const alsa_device_proxy *proxy = &in->proxy;
    915     const int ret = proxy_get_capture_position(proxy, frames, time);
    916 
    917     stream_unlock(&in->lock);
    918     return ret;
    919 }
    920 
    921 static int in_get_active_microphones(const struct audio_stream_in *stream,
    922                                      struct audio_microphone_characteristic_t *mic_array,
    923                                      size_t *mic_count) {
    924     (void)stream;
    925     (void)mic_array;
    926     (void)mic_count;
    927 
    928     return -ENOSYS;
    929 }
    930 
    931 static int in_set_microphone_direction(const struct audio_stream_in *stream,
    932                                            audio_microphone_direction_t dir) {
    933     (void)stream;
    934     (void)dir;
    935     ALOGV("---- in_set_microphone_direction()");
    936     return -ENOSYS;
    937 }
    938 
    939 static int in_set_microphone_field_dimension(const struct audio_stream_in *stream, float zoom) {
    940     (void)zoom;
    941     ALOGV("---- in_set_microphone_field_dimension()");
    942     return -ENOSYS;
    943 }
    944 
    945 static int adev_open_input_stream(struct audio_hw_device *hw_dev,
    946                                   audio_io_handle_t handle,
    947                                   audio_devices_t devicesSpec __unused,
    948                                   struct audio_config *config,
    949                                   struct audio_stream_in **stream_in,
    950                                   audio_input_flags_t flags __unused,
    951                                   const char *address,
    952                                   audio_source_t source __unused)
    953 {
    954     ALOGV("adev_open_input_stream() rate:%" PRIu32 ", chanMask:0x%" PRIX32 ", fmt:%" PRIu8,
    955           config->sample_rate, config->channel_mask, config->format);
    956 
    957     /* Pull out the card/device pair */
    958     int32_t card, device;
    959     if (!parse_card_device_params(address, &card, &device)) {
    960         ALOGW("%s fail - invalid address %s", __func__, address);
    961         *stream_in = NULL;
    962         return -EINVAL;
    963     }
    964 
    965     struct stream_in * const in = (struct stream_in *)calloc(1, sizeof(struct stream_in));
    966     if (in == NULL) {
    967         *stream_in = NULL;
    968         return -ENOMEM;
    969     }
    970 
    971     /* setup function pointers */
    972     in->stream.common.get_sample_rate = in_get_sample_rate;
    973     in->stream.common.set_sample_rate = in_set_sample_rate;
    974     in->stream.common.get_buffer_size = in_get_buffer_size;
    975     in->stream.common.get_channels = in_get_channels;
    976     in->stream.common.get_format = in_get_format;
    977     in->stream.common.set_format = in_set_format;
    978     in->stream.common.standby = in_standby;
    979     in->stream.common.dump = in_dump;
    980     in->stream.common.set_parameters = in_set_parameters;
    981     in->stream.common.get_parameters = in_get_parameters;
    982     in->stream.common.add_audio_effect = in_add_audio_effect;
    983     in->stream.common.remove_audio_effect = in_remove_audio_effect;
    984 
    985     in->stream.set_gain = in_set_gain;
    986     in->stream.read = in_read;
    987     in->stream.get_input_frames_lost = in_get_input_frames_lost;
    988     in->stream.get_capture_position = in_get_capture_position;
    989 
    990     in->stream.get_active_microphones = in_get_active_microphones;
    991     in->stream.set_microphone_direction = in_set_microphone_direction;
    992     in->stream.set_microphone_field_dimension = in_set_microphone_field_dimension;
    993 
    994     stream_lock_init(&in->lock);
    995 
    996     in->adev = (struct audio_device *)hw_dev;
    997 
    998     profile_init(&in->profile, PCM_IN);
    999 
   1000     struct pcm_config proxy_config;
   1001     memset(&proxy_config, 0, sizeof(proxy_config));
   1002 
   1003     int ret = 0;
   1004     device_lock(in->adev);
   1005     int num_open_inputs = in->adev->inputs_open;
   1006     device_unlock(in->adev);
   1007 
   1008     /* Check if an input stream is already open */
   1009     if (num_open_inputs > 0) {
   1010         if (!profile_is_cached_for(&in->profile, card, device)) {
   1011             ALOGW("%s fail - address card:%d device:%d doesn't match existing profile",
   1012                     __func__, card, device);
   1013             ret = -EINVAL;
   1014         }
   1015     } else {
   1016         /* Read input profile only if necessary */
   1017         in->profile.card = card;
   1018         in->profile.device = device;
   1019         if (!profile_read_device_info(&in->profile)) {
   1020             ALOGW("%s fail - cannot read profile", __func__);
   1021             ret = -EINVAL;
   1022         }
   1023     }
   1024     if (ret != 0) {
   1025         free(in);
   1026         *stream_in = NULL;
   1027         return ret;
   1028     }
   1029 
   1030     /* Rate */
   1031     int request_config_rate = config->sample_rate;
   1032     if (config->sample_rate == 0) {
   1033         config->sample_rate = profile_get_default_sample_rate(&in->profile);
   1034     }
   1035 
   1036     if (in->adev->device_sample_rate != 0 &&   /* we are playing, so lock the rate if possible */
   1037         in->adev->device_sample_rate >= RATELOCK_THRESHOLD) {/* but only for high sample rates */
   1038         if (config->sample_rate != in->adev->device_sample_rate) {
   1039             unsigned highest_rate = profile_get_highest_sample_rate(&in->profile);
   1040             if (highest_rate == 0) {
   1041                 ret = -EINVAL; /* error with device */
   1042             } else {
   1043                 proxy_config.rate = config->sample_rate =
   1044                         min(highest_rate, in->adev->device_sample_rate);
   1045                 if (request_config_rate != 0 && proxy_config.rate != config->sample_rate) {
   1046                     /* Changing the requested rate */
   1047                     ret = -EINVAL;
   1048                 } else {
   1049                     /* Everything AOK! */
   1050                     ret = 0;
   1051                 }
   1052             }
   1053         }
   1054     } else if (profile_is_sample_rate_valid(&in->profile, config->sample_rate)) {
   1055         proxy_config.rate = config->sample_rate;
   1056     } else {
   1057         proxy_config.rate = config->sample_rate = profile_get_default_sample_rate(&in->profile);
   1058         ret = -EINVAL;
   1059     }
   1060 
   1061     /* Format */
   1062     if (config->format == AUDIO_FORMAT_DEFAULT) {
   1063         proxy_config.format = profile_get_default_format(&in->profile);
   1064         config->format = audio_format_from_pcm_format(proxy_config.format);
   1065     } else {
   1066         enum pcm_format fmt = pcm_format_from_audio_format(config->format);
   1067         if (profile_is_format_valid(&in->profile, fmt)) {
   1068             proxy_config.format = fmt;
   1069         } else {
   1070             proxy_config.format = profile_get_default_format(&in->profile);
   1071             config->format = audio_format_from_pcm_format(proxy_config.format);
   1072             ret = -EINVAL;
   1073         }
   1074     }
   1075 
   1076     /* Channels */
   1077     bool calc_mask = false;
   1078     if (config->channel_mask == AUDIO_CHANNEL_NONE) {
   1079         /* query case */
   1080         in->hal_channel_count = profile_get_default_channel_count(&in->profile);
   1081         calc_mask = true;
   1082     } else {
   1083         /* explicit case */
   1084         in->hal_channel_count = audio_channel_count_from_in_mask(config->channel_mask);
   1085     }
   1086 
   1087     /* The Framework is currently limited to no more than this number of channels */
   1088     if (in->hal_channel_count > FCC_8) {
   1089         in->hal_channel_count = FCC_8;
   1090         calc_mask = true;
   1091     }
   1092 
   1093     if (calc_mask) {
   1094         /* need to calculate the mask from channel count either because this is the query case
   1095          * or the specified mask isn't valid for this device, or is more then the FW can handle */
   1096         in->hal_channel_mask = in->hal_channel_count <= FCC_2
   1097             /* position mask for mono & stereo */
   1098             ? audio_channel_in_mask_from_count(in->hal_channel_count)
   1099             /* otherwise indexed */
   1100             : audio_channel_mask_for_index_assignment_from_count(in->hal_channel_count);
   1101 
   1102         // if we change the mask...
   1103         if (in->hal_channel_mask != config->channel_mask &&
   1104             config->channel_mask != AUDIO_CHANNEL_NONE) {
   1105             config->channel_mask = in->hal_channel_mask;
   1106             ret = -EINVAL;
   1107         }
   1108     } else {
   1109         in->hal_channel_mask = config->channel_mask;
   1110     }
   1111 
   1112     if (ret == 0) {
   1113         // Validate the "logical" channel count against support in the "actual" profile.
   1114         // if they differ, choose the "actual" number of channels *closest* to the "logical".
   1115         // and store THAT in proxy_config.channels
   1116         proxy_config.channels =
   1117                 profile_get_closest_channel_count(&in->profile, in->hal_channel_count);
   1118         ret = proxy_prepare(&in->proxy, &in->profile, &proxy_config);
   1119         if (ret == 0) {
   1120             in->standby = true;
   1121 
   1122             in->conversion_buffer = NULL;
   1123             in->conversion_buffer_size = 0;
   1124 
   1125             *stream_in = &in->stream;
   1126 
   1127             /* Save this for adev_dump() */
   1128             adev_add_stream_to_list(in->adev, &in->adev->input_stream_list, &in->list_node);
   1129         } else {
   1130             ALOGW("proxy_prepare error %d", ret);
   1131             unsigned channel_count = proxy_get_channel_count(&in->proxy);
   1132             config->channel_mask = channel_count <= FCC_2
   1133                 ? audio_channel_in_mask_from_count(channel_count)
   1134                 : audio_channel_mask_for_index_assignment_from_count(channel_count);
   1135             config->format = audio_format_from_pcm_format(proxy_get_format(&in->proxy));
   1136             config->sample_rate = proxy_get_sample_rate(&in->proxy);
   1137         }
   1138     }
   1139 
   1140     if (ret != 0) {
   1141         // Deallocate this stream on error, because AudioFlinger won't call
   1142         // adev_close_input_stream() in this case.
   1143         *stream_in = NULL;
   1144         free(in);
   1145     }
   1146 
   1147     device_lock(in->adev);
   1148     ++in->adev->inputs_open;
   1149     device_unlock(in->adev);
   1150 
   1151     return ret;
   1152 }
   1153 
   1154 static void adev_close_input_stream(struct audio_hw_device *hw_dev,
   1155                                     struct audio_stream_in *stream)
   1156 {
   1157     struct stream_in *in = (struct stream_in *)stream;
   1158     ALOGV("adev_close_input_stream(c:%d d:%d)", in->profile.card, in->profile.device);
   1159 
   1160     adev_remove_stream_from_list(in->adev, &in->list_node);
   1161 
   1162     device_lock(in->adev);
   1163     --in->adev->inputs_open;
   1164     LOG_ALWAYS_FATAL_IF(in->adev->inputs_open < 0,
   1165             "invalid inputs_open: %d", in->adev->inputs_open);
   1166     device_unlock(in->adev);
   1167 
   1168     /* Close the pcm device */
   1169     in_standby(&stream->common);
   1170 
   1171     free(in->conversion_buffer);
   1172 
   1173     free(stream);
   1174 }
   1175 
   1176 /*
   1177  * ADEV Functions
   1178  */
   1179 static int adev_set_parameters(struct audio_hw_device *hw_dev, const char *kvpairs)
   1180 {
   1181     return 0;
   1182 }
   1183 
   1184 static char * adev_get_parameters(const struct audio_hw_device *hw_dev, const char *keys)
   1185 {
   1186     return strdup("");
   1187 }
   1188 
   1189 static int adev_init_check(const struct audio_hw_device *hw_dev)
   1190 {
   1191     return 0;
   1192 }
   1193 
   1194 static int adev_set_voice_volume(struct audio_hw_device *hw_dev, float volume)
   1195 {
   1196     return -ENOSYS;
   1197 }
   1198 
   1199 static int adev_set_master_volume(struct audio_hw_device *hw_dev, float volume)
   1200 {
   1201     return -ENOSYS;
   1202 }
   1203 
   1204 static int adev_set_mode(struct audio_hw_device *hw_dev, audio_mode_t mode)
   1205 {
   1206     return 0;
   1207 }
   1208 
   1209 static int adev_set_mic_mute(struct audio_hw_device *hw_dev, bool state)
   1210 {
   1211     struct audio_device * adev = (struct audio_device *)hw_dev;
   1212     device_lock(adev);
   1213     adev->mic_muted = state;
   1214     device_unlock(adev);
   1215     return -ENOSYS;
   1216 }
   1217 
   1218 static int adev_get_mic_mute(const struct audio_hw_device *hw_dev, bool *state)
   1219 {
   1220     return -ENOSYS;
   1221 }
   1222 
   1223 static int adev_dump(const struct audio_hw_device *device, int fd)
   1224 {
   1225     dprintf(fd, "\nUSB audio module:\n");
   1226 
   1227     struct audio_device* adev = (struct audio_device*)device;
   1228     const int kNumRetries = 3;
   1229     const int kSleepTimeMS = 500;
   1230 
   1231     // use device_try_lock() in case we dumpsys during a deadlock
   1232     int retry = kNumRetries;
   1233     while (retry > 0 && device_try_lock(adev) != 0) {
   1234       sleep(kSleepTimeMS);
   1235       retry--;
   1236     }
   1237 
   1238     if (retry > 0) {
   1239         if (list_empty(&adev->output_stream_list)) {
   1240             dprintf(fd, "  No output streams.\n");
   1241         } else {
   1242             struct listnode* node;
   1243             list_for_each(node, &adev->output_stream_list) {
   1244                 struct audio_stream* stream =
   1245                         (struct audio_stream *)node_to_item(node, struct stream_out, list_node);
   1246                 out_dump(stream, fd);
   1247             }
   1248         }
   1249 
   1250         if (list_empty(&adev->input_stream_list)) {
   1251             dprintf(fd, "\n  No input streams.\n");
   1252         } else {
   1253             struct listnode* node;
   1254             list_for_each(node, &adev->input_stream_list) {
   1255                 struct audio_stream* stream =
   1256                         (struct audio_stream *)node_to_item(node, struct stream_in, list_node);
   1257                 in_dump(stream, fd);
   1258             }
   1259         }
   1260 
   1261         device_unlock(adev);
   1262     } else {
   1263         // Couldn't lock
   1264         dprintf(fd, "  Could not obtain device lock.\n");
   1265     }
   1266 
   1267     return 0;
   1268 }
   1269 
   1270 static int adev_close(hw_device_t *device)
   1271 {
   1272     free(device);
   1273 
   1274     return 0;
   1275 }
   1276 
   1277 static int adev_open(const hw_module_t* module, const char* name, hw_device_t** device)
   1278 {
   1279     if (strcmp(name, AUDIO_HARDWARE_INTERFACE) != 0)
   1280         return -EINVAL;
   1281 
   1282     struct audio_device *adev = calloc(1, sizeof(struct audio_device));
   1283     if (!adev)
   1284         return -ENOMEM;
   1285 
   1286     pthread_mutex_init(&adev->lock, (const pthread_mutexattr_t *) NULL);
   1287 
   1288     list_init(&adev->output_stream_list);
   1289     list_init(&adev->input_stream_list);
   1290 
   1291     adev->hw_device.common.tag = HARDWARE_DEVICE_TAG;
   1292     adev->hw_device.common.version = AUDIO_DEVICE_API_VERSION_2_0;
   1293     adev->hw_device.common.module = (struct hw_module_t *)module;
   1294     adev->hw_device.common.close = adev_close;
   1295 
   1296     adev->hw_device.init_check = adev_init_check;
   1297     adev->hw_device.set_voice_volume = adev_set_voice_volume;
   1298     adev->hw_device.set_master_volume = adev_set_master_volume;
   1299     adev->hw_device.set_mode = adev_set_mode;
   1300     adev->hw_device.set_mic_mute = adev_set_mic_mute;
   1301     adev->hw_device.get_mic_mute = adev_get_mic_mute;
   1302     adev->hw_device.set_parameters = adev_set_parameters;
   1303     adev->hw_device.get_parameters = adev_get_parameters;
   1304     adev->hw_device.get_input_buffer_size = adev_get_input_buffer_size;
   1305     adev->hw_device.open_output_stream = adev_open_output_stream;
   1306     adev->hw_device.close_output_stream = adev_close_output_stream;
   1307     adev->hw_device.open_input_stream = adev_open_input_stream;
   1308     adev->hw_device.close_input_stream = adev_close_input_stream;
   1309     adev->hw_device.dump = adev_dump;
   1310 
   1311     *device = &adev->hw_device.common;
   1312 
   1313     return 0;
   1314 }
   1315 
   1316 static struct hw_module_methods_t hal_module_methods = {
   1317     .open = adev_open,
   1318 };
   1319 
   1320 struct audio_module HAL_MODULE_INFO_SYM = {
   1321     .common = {
   1322         .tag = HARDWARE_MODULE_TAG,
   1323         .module_api_version = AUDIO_MODULE_API_VERSION_0_1,
   1324         .hal_api_version = HARDWARE_HAL_API_VERSION,
   1325         .id = AUDIO_HARDWARE_MODULE_ID,
   1326         .name = "USB audio HW HAL",
   1327         .author = "The Android Open Source Project",
   1328         .methods = &hal_module_methods,
   1329     },
   1330 };
   1331