Home | History | Annotate | Download | only in audio
      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 "audio_hw_primary"
     18 /*#define LOG_NDEBUG 0*/
     19 
     20 #include <errno.h>
     21 #include <pthread.h>
     22 #include <stdint.h>
     23 #include <stdlib.h>
     24 #include <sys/time.h>
     25 #include <fcntl.h>
     26 
     27 #include <cutils/log.h>
     28 #include <cutils/properties.h>
     29 #include <cutils/str_parms.h>
     30 
     31 #include <hardware/audio.h>
     32 #include <hardware/hardware.h>
     33 
     34 #include <linux/videodev2.h>
     35 #include <videodev2_exynos_media.h>
     36 
     37 #include <system/audio.h>
     38 
     39 #include <tinyalsa/asoundlib.h>
     40 
     41 #include <audio_utils/resampler.h>
     42 #include <audio_route/audio_route.h>
     43 
     44 #include <BubbleLevel.h>
     45 
     46 #include <eS305VoiceProcessing.h>
     47 
     48 #define PCM_CARD 0
     49 #define PCM_CARD_SPDIF 1
     50 #define PCM_TOTAL 2
     51 
     52 #define PCM_DEVICE 0
     53 #define PCM_DEVICE_DEEP 1
     54 #define PCM_DEVICE_VOICE 2
     55 #define PCM_DEVICE_SCO 3
     56 
     57 #define MIXER_CARD 0
     58 
     59 /* duration in ms of volume ramp applied when starting capture to remove plop */
     60 #define CAPTURE_START_RAMP_MS 100
     61 
     62 /* default sampling for HDMI multichannel output */
     63 #define HDMI_MULTI_DEFAULT_SAMPLING_RATE  44100
     64 /* maximum number of channel mask configurations supported. Currently the primary
     65  * output only supports 1 (stereo) and the multi channel HDMI output 2 (5.1 and 7.1) */
     66 #define MAX_SUPPORTED_CHANNEL_MASKS 2
     67 
     68 #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
     69 
     70 struct pcm_config pcm_config = {
     71     .channels = 2,
     72     .rate = 44100,
     73     .period_size = 256,
     74     .period_count = 2,
     75     .format = PCM_FORMAT_S16_LE,
     76 };
     77 
     78 struct pcm_config pcm_config_in = {
     79     .channels = 2,
     80     .rate = 44100,
     81     .period_size = 1024,
     82     .period_count = 2,
     83     .format = PCM_FORMAT_S16_LE,
     84 };
     85 
     86 struct pcm_config pcm_config_in_low_latency = {
     87     .channels = 2,
     88     .rate = 44100,
     89     .period_size = 256,
     90     .period_count = 2,
     91     .format = PCM_FORMAT_S16_LE,
     92 };
     93 
     94 struct pcm_config pcm_config_sco = {
     95     .channels = 1,
     96     .rate = 8000,
     97     .period_size = 128,
     98     .period_count = 2,
     99     .format = PCM_FORMAT_S16_LE,
    100 };
    101 
    102 struct pcm_config pcm_config_deep = {
    103     .channels = 2,
    104     .rate = 44100,
    105     /* FIXME This is an arbitrary number, may change.
    106      * Dynamic configuration based on screen on/off is not implemented;
    107      * let's see what power consumption is first to see if necessary.
    108      */
    109     .period_size = 8192,
    110     .period_count = 2,
    111     .format = PCM_FORMAT_S16_LE,
    112 };
    113 
    114 struct pcm_config pcm_config_hdmi_multi = {
    115     .channels = 6, /* changed when the stream is opened */
    116     .rate = HDMI_MULTI_DEFAULT_SAMPLING_RATE,
    117     .period_size = 1024,
    118     .period_count = 4,
    119     .format = PCM_FORMAT_S16_LE,
    120 };
    121 
    122 enum output_type {
    123     OUTPUT_DEEP_BUF,      // deep PCM buffers output stream
    124     OUTPUT_LOW_LATENCY,   // low latency output stream
    125     OUTPUT_HDMI,          // HDMI multi channel
    126     OUTPUT_TOTAL
    127 };
    128 
    129 struct audio_device {
    130     struct audio_hw_device hw_device;
    131 
    132     pthread_mutex_t lock; /* see note below on mutex acquisition order */
    133     audio_devices_t out_device; /* "or" of stream_out.device for all active output streams */
    134     audio_devices_t in_device;
    135     bool mic_mute;
    136     struct audio_route *ar;
    137     audio_source_t input_source;
    138     int cur_route_id;     /* current route ID: combination of input source
    139                            * and output device IDs */
    140     struct pcm *pcm_voice_out;
    141     struct pcm *pcm_sco_out;
    142     struct pcm *pcm_voice_in;
    143     struct pcm *pcm_sco_in;
    144     int es305_preset;
    145     int es305_new_mode;
    146     int es305_mode;
    147     int hdmi_drv_fd;    /* either an fd >= 0 or -1 */
    148     struct bubble_level *bubble_level;
    149     audio_channel_mask_t in_channel_mask;
    150     unsigned int sco_on_count;
    151 
    152     struct stream_out *outputs[OUTPUT_TOTAL];
    153     pthread_mutex_t lock_outputs; /* see note below on mutex acquisition order */
    154 };
    155 
    156 struct stream_out {
    157     struct audio_stream_out stream;
    158 
    159     pthread_mutex_t lock; /* see note below on mutex acquisition order */
    160     struct pcm *pcm[PCM_TOTAL];
    161     struct pcm_config config;
    162     unsigned int pcm_device;
    163     bool standby; /* true if all PCMs are inactive */
    164     audio_devices_t device;
    165     /* FIXME: when HDMI multichannel output is active, other outputs must be disabled as
    166      * HDMI and WM1811 share the same I2S. This means that notifications and other sounds are
    167      * silent when watching a 5.1 movie. */
    168     bool disabled;
    169     audio_channel_mask_t channel_mask;
    170     /* Array of supported channel mask configurations. +1 so that the last entry is always 0 */
    171     audio_channel_mask_t supported_channel_masks[MAX_SUPPORTED_CHANNEL_MASKS + 1];
    172     bool muted;
    173     uint64_t written; /* total frames written, not cleared when entering standby */
    174 
    175     struct audio_device *dev;
    176 };
    177 
    178 struct stream_in {
    179     struct audio_stream_in stream;
    180 
    181     pthread_mutex_t lock; /* see note below on mutex acquisition order */
    182     struct pcm *pcm;
    183     bool standby;
    184 
    185     unsigned int requested_rate;
    186     struct resampler_itfe *resampler;
    187     struct resampler_buffer_provider buf_provider;
    188     int16_t *buffer;
    189     size_t frames_in;
    190     int read_status;
    191     audio_source_t input_source;
    192     audio_io_handle_t io_handle;
    193     audio_devices_t device;
    194     uint16_t ramp_vol;
    195     uint16_t ramp_step;
    196     size_t  ramp_frames;
    197     audio_channel_mask_t channel_mask;
    198     audio_input_flags_t flags;
    199     struct pcm_config *config;
    200 
    201     struct audio_device *dev;
    202 };
    203 
    204 #define STRING_TO_ENUM(string) { #string, string }
    205 
    206 struct string_to_enum {
    207     const char *name;
    208     uint32_t value;
    209 };
    210 
    211 const struct string_to_enum out_channels_name_to_enum_table[] = {
    212     STRING_TO_ENUM(AUDIO_CHANNEL_OUT_STEREO),
    213     STRING_TO_ENUM(AUDIO_CHANNEL_OUT_5POINT1),
    214     STRING_TO_ENUM(AUDIO_CHANNEL_OUT_7POINT1),
    215 };
    216 
    217 enum {
    218     OUT_DEVICE_SPEAKER,
    219     OUT_DEVICE_HEADSET,
    220     OUT_DEVICE_HEADPHONES,
    221     OUT_DEVICE_BT_SCO,
    222     OUT_DEVICE_SPEAKER_AND_HEADSET,
    223     OUT_DEVICE_TAB_SIZE,           /* number of rows in route_configs[][] */
    224     OUT_DEVICE_NONE,
    225     OUT_DEVICE_CNT
    226 };
    227 
    228 enum {
    229     IN_SOURCE_MIC,
    230     IN_SOURCE_CAMCORDER,
    231     IN_SOURCE_VOICE_RECOGNITION,
    232     IN_SOURCE_VOICE_COMMUNICATION,
    233     IN_SOURCE_TAB_SIZE,            /* number of lines in route_configs[][] */
    234     IN_SOURCE_NONE,
    235     IN_SOURCE_CNT
    236 };
    237 
    238 enum {
    239     ES305_MODE_DEFAULT,
    240     ES305_MODE_LEVEL,
    241     ES305_NUM_MODES,
    242 };
    243 
    244 int get_output_device_id(audio_devices_t device)
    245 {
    246     if (device == AUDIO_DEVICE_NONE)
    247         return OUT_DEVICE_NONE;
    248 
    249     if (popcount(device) == 2) {
    250         if ((device == (AUDIO_DEVICE_OUT_SPEAKER |
    251                        AUDIO_DEVICE_OUT_WIRED_HEADSET)) ||
    252                 (device == (AUDIO_DEVICE_OUT_SPEAKER |
    253                         AUDIO_DEVICE_OUT_WIRED_HEADPHONE)))
    254             return OUT_DEVICE_SPEAKER_AND_HEADSET;
    255         else
    256             return OUT_DEVICE_NONE;
    257     }
    258 
    259     if (popcount(device) != 1)
    260         return OUT_DEVICE_NONE;
    261 
    262     switch (device) {
    263     case AUDIO_DEVICE_OUT_SPEAKER:
    264         return OUT_DEVICE_SPEAKER;
    265     case AUDIO_DEVICE_OUT_WIRED_HEADSET:
    266         return OUT_DEVICE_HEADSET;
    267     case AUDIO_DEVICE_OUT_WIRED_HEADPHONE:
    268         return OUT_DEVICE_HEADPHONES;
    269     case AUDIO_DEVICE_OUT_BLUETOOTH_SCO:
    270     case AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET:
    271     case AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT:
    272         return OUT_DEVICE_BT_SCO;
    273     default:
    274         return OUT_DEVICE_NONE;
    275     }
    276 }
    277 
    278 int get_input_source_id(audio_source_t source)
    279 {
    280     switch (source) {
    281     case AUDIO_SOURCE_DEFAULT:
    282         return IN_SOURCE_NONE;
    283     case AUDIO_SOURCE_MIC:
    284         return IN_SOURCE_MIC;
    285     case AUDIO_SOURCE_CAMCORDER:
    286         return IN_SOURCE_CAMCORDER;
    287     case AUDIO_SOURCE_VOICE_RECOGNITION:
    288         return IN_SOURCE_VOICE_RECOGNITION;
    289     case AUDIO_SOURCE_VOICE_COMMUNICATION:
    290         return IN_SOURCE_VOICE_COMMUNICATION;
    291     default:
    292         return IN_SOURCE_NONE;
    293     }
    294 }
    295 
    296 struct route_config {
    297     const char * const output_route;
    298     const char * const input_route;
    299     int es305_preset[ES305_NUM_MODES]; // es305 preset for this route.
    300                                        // -1 means es305 bypass
    301 };
    302 
    303 const struct route_config media_speaker = {
    304     "media-speaker",
    305     "media-main-mic",
    306     { ES305_PRESET_OFF,
    307       ES305_PRESET_OFF }
    308 };
    309 
    310 const struct route_config media_headphones = {
    311     "media-headphones",
    312     "media-main-mic",
    313     { ES305_PRESET_OFF,
    314       ES305_PRESET_OFF }
    315 };
    316 
    317 const struct route_config media_headset = {
    318     "media-headphones",
    319     "media-headset-mic",
    320     { ES305_PRESET_OFF,
    321       ES305_PRESET_OFF }
    322 };
    323 
    324 const struct route_config camcorder_speaker = {
    325     "media-speaker",
    326     "media-second-mic",
    327     { ES305_PRESET_CAMCORDER,
    328       ES305_PRESET_CAMCORDER }
    329 };
    330 
    331 const struct route_config camcorder_headphones = {
    332     "media-headphones",
    333     "media-second-mic",
    334     { ES305_PRESET_CAMCORDER,
    335       ES305_PRESET_CAMCORDER }
    336 };
    337 
    338 const struct route_config voice_rec_speaker = {
    339     "voice-rec-speaker",
    340     "voice-rec-main-mic",
    341     { ES305_PRESET_ASRA_HANDHELD,
    342       ES305_PRESET_ASRA_DESKTOP }
    343 };
    344 
    345 const struct route_config voice_rec_headphones = {
    346     "voice-rec-headphones",
    347     "voice-rec-main-mic",
    348     { ES305_PRESET_ASRA_HANDHELD,
    349       ES305_PRESET_ASRA_DESKTOP }
    350 };
    351 
    352 const struct route_config voice_rec_headset = {
    353     "voice-rec-headphones",
    354     "voice-rec-headset-mic",
    355     { ES305_PRESET_ASRA_HEADSET,
    356       ES305_PRESET_ASRA_HEADSET }
    357 };
    358 
    359 const struct route_config communication_speaker = {
    360     "communication-speaker",
    361     "communication-main-mic",
    362     { ES305_PRESET_VOIP_HANDHELD,
    363       ES305_PRESET_VOIP_DESKTOP }
    364 };
    365 
    366 const struct route_config communication_headphones = {
    367     "communication-headphones",
    368     "communication-main-mic",
    369     { ES305_PRESET_VOIP_HEADPHONES,
    370       ES305_PRESET_VOIP_HP_DESKTOP}
    371 };
    372 
    373 const struct route_config communication_headset = {
    374     "communication-headphones",
    375     "communication-headset-mic",
    376     { ES305_PRESET_VOIP_HEADSET,
    377       ES305_PRESET_VOIP_HEADSET }
    378 };
    379 
    380 const struct route_config speaker_and_headphones = {
    381     "speaker-and-headphones",
    382     "main-mic",
    383     { ES305_PRESET_CURRENT,
    384       ES305_PRESET_CURRENT }
    385 };
    386 
    387 const struct route_config bluetooth_sco = {
    388     "bt-sco-headset",
    389     "bt-sco-mic",
    390     { ES305_PRESET_OFF,
    391       ES305_PRESET_OFF }
    392 };
    393 
    394 const struct route_config * const route_configs[IN_SOURCE_TAB_SIZE]
    395                                                [OUT_DEVICE_TAB_SIZE] = {
    396     {   /* IN_SOURCE_MIC */
    397         &media_speaker,             /* OUT_DEVICE_SPEAKER */
    398         &media_headset,             /* OUT_DEVICE_HEADSET */
    399         &media_headphones,          /* OUT_DEVICE_HEADPHONES */
    400         &bluetooth_sco,             /* OUT_DEVICE_BT_SCO */
    401         &speaker_and_headphones     /* OUT_DEVICE_SPEAKER_AND_HEADSET */
    402     },
    403     {   /* IN_SOURCE_CAMCORDER */
    404         &camcorder_speaker,         /* OUT_DEVICE_SPEAKER */
    405         &camcorder_headphones,      /* OUT_DEVICE_HEADSET */
    406         &camcorder_headphones,      /* OUT_DEVICE_HEADPHONES */
    407         &bluetooth_sco,             /* OUT_DEVICE_BT_SCO */
    408         &speaker_and_headphones     /* OUT_DEVICE_SPEAKER_AND_HEADSET */
    409     },
    410     {   /* IN_SOURCE_VOICE_RECOGNITION */
    411         &voice_rec_speaker,         /* OUT_DEVICE_SPEAKER */
    412         &voice_rec_headset,         /* OUT_DEVICE_HEADSET */
    413         &voice_rec_headphones,      /* OUT_DEVICE_HEADPHONES */
    414         &bluetooth_sco,             /* OUT_DEVICE_BT_SCO */
    415         &speaker_and_headphones     /* OUT_DEVICE_SPEAKER_AND_HEADSET */
    416     },
    417     {   /* IN_SOURCE_VOICE_COMMUNICATION */
    418         &communication_speaker,     /* OUT_DEVICE_SPEAKER */
    419         &communication_headset,     /* OUT_DEVICE_HEADSET */
    420         &communication_headphones,  /* OUT_DEVICE_HEADPHONES */
    421         &bluetooth_sco,             /* OUT_DEVICE_BT_SCO */
    422         &speaker_and_headphones     /* OUT_DEVICE_SPEAKER_AND_HEADSET */
    423     }
    424 };
    425 
    426 static void do_out_standby(struct stream_out *out);
    427 
    428 /**
    429  * NOTE: when multiple mutexes have to be acquired, always respect the following order:
    430  *   lock_outputs for hw device outputs list only
    431  *   in stream
    432  *   out stream(s) in enum output_type order
    433  *   hw device
    434  * TODO investigate whether we ever actually take both in stream and out stream
    435  */
    436 
    437 /* Helper functions */
    438 
    439 /* must be called with hw device mutex locked */
    440 static int open_hdmi_driver(struct audio_device *adev)
    441 {
    442     if (adev->hdmi_drv_fd < 0) {
    443         adev->hdmi_drv_fd = open("/dev/video16", O_RDWR);
    444         if (adev->hdmi_drv_fd < 0)
    445             ALOGE("%s cannot open video16 (%d)", __func__, adev->hdmi_drv_fd);
    446     }
    447     return adev->hdmi_drv_fd;
    448 }
    449 
    450 /* must be called with hw device mutex locked */
    451 static int enable_hdmi_audio(struct audio_device *adev, int enable)
    452 {
    453     int ret;
    454     struct v4l2_control ctrl;
    455 
    456     ret = open_hdmi_driver(adev);
    457     if (ret < 0)
    458         return ret;
    459 
    460     ctrl.id = V4L2_CID_TV_ENABLE_HDMI_AUDIO;
    461     ctrl.value = !!enable;
    462     ret = ioctl(adev->hdmi_drv_fd, VIDIOC_S_CTRL, &ctrl);
    463 
    464     if (ret < 0)
    465         ALOGE("V4L2_CID_TV_ENABLE_HDMI_AUDIO ioctl error (%d)", errno);
    466 
    467     return ret;
    468 }
    469 
    470 /* must be called with hw device mutex locked
    471  * Called from adev_open_output_stream with no stream lock,
    472  * but this is OK because stream is not yet visible
    473  */
    474 static int read_hdmi_channel_masks(struct audio_device *adev, struct stream_out *out) {
    475     int ret;
    476     struct v4l2_control ctrl;
    477 
    478     ret = open_hdmi_driver(adev);
    479     if (ret < 0)
    480         return ret;
    481 
    482     ctrl.id = V4L2_CID_TV_MAX_AUDIO_CHANNELS;
    483     ret = ioctl(adev->hdmi_drv_fd, VIDIOC_G_CTRL, &ctrl);
    484     if (ret < 0) {
    485         ALOGE("V4L2_CID_TV_MAX_AUDIO_CHANNELS ioctl error (%d)", errno);
    486         return ret;
    487     }
    488 
    489     ALOGV("%s ioctl %d got %d max channels", __func__, ret, ctrl.value);
    490 
    491     if (ctrl.value != 6 && ctrl.value != 8)
    492         return -ENOSYS;
    493 
    494     out->supported_channel_masks[0] = AUDIO_CHANNEL_OUT_5POINT1;
    495     if (ctrl.value == 8)
    496         out->supported_channel_masks[1] = AUDIO_CHANNEL_OUT_7POINT1;
    497 
    498     return ret;
    499 }
    500 
    501 /* must be called with hw device mutex locked */
    502 static int set_hdmi_channels(struct audio_device *adev, int channels) {
    503     int ret;
    504     struct v4l2_control ctrl;
    505 
    506     ret = open_hdmi_driver(adev);
    507     if (ret < 0)
    508         return ret;
    509 
    510     ctrl.id = V4L2_CID_TV_SET_NUM_CHANNELS;
    511     ctrl.value = channels;
    512     ret = ioctl(adev->hdmi_drv_fd, VIDIOC_S_CTRL, &ctrl);
    513     if (ret < 0)
    514         ALOGE("V4L2_CID_TV_SET_NUM_CHANNELS ioctl error (%d)", errno);
    515 
    516     return ret;
    517 }
    518 
    519 /* must be called with hw device mutex locked */
    520 static void select_devices(struct audio_device *adev)
    521 {
    522     int output_device_id = get_output_device_id(adev->out_device);
    523     int input_source_id = get_input_source_id(adev->input_source);
    524     const char *output_route = NULL;
    525     const char *input_route = NULL;
    526     int new_route_id;
    527     int new_es305_preset = -1;
    528 
    529     audio_route_reset(adev->ar);
    530 
    531     enable_hdmi_audio(adev, adev->out_device & AUDIO_DEVICE_OUT_AUX_DIGITAL);
    532 
    533     new_route_id = (1 << (input_source_id + OUT_DEVICE_CNT)) + (1 << output_device_id);
    534     if ((new_route_id == adev->cur_route_id) && (adev->es305_mode == adev->es305_new_mode))
    535         return;
    536     adev->cur_route_id = new_route_id;
    537     adev->es305_mode = adev->es305_new_mode;
    538 
    539     if (input_source_id != IN_SOURCE_NONE) {
    540         if (output_device_id != OUT_DEVICE_NONE) {
    541             input_route =
    542                     route_configs[input_source_id][output_device_id]->input_route;
    543             output_route =
    544                     route_configs[input_source_id][output_device_id]->output_route;
    545             new_es305_preset =
    546                 route_configs[input_source_id][output_device_id]->es305_preset[adev->es305_mode];
    547         } else {
    548             switch (adev->in_device) {
    549             case AUDIO_DEVICE_IN_WIRED_HEADSET & ~AUDIO_DEVICE_BIT_IN:
    550                 output_device_id = OUT_DEVICE_HEADSET;
    551                 break;
    552             case AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET & ~AUDIO_DEVICE_BIT_IN:
    553                 output_device_id = OUT_DEVICE_BT_SCO;
    554                 break;
    555             default:
    556                 output_device_id = OUT_DEVICE_SPEAKER;
    557                 break;
    558             }
    559             input_route =
    560                     route_configs[input_source_id][output_device_id]->input_route;
    561             new_es305_preset =
    562                 route_configs[input_source_id][output_device_id]->es305_preset[adev->es305_mode];
    563         }
    564         // disable noise suppression when capturing front and back mic for voice recognition
    565         if ((adev->input_source == AUDIO_SOURCE_VOICE_RECOGNITION) &&
    566                 (adev->in_channel_mask == AUDIO_CHANNEL_IN_FRONT_BACK))
    567             new_es305_preset = -1;
    568     } else {
    569         if (output_device_id != OUT_DEVICE_NONE) {
    570             output_route =
    571                     route_configs[IN_SOURCE_MIC][output_device_id]->output_route;
    572         }
    573     }
    574 
    575     ALOGV("select_devices() devices %#x input src %d output route %s input route %s",
    576           adev->out_device, adev->input_source,
    577           output_route ? output_route : "none",
    578           input_route ? input_route : "none");
    579 
    580     if (output_route)
    581         audio_route_apply_path(adev->ar, output_route);
    582     if (input_route)
    583         audio_route_apply_path(adev->ar, input_route);
    584 
    585     if ((new_es305_preset != ES305_PRESET_CURRENT) &&
    586             (new_es305_preset != adev->es305_preset)) {
    587         ALOGV("  select_devices() changing es305 preset from %d to %d",
    588               adev->es305_preset, new_es305_preset);
    589         if (eS305_UsePreset(new_es305_preset) == 0) {
    590             adev->es305_preset = new_es305_preset;
    591         }
    592     }
    593 
    594     audio_route_update_mixer(adev->ar);
    595 }
    596 
    597 /* must be called with hw device mutex unlocked */
    598 void bubblelevel_callback(bool is_level, void *user_data)
    599 {
    600     struct audio_device *adev = (struct audio_device *)user_data;
    601     int es305_mode;
    602 
    603     if (is_level)
    604         es305_mode = ES305_MODE_LEVEL;
    605     else
    606         es305_mode = ES305_MODE_DEFAULT;
    607 
    608     pthread_mutex_lock(&adev->lock);
    609     if (es305_mode != adev->es305_mode) {
    610         adev->es305_new_mode = es305_mode;
    611         select_devices(adev);
    612         ALOGV("bubblelevel_callback is_level %d es305_mode %d", is_level, es305_mode);
    613     }
    614     pthread_mutex_unlock(&adev->lock);
    615 }
    616 
    617 /* must be called with hw device mutex locked */
    618 bool get_bubblelevel(struct audio_device *adev)
    619 {
    620     if (!adev->bubble_level) {
    621         adev->bubble_level = bubble_level_create();
    622         if (adev->bubble_level)
    623             adev->bubble_level->set_callback(adev->bubble_level, bubblelevel_callback, adev);
    624     }
    625     return (adev->bubble_level != NULL);
    626 }
    627 
    628 /* must be called with hw device outputs list, all out streams, and hw device mutexes locked */
    629 static void force_non_hdmi_out_standby(struct audio_device *adev)
    630 {
    631     enum output_type type;
    632     struct stream_out *out;
    633 
    634     for (type = 0; type < OUTPUT_TOTAL; ++type) {
    635         out = adev->outputs[type];
    636         if (type == OUTPUT_HDMI || !out)
    637             continue;
    638         /* This will never recurse more than 2 levels deep. */
    639         do_out_standby(out);
    640     }
    641 }
    642 
    643 /* must be called with the hw device mutex locked, OK to hold other mutexes */
    644 static void start_bt_sco(struct audio_device *adev) {
    645     if (adev->sco_on_count++ > 0)
    646         return;
    647 
    648     adev->pcm_voice_out = pcm_open(PCM_CARD, PCM_DEVICE_VOICE, PCM_OUT | PCM_MONOTONIC,
    649                               &pcm_config_sco);
    650     if (adev->pcm_voice_out && !pcm_is_ready(adev->pcm_voice_out)) {
    651         ALOGE("pcm_open(VOICE_OUT) failed: %s", pcm_get_error(adev->pcm_voice_out));
    652         goto err_voice_out;
    653     }
    654     adev->pcm_sco_out = pcm_open(PCM_CARD, PCM_DEVICE_SCO, PCM_OUT | PCM_MONOTONIC,
    655                             &pcm_config_sco);
    656     if (adev->pcm_sco_out && !pcm_is_ready(adev->pcm_sco_out)) {
    657         ALOGE("pcm_open(SCO_OUT) failed: %s", pcm_get_error(adev->pcm_sco_out));
    658         goto err_sco_out;
    659     }
    660     adev->pcm_voice_in = pcm_open(PCM_CARD, PCM_DEVICE_VOICE, PCM_IN,
    661                                  &pcm_config_sco);
    662     if (adev->pcm_voice_in && !pcm_is_ready(adev->pcm_voice_in)) {
    663         ALOGE("pcm_open(VOICE_IN) failed: %s", pcm_get_error(adev->pcm_voice_in));
    664         goto err_voice_in;
    665     }
    666     adev->pcm_sco_in = pcm_open(PCM_CARD, PCM_DEVICE_SCO, PCM_IN,
    667                                &pcm_config_sco);
    668     if (adev->pcm_sco_in && !pcm_is_ready(adev->pcm_sco_in)) {
    669         ALOGE("pcm_open(SCO_IN) failed: %s", pcm_get_error(adev->pcm_sco_in));
    670         goto err_sco_in;
    671     }
    672 
    673     pcm_start(adev->pcm_voice_out);
    674     pcm_start(adev->pcm_sco_out);
    675     pcm_start(adev->pcm_voice_in);
    676     pcm_start(adev->pcm_sco_in);
    677 
    678     return;
    679 
    680 err_sco_in:
    681     pcm_close(adev->pcm_sco_in);
    682 err_voice_in:
    683     pcm_close(adev->pcm_voice_in);
    684 err_sco_out:
    685     pcm_close(adev->pcm_sco_out);
    686 err_voice_out:
    687     pcm_close(adev->pcm_voice_out);
    688 }
    689 
    690 /* must be called with the hw device mutex locked, OK to hold other mutexes */
    691 static void stop_bt_sco(struct audio_device *adev) {
    692     if (adev->sco_on_count == 0 || --adev->sco_on_count > 0)
    693         return;
    694 
    695     pcm_stop(adev->pcm_voice_out);
    696     pcm_stop(adev->pcm_sco_out);
    697     pcm_stop(adev->pcm_voice_in);
    698     pcm_stop(adev->pcm_sco_in);
    699 
    700     pcm_close(adev->pcm_voice_out);
    701     pcm_close(adev->pcm_sco_out);
    702     pcm_close(adev->pcm_voice_in);
    703     pcm_close(adev->pcm_sco_in);
    704 }
    705 
    706 /* must be called with hw device outputs list, output stream, and hw device mutexes locked */
    707 static int start_output_stream(struct stream_out *out)
    708 {
    709     struct audio_device *adev = out->dev;
    710     int type;
    711 
    712     if (out == adev->outputs[OUTPUT_HDMI]) {
    713         force_non_hdmi_out_standby(adev);
    714     } else if (adev->outputs[OUTPUT_HDMI] && !adev->outputs[OUTPUT_HDMI]->standby) {
    715         out->disabled = true;
    716         return 0;
    717     }
    718 
    719     out->disabled = false;
    720 
    721     if (out->device & (AUDIO_DEVICE_OUT_SPEAKER |
    722                        AUDIO_DEVICE_OUT_WIRED_HEADSET |
    723                        AUDIO_DEVICE_OUT_WIRED_HEADPHONE |
    724                        AUDIO_DEVICE_OUT_AUX_DIGITAL |
    725                        AUDIO_DEVICE_OUT_ALL_SCO)) {
    726 
    727         out->pcm[PCM_CARD] = pcm_open(PCM_CARD, out->pcm_device,
    728                                       PCM_OUT | PCM_MONOTONIC, &out->config);
    729 
    730         if (out->pcm[PCM_CARD] && !pcm_is_ready(out->pcm[PCM_CARD])) {
    731             ALOGE("pcm_open(PCM_CARD) failed: %s",
    732                   pcm_get_error(out->pcm[PCM_CARD]));
    733             pcm_close(out->pcm[PCM_CARD]);
    734             return -ENOMEM;
    735         }
    736     }
    737 
    738     if (out->device & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) {
    739         out->pcm[PCM_CARD_SPDIF] = pcm_open(PCM_CARD_SPDIF, out->pcm_device,
    740                                             PCM_OUT | PCM_MONOTONIC, &out->config);
    741 
    742         if (out->pcm[PCM_CARD_SPDIF] &&
    743                 !pcm_is_ready(out->pcm[PCM_CARD_SPDIF])) {
    744             ALOGE("pcm_open(PCM_CARD_SPDIF) failed: %s",
    745                   pcm_get_error(out->pcm[PCM_CARD_SPDIF]));
    746             pcm_close(out->pcm[PCM_CARD_SPDIF]);
    747             return -ENOMEM;
    748         }
    749     }
    750 
    751     adev->out_device |= out->device;
    752     select_devices(adev);
    753 
    754     if (out->device & AUDIO_DEVICE_OUT_ALL_SCO)
    755         start_bt_sco(adev);
    756 
    757     if (out->device & AUDIO_DEVICE_OUT_AUX_DIGITAL)
    758         set_hdmi_channels(adev, out->config.channels);
    759 
    760     /* anticipate level measurement in case we start capture later */
    761     if (get_bubblelevel(adev))
    762         adev->bubble_level->poll_once(adev->bubble_level);
    763 
    764     return 0;
    765 }
    766 
    767 /* must be called with input stream and hw device mutexes locked */
    768 static int start_input_stream(struct stream_in *in)
    769 {
    770     struct audio_device *adev = in->dev;
    771 
    772     in->pcm = pcm_open(PCM_CARD, PCM_DEVICE, PCM_IN, in->config);
    773 
    774     if (in->pcm && !pcm_is_ready(in->pcm)) {
    775         ALOGE("pcm_open() failed: %s", pcm_get_error(in->pcm));
    776         pcm_close(in->pcm);
    777         return -ENOMEM;
    778     }
    779 
    780     /* if no supported sample rate is available, use the resampler */
    781     if (in->resampler)
    782         in->resampler->reset(in->resampler);
    783 
    784     in->frames_in = 0;
    785     adev->input_source = in->input_source;
    786     adev->in_device = in->device;
    787     adev->in_channel_mask = in->channel_mask;
    788 
    789     eS305_SetActiveIoHandle(in->io_handle);
    790     select_devices(adev);
    791 
    792     if (in->device & AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET)
    793         start_bt_sco(adev);
    794 
    795     /* initialize volume ramp */
    796     in->ramp_frames = (CAPTURE_START_RAMP_MS * in->requested_rate) / 1000;
    797     in->ramp_step = (uint16_t)(USHRT_MAX / in->ramp_frames);
    798     in->ramp_vol = 0;;
    799 
    800     if (get_bubblelevel(adev)) {
    801         adev->bubble_level->set_poll_interval(adev->bubble_level, BL_POLL_INTERVAL_MIN_SEC);
    802         adev->bubble_level->start_polling(adev->bubble_level);
    803     }
    804 
    805     return 0;
    806 }
    807 
    808 static size_t get_input_buffer_size(unsigned int sample_rate,
    809                                     audio_format_t format,
    810                                     unsigned int channel_count,
    811                                     bool is_low_latency)
    812 {
    813     const struct pcm_config *config = is_low_latency ?
    814             &pcm_config_in_low_latency : &pcm_config_in;
    815     size_t size;
    816 
    817     /*
    818      * take resampling into account and return the closest majoring
    819      * multiple of 16 frames, as audioflinger expects audio buffers to
    820      * be a multiple of 16 frames
    821      */
    822     size = (config->period_size * sample_rate) / config->rate;
    823     size = ((size + 15) / 16) * 16;
    824 
    825     return size * channel_count * audio_bytes_per_sample(format);
    826 }
    827 
    828 static int get_next_buffer(struct resampler_buffer_provider *buffer_provider,
    829                                    struct resampler_buffer* buffer)
    830 {
    831     struct stream_in *in;
    832     size_t i;
    833 
    834     if (buffer_provider == NULL || buffer == NULL)
    835         return -EINVAL;
    836 
    837     in = (struct stream_in *)((char *)buffer_provider -
    838                                    offsetof(struct stream_in, buf_provider));
    839 
    840     if (in->pcm == NULL) {
    841         buffer->raw = NULL;
    842         buffer->frame_count = 0;
    843         in->read_status = -ENODEV;
    844         return -ENODEV;
    845     }
    846 
    847     if (in->frames_in == 0) {
    848         in->read_status = pcm_read(in->pcm,
    849                                    (void*)in->buffer,
    850                                    pcm_frames_to_bytes(in->pcm, in->config->period_size));
    851         if (in->read_status != 0) {
    852             ALOGE("get_next_buffer() pcm_read error %d", in->read_status);
    853             buffer->raw = NULL;
    854             buffer->frame_count = 0;
    855             return in->read_status;
    856         }
    857 
    858         in->frames_in = in->config->period_size;
    859 
    860         /* Do stereo to mono conversion in place by discarding right channel */
    861         if (in->channel_mask == AUDIO_CHANNEL_IN_MONO)
    862             for (i = 1; i < in->frames_in; i++)
    863                 in->buffer[i] = in->buffer[i * 2];
    864     }
    865 
    866     buffer->frame_count = (buffer->frame_count > in->frames_in) ?
    867                                 in->frames_in : buffer->frame_count;
    868     buffer->i16 = in->buffer +
    869             (in->config->period_size - in->frames_in) *
    870                 audio_channel_count_from_in_mask(in->channel_mask);
    871 
    872     return in->read_status;
    873 
    874 }
    875 
    876 static void release_buffer(struct resampler_buffer_provider *buffer_provider,
    877                                   struct resampler_buffer* buffer)
    878 {
    879     struct stream_in *in;
    880 
    881     if (buffer_provider == NULL || buffer == NULL)
    882         return;
    883 
    884     in = (struct stream_in *)((char *)buffer_provider -
    885                                    offsetof(struct stream_in, buf_provider));
    886 
    887     in->frames_in -= buffer->frame_count;
    888 }
    889 
    890 /* read_frames() reads frames from kernel driver, down samples to capture rate
    891  * if necessary and output the number of frames requested to the buffer specified */
    892 static ssize_t read_frames(struct stream_in *in, void *buffer, ssize_t frames)
    893 {
    894     ssize_t frames_wr = 0;
    895     size_t frame_size = audio_stream_in_frame_size(&in->stream);
    896 
    897     while (frames_wr < frames) {
    898         size_t frames_rd = frames - frames_wr;
    899         if (in->resampler != NULL) {
    900             in->resampler->resample_from_provider(in->resampler,
    901                     (int16_t *)((char *)buffer +
    902                             frames_wr * frame_size),
    903                     &frames_rd);
    904         } else {
    905             struct resampler_buffer buf = {
    906                     { raw : NULL, },
    907                     frame_count : frames_rd,
    908             };
    909             get_next_buffer(&in->buf_provider, &buf);
    910             if (buf.raw != NULL) {
    911                 memcpy((char *)buffer +
    912                            frames_wr * frame_size,
    913                         buf.raw,
    914                         buf.frame_count * frame_size);
    915                 frames_rd = buf.frame_count;
    916             }
    917             release_buffer(&in->buf_provider, &buf);
    918         }
    919         /* in->read_status is updated by getNextBuffer() also called by
    920          * in->resampler->resample_from_provider() */
    921         if (in->read_status != 0)
    922             return in->read_status;
    923 
    924         frames_wr += frames_rd;
    925     }
    926     return frames_wr;
    927 }
    928 
    929 /* API functions */
    930 
    931 static uint32_t out_get_sample_rate(const struct audio_stream *stream)
    932 {
    933     struct stream_out *out = (struct stream_out *)stream;
    934 
    935     return out->config.rate;
    936 }
    937 
    938 static int out_set_sample_rate(struct audio_stream *stream, uint32_t rate)
    939 {
    940     return -ENOSYS;
    941 }
    942 
    943 static size_t out_get_buffer_size(const struct audio_stream *stream)
    944 {
    945     struct stream_out *out = (struct stream_out *)stream;
    946 
    947     return out->config.period_size *
    948             audio_stream_out_frame_size((const struct audio_stream_out *)stream);
    949 }
    950 
    951 static audio_channel_mask_t out_get_channels(const struct audio_stream *stream)
    952 {
    953     struct stream_out *out = (struct stream_out *)stream;
    954 
    955     return out->channel_mask;
    956 }
    957 
    958 static audio_format_t out_get_format(const struct audio_stream *stream)
    959 {
    960     return AUDIO_FORMAT_PCM_16_BIT;
    961 }
    962 
    963 static int out_set_format(struct audio_stream *stream, audio_format_t format)
    964 {
    965     return -ENOSYS;
    966 }
    967 
    968 /* Return the set of output devices associated with active streams
    969  * other than out.  Assumes out is non-NULL and out->dev is locked.
    970  */
    971 static audio_devices_t output_devices(struct stream_out *out)
    972 {
    973     struct audio_device *dev = out->dev;
    974     enum output_type type;
    975     audio_devices_t devices = AUDIO_DEVICE_NONE;
    976 
    977     for (type = 0; type < OUTPUT_TOTAL; ++type) {
    978         struct stream_out *other = dev->outputs[type];
    979         if (other && (other != out) && !other->standby) {
    980             // TODO no longer accurate
    981             /* safe to access other stream without a mutex,
    982              * because we hold the dev lock,
    983              * which prevents the other stream from being closed
    984              */
    985             devices |= other->device;
    986         }
    987     }
    988 
    989     return devices;
    990 }
    991 
    992 /* must be called with hw device outputs list, all out streams, and hw device mutex locked */
    993 static void do_out_standby(struct stream_out *out)
    994 {
    995     struct audio_device *adev = out->dev;
    996     int i;
    997 
    998     if (!out->standby) {
    999         for (i = 0; i < PCM_TOTAL; i++) {
   1000             if (out->pcm[i]) {
   1001                 pcm_close(out->pcm[i]);
   1002                 out->pcm[i] = NULL;
   1003             }
   1004         }
   1005         out->standby = true;
   1006 
   1007         if (out == adev->outputs[OUTPUT_HDMI]) {
   1008             /* force standby on low latency output stream so that it can reuse HDMI driver if
   1009              * necessary when restarted */
   1010             force_non_hdmi_out_standby(adev);
   1011         }
   1012 
   1013         if (out->device & AUDIO_DEVICE_OUT_ALL_SCO)
   1014             stop_bt_sco(adev);
   1015 
   1016         /* re-calculate the set of active devices from other streams */
   1017         adev->out_device = output_devices(out);
   1018 
   1019         /* Skip resetting the mixer if no output device is active */
   1020         if (adev->out_device)
   1021             select_devices(adev);
   1022     }
   1023 }
   1024 
   1025 /* lock outputs list, all output streams, and device */
   1026 static void lock_all_outputs(struct audio_device *adev)
   1027 {
   1028     enum output_type type;
   1029     pthread_mutex_lock(&adev->lock_outputs);
   1030     for (type = 0; type < OUTPUT_TOTAL; ++type) {
   1031         struct stream_out *out = adev->outputs[type];
   1032         if (out)
   1033             pthread_mutex_lock(&out->lock);
   1034     }
   1035     pthread_mutex_lock(&adev->lock);
   1036 }
   1037 
   1038 /* unlock device, all output streams (except specified stream), and outputs list */
   1039 static void unlock_all_outputs(struct audio_device *adev, struct stream_out *except)
   1040 {
   1041     /* unlock order is irrelevant, but for cleanliness we unlock in reverse order */
   1042     pthread_mutex_unlock(&adev->lock);
   1043     enum output_type type = OUTPUT_TOTAL;
   1044     do {
   1045         struct stream_out *out = adev->outputs[--type];
   1046         if (out && out != except)
   1047             pthread_mutex_unlock(&out->lock);
   1048     } while (type != (enum output_type) 0);
   1049     pthread_mutex_unlock(&adev->lock_outputs);
   1050 }
   1051 
   1052 static int out_standby(struct audio_stream *stream)
   1053 {
   1054     struct stream_out *out = (struct stream_out *)stream;
   1055     struct audio_device *adev = out->dev;
   1056 
   1057     lock_all_outputs(adev);
   1058 
   1059     do_out_standby(out);
   1060 
   1061     unlock_all_outputs(adev, NULL);
   1062 
   1063     return 0;
   1064 }
   1065 
   1066 static int out_dump(const struct audio_stream *stream, int fd)
   1067 {
   1068     return 0;
   1069 }
   1070 
   1071 static int out_set_parameters(struct audio_stream *stream, const char *kvpairs)
   1072 {
   1073     struct stream_out *out = (struct stream_out *)stream;
   1074     struct audio_device *adev = out->dev;
   1075     struct str_parms *parms;
   1076     char value[32];
   1077     int ret;
   1078     unsigned int val;
   1079 
   1080     parms = str_parms_create_str(kvpairs);
   1081 
   1082     ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_ROUTING,
   1083                             value, sizeof(value));
   1084     lock_all_outputs(adev);
   1085     if (ret >= 0) {
   1086         val = atoi(value);
   1087         if ((out->device != val) && (val != 0)) {
   1088             /* Force standby if moving to/from SPDIF or if the output
   1089              * device changes when in SPDIF mode */
   1090             if (((val & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) ^
   1091                  (adev->out_device & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET)) ||
   1092                 (adev->out_device & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET)) {
   1093                 do_out_standby(out);
   1094             }
   1095 
   1096             /* force output standby to start or stop SCO pcm stream if needed */
   1097             if ((val & AUDIO_DEVICE_OUT_ALL_SCO) ^
   1098                     (out->device & AUDIO_DEVICE_OUT_ALL_SCO)) {
   1099                 do_out_standby(out);
   1100             }
   1101 
   1102             if (!out->standby && (out == adev->outputs[OUTPUT_HDMI] ||
   1103                     !adev->outputs[OUTPUT_HDMI] ||
   1104                     adev->outputs[OUTPUT_HDMI]->standby)) {
   1105                 adev->out_device = output_devices(out) | val;
   1106                 select_devices(adev);
   1107             }
   1108             out->device = val;
   1109         }
   1110     }
   1111     unlock_all_outputs(adev, NULL);
   1112 
   1113     str_parms_destroy(parms);
   1114     return ret;
   1115 }
   1116 
   1117 static char * out_get_parameters(const struct audio_stream *stream, const char *keys)
   1118 {
   1119     struct stream_out *out = (struct stream_out *)stream;
   1120     struct str_parms *query = str_parms_create_str(keys);
   1121     char *str;
   1122     char value[256];
   1123     struct str_parms *reply = str_parms_create();
   1124     size_t i, j;
   1125     int ret;
   1126     bool first = true;
   1127 
   1128     ret = str_parms_get_str(query, AUDIO_PARAMETER_STREAM_SUP_CHANNELS, value, sizeof(value));
   1129     if (ret >= 0) {
   1130         value[0] = '\0';
   1131         i = 0;
   1132         /* the last entry in supported_channel_masks[] is always 0 */
   1133         while (out->supported_channel_masks[i] != 0) {
   1134             for (j = 0; j < ARRAY_SIZE(out_channels_name_to_enum_table); j++) {
   1135                 if (out_channels_name_to_enum_table[j].value == out->supported_channel_masks[i]) {
   1136                     if (!first) {
   1137                         strcat(value, "|");
   1138                     }
   1139                     strcat(value, out_channels_name_to_enum_table[j].name);
   1140                     first = false;
   1141                     break;
   1142                 }
   1143             }
   1144             i++;
   1145         }
   1146         str_parms_add_str(reply, AUDIO_PARAMETER_STREAM_SUP_CHANNELS, value);
   1147         str = str_parms_to_str(reply);
   1148     } else {
   1149         str = strdup(keys);
   1150     }
   1151 
   1152     str_parms_destroy(query);
   1153     str_parms_destroy(reply);
   1154     return str;
   1155 }
   1156 
   1157 static uint32_t out_get_latency(const struct audio_stream_out *stream)
   1158 {
   1159     struct stream_out *out = (struct stream_out *)stream;
   1160 
   1161     return (out->config.period_size * out->config.period_count * 1000) /
   1162             out->config.rate;
   1163 }
   1164 
   1165 static int out_set_volume(struct audio_stream_out *stream, float left,
   1166                           float right)
   1167 {
   1168     struct stream_out *out = (struct stream_out *)stream;
   1169     struct audio_device *adev = out->dev;
   1170 
   1171     /* The mutex lock is not needed, because the client
   1172      * is not allowed to close the stream concurrently with this API
   1173      *  pthread_mutex_lock(&adev->lock_outputs);
   1174      */
   1175     bool is_HDMI = out == adev->outputs[OUTPUT_HDMI];
   1176     /*  pthread_mutex_unlock(&adev->lock_outputs); */
   1177     if (is_HDMI) {
   1178         /* only take left channel into account: the API is for stereo anyway */
   1179         out->muted = (left == 0.0f);
   1180         return 0;
   1181     }
   1182     return -ENOSYS;
   1183 }
   1184 
   1185 static ssize_t out_write(struct audio_stream_out *stream, const void* buffer,
   1186                          size_t bytes)
   1187 {
   1188     int ret = 0;
   1189     struct stream_out *out = (struct stream_out *)stream;
   1190     struct audio_device *adev = out->dev;
   1191     int i;
   1192 
   1193     /* FIXME This comment is no longer correct
   1194      * acquiring hw device mutex systematically is useful if a low
   1195      * priority thread is waiting on the output stream mutex - e.g.
   1196      * executing out_set_parameters() while holding the hw device
   1197      * mutex
   1198      */
   1199     pthread_mutex_lock(&out->lock);
   1200     if (out->standby) {
   1201         pthread_mutex_unlock(&out->lock);
   1202         lock_all_outputs(adev);
   1203         if (!out->standby) {
   1204             unlock_all_outputs(adev, out);
   1205             goto false_alarm;
   1206         }
   1207         ret = start_output_stream(out);
   1208         if (ret < 0) {
   1209             unlock_all_outputs(adev, NULL);
   1210             goto final_exit;
   1211         }
   1212         out->standby = false;
   1213         unlock_all_outputs(adev, out);
   1214     }
   1215 false_alarm:
   1216 
   1217     if (out->disabled) {
   1218         ret = -EPIPE;
   1219         goto exit;
   1220     }
   1221 
   1222     if (out->muted)
   1223         memset((void *)buffer, 0, bytes);
   1224 
   1225     /* Write to all active PCMs */
   1226     for (i = 0; i < PCM_TOTAL; i++)
   1227         if (out->pcm[i]) {
   1228             ret = pcm_write(out->pcm[i], (void *)buffer, bytes);
   1229             if (ret != 0)
   1230                 break;
   1231         }
   1232     if (ret == 0)
   1233         out->written += bytes / (out->config.channels * sizeof(short));
   1234 
   1235 exit:
   1236     pthread_mutex_unlock(&out->lock);
   1237 final_exit:
   1238 
   1239     if (ret != 0) {
   1240         usleep(bytes * 1000000 / audio_stream_out_frame_size(stream) /
   1241                out_get_sample_rate(&stream->common));
   1242     }
   1243 
   1244     return bytes;
   1245 }
   1246 
   1247 static int out_get_render_position(const struct audio_stream_out *stream,
   1248                                    uint32_t *dsp_frames)
   1249 {
   1250     return -EINVAL;
   1251 }
   1252 
   1253 static int out_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
   1254 {
   1255     return 0;
   1256 }
   1257 
   1258 static int out_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
   1259 {
   1260     return 0;
   1261 }
   1262 
   1263 static int out_get_next_write_timestamp(const struct audio_stream_out *stream,
   1264                                         int64_t *timestamp)
   1265 {
   1266     return -EINVAL;
   1267 }
   1268 
   1269 static int out_get_presentation_position(const struct audio_stream_out *stream,
   1270                                    uint64_t *frames, struct timespec *timestamp)
   1271 {
   1272     struct stream_out *out = (struct stream_out *)stream;
   1273     int ret = -1;
   1274 
   1275     pthread_mutex_lock(&out->lock);
   1276 
   1277     int i;
   1278     // There is a question how to implement this correctly when there is more than one PCM stream.
   1279     // We are just interested in the frames pending for playback in the kernel buffer here,
   1280     // not the total played since start.  The current behavior should be safe because the
   1281     // cases where both cards are active are marginal.
   1282     for (i = 0; i < PCM_TOTAL; i++)
   1283         if (out->pcm[i]) {
   1284             size_t avail;
   1285             if (pcm_get_htimestamp(out->pcm[i], &avail, timestamp) == 0) {
   1286                 size_t kernel_buffer_size = out->config.period_size * out->config.period_count;
   1287                 // FIXME This calculation is incorrect if there is buffering after app processor
   1288                 int64_t signed_frames = out->written - kernel_buffer_size + avail;
   1289                 // It would be unusual for this value to be negative, but check just in case ...
   1290                 if (signed_frames >= 0) {
   1291                     *frames = signed_frames;
   1292                     ret = 0;
   1293                 }
   1294                 break;
   1295             }
   1296         }
   1297 
   1298     pthread_mutex_unlock(&out->lock);
   1299 
   1300     return ret;
   1301 }
   1302 
   1303 /** audio_stream_in implementation **/
   1304 static uint32_t in_get_sample_rate(const struct audio_stream *stream)
   1305 {
   1306     struct stream_in *in = (struct stream_in *)stream;
   1307 
   1308     return in->requested_rate;
   1309 }
   1310 
   1311 static int in_set_sample_rate(struct audio_stream *stream, uint32_t rate)
   1312 {
   1313     return 0;
   1314 }
   1315 
   1316 static audio_channel_mask_t in_get_channels(const struct audio_stream *stream)
   1317 {
   1318     struct stream_in *in = (struct stream_in *)stream;
   1319 
   1320     return in->channel_mask;
   1321 }
   1322 
   1323 
   1324 static size_t in_get_buffer_size(const struct audio_stream *stream)
   1325 {
   1326     struct stream_in *in = (struct stream_in *)stream;
   1327 
   1328     return get_input_buffer_size(in->requested_rate,
   1329                                  AUDIO_FORMAT_PCM_16_BIT,
   1330                                  audio_channel_count_from_in_mask(in_get_channels(stream)),
   1331                                  (in->flags & AUDIO_INPUT_FLAG_FAST) != 0);
   1332 }
   1333 
   1334 static audio_format_t in_get_format(const struct audio_stream *stream)
   1335 {
   1336     return AUDIO_FORMAT_PCM_16_BIT;
   1337 }
   1338 
   1339 static int in_set_format(struct audio_stream *stream, audio_format_t format)
   1340 {
   1341     return -ENOSYS;
   1342 }
   1343 
   1344 /* must be called with in stream and hw device mutex locked */
   1345 static void do_in_standby(struct stream_in *in)
   1346 {
   1347     struct audio_device *adev = in->dev;
   1348 
   1349     if (!in->standby) {
   1350         pcm_close(in->pcm);
   1351         in->pcm = NULL;
   1352 
   1353         if (in->device & AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET)
   1354             stop_bt_sco(adev);
   1355 
   1356         in->dev->input_source = AUDIO_SOURCE_DEFAULT;
   1357         in->dev->in_device = AUDIO_DEVICE_NONE;
   1358         in->dev->in_channel_mask = 0;
   1359         select_devices(adev);
   1360         in->standby = true;
   1361 
   1362         if (get_bubblelevel(adev))
   1363             in->dev->bubble_level->stop_polling(adev->bubble_level);
   1364     }
   1365 
   1366     eS305_SetActiveIoHandle(ES305_IO_HANDLE_NONE);
   1367 }
   1368 
   1369 static int in_standby(struct audio_stream *stream)
   1370 {
   1371     struct stream_in *in = (struct stream_in *)stream;
   1372 
   1373     pthread_mutex_lock(&in->lock);
   1374     pthread_mutex_lock(&in->dev->lock);
   1375 
   1376     do_in_standby(in);
   1377 
   1378     pthread_mutex_unlock(&in->dev->lock);
   1379     pthread_mutex_unlock(&in->lock);
   1380 
   1381     return 0;
   1382 }
   1383 
   1384 static int in_dump(const struct audio_stream *stream, int fd)
   1385 {
   1386     return 0;
   1387 }
   1388 
   1389 static int in_set_parameters(struct audio_stream *stream, const char *kvpairs)
   1390 {
   1391     struct stream_in *in = (struct stream_in *)stream;
   1392     struct audio_device *adev = in->dev;
   1393     struct str_parms *parms;
   1394     char value[32];
   1395     int ret;
   1396     unsigned int val;
   1397     bool apply_now = false;
   1398 
   1399     parms = str_parms_create_str(kvpairs);
   1400 
   1401     pthread_mutex_lock(&in->lock);
   1402     pthread_mutex_lock(&adev->lock);
   1403     ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_INPUT_SOURCE,
   1404                             value, sizeof(value));
   1405     if (ret >= 0) {
   1406         val = atoi(value);
   1407         /* no audio source uses val == 0 */
   1408         if ((in->input_source != val) && (val != 0)) {
   1409             in->input_source = val;
   1410             apply_now = !in->standby;
   1411         }
   1412     }
   1413 
   1414     ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_ROUTING,
   1415                             value, sizeof(value));
   1416     if (ret >= 0) {
   1417         /* strip AUDIO_DEVICE_BIT_IN to allow bitwise comparisons */
   1418         val = atoi(value) & ~AUDIO_DEVICE_BIT_IN;
   1419         /* no audio device uses val == 0 */
   1420         if ((in->device != val) && (val != 0)) {
   1421             /* force output standby to start or stop SCO pcm stream if needed */
   1422             if ((val & AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET) ^
   1423                     (in->device & AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET)) {
   1424                 do_in_standby(in);
   1425             }
   1426             in->device = val;
   1427             apply_now = !in->standby;
   1428         }
   1429     }
   1430 
   1431     if (apply_now) {
   1432         adev->input_source = in->input_source;
   1433         adev->in_device = in->device;
   1434         select_devices(adev);
   1435     }
   1436 
   1437     pthread_mutex_unlock(&adev->lock);
   1438     pthread_mutex_unlock(&in->lock);
   1439 
   1440     str_parms_destroy(parms);
   1441     return ret;
   1442 }
   1443 
   1444 static char * in_get_parameters(const struct audio_stream *stream,
   1445                                 const char *keys)
   1446 {
   1447     return strdup("");
   1448 }
   1449 
   1450 static int in_set_gain(struct audio_stream_in *stream, float gain)
   1451 {
   1452     return 0;
   1453 }
   1454 
   1455 static void in_apply_ramp(struct stream_in *in, int16_t *buffer, size_t frames)
   1456 {
   1457     size_t i;
   1458     uint16_t vol = in->ramp_vol;
   1459     uint16_t step = in->ramp_step;
   1460 
   1461     frames = (frames < in->ramp_frames) ? frames : in->ramp_frames;
   1462 
   1463     if (in->channel_mask == AUDIO_CHANNEL_IN_MONO)
   1464         for (i = 0; i < frames; i++)
   1465         {
   1466             buffer[i] = (int16_t)((buffer[i] * vol) >> 16);
   1467             vol += step;
   1468         }
   1469     else
   1470         for (i = 0; i < frames; i++)
   1471         {
   1472             buffer[2*i] = (int16_t)((buffer[2*i] * vol) >> 16);
   1473             buffer[2*i + 1] = (int16_t)((buffer[2*i + 1] * vol) >> 16);
   1474             vol += step;
   1475         }
   1476 
   1477 
   1478     in->ramp_vol = vol;
   1479     in->ramp_frames -= frames;
   1480 }
   1481 
   1482 static ssize_t in_read(struct audio_stream_in *stream, void* buffer,
   1483                        size_t bytes)
   1484 {
   1485     int ret = 0;
   1486     struct stream_in *in = (struct stream_in *)stream;
   1487     struct audio_device *adev = in->dev;
   1488     size_t frames_rq = bytes / audio_stream_in_frame_size(stream);
   1489 
   1490     /*
   1491      * acquiring hw device mutex systematically is useful if a low
   1492      * priority thread is waiting on the input stream mutex - e.g.
   1493      * executing in_set_parameters() while holding the hw device
   1494      * mutex
   1495      */
   1496     pthread_mutex_lock(&in->lock);
   1497     if (in->standby) {
   1498         pthread_mutex_lock(&adev->lock);
   1499         ret = start_input_stream(in);
   1500         pthread_mutex_unlock(&adev->lock);
   1501         if (ret < 0)
   1502             goto exit;
   1503         in->standby = false;
   1504     }
   1505 
   1506     /*if (in->num_preprocessors != 0)
   1507         ret = process_frames(in, buffer, frames_rq);
   1508       else */
   1509     ret = read_frames(in, buffer, frames_rq);
   1510 
   1511     if (ret > 0)
   1512         ret = 0;
   1513 
   1514     if (in->ramp_frames > 0)
   1515         in_apply_ramp(in, buffer, frames_rq);
   1516 
   1517     /*
   1518      * Instead of writing zeroes here, we could trust the hardware
   1519      * to always provide zeroes when muted.
   1520      */
   1521     if (ret == 0 && adev->mic_mute)
   1522         memset(buffer, 0, bytes);
   1523 
   1524 exit:
   1525     if (ret < 0)
   1526         usleep(bytes * 1000000 / audio_stream_in_frame_size(stream) /
   1527                in_get_sample_rate(&stream->common));
   1528 
   1529     pthread_mutex_unlock(&in->lock);
   1530     return bytes;
   1531 }
   1532 
   1533 static uint32_t in_get_input_frames_lost(struct audio_stream_in *stream)
   1534 {
   1535     return 0;
   1536 }
   1537 
   1538 static int in_add_audio_effect(const struct audio_stream *stream,
   1539                                effect_handle_t effect)
   1540 {
   1541     struct stream_in *in = (struct stream_in *)stream;
   1542     effect_descriptor_t descr;
   1543     if ((*effect)->get_descriptor(effect, &descr) == 0) {
   1544 
   1545         pthread_mutex_lock(&in->lock);
   1546         pthread_mutex_lock(&in->dev->lock);
   1547 
   1548         eS305_AddEffect(&descr, in->io_handle);
   1549 
   1550         pthread_mutex_unlock(&in->dev->lock);
   1551         pthread_mutex_unlock(&in->lock);
   1552     }
   1553 
   1554     return 0;
   1555 }
   1556 
   1557 static int in_remove_audio_effect(const struct audio_stream *stream,
   1558                                   effect_handle_t effect)
   1559 {
   1560     struct stream_in *in = (struct stream_in *)stream;
   1561     effect_descriptor_t descr;
   1562     if ((*effect)->get_descriptor(effect, &descr) == 0) {
   1563 
   1564         pthread_mutex_lock(&in->lock);
   1565         pthread_mutex_lock(&in->dev->lock);
   1566 
   1567         eS305_RemoveEffect(&descr, in->io_handle);
   1568 
   1569         pthread_mutex_unlock(&in->dev->lock);
   1570         pthread_mutex_unlock(&in->lock);
   1571     }
   1572 
   1573     return 0;
   1574 }
   1575 
   1576 static int adev_open_output_stream(struct audio_hw_device *dev,
   1577                                    audio_io_handle_t handle,
   1578                                    audio_devices_t devices,
   1579                                    audio_output_flags_t flags,
   1580                                    struct audio_config *config,
   1581                                    struct audio_stream_out **stream_out,
   1582                                    const char *address __unused)
   1583 {
   1584     struct audio_device *adev = (struct audio_device *)dev;
   1585     struct stream_out *out;
   1586     int ret;
   1587     enum output_type type;
   1588 
   1589     out = (struct stream_out *)calloc(1, sizeof(struct stream_out));
   1590     if (!out)
   1591         return -ENOMEM;
   1592 
   1593     out->supported_channel_masks[0] = AUDIO_CHANNEL_OUT_STEREO;
   1594     out->channel_mask = AUDIO_CHANNEL_OUT_STEREO;
   1595     if (devices == AUDIO_DEVICE_NONE)
   1596         devices = AUDIO_DEVICE_OUT_SPEAKER;
   1597     out->device = devices;
   1598 
   1599     if (flags & AUDIO_OUTPUT_FLAG_DIRECT &&
   1600                    devices == AUDIO_DEVICE_OUT_AUX_DIGITAL) {
   1601         pthread_mutex_lock(&adev->lock);
   1602         ret = read_hdmi_channel_masks(adev, out);
   1603         pthread_mutex_unlock(&adev->lock);
   1604         if (ret != 0)
   1605             goto err_open;
   1606         if (config->sample_rate == 0)
   1607             config->sample_rate = HDMI_MULTI_DEFAULT_SAMPLING_RATE;
   1608         if (config->channel_mask == 0)
   1609             config->channel_mask = AUDIO_CHANNEL_OUT_5POINT1;
   1610         out->channel_mask = config->channel_mask;
   1611         out->config = pcm_config_hdmi_multi;
   1612         out->config.rate = config->sample_rate;
   1613         out->config.channels = audio_channel_count_from_out_mask(config->channel_mask);
   1614         out->pcm_device = PCM_DEVICE;
   1615         type = OUTPUT_HDMI;
   1616     } else if (flags & AUDIO_OUTPUT_FLAG_DEEP_BUFFER) {
   1617         out->config = pcm_config_deep;
   1618         out->pcm_device = PCM_DEVICE_DEEP;
   1619         type = OUTPUT_DEEP_BUF;
   1620     } else {
   1621         out->config = pcm_config;
   1622         out->pcm_device = PCM_DEVICE;
   1623         type = OUTPUT_LOW_LATENCY;
   1624     }
   1625 
   1626     out->stream.common.get_sample_rate = out_get_sample_rate;
   1627     out->stream.common.set_sample_rate = out_set_sample_rate;
   1628     out->stream.common.get_buffer_size = out_get_buffer_size;
   1629     out->stream.common.get_channels = out_get_channels;
   1630     out->stream.common.get_format = out_get_format;
   1631     out->stream.common.set_format = out_set_format;
   1632     out->stream.common.standby = out_standby;
   1633     out->stream.common.dump = out_dump;
   1634     out->stream.common.set_parameters = out_set_parameters;
   1635     out->stream.common.get_parameters = out_get_parameters;
   1636     out->stream.common.add_audio_effect = out_add_audio_effect;
   1637     out->stream.common.remove_audio_effect = out_remove_audio_effect;
   1638     out->stream.get_latency = out_get_latency;
   1639     out->stream.set_volume = out_set_volume;
   1640     out->stream.write = out_write;
   1641     out->stream.get_render_position = out_get_render_position;
   1642     out->stream.get_next_write_timestamp = out_get_next_write_timestamp;
   1643     out->stream.get_presentation_position = out_get_presentation_position;
   1644 
   1645     out->dev = adev;
   1646 
   1647     config->format = out_get_format(&out->stream.common);
   1648     config->channel_mask = out_get_channels(&out->stream.common);
   1649     config->sample_rate = out_get_sample_rate(&out->stream.common);
   1650 
   1651     out->standby = true;
   1652     /* out->muted = false; by calloc() */
   1653     /* out->written = 0; by calloc() */
   1654 
   1655     pthread_mutex_lock(&adev->lock_outputs);
   1656     if (adev->outputs[type]) {
   1657         pthread_mutex_unlock(&adev->lock_outputs);
   1658         ret = -EBUSY;
   1659         goto err_open;
   1660     }
   1661     adev->outputs[type] = out;
   1662     pthread_mutex_unlock(&adev->lock_outputs);
   1663 
   1664     *stream_out = &out->stream;
   1665 
   1666     return 0;
   1667 
   1668 err_open:
   1669     free(out);
   1670     *stream_out = NULL;
   1671     return ret;
   1672 }
   1673 
   1674 static void adev_close_output_stream(struct audio_hw_device *dev,
   1675                                      struct audio_stream_out *stream)
   1676 {
   1677     struct audio_device *adev;
   1678     enum output_type type;
   1679 
   1680     out_standby(&stream->common);
   1681     adev = (struct audio_device *)dev;
   1682     pthread_mutex_lock(&adev->lock_outputs);
   1683     for (type = 0; type < OUTPUT_TOTAL; ++type) {
   1684         if (adev->outputs[type] == (struct stream_out *) stream) {
   1685             adev->outputs[type] = NULL;
   1686             break;
   1687         }
   1688     }
   1689     pthread_mutex_unlock(&adev->lock_outputs);
   1690     free(stream);
   1691 }
   1692 
   1693 static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs)
   1694 {
   1695     return 0;
   1696 }
   1697 
   1698 static char * adev_get_parameters(const struct audio_hw_device *dev,
   1699                                   const char *keys)
   1700 {
   1701     struct audio_device *adev = (struct audio_device *)dev;
   1702     struct str_parms *parms = str_parms_create_str(keys);
   1703     char value[32];
   1704     int ret = str_parms_get_str(parms, "ec_supported", value, sizeof(value));
   1705     char *str;
   1706 
   1707     str_parms_destroy(parms);
   1708     if (ret >= 0) {
   1709         parms = str_parms_create_str("ec_supported=yes");
   1710         str = str_parms_to_str(parms);
   1711         str_parms_destroy(parms);
   1712         return str;
   1713     }
   1714     return strdup("");
   1715 }
   1716 
   1717 static int adev_init_check(const struct audio_hw_device *dev)
   1718 {
   1719     return 0;
   1720 }
   1721 
   1722 static int adev_set_voice_volume(struct audio_hw_device *dev, float volume)
   1723 {
   1724     return -ENOSYS;
   1725 }
   1726 
   1727 static int adev_set_master_volume(struct audio_hw_device *dev, float volume)
   1728 {
   1729     return -ENOSYS;
   1730 }
   1731 
   1732 static int adev_set_mode(struct audio_hw_device *dev, audio_mode_t mode)
   1733 {
   1734     return 0;
   1735 }
   1736 
   1737 static int adev_set_mic_mute(struct audio_hw_device *dev, bool state)
   1738 {
   1739     struct audio_device *adev = (struct audio_device *)dev;
   1740 
   1741     adev->mic_mute = state;
   1742 
   1743     return 0;
   1744 }
   1745 
   1746 static int adev_get_mic_mute(const struct audio_hw_device *dev, bool *state)
   1747 {
   1748     struct audio_device *adev = (struct audio_device *)dev;
   1749 
   1750     *state = adev->mic_mute;
   1751 
   1752     return 0;
   1753 }
   1754 
   1755 static size_t adev_get_input_buffer_size(const struct audio_hw_device *dev,
   1756                                          const struct audio_config *config)
   1757 {
   1758 
   1759     return get_input_buffer_size(config->sample_rate, config->format,
   1760                                  audio_channel_count_from_in_mask(config->channel_mask),
   1761                                  false /* is_low_latency: since we don't know, be conservative */);
   1762 }
   1763 
   1764 static int adev_open_input_stream(struct audio_hw_device *dev,
   1765                                   audio_io_handle_t handle,
   1766                                   audio_devices_t devices,
   1767                                   struct audio_config *config,
   1768                                   struct audio_stream_in **stream_in,
   1769                                   audio_input_flags_t flags,
   1770                                   const char *address __unused,
   1771                                   audio_source_t source __unused)
   1772 {
   1773     struct audio_device *adev = (struct audio_device *)dev;
   1774     struct stream_in *in;
   1775     int ret;
   1776 
   1777     *stream_in = NULL;
   1778 
   1779     /* Respond with a request for mono if a different format is given. */
   1780     if (config->channel_mask != AUDIO_CHANNEL_IN_MONO &&
   1781             config->channel_mask != AUDIO_CHANNEL_IN_FRONT_BACK) {
   1782         config->channel_mask = AUDIO_CHANNEL_IN_MONO;
   1783         return -EINVAL;
   1784     }
   1785 
   1786     in = (struct stream_in *)calloc(1, sizeof(struct stream_in));
   1787     if (!in)
   1788         return -ENOMEM;
   1789 
   1790     in->stream.common.get_sample_rate = in_get_sample_rate;
   1791     in->stream.common.set_sample_rate = in_set_sample_rate;
   1792     in->stream.common.get_buffer_size = in_get_buffer_size;
   1793     in->stream.common.get_channels = in_get_channels;
   1794     in->stream.common.get_format = in_get_format;
   1795     in->stream.common.set_format = in_set_format;
   1796     in->stream.common.standby = in_standby;
   1797     in->stream.common.dump = in_dump;
   1798     in->stream.common.set_parameters = in_set_parameters;
   1799     in->stream.common.get_parameters = in_get_parameters;
   1800     in->stream.common.add_audio_effect = in_add_audio_effect;
   1801     in->stream.common.remove_audio_effect = in_remove_audio_effect;
   1802     in->stream.set_gain = in_set_gain;
   1803     in->stream.read = in_read;
   1804     in->stream.get_input_frames_lost = in_get_input_frames_lost;
   1805 
   1806     in->dev = adev;
   1807     in->standby = true;
   1808     in->requested_rate = config->sample_rate;
   1809     in->input_source = AUDIO_SOURCE_DEFAULT;
   1810     /* strip AUDIO_DEVICE_BIT_IN to allow bitwise comparisons */
   1811     in->device = devices & ~AUDIO_DEVICE_BIT_IN;
   1812     in->io_handle = handle;
   1813     in->channel_mask = config->channel_mask;
   1814     in->flags = flags;
   1815     struct pcm_config *pcm_config = flags & AUDIO_INPUT_FLAG_FAST ?
   1816             &pcm_config_in_low_latency : &pcm_config_in;
   1817     in->config = pcm_config;
   1818 
   1819     in->buffer = malloc(pcm_config->period_size * pcm_config->channels
   1820                                                * audio_stream_in_frame_size(&in->stream));
   1821 
   1822     if (!in->buffer) {
   1823         ret = -ENOMEM;
   1824         goto err_malloc;
   1825     }
   1826 
   1827     if (in->requested_rate != pcm_config->rate) {
   1828         in->buf_provider.get_next_buffer = get_next_buffer;
   1829         in->buf_provider.release_buffer = release_buffer;
   1830 
   1831         ret = create_resampler(pcm_config->rate,
   1832                                in->requested_rate,
   1833                                audio_channel_count_from_in_mask(in->channel_mask),
   1834                                RESAMPLER_QUALITY_DEFAULT,
   1835                                &in->buf_provider,
   1836                                &in->resampler);
   1837         if (ret != 0) {
   1838             ret = -EINVAL;
   1839             goto err_resampler;
   1840         }
   1841     }
   1842 
   1843     *stream_in = &in->stream;
   1844     return 0;
   1845 
   1846 err_resampler:
   1847     free(in->buffer);
   1848 err_malloc:
   1849     free(in);
   1850     return ret;
   1851 }
   1852 
   1853 static void adev_close_input_stream(struct audio_hw_device *dev,
   1854                                    struct audio_stream_in *stream)
   1855 {
   1856     struct stream_in *in = (struct stream_in *)stream;
   1857 
   1858     in_standby(&stream->common);
   1859     if (in->resampler) {
   1860         release_resampler(in->resampler);
   1861         in->resampler = NULL;
   1862     }
   1863     free(in->buffer);
   1864     free(stream);
   1865 }
   1866 
   1867 static int adev_dump(const audio_hw_device_t *device, int fd)
   1868 {
   1869     return 0;
   1870 }
   1871 
   1872 static int adev_close(hw_device_t *device)
   1873 {
   1874     struct audio_device *adev = (struct audio_device *)device;
   1875 
   1876     audio_route_free(adev->ar);
   1877 
   1878     eS305_Release();
   1879 
   1880     if (adev->hdmi_drv_fd >= 0)
   1881         close(adev->hdmi_drv_fd);
   1882 
   1883     if (adev->bubble_level)
   1884         bubble_level_release(adev->bubble_level);
   1885 
   1886     free(device);
   1887     return 0;
   1888 }
   1889 
   1890 static int adev_open(const hw_module_t* module, const char* name,
   1891                      hw_device_t** device)
   1892 {
   1893     struct audio_device *adev;
   1894     int ret;
   1895 
   1896     if (strcmp(name, AUDIO_HARDWARE_INTERFACE) != 0)
   1897         return -EINVAL;
   1898 
   1899     adev = calloc(1, sizeof(struct audio_device));
   1900     if (!adev)
   1901         return -ENOMEM;
   1902 
   1903     adev->hw_device.common.tag = HARDWARE_DEVICE_TAG;
   1904     adev->hw_device.common.version = AUDIO_DEVICE_API_VERSION_2_0;
   1905     adev->hw_device.common.module = (struct hw_module_t *) module;
   1906     adev->hw_device.common.close = adev_close;
   1907 
   1908     adev->hw_device.init_check = adev_init_check;
   1909     adev->hw_device.set_voice_volume = adev_set_voice_volume;
   1910     adev->hw_device.set_master_volume = adev_set_master_volume;
   1911     adev->hw_device.set_mode = adev_set_mode;
   1912     adev->hw_device.set_mic_mute = adev_set_mic_mute;
   1913     adev->hw_device.get_mic_mute = adev_get_mic_mute;
   1914     adev->hw_device.set_parameters = adev_set_parameters;
   1915     adev->hw_device.get_parameters = adev_get_parameters;
   1916     adev->hw_device.get_input_buffer_size = adev_get_input_buffer_size;
   1917     adev->hw_device.open_output_stream = adev_open_output_stream;
   1918     adev->hw_device.close_output_stream = adev_close_output_stream;
   1919     adev->hw_device.open_input_stream = adev_open_input_stream;
   1920     adev->hw_device.close_input_stream = adev_close_input_stream;
   1921     adev->hw_device.dump = adev_dump;
   1922 
   1923     adev->ar = audio_route_init(MIXER_CARD, NULL);
   1924     adev->input_source = AUDIO_SOURCE_DEFAULT;
   1925     /* adev->cur_route_id initial value is 0 and such that first device
   1926      * selection is always applied by select_devices() */
   1927 
   1928     adev->es305_preset = ES305_PRESET_INIT;
   1929     adev->es305_new_mode = ES305_MODE_LEVEL;
   1930     adev->es305_mode = ES305_MODE_LEVEL;
   1931     adev->hdmi_drv_fd = -1;
   1932 
   1933     *device = &adev->hw_device.common;
   1934 
   1935     char value[PROPERTY_VALUE_MAX];
   1936     if (property_get("audio_hal.period_size", value, NULL) > 0) {
   1937         pcm_config.period_size = atoi(value);
   1938         pcm_config_in.period_size = pcm_config.period_size;
   1939     }
   1940     if (property_get("audio_hal.in_period_size", value, NULL) > 0)
   1941         pcm_config_in.period_size = atoi(value);
   1942 
   1943     return 0;
   1944 }
   1945 
   1946 static struct hw_module_methods_t hal_module_methods = {
   1947     .open = adev_open,
   1948 };
   1949 
   1950 struct audio_module HAL_MODULE_INFO_SYM = {
   1951     .common = {
   1952         .tag = HARDWARE_MODULE_TAG,
   1953         .module_api_version = AUDIO_MODULE_API_VERSION_0_1,
   1954         .hal_api_version = HARDWARE_HAL_API_VERSION,
   1955         .id = AUDIO_HARDWARE_MODULE_ID,
   1956         .name = "Manta audio HW HAL",
   1957         .author = "The Android Open Source Project",
   1958         .methods = &hal_module_methods,
   1959     },
   1960 };
   1961