Home | History | Annotate | Download | only in audio
      1 /*
      2  * Copyright (C) 2008 The Android Open Source Project
      3  * Copyright (C) 2011 Texas Instruments Inc.
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  * This module is a derived work from the original contribution of
     17  * the /device/samsung/tuna/audio/audio_hw.c by Simon Wilson
     18  *
     19  */
     20 
     21 #define LOG_TAG "audio_hw_primary"
     22 /*#define LOG_NDEBUG 0*/
     23 /*#define LOG_NDEBUG_FUNCTION*/
     24 #ifndef LOG_NDEBUG_FUNCTION
     25 #define LOGFUNC(...) ((void)0)
     26 #else
     27 #define LOGFUNC(...) (ALOGV(__VA_ARGS__))
     28 #endif
     29 
     30 #include <errno.h>
     31 #include <pthread.h>
     32 #include <stdint.h>
     33 #include <sys/time.h>
     34 #include <stdlib.h>
     35 
     36 #include <cutils/log.h>
     37 #include <cutils/str_parms.h>
     38 #include <cutils/properties.h>
     39 
     40 #include <hardware/hardware.h>
     41 #include <system/audio.h>
     42 #include <hardware/audio.h>
     43 
     44 #include <tinyalsa/asoundlib.h>
     45 #include <audio_utils/resampler.h>
     46 #include <audio_utils/echo_reference.h>
     47 #include <hardware/audio_effect.h>
     48 #include <audio_effects/effect_aec.h>
     49 
     50 /* Mixer control names */
     51 #define MIXER_DL1_EQUALIZER                 "DL1 Equalizer"
     52 #define MIXER_DL2_LEFT_EQUALIZER            "DL2 Left Equalizer"
     53 #define MIXER_DL2_RIGHT_EQUALIZER           "DL2 Right Equalizer"
     54 #define MIXER_DL1_MEDIA_PLAYBACK_VOLUME     "DL1 Media Playback Volume"
     55 #define MIXER_DL1_VOICE_PLAYBACK_VOLUME     "DL1 Voice Playback Volume"
     56 #define MIXER_DL2_MEDIA_PLAYBACK_VOLUME     "DL2 Media Playback Volume"
     57 #define MIXER_DL2_VOICE_PLAYBACK_VOLUME     "DL2 Voice Playback Volume"
     58 #define MIXER_SDT_DL_VOLUME                 "SDT DL Volume"
     59 #define MIXER_SDT_UL_VOLUME                 "SDT UL Volume"
     60 
     61 #define MIXER_DL1_CAPTURE_PLAYBACK_VOLUME   "DL1 Capture Playback Volume"
     62 #define MIXER_DL2_CAPTURE_PLAYBACK_VOLUME   "DL2 Capture Playback Volume"
     63 #define MIXER_HEADSET_PLAYBACK_VOLUME       "Headset Playback Volume"
     64 #define MIXER_HANDSFREE_PLAYBACK_VOLUME     "Handsfree Playback Volume"
     65 #define MIXER_EARPHONE_PLAYBACK_VOLUME      "Earphone Playback Volume"
     66 #define MIXER_BT_UL_VOLUME                  "BT UL Volume"
     67 
     68 #define MIXER_DL1_EQUALIZER                 "DL1 Equalizer"
     69 #define MIXER_DL1_MIXER_MULTIMEDIA          "DL1 Mixer Multimedia"
     70 #define MIXER_DL1_MIXER_VOICE               "DL1 Mixer Voice"
     71 #define MIXER_DL1_MONO_MIXER                "DL1 Mono Mixer"
     72 #define MIXER_DL2_MIXER_MULTIMEDIA          "DL2 Mixer Multimedia"
     73 #define MIXER_DL2_MIXER_VOICE               "DL2 Mixer Voice"
     74 #define MIXER_DL2_MONO_MIXER                "DL2 Mono Mixer"
     75 #define MIXER_SIDETONE_MIXER_PLAYBACK       "Sidetone Mixer Playback"
     76 #define MIXER_SIDETONE_MIXER_CAPTURE        "Sidetone Mixer Capture"
     77 #define MIXER_DL1_PDM_SWITCH                "DL1 PDM Switch"
     78 #define MIXER_DL1_BT_VX_SWITCH              "DL1 BT_VX Switch"
     79 #define MIXER_DL1_MM_EXT_SWITCH             "DL1 MM_EXT Switch"
     80 #define MIXER_VOICE_CAPTURE_MIXER_CAPTURE   "Voice Capture Mixer Capture"
     81 
     82 #define MIXER_HS_LEFT_PLAYBACK              "HS Left Playback"
     83 #define MIXER_HS_RIGHT_PLAYBACK             "HS Right Playback"
     84 #define MIXER_HF_LEFT_PLAYBACK              "HF Left Playback"
     85 #define MIXER_HF_RIGHT_PLAYBACK             "HF Right Playback"
     86 #define MIXER_EARPHONE_ENABLE_SWITCH        "Earphone Enable Switch"
     87 
     88 #define MIXER_ANALOG_LEFT_CAPTURE_ROUTE     "Analog Left Capture Route"
     89 #define MIXER_ANALOG_RIGHT_CAPTURE_ROUTE    "Analog Right Capture Route"
     90 #define MIXER_CAPTURE_PREAMPLIFIER_VOLUME   "Capture Preamplifier Volume"
     91 #define MIXER_CAPTURE_VOLUME                "Capture Volume"
     92 #define MIXER_AMIC_UL_VOLUME                "AMIC UL Volume"
     93 #define MIXER_AUDUL_VOICE_UL_VOLUME         "AUDUL Voice UL Volume"
     94 #define MIXER_DMIC1_UL_VOLUME               "DMIC1 UL Volume"
     95 #define MIXER_MUX_VX0                       "MUX_VX0"
     96 #define MIXER_MUX_VX1                       "MUX_VX1"
     97 #define MIXER_MUX_UL10                      "MUX_UL10"
     98 #define MIXER_MUX_UL11                      "MUX_UL11"
     99 
    100 /* Mixer control gain and route values */
    101 #define MIXER_ABE_GAIN_0DB                  120
    102 #define MIXER_PLAYBACK_HS_DAC               "HS DAC"
    103 #define MIXER_PLAYBACK_HF_DAC               "HF DAC"
    104 #define MIXER_MAIN_MIC                      "Main Mic"
    105 #define MIXER_SUB_MIC                       "Sub Mic"
    106 #define MIXER_HS_MIC                        "Headset Mic"
    107 #define MIXER_AMIC0                         "AMic0"
    108 #define MIXER_AMIC1                         "AMic1"
    109 #define MIXER_DMIC0L                        "DMic0L"
    110 #define MIXER_DMIC0R                        "DMic0R"
    111 #define MIXER_BT_LEFT                       "BT Left"
    112 #define MIXER_BT_RIGHT                      "BT Right"
    113 #define MIXER_AUX_LEFT                      "Aux/FM Left"
    114 #define MIXER_AUX_RIGHT                     "Aux/FM Right"
    115 #define MIXER_450HZ_HIGH_PASS               "450Hz High-pass"
    116 #define MIXER_0DB_HIGH_PASS                 "High-pass 0dB"
    117 #define MIXER_FLAT_RESPONSE                 "Flat Response"
    118 #define MIXER_4KHZ_LPF_0DB                  "4Khz LPF   0dB"
    119 
    120 
    121 /* ALSA cards for OMAP4 */
    122 #define CARD_OMAP4_ABE 0
    123 #define CARD_OMAP4_HDMI 1
    124 #define CARD_OMAP4_USB 2
    125 #define CARD_BLAZE_DEFAULT CARD_OMAP4_ABE
    126 
    127 /* ALSA ports for OMAP4 */
    128 #define PORT_MM 0
    129 #define PORT_MM2_UL 1
    130 #define PORT_VX 2
    131 #define PORT_TONES 3
    132 #define PORT_VIBRA 4
    133 #define PORT_MODEM 5
    134 #define PORT_MM_LP 6
    135 
    136 /* constraint imposed by ABE for CBPr mode: all period sizes must be multiples of 24 */
    137 #define ABE_BASE_FRAME_COUNT 24
    138 /* number of base blocks in a short period (low latency) */
    139 #define SHORT_PERIOD_MULTIPLIER 80  /* 40 ms */
    140 /* number of frames per short period (low latency) */
    141 #define SHORT_PERIOD_SIZE (ABE_BASE_FRAME_COUNT * SHORT_PERIOD_MULTIPLIER)
    142 /* number of short periods in a long period (low power) */
    143 #define LONG_PERIOD_MULTIPLIER 1  /* 40 ms */
    144 /* number of frames per long period (low power) */
    145 #define LONG_PERIOD_SIZE (SHORT_PERIOD_SIZE * LONG_PERIOD_MULTIPLIER)
    146 /* number of periods for playback */
    147 #define PLAYBACK_PERIOD_COUNT 4
    148 /* number of periods for capture */
    149 #define CAPTURE_PERIOD_COUNT 2
    150 /* minimum sleep time in out_write() when write threshold is not reached */
    151 #define MIN_WRITE_SLEEP_US 5000
    152 
    153 #define RESAMPLER_BUFFER_FRAMES (SHORT_PERIOD_SIZE * 2)
    154 #define RESAMPLER_BUFFER_SIZE (4 * RESAMPLER_BUFFER_FRAMES)
    155 
    156 #define DEFAULT_OUT_SAMPLING_RATE 44100
    157 
    158 /* sampling rate when using MM low power port */
    159 #define MM_LOW_POWER_SAMPLING_RATE 44100
    160 /* sampling rate when using MM full power port */
    161 #define MM_FULL_POWER_SAMPLING_RATE 48000
    162 /* sampling rate when using VX port for narrow band */
    163 #define VX_NB_SAMPLING_RATE 8000
    164 /* sampling rate when using VX port for wide band */
    165 #define VX_WB_SAMPLING_RATE 16000
    166 
    167 /* conversions from dB to ABE and codec gains */
    168 #define DB_TO_ABE_GAIN(x) ((x) + MIXER_ABE_GAIN_0DB)
    169 #define DB_TO_CAPTURE_PREAMPLIFIER_VOLUME(x) (((x) + 6) / 6)
    170 #define DB_TO_CAPTURE_VOLUME(x) (((x) - 6) / 6)
    171 #define DB_TO_HEADSET_VOLUME(x) (((x) + 30) / 2)
    172 #define DB_TO_SPEAKER_VOLUME(x) (((x) + 52) / 2)
    173 #define DB_TO_EARPIECE_VOLUME(x) (((x) + 24) / 2)
    174 
    175 /* use-case specific mic volumes, all in dB */
    176 #define CAPTURE_DIGITAL_MIC_VOLUME            26
    177 #define CAPTURE_MAIN_MIC_VOLUME               15
    178 #define CAPTURE_SUB_MIC_VOLUME                15
    179 #define CAPTURE_HEADSET_MIC_VOLUME            15
    180 
    181 #define VOICE_RECOGNITION_MAIN_MIC_VOLUME     25
    182 #define VOICE_RECOGNITION_SUB_MIC_VOLUME      25
    183 #define VOICE_RECOGNITION_HEADSET_MIC_VOLUME  25
    184 
    185 #define CAMCORDER_MAIN_MIC_VOLUME             15
    186 #define CAMCORDER_SUB_MIC_VOLUME              15
    187 #define CAMCORDER_HEADSET_MIC_VOLUME          15
    188 
    189 #define VOIP_MAIN_MIC_VOLUME                  15
    190 #define VOIP_SUB_MIC_VOLUME                   15
    191 #define VOIP_HEADSET_MIC_VOLUME               15
    192 
    193 #define VOICE_CALL_MAIN_MIC_VOLUME            15
    194 #define VOICE_CALL_SUB_MIC_VOLUME             15
    195 #define VOICE_CALL_HEADSET_MIC_VOLUME         15
    196 
    197 /* use-case specific output volumes */
    198 #define NORMAL_SPEAKER_VOLUME                 0
    199 #define VOICE_CALL_SPEAKER_VOLUME             0
    200 
    201 #define HEADSET_VOLUME                        0
    202 #define HEADPHONE_VOLUME                      0 /* allow louder output for headphones */
    203 
    204 /* product-specific defines */
    205 #define PRODUCT_DEVICE_PROPERTY "ro.product.device"
    206 #define PRODUCT_DEVICE_BLAZE    "blaze"
    207 #define PRODUCT_DEVICE_TABLET   "blaze_tablet"
    208 #define PRODUCT_DEVICE_PANDA    "panda"
    209 
    210 enum supported_boards {
    211     BLAZE,
    212     TABLET,
    213     PANDA
    214 };
    215 
    216 enum tty_modes {
    217     TTY_MODE_OFF,
    218     TTY_MODE_VCO,
    219     TTY_MODE_HCO,
    220     TTY_MODE_FULL
    221 };
    222 
    223 struct pcm_config pcm_config_mm = {
    224     .channels = 2,
    225     .rate = DEFAULT_OUT_SAMPLING_RATE,
    226     .period_size = LONG_PERIOD_SIZE,
    227     .period_count = PLAYBACK_PERIOD_COUNT,
    228     .format = PCM_FORMAT_S16_LE,
    229 };
    230 
    231 struct pcm_config pcm_config_mm_ul = {
    232     .channels = 2,
    233     .rate = MM_FULL_POWER_SAMPLING_RATE,
    234     .period_size = SHORT_PERIOD_SIZE,
    235     .period_count = CAPTURE_PERIOD_COUNT,
    236     .format = PCM_FORMAT_S16_LE,
    237 };
    238 
    239 struct pcm_config pcm_config_vx = {
    240     .channels = 2,
    241     .rate = VX_WB_SAMPLING_RATE,
    242     .period_size = 160,
    243     .period_count = 2,
    244     .format = PCM_FORMAT_S16_LE,
    245 };
    246 
    247 #define MIN(x, y) ((x) > (y) ? (y) : (x))
    248 
    249 struct route_setting
    250 {
    251     char *ctl_name;
    252     int intval;
    253     char *strval;
    254 };
    255 
    256 /* These are values that never change */
    257 struct route_setting defaults[] = {
    258     /* general */
    259     {
    260         .ctl_name = MIXER_DL2_LEFT_EQUALIZER,
    261         .strval = MIXER_0DB_HIGH_PASS,
    262     },
    263     {
    264         .ctl_name = MIXER_DL2_RIGHT_EQUALIZER,
    265         .strval = MIXER_0DB_HIGH_PASS,
    266     },
    267     {
    268         .ctl_name = MIXER_DL1_EQUALIZER,
    269         .strval = MIXER_FLAT_RESPONSE,
    270     },
    271     {
    272         .ctl_name = MIXER_DL1_MEDIA_PLAYBACK_VOLUME,
    273         .intval = MIXER_ABE_GAIN_0DB - 2,
    274     },
    275     {
    276         .ctl_name = MIXER_DL2_MEDIA_PLAYBACK_VOLUME,
    277         .intval = MIXER_ABE_GAIN_0DB - 2,
    278     },
    279     {
    280         .ctl_name = MIXER_DL1_VOICE_PLAYBACK_VOLUME,
    281         .intval = MIXER_ABE_GAIN_0DB,
    282     },
    283     {
    284         .ctl_name = MIXER_DL2_VOICE_PLAYBACK_VOLUME,
    285         .intval = MIXER_ABE_GAIN_0DB,
    286     },
    287     {
    288         .ctl_name = MIXER_SDT_DL_VOLUME,
    289         .intval = MIXER_ABE_GAIN_0DB,
    290     },
    291     {
    292         .ctl_name = MIXER_EARPHONE_PLAYBACK_VOLUME,
    293         .intval = DB_TO_EARPIECE_VOLUME(6),
    294     },
    295     {
    296         .ctl_name = MIXER_AUDUL_VOICE_UL_VOLUME,
    297         .intval = MIXER_ABE_GAIN_0DB,
    298     },
    299     {
    300         .ctl_name = MIXER_CAPTURE_PREAMPLIFIER_VOLUME,
    301         .intval = DB_TO_CAPTURE_PREAMPLIFIER_VOLUME(0),
    302     },
    303     {
    304         .ctl_name = MIXER_CAPTURE_VOLUME,
    305         .intval = DB_TO_CAPTURE_VOLUME(30),
    306     },
    307     {
    308         .ctl_name = MIXER_SDT_UL_VOLUME,
    309         .intval = MIXER_ABE_GAIN_0DB - 19,
    310     },
    311     {
    312         .ctl_name = MIXER_SIDETONE_MIXER_CAPTURE,
    313         .intval = 0,
    314     },
    315 
    316     /* headset */
    317     {
    318         .ctl_name = MIXER_SIDETONE_MIXER_PLAYBACK,
    319         .intval = 1,
    320     },
    321     {
    322         .ctl_name = MIXER_DL1_PDM_SWITCH,
    323         .intval = 1,
    324     },
    325 
    326     /* bt */
    327     {
    328         .ctl_name = MIXER_BT_UL_VOLUME,
    329         .intval = MIXER_ABE_GAIN_0DB,
    330     },
    331     {
    332         .ctl_name = NULL,
    333     },
    334 };
    335 
    336 struct route_setting hf_output[] = {
    337     {
    338         .ctl_name = MIXER_HF_LEFT_PLAYBACK,
    339         .strval = MIXER_PLAYBACK_HF_DAC,
    340     },
    341     {
    342         .ctl_name = MIXER_HF_RIGHT_PLAYBACK,
    343         .strval = MIXER_PLAYBACK_HF_DAC,
    344     },
    345     {
    346         .ctl_name = NULL,
    347     },
    348 };
    349 
    350 struct route_setting hs_output[] = {
    351     {
    352         .ctl_name = MIXER_HS_LEFT_PLAYBACK,
    353         .strval = MIXER_PLAYBACK_HS_DAC,
    354     },
    355     {
    356         .ctl_name = MIXER_HS_RIGHT_PLAYBACK,
    357         .strval = MIXER_PLAYBACK_HS_DAC,
    358     },
    359     {
    360         .ctl_name = NULL,
    361     },
    362 };
    363 
    364 struct route_setting fmtx_output_on[] ={
    365    {
    366         .ctl_name = MIXER_DL1_MM_EXT_SWITCH,
    367         .intval = 1,
    368    },
    369    {
    370         .ctl_name = MIXER_DL1_PDM_SWITCH,
    371         .intval = 0,
    372    },
    373    {
    374         .ctl_name = NULL,
    375    },
    376 };
    377 
    378 struct route_setting fmtx_output_off[] ={
    379    {
    380         .ctl_name = MIXER_DL1_MM_EXT_SWITCH,
    381         .intval = 0,
    382    },
    383    {
    384         .ctl_name = MIXER_DL1_PDM_SWITCH,
    385         .intval = 1,
    386    },
    387    {
    388         .ctl_name = NULL,
    389    },
    390 };
    391 
    392 /* MM UL front-end paths */
    393 struct route_setting mm_ul2_bt[] = {
    394     {
    395         .ctl_name = MIXER_MUX_UL10,
    396         .strval = MIXER_BT_LEFT,
    397     },
    398     {
    399         .ctl_name = MIXER_MUX_UL11,
    400         .strval = MIXER_BT_LEFT,
    401     },
    402     {
    403         .ctl_name = NULL,
    404     },
    405 };
    406 
    407 struct route_setting mm_ul2_fmradio[] = {
    408      {
    409         .ctl_name = MIXER_MUX_UL10,
    410         .strval = MIXER_AMIC1,
    411      },
    412      {
    413         .ctl_name = MIXER_MUX_UL11,
    414         .strval = MIXER_AMIC0,
    415      },
    416      {
    417         .ctl_name =  MIXER_DL1_CAPTURE_PLAYBACK_VOLUME,  // Enable FM on wired headset only.
    418         .intval = MIXER_ABE_GAIN_0DB,
    419      },
    420      {
    421         .ctl_name = NULL,
    422      },
    423 };
    424 
    425 struct route_setting mm_ul2_amic_left[] = {
    426     {
    427         .ctl_name = MIXER_MUX_UL10,
    428         .strval = MIXER_AMIC0,
    429     },
    430     {
    431         .ctl_name = MIXER_MUX_UL11,
    432         .strval = MIXER_AMIC0,
    433     },
    434     {
    435         .ctl_name = NULL,
    436     },
    437 };
    438 
    439 struct route_setting mm_ul2_amic_right[] = {
    440     {
    441         .ctl_name = MIXER_MUX_UL10,
    442         .strval = MIXER_AMIC1,
    443     },
    444     {
    445         .ctl_name = MIXER_MUX_UL11,
    446         .strval = MIXER_AMIC1,
    447     },
    448     {
    449         .ctl_name = NULL,
    450     },
    451 };
    452 
    453 struct route_setting mm_ul2_dmic0[] = {
    454     {
    455         .ctl_name = MIXER_MUX_UL10,
    456         .strval = MIXER_DMIC0L,
    457     },
    458     {
    459         .ctl_name = MIXER_MUX_UL11,
    460         .strval = MIXER_DMIC0L,
    461     },
    462     {
    463         .ctl_name = NULL,
    464     },
    465 };
    466 
    467 /* VX UL front-end paths */
    468 struct route_setting vx_ul_amic_left[] = {
    469     {
    470         .ctl_name = MIXER_MUX_VX0,
    471         .strval = MIXER_AMIC0,
    472     },
    473     {
    474         .ctl_name = MIXER_MUX_VX1,
    475         .strval = MIXER_AMIC0,
    476     },
    477     {
    478         .ctl_name = MIXER_VOICE_CAPTURE_MIXER_CAPTURE,
    479         .intval = 1,
    480     },
    481     {
    482         .ctl_name = NULL,
    483     },
    484 };
    485 
    486 struct route_setting vx_ul_amic_right[] = {
    487     {
    488         .ctl_name = MIXER_MUX_VX0,
    489         .strval = MIXER_AMIC1,
    490     },
    491     {
    492         .ctl_name = MIXER_MUX_VX1,
    493         .strval = MIXER_AMIC1,
    494     },
    495     {
    496         .ctl_name = MIXER_VOICE_CAPTURE_MIXER_CAPTURE,
    497         .intval = 1,
    498     },
    499     {
    500         .ctl_name = NULL,
    501     },
    502 };
    503 struct route_setting vx_ul_dmic0[] = {
    504     {
    505         .ctl_name = MIXER_MUX_VX0,
    506         .strval = MIXER_DMIC0L,
    507     },
    508     {
    509         .ctl_name = MIXER_MUX_VX1,
    510         .strval = MIXER_DMIC0L,
    511     },
    512     {
    513         .ctl_name = MIXER_VOICE_CAPTURE_MIXER_CAPTURE,
    514         .intval = 1,
    515     },
    516     {
    517         .ctl_name = NULL,
    518     },
    519 };
    520 
    521 struct route_setting vx_ul_bt[] = {
    522     {
    523         .ctl_name = MIXER_MUX_VX0,
    524         .strval = MIXER_BT_LEFT,
    525     },
    526     {
    527         .ctl_name = MIXER_MUX_VX1,
    528         .strval = MIXER_BT_LEFT,
    529     },
    530     {
    531         .ctl_name = MIXER_VOICE_CAPTURE_MIXER_CAPTURE,
    532         .intval = 1,
    533     },
    534     {
    535         .ctl_name = NULL,
    536     },
    537 };
    538 
    539 struct buffer_remix;
    540 
    541 /* buffer_remix: functor for doing in-place buffer manipulations.
    542  *
    543  * NB. When remix_func is called, the memory at `buf` must be at least
    544  * as large as frames * sample_size * MAX(in_chans, out_chans).
    545  */
    546 struct buffer_remix {
    547     void (*remix_func)(struct buffer_remix *data, void *buf, size_t frames);
    548     size_t sample_size; /* size of one audio sample, in bytes */
    549     size_t in_chans;    /* number of input channels */
    550     size_t out_chans;   /* number of output channels */
    551 };
    552 
    553 
    554 struct mixer_ctls
    555 {
    556     struct mixer_ctl *dl1_eq;
    557     struct mixer_ctl *mm_dl1;
    558     struct mixer_ctl *mm_dl2;
    559     struct mixer_ctl *vx_dl1;
    560     struct mixer_ctl *vx_dl2;
    561     struct mixer_ctl *earpiece_enable;
    562     struct mixer_ctl *dl2_mono;
    563     struct mixer_ctl *dl1_mono;
    564     struct mixer_ctl *dl1_headset;
    565     struct mixer_ctl *dl1_bt;
    566     struct mixer_ctl *left_capture;
    567     struct mixer_ctl *right_capture;
    568     struct mixer_ctl *amic_ul_volume;
    569     struct mixer_ctl *dmic1_ul_volume;
    570     struct mixer_ctl *voice_ul_volume;
    571     struct mixer_ctl *sidetone_capture;
    572     struct mixer_ctl *headset_volume;
    573     struct mixer_ctl *speaker_volume;
    574 };
    575 
    576 struct omap4_audio_device {
    577     struct audio_hw_device hw_device;
    578 
    579     pthread_mutex_t lock;       /* see note below on mutex acquisition order */
    580     struct mixer *mixer;
    581     struct mixer_ctls mixer_ctls;
    582     int mode;
    583     int devices;
    584     struct pcm *pcm_modem_dl;
    585     struct pcm *pcm_modem_ul;
    586     int in_call;
    587     float voice_volume;
    588     struct omap4_stream_in *active_input;
    589     struct omap4_stream_out *active_output;
    590     bool mic_mute;
    591     int tty_mode;
    592     int sidetone_capture;
    593     int board_type;
    594     struct echo_reference_itfe *echo_reference;
    595     int input_requires_stereo;
    596     bool low_power;
    597     bool bluetooth_nrec;
    598 };
    599 
    600 struct omap4_stream_out {
    601     struct audio_stream_out stream;
    602 
    603     pthread_mutex_t lock;       /* see note below on mutex acquisition order */
    604     struct pcm_config config;
    605     struct pcm *pcm;
    606     struct resampler_itfe *resampler;
    607     char *buffer;
    608     int standby;
    609     struct echo_reference_itfe *echo_reference;
    610     int write_threshold;
    611     bool low_power;
    612 
    613     struct omap4_audio_device *dev;
    614 };
    615 
    616 #define MAX_PREPROCESSORS 3 /* maximum one AGC + one NS + one AEC per input stream */
    617 
    618 struct omap4_stream_in {
    619     struct audio_stream_in stream;
    620 
    621     pthread_mutex_t lock;       /* see note below on mutex acquisition order */
    622     struct pcm_config config;
    623     struct pcm *pcm;
    624     int device;
    625     struct resampler_itfe *resampler;
    626     struct resampler_buffer_provider buf_provider;
    627     int16_t *buffer;
    628     size_t frames_in;
    629     unsigned int requested_rate;
    630     int standby;
    631     int source;
    632     struct echo_reference_itfe *echo_reference;
    633     bool need_echo_reference;
    634     effect_handle_t preprocessors[MAX_PREPROCESSORS];
    635     int num_preprocessors;
    636     int16_t *proc_buf;
    637     size_t proc_buf_size;
    638     size_t proc_frames_in;
    639     int16_t *ref_buf;
    640     size_t ref_buf_size;
    641     size_t ref_frames_in;
    642     int read_status;
    643     struct buffer_remix *remix_at_driver; /* adapt hw chan count to client */
    644 
    645     struct omap4_audio_device *dev;
    646 };
    647 
    648 /**
    649  * NOTE: when multiple mutexes have to be acquired, always respect the following order:
    650  *        hw device > in stream > out stream
    651  */
    652 
    653 
    654 static void select_output_device(struct omap4_audio_device *adev);
    655 static void select_input_device(struct omap4_audio_device *adev);
    656 static int adev_set_voice_volume(struct audio_hw_device *dev, float volume);
    657 static int do_input_standby(struct omap4_stream_in *in);
    658 static int do_output_standby(struct omap4_stream_out *out);
    659 
    660 /* Implementation of buffer_remix::remix_func that removes
    661  * channels in place without doing any other processing.  The
    662  * extra channels are truncated.
    663  */
    664 static void remove_channels_from_buf(struct buffer_remix *data, void *buf, size_t frames)
    665 {
    666     size_t samp_size, in_frame, out_frame;
    667     size_t N, c;
    668     char *s, *d;
    669 
    670     LOGFUNC("%s(%p, %p, %d)", __FUNCTION__, data, buf, frames);
    671     if (frames == 0)
    672         return;
    673 
    674 
    675     samp_size = data->sample_size;
    676     in_frame = data->in_chans * samp_size;
    677     out_frame = data->out_chans * samp_size;
    678 
    679     if (out_frame >= in_frame) {
    680         ALOGE("BUG: remove_channels_from_buf() can not add channels to a buffer.\n");
    681         return;
    682     }
    683 
    684     N = frames - 1;
    685     d = (char*)buf + out_frame;
    686     s = (char*)buf + in_frame;
    687 
    688     /* take the first several channels and
    689      * truncate the rest
    690      */
    691     while (N--) {
    692         for (c=0 ; c < out_frame ; ++c)
    693             d[c] = s[c];
    694         d += out_frame;
    695         s += in_frame;
    696     }
    697 }
    698 
    699 static void setup_stereo_to_mono_input_remix(struct omap4_stream_in *in)
    700 {
    701     struct buffer_remix *br = (struct buffer_remix *)malloc(sizeof(struct buffer_remix));
    702 
    703     LOGFUNC("%s(%p)", __FUNCTION__, in);
    704 
    705 
    706     if (br) {
    707         br->remix_func = remove_channels_from_buf;
    708         br->sample_size = audio_stream_frame_size(&in->stream.common) / in->config.channels;
    709         br->in_chans = 2;
    710         br->out_chans = 1;
    711     } else
    712         ALOGE("Could not allocate memory for struct buffer_remix\n");
    713 
    714     if (in->buffer) {
    715         size_t chans = (br->in_chans > br->out_chans) ? br->in_chans : br->out_chans;
    716         free(in->buffer);
    717         in->buffer = malloc(in->config.period_size * br->sample_size * chans);
    718         if (!in->buffer)
    719             ALOGE("Could not reallocate memory for input buffer\n");
    720     }
    721 
    722     if (in->remix_at_driver)
    723         free(in->remix_at_driver);
    724     in->remix_at_driver = br;
    725 }
    726 
    727 static int get_boardtype(struct omap4_audio_device *adev)
    728 {
    729     char board[PROPERTY_VALUE_MAX];
    730     int status = 0;
    731     int board_type = 0;
    732 
    733     LOGFUNC("%s(%p)", __FUNCTION__, adev);
    734 
    735     property_get(PRODUCT_DEVICE_PROPERTY, board, PRODUCT_DEVICE_BLAZE);
    736     /* return true if the property matches the given value */
    737     if(!strcmp(board, PRODUCT_DEVICE_BLAZE)) {
    738             adev->board_type = BLAZE;
    739           /*true on devices that must use sidetone capture */
    740             adev->sidetone_capture = 1;
    741     }
    742     else if(!strcmp(board, PRODUCT_DEVICE_TABLET)) {
    743             adev->board_type = TABLET;
    744             adev->sidetone_capture = 0;
    745     }
    746     else if(!strcmp(board, PRODUCT_DEVICE_PANDA)) {
    747             adev->board_type = PANDA;
    748             adev->sidetone_capture = 0;
    749     }
    750     else
    751         return -EINVAL;
    752 
    753     return 0;
    754 }
    755 /* The enable flag when 0 makes the assumption that enums are disabled by
    756  * "Off" and integers/booleans by 0 */
    757 
    758 static int set_route_by_array(struct mixer *mixer, struct route_setting *route,
    759                               int enable)
    760 {
    761     struct mixer_ctl *ctl;
    762     unsigned int i, j;
    763 
    764     LOGFUNC("%s(%p, %p, %d)", __FUNCTION__, mixer, route, enable);
    765 
    766     /* Go through the route array and set each value */
    767     i = 0;
    768     while (route[i].ctl_name) {
    769         ctl = mixer_get_ctl_by_name(mixer, route[i].ctl_name);
    770         if (!ctl)
    771             return -EINVAL;
    772 
    773         if (route[i].strval) {
    774             if (enable)
    775                 mixer_ctl_set_enum_by_string(ctl, route[i].strval);
    776             else
    777                 mixer_ctl_set_enum_by_string(ctl, "Off");
    778         } else {
    779             /* This ensures multiple (i.e. stereo) values are set jointly */
    780             for (j = 0; j < mixer_ctl_get_num_values(ctl); j++) {
    781                 if (enable)
    782                     mixer_ctl_set_value(ctl, j, route[i].intval);
    783                 else
    784                     mixer_ctl_set_value(ctl, j, 0);
    785             }
    786         }
    787         i++;
    788     }
    789 
    790     return 0;
    791 }
    792 
    793 static int start_call(struct omap4_audio_device *adev)
    794 {
    795     ALOGE("Opening modem PCMs");
    796     LOGFUNC("%s(%p)", __FUNCTION__, adev);
    797 
    798     pcm_config_vx.rate = VX_NB_SAMPLING_RATE;
    799 
    800     /* Open modem PCM channels */
    801     if (adev->pcm_modem_dl == NULL) {
    802         adev->pcm_modem_dl = pcm_open(0, PORT_MODEM, PCM_OUT, &pcm_config_vx);
    803         if (!pcm_is_ready(adev->pcm_modem_dl)) {
    804             ALOGE("cannot open PCM modem DL stream: %s", pcm_get_error(adev->pcm_modem_dl));
    805             goto err_open_dl;
    806         }
    807     }
    808 
    809     if (adev->pcm_modem_ul == NULL) {
    810         adev->pcm_modem_ul = pcm_open(0, PORT_MODEM, PCM_IN, &pcm_config_vx);
    811         if (!pcm_is_ready(adev->pcm_modem_ul)) {
    812             ALOGE("cannot open PCM modem UL stream: %s", pcm_get_error(adev->pcm_modem_ul));
    813             goto err_open_ul;
    814         }
    815     }
    816 
    817     pcm_start(adev->pcm_modem_dl);
    818     pcm_start(adev->pcm_modem_ul);
    819 
    820     return 0;
    821 
    822 err_open_ul:
    823     pcm_close(adev->pcm_modem_ul);
    824     adev->pcm_modem_ul = NULL;
    825 err_open_dl:
    826     pcm_close(adev->pcm_modem_dl);
    827     adev->pcm_modem_dl = NULL;
    828 
    829     return -ENOMEM;
    830 }
    831 
    832 static void end_call(struct omap4_audio_device *adev)
    833 {
    834     ALOGE("Closing modem PCMs");
    835     LOGFUNC("%s(%p)", __FUNCTION__, adev);
    836 
    837     pcm_stop(adev->pcm_modem_dl);
    838     pcm_stop(adev->pcm_modem_ul);
    839     pcm_close(adev->pcm_modem_dl);
    840     pcm_close(adev->pcm_modem_ul);
    841     adev->pcm_modem_dl = NULL;
    842     adev->pcm_modem_ul = NULL;
    843 }
    844 
    845 static void set_eq_filter(struct omap4_audio_device *adev)
    846 {
    847     LOGFUNC("%s(%p)", __FUNCTION__, adev);
    848 }
    849 
    850 static void set_incall_device(struct omap4_audio_device *adev)
    851 {
    852 	return;
    853 }
    854 
    855 static void set_input_volumes(struct omap4_audio_device *adev, int main_mic_on,
    856                               int headset_mic_on, int sub_mic_on)
    857 {
    858     unsigned int channel;
    859     int volume = MIXER_ABE_GAIN_0DB;
    860 
    861     LOGFUNC("%s(%p, %d, %d, %d)", __FUNCTION__, adev, main_mic_on,
    862                                 headset_mic_on, sub_mic_on);
    863 
    864     if (adev->mode == AUDIO_MODE_IN_CALL) {
    865         /* special case: don't look at input source for IN_CALL state */
    866         volume = DB_TO_ABE_GAIN(main_mic_on ? VOICE_CALL_MAIN_MIC_VOLUME :
    867                 (headset_mic_on ? VOICE_CALL_HEADSET_MIC_VOLUME :
    868                 (sub_mic_on ? VOICE_CALL_SUB_MIC_VOLUME : 0)));
    869     } else if (adev->active_input) {
    870         /* determine input volume by use case */
    871         switch (adev->active_input->source) {
    872         case AUDIO_SOURCE_MIC: /* general capture */
    873             if(adev->board_type == BLAZE) {
    874                 volume = DB_TO_ABE_GAIN(main_mic_on ? CAPTURE_MAIN_MIC_VOLUME :
    875                     (headset_mic_on ? CAPTURE_HEADSET_MIC_VOLUME :
    876                     (sub_mic_on ? CAPTURE_SUB_MIC_VOLUME : 0)));
    877             }else if(adev->board_type == TABLET) {
    878                 volume = DB_TO_ABE_GAIN(main_mic_on ? CAPTURE_DIGITAL_MIC_VOLUME :
    879                     (headset_mic_on ? CAPTURE_HEADSET_MIC_VOLUME :
    880                      (sub_mic_on ? CAPTURE_SUB_MIC_VOLUME : 0)));
    881             }
    882             break;
    883 
    884         case AUDIO_SOURCE_CAMCORDER:
    885             volume = DB_TO_ABE_GAIN(main_mic_on ? CAMCORDER_MAIN_MIC_VOLUME :
    886                     (headset_mic_on ? CAMCORDER_HEADSET_MIC_VOLUME :
    887                     (sub_mic_on ? CAMCORDER_SUB_MIC_VOLUME : 0)));
    888             break;
    889 
    890         case AUDIO_SOURCE_VOICE_RECOGNITION:
    891             volume = DB_TO_ABE_GAIN(main_mic_on ? VOICE_RECOGNITION_MAIN_MIC_VOLUME :
    892                     (headset_mic_on ? VOICE_RECOGNITION_HEADSET_MIC_VOLUME :
    893                     (sub_mic_on ? VOICE_RECOGNITION_SUB_MIC_VOLUME : 0)));
    894             break;
    895 
    896         case AUDIO_SOURCE_VOICE_COMMUNICATION: /* VoIP */
    897             volume = DB_TO_ABE_GAIN(main_mic_on ? VOIP_MAIN_MIC_VOLUME :
    898                     (headset_mic_on ? VOIP_HEADSET_MIC_VOLUME :
    899                     (sub_mic_on ? VOIP_SUB_MIC_VOLUME : 0)));
    900             break;
    901 
    902         default:
    903             /* nothing to do */
    904             break;
    905         }
    906     }
    907 
    908     for (channel = 0; channel < 2; channel++) {
    909         if(adev->board_type == BLAZE) {
    910             mixer_ctl_set_value(adev->mixer_ctls.amic_ul_volume, channel, volume);
    911         }else if(adev->board_type == TABLET) {
    912             if (headset_mic_on)
    913                 mixer_ctl_set_value(adev->mixer_ctls.amic_ul_volume, channel, volume);
    914             else
    915                 mixer_ctl_set_value(adev->mixer_ctls.dmic1_ul_volume, channel, volume);
    916         }
    917     }
    918 }
    919 
    920 static void set_output_volumes(struct omap4_audio_device *adev)
    921 {
    922     unsigned int channel;
    923     int speaker_volume;
    924     int headset_volume;
    925 
    926     speaker_volume = adev->mode == AUDIO_MODE_IN_CALL ? VOICE_CALL_SPEAKER_VOLUME :
    927                                                         NORMAL_SPEAKER_VOLUME;
    928     headset_volume = adev->devices & AUDIO_DEVICE_OUT_WIRED_HEADSET ?
    929                                                         HEADSET_VOLUME :
    930                                                         HEADPHONE_VOLUME;
    931 
    932     for (channel = 0; channel < 2; channel++) {
    933         mixer_ctl_set_value(adev->mixer_ctls.speaker_volume, channel,
    934             DB_TO_SPEAKER_VOLUME(speaker_volume));
    935         mixer_ctl_set_value(adev->mixer_ctls.headset_volume, channel,
    936             DB_TO_HEADSET_VOLUME(headset_volume));
    937     }
    938 }
    939 
    940 static void force_all_standby(struct omap4_audio_device *adev)
    941 {
    942     struct omap4_stream_in *in;
    943     struct omap4_stream_out *out;
    944 
    945     LOGFUNC("%s(%p)", __FUNCTION__, adev);
    946 
    947     if (adev->active_output) {
    948         out = adev->active_output;
    949         pthread_mutex_lock(&out->lock);
    950         do_output_standby(out);
    951         pthread_mutex_unlock(&out->lock);
    952     }
    953     if (adev->active_input) {
    954         in = adev->active_input;
    955         pthread_mutex_lock(&in->lock);
    956         do_input_standby(in);
    957         pthread_mutex_unlock(&in->lock);
    958     }
    959 }
    960 
    961 static void select_mode(struct omap4_audio_device *adev)
    962 {
    963     LOGFUNC("%s(%p)", __FUNCTION__, adev);
    964 
    965     if (adev->mode == AUDIO_MODE_IN_CALL) {
    966         ALOGE("Entering IN_CALL state, in_call=%d", adev->in_call);
    967         if (!adev->in_call) {
    968             force_all_standby(adev);
    969             /* force earpiece route for in call state if speaker is the
    970             only currently selected route. This prevents having to tear
    971             down the modem PCMs to change route from speaker to earpiece
    972             after the ringtone is played, but doesn't cause a route
    973             change if a headset or bt device is already connected. If
    974             speaker is not the only thing active, just remove it from
    975             the route. We'll assume it'll never be used initally during
    976             a call. This works because we're sure that the audio policy
    977             manager will update the output device after the audio mode
    978             change, even if the device selection did not change. */
    979             if ((adev->devices & AUDIO_DEVICE_OUT_ALL) == AUDIO_DEVICE_OUT_SPEAKER)
    980                 adev->devices = AUDIO_DEVICE_OUT_EARPIECE |
    981                                 AUDIO_DEVICE_IN_BUILTIN_MIC;
    982             else
    983                 adev->devices &= ~AUDIO_DEVICE_OUT_SPEAKER;
    984             select_output_device(adev);
    985             start_call(adev);
    986             adev_set_voice_volume(&adev->hw_device, adev->voice_volume);
    987             adev->in_call = 1;
    988         }
    989     } else {
    990         ALOGE("Leaving IN_CALL state, in_call=%d, mode=%d",
    991              adev->in_call, adev->mode);
    992         if (adev->in_call) {
    993             adev->in_call = 0;
    994             end_call(adev);
    995             force_all_standby(adev);
    996             select_output_device(adev);
    997             select_input_device(adev);
    998         }
    999     }
   1000 }
   1001 
   1002 static void select_output_device(struct omap4_audio_device *adev)
   1003 {
   1004     int headset_on;
   1005     int headphone_on;
   1006     int speaker_on;
   1007     int earpiece_on;
   1008     int bt_on;
   1009     int dl1_on;
   1010     int fmtx_on;
   1011     int sidetone_capture_on = 0;
   1012     unsigned int channel, voice_ul_volume[2];
   1013 
   1014     LOGFUNC("%s(%p)", __FUNCTION__, adev);
   1015 
   1016     if(adev->board_type ==  PANDA) {
   1017         headset_on = 0;
   1018         speaker_on = 1;
   1019         mixer_ctl_set_value(adev->mixer_ctls.mm_dl1, 0, 1);
   1020         set_route_by_array(adev->mixer, hs_output, 1);
   1021         set_input_volumes(adev, 0,
   1022                         headset_on, speaker_on);
   1023     } else {
   1024         headset_on = adev->devices & AUDIO_DEVICE_OUT_WIRED_HEADSET;
   1025         headphone_on = adev->devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE;
   1026         speaker_on = adev->devices & AUDIO_DEVICE_OUT_SPEAKER;
   1027         earpiece_on = adev->devices & AUDIO_DEVICE_OUT_EARPIECE;
   1028         bt_on = adev->devices & AUDIO_DEVICE_OUT_ALL_SCO;
   1029 
   1030         /* force rx path according to TTY mode when in call */
   1031         if (adev->mode == AUDIO_MODE_IN_CALL && !bt_on) {
   1032             switch(adev->tty_mode) {
   1033                 case TTY_MODE_FULL:
   1034                 case TTY_MODE_VCO:
   1035                     /* rx path to headphones */
   1036                     headphone_on = 1;
   1037                     headset_on = 0;
   1038                     speaker_on = 0;
   1039                     earpiece_on = 0;
   1040                     break;
   1041                 case TTY_MODE_HCO:
   1042                     /* rx path to device speaker */
   1043                     headphone_on = 0;
   1044                     headset_on = 0;
   1045                     speaker_on = 1;
   1046                     earpiece_on = 0;
   1047                     break;
   1048                 case TTY_MODE_OFF:
   1049                 default:
   1050                     /* force speaker on when in call and HDMI is selected as voice DL audio
   1051                      * cannot be routed to HDMI by ABE */
   1052                     if (adev->devices & AUDIO_DEVICE_OUT_AUX_DIGITAL)
   1053                         speaker_on = 1;
   1054                     break;
   1055             }
   1056         }
   1057 
   1058         dl1_on = headset_on | headphone_on | earpiece_on | bt_on;
   1059 
   1060         /* Select front end */
   1061         mixer_ctl_set_value(adev->mixer_ctls.mm_dl2, 0, speaker_on);
   1062         mixer_ctl_set_value(adev->mixer_ctls.vx_dl2, 0,
   1063                             speaker_on && (adev->mode == AUDIO_MODE_IN_CALL));
   1064         mixer_ctl_set_value(adev->mixer_ctls.mm_dl1, 0, dl1_on);
   1065         mixer_ctl_set_value(adev->mixer_ctls.vx_dl1, 0,
   1066                             dl1_on && (adev->mode == AUDIO_MODE_IN_CALL));
   1067         /* Select back end */
   1068         mixer_ctl_set_value(adev->mixer_ctls.dl1_headset, 0,
   1069                             headset_on | headphone_on | earpiece_on);
   1070         mixer_ctl_set_value(adev->mixer_ctls.dl1_bt, 0, bt_on);
   1071         mixer_ctl_set_value(adev->mixer_ctls.earpiece_enable, 0, earpiece_on);
   1072 
   1073         /* select output stage */
   1074         set_route_by_array(adev->mixer, hs_output, headset_on | headphone_on);
   1075         set_route_by_array(adev->mixer, hf_output, speaker_on);
   1076 
   1077         set_route_by_array(adev->mixer, fmtx_output_off, 1);
   1078 
   1079         set_output_volumes(adev);
   1080         /* Special case: select input path if in a call, otherwise
   1081            in_set_parameters is used to update the input route
   1082            todo: use sub mic for handsfree case */
   1083         if (adev->mode == AUDIO_MODE_IN_CALL) {
   1084             if (bt_on)
   1085                 set_route_by_array(adev->mixer, vx_ul_bt, bt_on);
   1086             else {
   1087                 /* force tx path according to TTY mode when in call */
   1088                 switch(adev->tty_mode) {
   1089                     case TTY_MODE_FULL:
   1090                     case TTY_MODE_VCO:
   1091                         /* rx path to headphones */
   1092                         headphone_on = 1;
   1093                         headset_on = 0;
   1094                         speaker_on = 0;
   1095                         earpiece_on = 0;
   1096                         break;
   1097                     case TTY_MODE_HCO:
   1098                         /* rx path to device speaker */
   1099                         headphone_on = 0;
   1100                         headset_on = 0;
   1101                         speaker_on = 1;
   1102                         earpiece_on = 0;
   1103                         break;
   1104                     case TTY_MODE_OFF:
   1105                     default:
   1106                         /* force speaker on when in call and HDMI is selected as voice DL audio
   1107                          * cannot be routed to HDMI by ABE */
   1108                         if (adev->devices & AUDIO_DEVICE_OUT_AUX_DIGITAL)
   1109                             speaker_on = 1;
   1110                         break;
   1111                 }
   1112             }
   1113 
   1114             dl1_on = headset_on | headphone_on | earpiece_on | bt_on;
   1115 
   1116             /* Select front end */
   1117             mixer_ctl_set_value(adev->mixer_ctls.mm_dl2, 0, speaker_on);
   1118             mixer_ctl_set_value(adev->mixer_ctls.vx_dl2, 0,
   1119                     speaker_on && (adev->mode == AUDIO_MODE_IN_CALL));
   1120             mixer_ctl_set_value(adev->mixer_ctls.mm_dl1, 0, dl1_on);
   1121             mixer_ctl_set_value(adev->mixer_ctls.vx_dl1, 0,
   1122                     dl1_on && (adev->mode == AUDIO_MODE_IN_CALL));
   1123             /* Select back end */
   1124             mixer_ctl_set_value(adev->mixer_ctls.dl1_headset, 0,
   1125                     headset_on | headphone_on | earpiece_on);
   1126             mixer_ctl_set_value(adev->mixer_ctls.dl1_bt, 0, bt_on);
   1127             mixer_ctl_set_value(adev->mixer_ctls.earpiece_enable, 0, earpiece_on);
   1128 
   1129             /* select output stage */
   1130             set_route_by_array(adev->mixer, hs_output, headset_on | headphone_on);
   1131             set_route_by_array(adev->mixer, hf_output, speaker_on);
   1132 
   1133             set_output_volumes(adev);
   1134             /* Special case: select input path if in a call, otherwise
   1135                in_set_parameters is used to update the input route
   1136                todo: use sub mic for handsfree case */
   1137             if (adev->mode == AUDIO_MODE_IN_CALL) {
   1138                 if (bt_on)
   1139                     set_route_by_array(adev->mixer, vx_ul_bt, bt_on);
   1140                 else {
   1141                     /* force tx path according to TTY mode when in call */
   1142                     switch(adev->tty_mode) {
   1143                         case TTY_MODE_FULL:
   1144                         case TTY_MODE_HCO:
   1145                             /* tx path from headset mic */
   1146                             headphone_on = 0;
   1147                             headset_on = 1;
   1148                             speaker_on = 0;
   1149                             earpiece_on = 0;
   1150                             break;
   1151                         case TTY_MODE_VCO:
   1152                             /* tx path from device sub mic */
   1153                             headphone_on = 0;
   1154                             headset_on = 0;
   1155                             speaker_on = 1;
   1156                             earpiece_on = 0;
   1157                             break;
   1158                         case TTY_MODE_OFF:
   1159                         default:
   1160                             break;
   1161                     }
   1162 
   1163                     if (headset_on || headphone_on || earpiece_on)
   1164                         set_route_by_array(adev->mixer, vx_ul_amic_left, 1);
   1165                     else if (speaker_on) {
   1166                         if(adev->board_type == BLAZE)
   1167                             set_route_by_array(adev->mixer, vx_ul_amic_right, 1);
   1168                         else if(adev->board_type == TABLET)
   1169                             set_route_by_array(adev->mixer, vx_ul_dmic0,1);
   1170                     }
   1171                     else {
   1172                         if(adev->board_type == BLAZE)
   1173                             set_route_by_array(adev->mixer, vx_ul_amic_left, 0);
   1174                         else if(adev->board_type == TABLET)
   1175                             set_route_by_array(adev->mixer, vx_ul_dmic0,0);
   1176                     }
   1177                     if(adev->board_type == BLAZE) {
   1178                         mixer_ctl_set_enum_by_string(adev->mixer_ctls.left_capture,
   1179                                 (earpiece_on || headphone_on) ? MIXER_MAIN_MIC :
   1180                                 (headset_on ? MIXER_HS_MIC : "Off"));
   1181                         mixer_ctl_set_enum_by_string(adev->mixer_ctls.right_capture,
   1182                                 speaker_on ? MIXER_SUB_MIC : "Off");
   1183                     } else if(adev->board_type == TABLET) {
   1184                         mixer_ctl_set_enum_by_string(adev->mixer_ctls.left_capture,
   1185                                 (headset_on ? MIXER_HS_MIC : "Off"));
   1186                         mixer_ctl_set_enum_by_string(adev->mixer_ctls.right_capture, "off");
   1187                     }
   1188 
   1189                     set_input_volumes(adev, earpiece_on || headphone_on,
   1190                             headset_on, speaker_on);
   1191 
   1192                     /* enable sidetone mixer capture if needed */
   1193                     sidetone_capture_on = earpiece_on && adev->sidetone_capture;
   1194                 }
   1195                 set_incall_device(adev);
   1196             }
   1197 
   1198             mixer_ctl_set_value(adev->mixer_ctls.sidetone_capture, 0, sidetone_capture_on);
   1199         }
   1200     }
   1201 }
   1202 
   1203 static void select_input_device(struct omap4_audio_device *adev)
   1204 {
   1205     int headset_on = 0;
   1206     int main_mic_on = 0;
   1207     int sub_mic_on = 0;
   1208     int bt_on = adev->devices & AUDIO_DEVICE_IN_ALL_SCO;
   1209     int hw_is_stereo_only = 0;
   1210 
   1211     LOGFUNC("%s(%p)", __FUNCTION__, adev);
   1212 
   1213     if(adev->board_type == PANDA) {
   1214         /*panda only supports headset mic */
   1215         main_mic_on = 0;
   1216         headset_on = 1;
   1217         sub_mic_on = 0;
   1218         set_route_by_array(adev->mixer, mm_ul2_amic_left, 1);
   1219         /* Select back end */
   1220         mixer_ctl_set_enum_by_string(adev->mixer_ctls.right_capture, MIXER_HS_MIC);
   1221         mixer_ctl_set_enum_by_string(adev->mixer_ctls.left_capture, MIXER_HS_MIC);
   1222         set_input_volumes(adev, main_mic_on, headset_on, sub_mic_on);
   1223     } else {
   1224         if (!bt_on) {
   1225             if ((adev->mode != AUDIO_MODE_IN_CALL) && (adev->active_input != 0)) {
   1226                 /* sub mic is used for camcorder or VoIP on speaker phone */
   1227                 sub_mic_on = (adev->active_input->source == AUDIO_SOURCE_CAMCORDER) ||
   1228                     ((adev->devices & AUDIO_DEVICE_OUT_SPEAKER) &&
   1229                      (adev->active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION));
   1230             }
   1231             if (!sub_mic_on) {
   1232                 headset_on = adev->devices & AUDIO_DEVICE_IN_WIRED_HEADSET;
   1233                 main_mic_on = adev->devices & AUDIO_DEVICE_IN_BUILTIN_MIC;
   1234             }
   1235         }
   1236 
   1237         /* TODO: check how capture is possible during voice calls or if
   1238          * both use cases are mutually exclusive.
   1239          */
   1240         if (bt_on)
   1241             set_route_by_array(adev->mixer, mm_ul2_bt, 1);
   1242         else {
   1243             if(adev->board_type == BLAZE) {
   1244                 /* Select front end */
   1245                 if (main_mic_on || headset_on)
   1246                     set_route_by_array(adev->mixer, mm_ul2_amic_left, 1);
   1247                 else if (sub_mic_on)
   1248                     set_route_by_array(adev->mixer, mm_ul2_amic_right, 1);
   1249                 else
   1250                     set_route_by_array(adev->mixer, mm_ul2_amic_left, 0);
   1251                 /* Select back end */
   1252                 mixer_ctl_set_enum_by_string(adev->mixer_ctls.right_capture,
   1253                         sub_mic_on ? MIXER_SUB_MIC : "Off");
   1254                 mixer_ctl_set_enum_by_string(adev->mixer_ctls.left_capture,
   1255                         main_mic_on ? MIXER_MAIN_MIC :
   1256                         (headset_on ? MIXER_HS_MIC : "Off"));
   1257             } else if(adev->board_type == TABLET) {
   1258                 /* Select front end */
   1259                 if (headset_on)
   1260                     set_route_by_array(adev->mixer, mm_ul2_amic_left, 1);
   1261                 else if (main_mic_on || sub_mic_on) {
   1262                     set_route_by_array(adev->mixer, mm_ul2_dmic0, 1);
   1263                     hw_is_stereo_only = 1;
   1264                 } else {
   1265                     set_route_by_array(adev->mixer, mm_ul2_dmic0, 0);
   1266                     hw_is_stereo_only = 1;
   1267                 }
   1268 
   1269                 /* Select back end */
   1270                 mixer_ctl_set_enum_by_string(adev->mixer_ctls.right_capture, "off");
   1271                 mixer_ctl_set_enum_by_string(adev->mixer_ctls.left_capture,
   1272                         main_mic_on ? "off" :
   1273                         (headset_on ? MIXER_HS_MIC : "Off"));
   1274             }
   1275         }
   1276 
   1277         adev->input_requires_stereo = hw_is_stereo_only;
   1278 
   1279         set_input_volumes(adev, main_mic_on, headset_on, sub_mic_on);
   1280     }
   1281 }
   1282 
   1283 /* must be called with hw device and output stream mutexes locked */
   1284 static int start_output_stream(struct omap4_stream_out *out)
   1285 {
   1286     struct omap4_audio_device *adev = out->dev;
   1287     unsigned int card = CARD_BLAZE_DEFAULT;
   1288     unsigned int port = PORT_MM_LP;
   1289 
   1290     LOGFUNC("%s(%p)", __FUNCTION__, adev);
   1291 
   1292     adev->active_output = out;
   1293     if (adev->devices & AUDIO_DEVICE_OUT_ALL_SCO)
   1294         out->config.rate = MM_FULL_POWER_SAMPLING_RATE;
   1295     else
   1296         out->config.rate = DEFAULT_OUT_SAMPLING_RATE;
   1297 
   1298     if (adev->mode != AUDIO_MODE_IN_CALL) {
   1299         /* FIXME: only works if only one output can be active at a time */
   1300         select_output_device(adev);
   1301     }
   1302 
   1303     /* in the case of multiple devices, this will cause use of HDMI only */
   1304     if(adev->devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
   1305         card = CARD_OMAP4_HDMI;
   1306         port = PORT_MM;
   1307     }
   1308     if((adev->devices & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET) ||
   1309         (adev->devices & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET)) {
   1310         card = CARD_OMAP4_USB;
   1311         port = PORT_MM;
   1312     }
   1313     /* default to low power:
   1314      *  NOTE: PCM_NOIRQ mode is required to dynamically scale avail_min
   1315      */
   1316     out->write_threshold = PLAYBACK_PERIOD_COUNT * LONG_PERIOD_SIZE;
   1317     out->config.start_threshold = SHORT_PERIOD_SIZE * 2;
   1318     out->config.avail_min = LONG_PERIOD_SIZE,
   1319     out->low_power = 1;
   1320 
   1321     out->pcm = pcm_open(card, port, PCM_OUT | PCM_MMAP, &out->config);
   1322 
   1323     if (!pcm_is_ready(out->pcm)) {
   1324         ALOGE("cannot open pcm_out driver: %s", pcm_get_error(out->pcm));
   1325         pcm_close(out->pcm);
   1326         adev->active_output = NULL;
   1327         return -ENOMEM;
   1328     }
   1329 
   1330     if (adev->echo_reference != NULL)
   1331         out->echo_reference = adev->echo_reference;
   1332     if (out->resampler)
   1333         out->resampler->reset(out->resampler);
   1334 
   1335     return 0;
   1336 }
   1337 
   1338 static int check_input_parameters(uint32_t sample_rate, int format, int channel_count)
   1339 {
   1340     LOGFUNC("%s(%d, %d, %d)", __FUNCTION__, sample_rate, format, channel_count);
   1341 
   1342     if (format != AUDIO_FORMAT_PCM_16_BIT) {
   1343         return -EINVAL;
   1344     }
   1345 
   1346     if ((channel_count < 1) || (channel_count > 2)) {
   1347         return -EINVAL;
   1348     }
   1349 
   1350     switch(sample_rate) {
   1351     case 8000:
   1352     case 11025:
   1353     case 16000:
   1354     case 22050:
   1355     case 24000:
   1356     case 32000:
   1357     case 44100:
   1358     case 48000:
   1359         break;
   1360     default:
   1361         return -EINVAL;
   1362     }
   1363 
   1364     return 0;
   1365 }
   1366 
   1367 static size_t get_input_buffer_size(uint32_t sample_rate, int format, int channel_count)
   1368 {
   1369     size_t size;
   1370     size_t device_rate;
   1371 
   1372     LOGFUNC("%s(%d, %d, %d)", __FUNCTION__, sample_rate, format, channel_count);
   1373 
   1374     if (check_input_parameters(sample_rate, format, channel_count) != 0)
   1375         return 0;
   1376 
   1377     /* take resampling into account and return the closest majoring
   1378     multiple of 16 frames, as audioflinger expects audio buffers to
   1379     be a multiple of 16 frames */
   1380     size = (pcm_config_mm_ul.period_size * sample_rate) / pcm_config_mm_ul.rate;
   1381     size = ((size + 15) / 16) * 16;
   1382 
   1383     return size * channel_count * sizeof(short);
   1384 }
   1385 
   1386 static void add_echo_reference(struct omap4_stream_out *out,
   1387                                struct echo_reference_itfe *reference)
   1388 {
   1389     LOGFUNC("%s(%p, %p)", __FUNCTION__, out, reference);
   1390 
   1391     pthread_mutex_lock(&out->lock);
   1392     out->echo_reference = reference;
   1393     pthread_mutex_unlock(&out->lock);
   1394 }
   1395 
   1396 static void remove_echo_reference(struct omap4_stream_out *out,
   1397                                   struct echo_reference_itfe *reference)
   1398 {
   1399     LOGFUNC("%s(%p, %p)", __FUNCTION__, out, reference);
   1400 
   1401     pthread_mutex_lock(&out->lock);
   1402     if (out->echo_reference == reference) {
   1403         /* stop writing to echo reference */
   1404         reference->write(reference, NULL);
   1405         out->echo_reference = NULL;
   1406     }
   1407     pthread_mutex_unlock(&out->lock);
   1408 }
   1409 
   1410 static void put_echo_reference(struct omap4_audio_device *adev,
   1411                           struct echo_reference_itfe *reference)
   1412 {
   1413     LOGFUNC("%s(%p, %p)", __FUNCTION__, adev, reference);
   1414 
   1415     if (adev->echo_reference != NULL &&
   1416             reference == adev->echo_reference) {
   1417         if (adev->active_output != NULL)
   1418             remove_echo_reference(adev->active_output, reference);
   1419         release_echo_reference(reference);
   1420         adev->echo_reference = NULL;
   1421     }
   1422 }
   1423 
   1424 static struct echo_reference_itfe *get_echo_reference(struct omap4_audio_device *adev,
   1425                                                audio_format_t format,
   1426                                                uint32_t channel_count,
   1427                                                uint32_t sampling_rate)
   1428 {
   1429     LOGFUNC("%s(%p, 0x%08x, 0x%04x, %d)", __FUNCTION__, adev, format,
   1430                                                 channel_count, sampling_rate);
   1431 
   1432     put_echo_reference(adev, adev->echo_reference);
   1433     if (adev->active_output != NULL) {
   1434         struct audio_stream *stream = &adev->active_output->stream.common;
   1435         uint32_t wr_channel_count = popcount(stream->get_channels(stream));
   1436         uint32_t wr_sampling_rate = stream->get_sample_rate(stream);
   1437 
   1438         int status = create_echo_reference(AUDIO_FORMAT_PCM_16_BIT,
   1439                                            channel_count,
   1440                                            sampling_rate,
   1441                                            AUDIO_FORMAT_PCM_16_BIT,
   1442                                            wr_channel_count,
   1443                                            wr_sampling_rate,
   1444                                            &adev->echo_reference);
   1445         if (status == 0)
   1446             add_echo_reference(adev->active_output, adev->echo_reference);
   1447     }
   1448     return adev->echo_reference;
   1449 }
   1450 
   1451 static int get_playback_delay(struct omap4_stream_out *out,
   1452                        size_t frames,
   1453                        struct echo_reference_buffer *buffer)
   1454 {
   1455     size_t kernel_frames;
   1456     int status;
   1457 
   1458     LOGFUNC("%s(%p, %ul, %p)", __FUNCTION__, out, frames, buffer);
   1459 
   1460     status = pcm_get_htimestamp(out->pcm, &kernel_frames, &buffer->time_stamp);
   1461     if (status < 0) {
   1462         buffer->time_stamp.tv_sec  = 0;
   1463         buffer->time_stamp.tv_nsec = 0;
   1464         buffer->delay_ns           = 0;
   1465         ALOGV("get_playback_delay(): pcm_get_htimestamp error,"
   1466                 "setting playbackTimestamp to 0");
   1467         return status;
   1468     }
   1469 
   1470     kernel_frames = pcm_get_buffer_size(out->pcm) - kernel_frames;
   1471 
   1472     /* adjust render time stamp with delay added by current driver buffer.
   1473      * Add the duration of current frame as we want the render time of the last
   1474      * sample being written. */
   1475     buffer->delay_ns = (long)(((int64_t)(kernel_frames + frames)* 1000000000)/
   1476                             MM_FULL_POWER_SAMPLING_RATE);
   1477 
   1478     return 0;
   1479 }
   1480 
   1481 static uint32_t out_get_sample_rate(const struct audio_stream *stream)
   1482 {
   1483     LOGFUNC("%s(%p)", __FUNCTION__, stream);
   1484 
   1485     return DEFAULT_OUT_SAMPLING_RATE;
   1486 }
   1487 
   1488 static int out_set_sample_rate(struct audio_stream *stream, uint32_t rate)
   1489 {
   1490     LOGFUNC("%s(%p, %d)", __FUNCTION__, stream, rate);
   1491 
   1492     return 0;
   1493 }
   1494 
   1495 static size_t out_get_buffer_size(const struct audio_stream *stream)
   1496 {
   1497     struct omap4_stream_out *out = (struct omap4_stream_out *)stream;
   1498 
   1499     LOGFUNC("%s(%p)", __FUNCTION__, stream);
   1500 
   1501     /* take resampling into account and return the closest majoring
   1502     multiple of 16 frames, as audioflinger expects audio buffers to
   1503     be a multiple of 16 frames */
   1504     size_t size = (SHORT_PERIOD_SIZE * DEFAULT_OUT_SAMPLING_RATE) / out->config.rate;
   1505     size = ((size + 15) / 16) * 16;
   1506     return size * audio_stream_frame_size((struct audio_stream *)stream);
   1507 }
   1508 
   1509 static audio_channel_mask_t out_get_channels(const struct audio_stream *stream)
   1510 {
   1511     LOGFUNC("%s(%p)", __FUNCTION__, stream);
   1512 
   1513     return AUDIO_CHANNEL_OUT_STEREO;
   1514 }
   1515 
   1516 static audio_format_t out_get_format(const struct audio_stream *stream)
   1517 {
   1518     LOGFUNC("%s(%p)", __FUNCTION__, stream);
   1519 
   1520     return AUDIO_FORMAT_PCM_16_BIT;
   1521 }
   1522 
   1523 static int out_set_format(struct audio_stream *stream, audio_format_t format)
   1524 {
   1525     LOGFUNC("%s(%p)", __FUNCTION__, stream);
   1526 
   1527     return 0;
   1528 }
   1529 
   1530 /* must be called with hw device and output stream mutexes locked */
   1531 static int do_output_standby(struct omap4_stream_out *out)
   1532 {
   1533     struct omap4_audio_device *adev = out->dev;
   1534 
   1535     LOGFUNC("%s(%p)", __FUNCTION__, out);
   1536 
   1537     if (!out->standby) {
   1538         pcm_close(out->pcm);
   1539         out->pcm = NULL;
   1540 
   1541         adev->active_output = 0;
   1542 
   1543         /* if in call, don't turn off the output stage. This will
   1544         be done when the call is ended */
   1545         if (adev->mode != AUDIO_MODE_IN_CALL) {
   1546             /* FIXME: only works if only one output can be active at a time */
   1547             set_route_by_array(adev->mixer, hs_output, 0);
   1548             set_route_by_array(adev->mixer, hf_output, 0);
   1549         }
   1550 
   1551         /* stop writing to echo reference */
   1552         if (out->echo_reference != NULL) {
   1553             out->echo_reference->write(out->echo_reference, NULL);
   1554             out->echo_reference = NULL;
   1555         }
   1556         out->standby = 1;
   1557     }
   1558 
   1559     return 0;
   1560 }
   1561 
   1562 static int out_standby(struct audio_stream *stream)
   1563 {
   1564     struct omap4_stream_out *out = (struct omap4_stream_out *)stream;
   1565     int status;
   1566 
   1567     LOGFUNC("%s(%p)", __FUNCTION__, stream);
   1568 
   1569     pthread_mutex_lock(&out->dev->lock);
   1570     pthread_mutex_lock(&out->lock);
   1571     status = do_output_standby(out);
   1572     pthread_mutex_unlock(&out->lock);
   1573     pthread_mutex_unlock(&out->dev->lock);
   1574     return status;
   1575 }
   1576 
   1577 static int out_dump(const struct audio_stream *stream, int fd)
   1578 {
   1579     LOGFUNC("%s(%p, %d)", __FUNCTION__, stream, fd);
   1580 
   1581     return 0;
   1582 }
   1583 
   1584 static int out_set_parameters(struct audio_stream *stream, const char *kvpairs)
   1585 {
   1586     struct omap4_stream_out *out = (struct omap4_stream_out *)stream;
   1587     struct omap4_audio_device *adev = out->dev;
   1588     struct omap4_stream_in *in;
   1589     struct str_parms *parms;
   1590     char *str;
   1591     char value[32];
   1592     int ret, val = 0;
   1593     bool force_input_standby = false;
   1594 
   1595     LOGFUNC("%s(%p, %s)", __FUNCTION__, stream, kvpairs);
   1596 
   1597     parms = str_parms_create_str(kvpairs);
   1598 
   1599     ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_ROUTING, value, sizeof(value));
   1600     if (ret >= 0) {
   1601         val = atoi(value);
   1602         pthread_mutex_lock(&adev->lock);
   1603         pthread_mutex_lock(&out->lock);
   1604         if (((adev->devices & AUDIO_DEVICE_OUT_ALL) != val) && (val != 0)) {
   1605             if (out == adev->active_output) {
   1606                 do_output_standby(out);
   1607                 /* a change in output device may change the microphone selection */
   1608                 if (adev->active_input &&
   1609                         adev->active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION) {
   1610                     force_input_standby = true;
   1611                 }
   1612                 /* force standby if moving to/from HDMI */
   1613                 if ((val & AUDIO_DEVICE_OUT_AUX_DIGITAL) ^
   1614                     (adev->devices & AUDIO_DEVICE_OUT_AUX_DIGITAL))
   1615                         do_output_standby(out);
   1616             }
   1617             adev->devices &= ~AUDIO_DEVICE_OUT_ALL;
   1618             adev->devices |= val;
   1619             select_output_device(adev);
   1620         }
   1621 
   1622         pthread_mutex_unlock(&out->lock);
   1623         if (force_input_standby) {
   1624             in = adev->active_input;
   1625             pthread_mutex_lock(&in->lock);
   1626             do_input_standby(in);
   1627             pthread_mutex_unlock(&in->lock);
   1628         }
   1629         pthread_mutex_unlock(&adev->lock);
   1630     }
   1631 
   1632     str_parms_destroy(parms);
   1633     return ret;
   1634 }
   1635 
   1636 static char * out_get_parameters(const struct audio_stream *stream, const char *keys)
   1637 {
   1638     LOGFUNC("%s(%p, %s)", __FUNCTION__, stream, keys);
   1639 
   1640     return strdup("");
   1641 }
   1642 
   1643 static uint32_t out_get_latency(const struct audio_stream_out *stream)
   1644 {
   1645     struct omap4_stream_out *out = (struct omap4_stream_out *)stream;
   1646 
   1647     LOGFUNC("%s(%p)", __FUNCTION__, stream);
   1648     return (SHORT_PERIOD_SIZE * PLAYBACK_PERIOD_COUNT * 1000) / out->config.rate;
   1649 }
   1650 
   1651 static int out_set_volume(struct audio_stream_out *stream, float left,
   1652                           float right)
   1653 {
   1654     LOGFUNC("%s(%p, %f, %f)", __FUNCTION__, stream, left, right);
   1655 
   1656     return -ENOSYS;
   1657 }
   1658 
   1659 static ssize_t out_write(struct audio_stream_out *stream, const void* buffer,
   1660                          size_t bytes)
   1661 {
   1662     int ret;
   1663     struct omap4_stream_out *out = (struct omap4_stream_out *)stream;
   1664     struct omap4_audio_device *adev = out->dev;
   1665     size_t frame_size = audio_stream_frame_size(&out->stream.common);
   1666     size_t in_frames = bytes / frame_size;
   1667     size_t out_frames = RESAMPLER_BUFFER_SIZE / frame_size;
   1668     bool force_input_standby = false;
   1669     struct omap4_stream_in *in;
   1670     int kernel_frames;
   1671     void *buf;
   1672 
   1673     LOGFUNC("%s(%p, %p, %d)", __FUNCTION__, stream, buffer, bytes);
   1674 
   1675     /* acquiring hw device mutex systematically is useful if a low priority thread is waiting
   1676      * on the output stream mutex - e.g. executing select_mode() while holding the hw device
   1677      * mutex
   1678      */
   1679     pthread_mutex_lock(&adev->lock);
   1680     pthread_mutex_lock(&out->lock);
   1681     if (out->standby) {
   1682         ret = start_output_stream(out);
   1683         if (ret != 0) {
   1684             pthread_mutex_unlock(&adev->lock);
   1685             goto exit;
   1686         }
   1687         out->standby = 0;
   1688         /* a change in output device may change the microphone selection */
   1689         if (adev->active_input &&
   1690                 adev->active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION)
   1691             force_input_standby = true;
   1692     }
   1693     pthread_mutex_unlock(&adev->lock);
   1694 
   1695     /* only use resampler if required */
   1696     if (out->config.rate != DEFAULT_OUT_SAMPLING_RATE) {
   1697         if (!out->resampler) {
   1698             ret = create_resampler(DEFAULT_OUT_SAMPLING_RATE,
   1699                     MM_FULL_POWER_SAMPLING_RATE,
   1700                     2,
   1701                     RESAMPLER_QUALITY_DEFAULT,
   1702                     NULL,
   1703                     &out->resampler);
   1704             if (ret != 0)
   1705                 goto exit;
   1706             out->buffer = malloc(RESAMPLER_BUFFER_SIZE); /* todo: allow for reallocing */
   1707         }
   1708         out->resampler->resample_from_input(out->resampler,
   1709                 (int16_t *)buffer,
   1710                 &in_frames,
   1711                 (int16_t *)out->buffer,
   1712                 &out_frames);
   1713         buf = out->buffer;
   1714     } else {
   1715         out_frames = in_frames;
   1716         buf = (void *)buffer;
   1717     }
   1718     if (out->echo_reference != NULL) {
   1719         struct echo_reference_buffer b;
   1720         b.raw = (void *)buffer;
   1721         b.frame_count = in_frames;
   1722 
   1723         get_playback_delay(out, out_frames, &b);
   1724         out->echo_reference->write(out->echo_reference, &b);
   1725     }
   1726 
   1727     /* do not allow more than out->write_threshold frames in kernel pcm driver buffer */
   1728     do {
   1729         struct timespec time_stamp;
   1730 
   1731         if (pcm_get_htimestamp(out->pcm, (unsigned int *)&kernel_frames, &time_stamp) < 0)
   1732             break;
   1733         kernel_frames = pcm_get_buffer_size(out->pcm) - kernel_frames;
   1734         if (kernel_frames > out->write_threshold) {
   1735             unsigned long time = (unsigned long)
   1736                     (((int64_t)(kernel_frames - out->write_threshold) * 1000000) /
   1737                             MM_FULL_POWER_SAMPLING_RATE);
   1738             if (time < MIN_WRITE_SLEEP_US)
   1739                 time = MIN_WRITE_SLEEP_US;
   1740             usleep(time);
   1741         }
   1742     } while (kernel_frames > out->write_threshold);
   1743 
   1744     ret = pcm_mmap_write(out->pcm, (void *)buf, out_frames * frame_size);
   1745 
   1746 exit:
   1747     pthread_mutex_unlock(&out->lock);
   1748 
   1749     if (ret != 0) {
   1750         usleep(bytes * 1000000 / audio_stream_frame_size(&stream->common) /
   1751                out_get_sample_rate(&stream->common));
   1752     }
   1753 
   1754     if (force_input_standby) {
   1755         pthread_mutex_lock(&adev->lock);
   1756         if (adev->active_input) {
   1757             in = adev->active_input;
   1758             pthread_mutex_lock(&in->lock);
   1759             do_input_standby(in);
   1760             pthread_mutex_unlock(&in->lock);
   1761         }
   1762         pthread_mutex_unlock(&adev->lock);
   1763     }
   1764 
   1765     return bytes;
   1766 }
   1767 
   1768 static int out_get_render_position(const struct audio_stream_out *stream,
   1769                                    uint32_t *dsp_frames)
   1770 {
   1771     LOGFUNC("%s(%p, %p)", __FUNCTION__, stream, dsp_frames);
   1772 
   1773     return -EINVAL;
   1774 }
   1775 
   1776 static int out_add_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
   1777 {
   1778     LOGFUNC("%s(%p, %p)", __FUNCTION__, stream, effect);
   1779 
   1780     return 0;
   1781 }
   1782 
   1783 static int out_remove_audio_effect(const struct audio_stream *stream, effect_handle_t effect)
   1784 {
   1785     LOGFUNC("%s(%p, %p)", __FUNCTION__, stream, effect);
   1786 
   1787     return 0;
   1788 }
   1789 
   1790 /** audio_stream_in implementation **/
   1791 
   1792 /* must be called with hw device and input stream mutexes locked */
   1793 static int start_input_stream(struct omap4_stream_in *in)
   1794 {
   1795     int ret = 0;
   1796     unsigned int card = CARD_BLAZE_DEFAULT;
   1797     unsigned int device = PORT_MM2_UL;
   1798     struct omap4_audio_device *adev = in->dev;
   1799 
   1800     LOGFUNC("%s(%p)", __FUNCTION__, in);
   1801 
   1802     adev->active_input = in;
   1803 
   1804     if (adev->mode != AUDIO_MODE_IN_CALL) {
   1805         adev->devices &= ~AUDIO_DEVICE_IN_ALL;
   1806         adev->devices |= in->device;
   1807         select_input_device(adev);
   1808     }
   1809 
   1810     if (adev->input_requires_stereo && (in->config.channels == 1))
   1811         setup_stereo_to_mono_input_remix(in);
   1812 
   1813     if (in->need_echo_reference && in->echo_reference == NULL)
   1814         in->echo_reference = get_echo_reference(adev,
   1815                                         AUDIO_FORMAT_PCM_16_BIT,
   1816                                         in->config.channels,
   1817                                         in->requested_rate);
   1818 
   1819     /* this assumes routing is done previously */
   1820     if (in->remix_at_driver)
   1821         in->config.channels = in->remix_at_driver->in_chans;
   1822 
   1823     in->pcm = pcm_open(card, device, PCM_IN, &in->config);
   1824     if (in->remix_at_driver)
   1825         in->config.channels = in->remix_at_driver->out_chans;
   1826     if (!pcm_is_ready(in->pcm)) {
   1827         ALOGE("cannot open pcm_in driver: %s", pcm_get_error(in->pcm));
   1828         pcm_close(in->pcm);
   1829         adev->active_input = NULL;
   1830         return -ENOMEM;
   1831     }
   1832 
   1833     /* if no supported sample rate is available, use the resampler */
   1834     if (in->resampler) {
   1835         in->resampler->reset(in->resampler);
   1836         in->frames_in = 0;
   1837     }
   1838     return 0;
   1839 }
   1840 
   1841 static uint32_t in_get_sample_rate(const struct audio_stream *stream)
   1842 {
   1843     struct omap4_stream_in *in = (struct omap4_stream_in *)stream;
   1844 
   1845     LOGFUNC("%s(%p)", __FUNCTION__, stream);
   1846 
   1847     return in->requested_rate;
   1848 }
   1849 
   1850 static int in_set_sample_rate(struct audio_stream *stream, uint32_t rate)
   1851 {
   1852     LOGFUNC("%s(%p, %d)", __FUNCTION__, stream, rate);
   1853 
   1854     return 0;
   1855 }
   1856 
   1857 static size_t in_get_buffer_size(const struct audio_stream *stream)
   1858 {
   1859     struct omap4_stream_in *in = (struct omap4_stream_in *)stream;
   1860 
   1861     LOGFUNC("%s(%p)", __FUNCTION__, stream);
   1862 
   1863     return get_input_buffer_size(in->requested_rate,
   1864                                  AUDIO_FORMAT_PCM_16_BIT,
   1865                                  in->config.channels);
   1866 }
   1867 
   1868 static audio_channel_mask_t in_get_channels(const struct audio_stream *stream)
   1869 {
   1870     struct omap4_stream_in *in = (struct omap4_stream_in *)stream;
   1871 
   1872     LOGFUNC("%s(%p)", __FUNCTION__, stream);
   1873 
   1874     if (in->config.channels == 1) {
   1875         return AUDIO_CHANNEL_IN_MONO;
   1876     } else {
   1877         return AUDIO_CHANNEL_IN_STEREO;
   1878     }
   1879 }
   1880 
   1881 static audio_format_t in_get_format(const struct audio_stream *stream)
   1882 {
   1883     LOGFUNC("%s(%p)", __FUNCTION__, stream);
   1884 
   1885     return AUDIO_FORMAT_PCM_16_BIT;
   1886 }
   1887 
   1888 static int in_set_format(struct audio_stream *stream, audio_format_t format)
   1889 {
   1890     LOGFUNC("%s(%p, %d)", __FUNCTION__, stream, format);
   1891 
   1892     return 0;
   1893 }
   1894 
   1895 /* must be called with hw device and input stream mutexes locked */
   1896 static int do_input_standby(struct omap4_stream_in *in)
   1897 {
   1898     struct omap4_audio_device *adev = in->dev;
   1899 
   1900     LOGFUNC("%s(%p)", __FUNCTION__, in);
   1901 
   1902     if (!in->standby) {
   1903         pcm_close(in->pcm);
   1904         in->pcm = NULL;
   1905 
   1906         adev->active_input = 0;
   1907         if (adev->mode != AUDIO_MODE_IN_CALL) {
   1908             adev->devices &= ~AUDIO_DEVICE_IN_ALL;
   1909             select_input_device(adev);
   1910         }
   1911 
   1912         if (in->echo_reference != NULL) {
   1913             /* stop reading from echo reference */
   1914             in->echo_reference->read(in->echo_reference, NULL);
   1915             put_echo_reference(adev, in->echo_reference);
   1916             in->echo_reference = NULL;
   1917         }
   1918         in->standby = 1;
   1919     }
   1920     return 0;
   1921 }
   1922 
   1923 static int in_standby(struct audio_stream *stream)
   1924 {
   1925     struct omap4_stream_in *in = (struct omap4_stream_in *)stream;
   1926     int status;
   1927 
   1928     LOGFUNC("%s(%p)", __FUNCTION__, stream);
   1929 
   1930     pthread_mutex_lock(&in->dev->lock);
   1931     pthread_mutex_lock(&in->lock);
   1932     status = do_input_standby(in);
   1933     pthread_mutex_unlock(&in->lock);
   1934     pthread_mutex_unlock(&in->dev->lock);
   1935     return status;
   1936 }
   1937 
   1938 static int in_dump(const struct audio_stream *stream, int fd)
   1939 {
   1940     LOGFUNC("%s(%p, %d)", __FUNCTION__, stream, fd);
   1941 
   1942     return 0;
   1943 }
   1944 static int in_fm_routing(struct audio_stream *stream)
   1945 {
   1946     struct omap4_stream_in *in = (struct omap4_stream_in *)stream;
   1947     int ret;
   1948 
   1949    LOGFUNC("%s(%p)", __FUNCTION__, stream);
   1950 
   1951     if (in->standby) {
   1952         ret = start_input_stream(in);
   1953         if (ret == 0)
   1954             in->standby = 0;
   1955     }
   1956     return 0;
   1957 }
   1958 
   1959 static int in_set_parameters(struct audio_stream *stream, const char *kvpairs)
   1960 {
   1961     struct omap4_stream_in *in = (struct omap4_stream_in *)stream;
   1962     struct omap4_audio_device *adev = in->dev;
   1963     struct str_parms *parms;
   1964     char *str;
   1965     char value[32];
   1966     int ret, val = 0;
   1967     bool do_standby = false;
   1968 
   1969     LOGFUNC("%s(%p, %s)", __FUNCTION__, stream, kvpairs);
   1970 
   1971     parms = str_parms_create_str(kvpairs);
   1972 
   1973     ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_INPUT_SOURCE, value, sizeof(value));
   1974 
   1975     pthread_mutex_lock(&adev->lock);
   1976     pthread_mutex_lock(&in->lock);
   1977     if (ret >= 0) {
   1978         val = atoi(value);
   1979         /* no audio source uses val == 0 */
   1980         if ((in->source != val) && (val != 0)) {
   1981             in->source = val;
   1982             do_standby = true;
   1983         }
   1984     }
   1985 
   1986     ret = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_ROUTING, value, sizeof(value));
   1987     if (ret >= 0) {
   1988         val = atoi(value);
   1989         if ((in->device != val) && (val != 0)) {
   1990             in->device = val;
   1991             do_standby = true;
   1992         }
   1993     }
   1994 
   1995     if (do_standby)
   1996         do_input_standby(in);
   1997 
   1998     pthread_mutex_unlock(&in->lock);
   1999     pthread_mutex_unlock(&adev->lock);
   2000 
   2001     str_parms_destroy(parms);
   2002     return ret;
   2003 }
   2004 
   2005 static char * in_get_parameters(const struct audio_stream *stream,
   2006                                 const char *keys)
   2007 {
   2008     LOGFUNC("%s(%p, %s)", __FUNCTION__, stream, keys);
   2009 
   2010     return strdup("");
   2011 }
   2012 
   2013 static int in_set_gain(struct audio_stream_in *stream, float gain)
   2014 {
   2015     LOGFUNC("%s(%p, %f)", __FUNCTION__, stream, gain);
   2016 
   2017     return 0;
   2018 }
   2019 
   2020 static void get_capture_delay(struct omap4_stream_in *in,
   2021                        size_t frames,
   2022                        struct echo_reference_buffer *buffer)
   2023 {
   2024 
   2025     /* read frames available in kernel driver buffer */
   2026     size_t kernel_frames;
   2027     struct timespec tstamp;
   2028     long buf_delay;
   2029     long rsmp_delay;
   2030     long kernel_delay;
   2031     long delay_ns;
   2032 
   2033     LOGFUNC("%s(%p, %ul, %p)", __FUNCTION__, in, frames, buffer);
   2034 
   2035     if (pcm_get_htimestamp(in->pcm, &kernel_frames, &tstamp) < 0) {
   2036         buffer->time_stamp.tv_sec  = 0;
   2037         buffer->time_stamp.tv_nsec = 0;
   2038         buffer->delay_ns           = 0;
   2039         ALOGW("read get_capture_delay(): pcm_htimestamp error");
   2040         return;
   2041     }
   2042 
   2043     /* read frames available in audio HAL input buffer
   2044      * add number of frames being read as we want the capture time of first sample
   2045      * in current buffer */
   2046     buf_delay = (long)(((int64_t)(in->frames_in + in->proc_frames_in) * 1000000000)
   2047                                     / in->config.rate);
   2048     /* add delay introduced by resampler */
   2049     rsmp_delay = 0;
   2050     if (in->resampler) {
   2051         rsmp_delay = in->resampler->delay_ns(in->resampler);
   2052     }
   2053 
   2054     kernel_delay = (long)(((int64_t)kernel_frames * 1000000000) / in->config.rate);
   2055 
   2056     delay_ns = kernel_delay + buf_delay + rsmp_delay;
   2057 
   2058     buffer->time_stamp = tstamp;
   2059     buffer->delay_ns   = delay_ns;
   2060     ALOGV("get_capture_delay time_stamp = [%ld].[%ld], delay_ns: [%d],"
   2061          " kernel_delay:[%ld], buf_delay:[%ld], rsmp_delay:[%ld], kernel_frames:[%d], "
   2062          "in->frames_in:[%d], in->proc_frames_in:[%d], frames:[%d]",
   2063          buffer->time_stamp.tv_sec , buffer->time_stamp.tv_nsec, buffer->delay_ns,
   2064          kernel_delay, buf_delay, rsmp_delay, kernel_frames,
   2065          in->frames_in, in->proc_frames_in, frames);
   2066 
   2067 }
   2068 
   2069 static int32_t update_echo_reference(struct omap4_stream_in *in, size_t frames)
   2070 {
   2071     struct echo_reference_buffer b;
   2072     b.delay_ns = 0;
   2073 
   2074     LOGFUNC("%s(%p, %ul)", __FUNCTION__, in, frames);
   2075 
   2076     ALOGV("update_echo_reference, frames = [%d], in->ref_frames_in = [%d],  "
   2077           "b.frame_count = [%d]",
   2078          frames, in->ref_frames_in, frames - in->ref_frames_in);
   2079     if (in->ref_frames_in < frames) {
   2080         if (in->ref_buf_size < frames) {
   2081             in->ref_buf_size = frames;
   2082             in->ref_buf = (int16_t *)realloc(in->ref_buf,
   2083                                              in->ref_buf_size *
   2084                                                  in->config.channels * sizeof(int16_t));
   2085         }
   2086 
   2087         b.frame_count = frames - in->ref_frames_in;
   2088         b.raw = (void *)(in->ref_buf + in->ref_frames_in * in->config.channels);
   2089 
   2090         get_capture_delay(in, frames, &b);
   2091 
   2092         if (in->echo_reference->read(in->echo_reference, &b) == 0)
   2093         {
   2094             in->ref_frames_in += b.frame_count;
   2095             ALOGV("update_echo_reference: in->ref_frames_in:[%d], "
   2096                     "in->ref_buf_size:[%d], frames:[%d], b.frame_count:[%d]",
   2097                  in->ref_frames_in, in->ref_buf_size, frames, b.frame_count);
   2098         }
   2099     } else
   2100         ALOGW("update_echo_reference: NOT enough frames to read ref buffer");
   2101     return b.delay_ns;
   2102 }
   2103 
   2104 static int set_preprocessor_param(effect_handle_t handle,
   2105                            effect_param_t *param)
   2106 {
   2107     uint32_t size = sizeof(int);
   2108     uint32_t psize = ((param->psize - 1) / sizeof(int) + 1) * sizeof(int) +
   2109                         param->vsize;
   2110 
   2111     LOGFUNC("%s(%p, %p)", __FUNCTION__, handle, param);
   2112 
   2113     int status = (*handle)->command(handle,
   2114                                    EFFECT_CMD_SET_PARAM,
   2115                                    sizeof (effect_param_t) + psize,
   2116                                    param,
   2117                                    &size,
   2118                                    &param->status);
   2119     if (status == 0)
   2120         status = param->status;
   2121 
   2122     return status;
   2123 }
   2124 
   2125 static int set_preprocessor_echo_delay(effect_handle_t handle,
   2126                                      int32_t delay_us)
   2127 {
   2128     uint32_t buf[sizeof(effect_param_t) / sizeof(uint32_t) + 2];
   2129     effect_param_t *param = (effect_param_t *)buf;
   2130 
   2131     LOGFUNC("%s(%p, %d)", __FUNCTION__, handle, delay_us);
   2132 
   2133     param->psize = sizeof(uint32_t);
   2134     param->vsize = sizeof(uint32_t);
   2135     *(uint32_t *)param->data = AEC_PARAM_ECHO_DELAY;
   2136     *((int32_t *)param->data + 1) = delay_us;
   2137 
   2138     return set_preprocessor_param(handle, param);
   2139 }
   2140 
   2141 static void push_echo_reference(struct omap4_stream_in *in, size_t frames)
   2142 {
   2143     /* read frames from echo reference buffer and update echo delay
   2144      * in->ref_frames_in is updated with frames available in in->ref_buf */
   2145     int32_t delay_us = update_echo_reference(in, frames)/1000;
   2146     int i;
   2147     audio_buffer_t buf;
   2148 
   2149     LOGFUNC("%s(%p, %ul)", __FUNCTION__, in, frames);
   2150 
   2151     if (in->ref_frames_in < frames)
   2152         frames = in->ref_frames_in;
   2153 
   2154     buf.frameCount = frames;
   2155     buf.raw = in->ref_buf;
   2156 
   2157     for (i = 0; i < in->num_preprocessors; i++) {
   2158         if ((*in->preprocessors[i])->process_reverse == NULL)
   2159             continue;
   2160 
   2161         (*in->preprocessors[i])->process_reverse(in->preprocessors[i],
   2162                                                &buf,
   2163                                                NULL);
   2164         set_preprocessor_echo_delay(in->preprocessors[i], delay_us);
   2165     }
   2166 
   2167     in->ref_frames_in -= buf.frameCount;
   2168     if (in->ref_frames_in) {
   2169         memcpy(in->ref_buf,
   2170                in->ref_buf + buf.frameCount * in->config.channels,
   2171                in->ref_frames_in * in->config.channels * sizeof(int16_t));
   2172     }
   2173 }
   2174 
   2175 static int get_next_buffer(struct resampler_buffer_provider *buffer_provider,
   2176                                    struct resampler_buffer* buffer)
   2177 {
   2178     struct omap4_stream_in *in;
   2179     struct buffer_remix *remix;
   2180     size_t hw_frame_size;
   2181 
   2182     LOGFUNC("%s(%p, %p)", __FUNCTION__, buffer_provider, buffer);
   2183 
   2184     if (buffer_provider == NULL || buffer == NULL)
   2185         return -EINVAL;
   2186 
   2187     in = (struct omap4_stream_in *)((char *)buffer_provider -
   2188                                    offsetof(struct omap4_stream_in, buf_provider));
   2189     remix = in->remix_at_driver;
   2190 
   2191     if (in->pcm == NULL) {
   2192         buffer->raw = NULL;
   2193         buffer->frame_count = 0;
   2194         in->read_status = -ENODEV;
   2195         return -ENODEV;
   2196     }
   2197 
   2198     if (remix)
   2199         hw_frame_size = remix->in_chans * remix->sample_size;
   2200     else
   2201         hw_frame_size = audio_stream_frame_size(&in->stream.common);
   2202 
   2203     if (in->frames_in == 0) {
   2204         in->read_status = pcm_read(in->pcm,
   2205                                    (void*)in->buffer,
   2206                                    in->config.period_size * hw_frame_size);
   2207         if (in->read_status != 0) {
   2208             ALOGE("get_next_buffer() pcm_read error %d", in->read_status);
   2209             buffer->raw = NULL;
   2210             buffer->frame_count = 0;
   2211             return in->read_status;
   2212         }
   2213         in->frames_in = in->config.period_size;
   2214 
   2215         if (remix)
   2216             remix->remix_func(remix, in->buffer, in->frames_in);
   2217     }
   2218 
   2219     buffer->frame_count = (buffer->frame_count > in->frames_in) ?
   2220                                 in->frames_in : buffer->frame_count;
   2221     buffer->i16 = in->buffer + (in->config.period_size - in->frames_in) *
   2222                                                 in->config.channels;
   2223 
   2224     return in->read_status;
   2225 
   2226 }
   2227 
   2228 static void release_buffer(struct resampler_buffer_provider *buffer_provider,
   2229                                   struct resampler_buffer* buffer)
   2230 {
   2231     struct omap4_stream_in *in;
   2232 
   2233     LOGFUNC("%s(%p, %p)", __FUNCTION__, buffer_provider, buffer);
   2234 
   2235     if (buffer_provider == NULL || buffer == NULL)
   2236         return;
   2237 
   2238     in = (struct omap4_stream_in *)((char *)buffer_provider -
   2239                                    offsetof(struct omap4_stream_in, buf_provider));
   2240 
   2241     in->frames_in -= buffer->frame_count;
   2242 }
   2243 
   2244 /* read_frames() reads frames from kernel driver, down samples to capture rate
   2245  * if necessary and output the number of frames requested to the buffer specified */
   2246 static ssize_t read_frames(struct omap4_stream_in *in, void *buffer, ssize_t frames)
   2247 {
   2248     ssize_t frames_wr = 0;
   2249     size_t frame_size;
   2250 
   2251     LOGFUNC("%s(%p, %p, %ld)", __FUNCTION__, in, buffer, frames);
   2252 
   2253     if (in->remix_at_driver)
   2254         frame_size = in->remix_at_driver->out_chans * in->remix_at_driver->sample_size;
   2255     else
   2256         frame_size = audio_stream_frame_size(&in->stream.common);
   2257 
   2258     while (frames_wr < frames) {
   2259         size_t frames_rd = frames - frames_wr;
   2260         if (in->resampler != NULL) {
   2261             in->resampler->resample_from_provider(in->resampler,
   2262                     (int16_t *)((char *)buffer + frames_wr * frame_size),
   2263                     &frames_rd);
   2264         } else {
   2265             struct resampler_buffer buf = {
   2266                     { raw : NULL, },
   2267                     frame_count : frames_rd,
   2268             };
   2269             get_next_buffer(&in->buf_provider, &buf);
   2270             if (buf.raw != NULL) {
   2271                 memcpy((char *)buffer +
   2272                         frames_wr * frame_size,
   2273                         buf.raw,
   2274                         buf.frame_count * frame_size);
   2275                 frames_rd = buf.frame_count;
   2276             }
   2277             release_buffer(&in->buf_provider, &buf);
   2278         }
   2279         /* in->read_status is updated by getNextBuffer() also called by
   2280          * in->resampler->resample_from_provider() */
   2281         if (in->read_status != 0)
   2282             return in->read_status;
   2283 
   2284         frames_wr += frames_rd;
   2285     }
   2286     return frames_wr;
   2287 }
   2288 
   2289 /* process_frames() reads frames from kernel driver (via read_frames()),
   2290  * calls the active audio pre processings and output the number of frames requested
   2291  * to the buffer specified */
   2292 static ssize_t process_frames(struct omap4_stream_in *in, void* buffer, ssize_t frames)
   2293 {
   2294     ssize_t frames_wr = 0;
   2295     audio_buffer_t in_buf;
   2296     audio_buffer_t out_buf;
   2297     int i;
   2298 
   2299     LOGFUNC("%s(%p, %p, %ld)", __FUNCTION__, in, buffer, frames);
   2300 
   2301     while (frames_wr < frames) {
   2302         /* first reload enough frames at the end of process input buffer */
   2303         if (in->proc_frames_in < (size_t)frames) {
   2304             ssize_t frames_rd;
   2305 
   2306             if (in->proc_buf_size < (size_t)frames) {
   2307                 in->proc_buf_size = (size_t)frames;
   2308                 in->proc_buf = (int16_t *)realloc(in->proc_buf,
   2309                                          in->proc_buf_size *
   2310                                              in->config.channels * sizeof(int16_t));
   2311                 ALOGV("process_frames(): in->proc_buf %p size extended to %d frames",
   2312                      in->proc_buf, in->proc_buf_size);
   2313             }
   2314             frames_rd = read_frames(in,
   2315                                     in->proc_buf +
   2316                                         in->proc_frames_in * in->config.channels,
   2317                                     frames - in->proc_frames_in);
   2318             if (frames_rd < 0) {
   2319                 frames_wr = frames_rd;
   2320                 break;
   2321             }
   2322             in->proc_frames_in += frames_rd;
   2323         }
   2324 
   2325         if (in->echo_reference != NULL)
   2326             push_echo_reference(in, in->proc_frames_in);
   2327 
   2328          /* in_buf.frameCount and out_buf.frameCount indicate respectively
   2329           * the maximum number of frames to be consumed and produced by process() */
   2330         in_buf.frameCount = in->proc_frames_in;
   2331         in_buf.s16 = in->proc_buf;
   2332         out_buf.frameCount = frames - frames_wr;
   2333         out_buf.s16 = (int16_t *)buffer + frames_wr * in->config.channels;
   2334 
   2335         for (i = 0; i < in->num_preprocessors; i++)
   2336             (*in->preprocessors[i])->process(in->preprocessors[i],
   2337                                                &in_buf,
   2338                                                &out_buf);
   2339 
   2340         /* process() has updated the number of frames consumed and produced in
   2341          * in_buf.frameCount and out_buf.frameCount respectively
   2342          * move remaining frames to the beginning of in->proc_buf */
   2343         in->proc_frames_in -= in_buf.frameCount;
   2344         if (in->proc_frames_in) {
   2345             memcpy(in->proc_buf,
   2346                    in->proc_buf + in_buf.frameCount * in->config.channels,
   2347                    in->proc_frames_in * in->config.channels * sizeof(int16_t));
   2348         }
   2349 
   2350         /* if not enough frames were passed to process(), read more and retry. */
   2351         if (out_buf.frameCount == 0)
   2352             continue;
   2353 
   2354         frames_wr += out_buf.frameCount;
   2355     }
   2356     return frames_wr;
   2357 }
   2358 
   2359 static ssize_t in_read(struct audio_stream_in *stream, void* buffer,
   2360                        size_t bytes)
   2361 {
   2362     int ret = 0;
   2363     struct omap4_stream_in *in = (struct omap4_stream_in *)stream;
   2364     struct omap4_audio_device *adev = in->dev;
   2365     size_t frames_rq = bytes / audio_stream_frame_size(&stream->common);
   2366 
   2367     LOGFUNC("%s(%p, %p, %d)", __FUNCTION__, stream, buffer, bytes);
   2368 
   2369     /* acquiring hw device mutex systematically is useful if a low priority thread is waiting
   2370      * on the input stream mutex - e.g. executing select_mode() while holding the hw device
   2371      * mutex
   2372      */
   2373     pthread_mutex_lock(&adev->lock);
   2374     pthread_mutex_lock(&in->lock);
   2375     if (in->standby) {
   2376         ret = start_input_stream(in);
   2377         if (ret == 0)
   2378             in->standby = 0;
   2379     }
   2380     pthread_mutex_unlock(&adev->lock);
   2381 
   2382     if (ret < 0)
   2383         goto exit;
   2384 
   2385     if (in->num_preprocessors != 0)
   2386         ret = process_frames(in, buffer, frames_rq);
   2387     else if (in->resampler != NULL || in->remix_at_driver)
   2388         ret = read_frames(in, buffer, frames_rq);
   2389     else
   2390         ret = pcm_read(in->pcm, buffer, bytes);
   2391 
   2392     if (ret > 0)
   2393         ret = 0;
   2394 
   2395     if (ret == 0 && adev->mic_mute)
   2396         memset(buffer, 0, bytes);
   2397 
   2398 exit:
   2399     if (ret < 0)
   2400         usleep(bytes * 1000000 / audio_stream_frame_size(&stream->common) /
   2401                in_get_sample_rate(&stream->common));
   2402 
   2403     pthread_mutex_unlock(&in->lock);
   2404     return bytes;
   2405 }
   2406 
   2407 static uint32_t in_get_input_frames_lost(struct audio_stream_in *stream)
   2408 {
   2409     LOGFUNC("%s(%p)", __FUNCTION__, stream);
   2410 
   2411     return 0;
   2412 }
   2413 
   2414 static int in_add_audio_effect(const struct audio_stream *stream,
   2415                                effect_handle_t effect)
   2416 {
   2417     struct omap4_stream_in *in = (struct omap4_stream_in *)stream;
   2418     int status;
   2419     effect_descriptor_t desc;
   2420 
   2421     LOGFUNC("%s(%p, %p)", __FUNCTION__, stream, effect);
   2422 
   2423     pthread_mutex_lock(&in->dev->lock);
   2424     pthread_mutex_lock(&in->lock);
   2425     if (in->num_preprocessors >= MAX_PREPROCESSORS) {
   2426         status = -ENOSYS;
   2427         goto exit;
   2428     }
   2429 
   2430     status = (*effect)->get_descriptor(effect, &desc);
   2431     if (status != 0)
   2432         goto exit;
   2433 
   2434     in->preprocessors[in->num_preprocessors++] = effect;
   2435 
   2436     if (memcmp(&desc.type, FX_IID_AEC, sizeof(effect_uuid_t)) == 0) {
   2437         in->need_echo_reference = true;
   2438         do_input_standby(in);
   2439     }
   2440 
   2441 exit:
   2442 
   2443     pthread_mutex_unlock(&in->lock);
   2444     pthread_mutex_unlock(&in->dev->lock);
   2445     return status;
   2446 }
   2447 
   2448 static int in_remove_audio_effect(const struct audio_stream *stream,
   2449                                   effect_handle_t effect)
   2450 {
   2451     struct omap4_stream_in *in = (struct omap4_stream_in *)stream;
   2452     int i;
   2453     int status = -EINVAL;
   2454     bool found = false;
   2455     effect_descriptor_t desc;
   2456 
   2457     LOGFUNC("%s(%p, %p)", __FUNCTION__, stream, effect);
   2458 
   2459     pthread_mutex_lock(&in->dev->lock);
   2460     pthread_mutex_lock(&in->lock);
   2461     if (in->num_preprocessors <= 0) {
   2462         status = -ENOSYS;
   2463         goto exit;
   2464     }
   2465 
   2466     for (i = 0; i < in->num_preprocessors; i++) {
   2467         if (found) {
   2468             in->preprocessors[i - 1] = in->preprocessors[i];
   2469             continue;
   2470         }
   2471         if (in->preprocessors[i] == effect) {
   2472             in->preprocessors[i] = NULL;
   2473             status = 0;
   2474             found = true;
   2475         }
   2476     }
   2477 
   2478     if (status != 0)
   2479         goto exit;
   2480 
   2481     in->num_preprocessors--;
   2482 
   2483     status = (*effect)->get_descriptor(effect, &desc);
   2484     if (status != 0)
   2485         goto exit;
   2486     if (memcmp(&desc.type, FX_IID_AEC, sizeof(effect_uuid_t)) == 0) {
   2487         in->need_echo_reference = false;
   2488         do_input_standby(in);
   2489     }
   2490 
   2491 exit:
   2492 
   2493     pthread_mutex_unlock(&in->lock);
   2494     pthread_mutex_unlock(&in->dev->lock);
   2495     return status;
   2496 }
   2497 
   2498 
   2499 static int adev_open_output_stream(struct audio_hw_device *dev,
   2500                                    audio_io_handle_t handle,
   2501                                    audio_devices_t devices,
   2502                                    audio_output_flags_t flags,
   2503                                    struct audio_config *config,
   2504                                    struct audio_stream_out **stream_out)
   2505 {
   2506     struct omap4_audio_device *ladev = (struct omap4_audio_device *)dev;
   2507     struct omap4_stream_out *out;
   2508     int ret;
   2509 
   2510     LOGFUNC("%s(%p, 0x%04x,%d, 0x%04x, %d, %p)", __FUNCTION__, dev, devices,
   2511                         *format, *channels, *sample_rate, stream_out);
   2512 
   2513     out = (struct omap4_stream_out *)calloc(1, sizeof(struct omap4_stream_out));
   2514     if (!out)
   2515         return -ENOMEM;
   2516     if (devices & AUDIO_DEVICE_OUT_ALL_SCO) {
   2517         ret = create_resampler(DEFAULT_OUT_SAMPLING_RATE,
   2518                 MM_FULL_POWER_SAMPLING_RATE,
   2519                 2,
   2520                 RESAMPLER_QUALITY_DEFAULT,
   2521                 NULL,
   2522                 &out->resampler);
   2523         if (ret != 0)
   2524             goto err_open;
   2525         out->buffer = malloc(RESAMPLER_BUFFER_SIZE); /* todo: allow for reallocing */
   2526     } else
   2527        out->resampler = NULL;
   2528 
   2529     out->stream.common.get_sample_rate = out_get_sample_rate;
   2530     out->stream.common.set_sample_rate = out_set_sample_rate;
   2531     out->stream.common.get_buffer_size = out_get_buffer_size;
   2532     out->stream.common.get_channels = out_get_channels;
   2533     out->stream.common.get_format = out_get_format;
   2534     out->stream.common.set_format = out_set_format;
   2535     out->stream.common.standby = out_standby;
   2536     out->stream.common.dump = out_dump;
   2537     out->stream.common.set_parameters = out_set_parameters;
   2538     out->stream.common.get_parameters = out_get_parameters;
   2539     out->stream.common.add_audio_effect = out_add_audio_effect;
   2540     out->stream.common.remove_audio_effect = out_remove_audio_effect;
   2541     out->stream.get_latency = out_get_latency;
   2542     out->stream.set_volume = out_set_volume;
   2543     out->stream.write = out_write;
   2544     out->stream.get_render_position = out_get_render_position;
   2545 
   2546     out->config = pcm_config_mm;
   2547 
   2548     out->dev = ladev;
   2549     out->standby = 1;
   2550 
   2551     /* FIXME: when we support multiple output devices, we will want to
   2552      * do the following:
   2553      * adev->devices &= ~AUDIO_DEVICE_OUT_ALL;
   2554      * adev->devices |= out->device;
   2555      * select_output_device(adev);
   2556      * This is because out_set_parameters() with a route is not
   2557      * guaranteed to be called after an output stream is opened. */
   2558 
   2559     config->format = out_get_format(&out->stream.common);
   2560     config->channel_mask = out_get_channels(&out->stream.common);
   2561     config->sample_rate = out_get_sample_rate(&out->stream.common);
   2562 
   2563     *stream_out = &out->stream;
   2564     return 0;
   2565 
   2566 err_open:
   2567     free(out);
   2568     *stream_out = NULL;
   2569     return ret;
   2570 }
   2571 
   2572 static void adev_close_output_stream(struct audio_hw_device *dev,
   2573                                      struct audio_stream_out *stream)
   2574 {
   2575     struct omap4_stream_out *out = (struct omap4_stream_out *)stream;
   2576 
   2577     LOGFUNC("%s(%p, %p)", __FUNCTION__, dev, stream);
   2578 
   2579     out_standby(&stream->common);
   2580     if (out->buffer)
   2581         free(out->buffer);
   2582     if (out->resampler)
   2583         release_resampler(out->resampler);
   2584     free(stream);
   2585 }
   2586 
   2587 static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs)
   2588 {
   2589     struct omap4_audio_device *adev = (struct omap4_audio_device *)dev;
   2590     struct str_parms *parms;
   2591     char *str;
   2592     char value[32];
   2593     int ret;
   2594 
   2595     LOGFUNC("%s(%p, %s)", __FUNCTION__, dev, kvpairs);
   2596 
   2597     parms = str_parms_create_str(kvpairs);
   2598     ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_TTY_MODE, value, sizeof(value));
   2599     if (ret >= 0) {
   2600         int tty_mode;
   2601 
   2602         if (strcmp(value, AUDIO_PARAMETER_VALUE_TTY_OFF) == 0)
   2603             tty_mode = TTY_MODE_OFF;
   2604         else if (strcmp(value, AUDIO_PARAMETER_VALUE_TTY_VCO) == 0)
   2605             tty_mode = TTY_MODE_VCO;
   2606         else if (strcmp(value, AUDIO_PARAMETER_VALUE_TTY_HCO) == 0)
   2607             tty_mode = TTY_MODE_HCO;
   2608         else if (strcmp(value, AUDIO_PARAMETER_VALUE_TTY_FULL) == 0)
   2609             tty_mode = TTY_MODE_FULL;
   2610         else
   2611             return -EINVAL;
   2612 
   2613         pthread_mutex_lock(&adev->lock);
   2614         if (tty_mode != adev->tty_mode) {
   2615             adev->tty_mode = tty_mode;
   2616             if (adev->mode == AUDIO_MODE_IN_CALL)
   2617                 select_output_device(adev);
   2618         }
   2619         pthread_mutex_unlock(&adev->lock);
   2620     }
   2621 
   2622     ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_BT_NREC, value, sizeof(value));
   2623     if (ret >= 0) {
   2624         if (strcmp(value, AUDIO_PARAMETER_VALUE_ON) == 0)
   2625             adev->bluetooth_nrec = true;
   2626         else
   2627             adev->bluetooth_nrec = false;
   2628 
   2629     }
   2630 
   2631     ret = str_parms_get_str(parms, "screen_state", value, sizeof(value));
   2632     if (ret >= 0) {
   2633         if (strcmp(value, AUDIO_PARAMETER_VALUE_ON) == 0)
   2634             adev->low_power = false;
   2635         else
   2636             adev->low_power = true;
   2637     }
   2638 
   2639     str_parms_destroy(parms);
   2640     return ret;
   2641 }
   2642 
   2643 static char * adev_get_parameters(const struct audio_hw_device *dev,
   2644                                   const char *keys)
   2645 {
   2646     LOGFUNC("%s(%p, %s)", __FUNCTION__, dev, keys);
   2647 
   2648     return strdup("");
   2649 }
   2650 
   2651 static int adev_init_check(const struct audio_hw_device *dev)
   2652 {
   2653     LOGFUNC("%s(%p)", __FUNCTION__, dev);
   2654     return 0;
   2655 }
   2656 
   2657 static int adev_set_voice_volume(struct audio_hw_device *dev, float volume)
   2658 {
   2659     struct omap4_audio_device *adev = (struct omap4_audio_device *)dev;
   2660 
   2661     LOGFUNC("%s(%p, %f)", __FUNCTION__, dev, volume);
   2662     adev->voice_volume = volume;
   2663 
   2664     return 0;
   2665 }
   2666 
   2667 static int adev_set_master_volume(struct audio_hw_device *dev, float volume)
   2668 {
   2669     LOGFUNC("%s(%p, %f)", __FUNCTION__, dev, volume);
   2670 
   2671     return -ENOSYS;
   2672 }
   2673 
   2674 static int adev_set_mode(struct audio_hw_device *dev, int mode)
   2675 {
   2676     struct omap4_audio_device *adev = (struct omap4_audio_device *)dev;
   2677 
   2678     LOGFUNC("%s(%p, %d)", __FUNCTION__, dev, mode);
   2679 
   2680     pthread_mutex_lock(&adev->lock);
   2681     if (adev->mode != mode) {
   2682         adev->mode = mode;
   2683         select_mode(adev);
   2684     }
   2685     pthread_mutex_unlock(&adev->lock);
   2686 
   2687     return 0;
   2688 }
   2689 
   2690 static int adev_set_mic_mute(struct audio_hw_device *dev, bool state)
   2691 {
   2692     struct omap4_audio_device *adev = (struct omap4_audio_device *)dev;
   2693 
   2694     LOGFUNC("%s(%p, %d)", __FUNCTION__, dev, state);
   2695 
   2696     adev->mic_mute = state;
   2697 
   2698     return 0;
   2699 }
   2700 
   2701 static int adev_get_mic_mute(const struct audio_hw_device *dev, bool *state)
   2702 {
   2703     struct omap4_audio_device *adev = (struct omap4_audio_device *)dev;
   2704 
   2705     LOGFUNC("%s(%p, %p)", __FUNCTION__, dev, state);
   2706 
   2707     *state = adev->mic_mute;
   2708 
   2709     return 0;
   2710 }
   2711 
   2712 static size_t adev_get_input_buffer_size(const struct audio_hw_device *dev,
   2713                                          const struct audio_config *config)
   2714 {
   2715     size_t size;
   2716     int channel_count = popcount(config->channel_mask);
   2717     LOGFUNC("%s(%p, %d, %d, %d)", __FUNCTION__, dev, sample_rate,
   2718                                 format, channel_count);
   2719 
   2720     if (check_input_parameters(config->sample_rate, config->format, channel_count) != 0) {
   2721         return 0;
   2722     }
   2723 
   2724     return get_input_buffer_size(config->sample_rate, config->format, channel_count);
   2725 }
   2726 
   2727 static int adev_open_input_stream(struct audio_hw_device *dev,
   2728                                   audio_io_handle_t handle,
   2729                                   audio_devices_t devices,
   2730                                   struct audio_config *config,
   2731                                   struct audio_stream_in **stream_in)
   2732 {
   2733     struct omap4_audio_device *ladev = (struct omap4_audio_device *)dev;
   2734     struct omap4_stream_in *in;
   2735     int ret;
   2736     int channel_count = popcount(config->channel_mask);
   2737     /*audioflinger expects return variable to be NULL incase of failure */
   2738     *stream_in = NULL;
   2739     LOGFUNC("%s(%p, 0x%04x, %d, 0x%04x, %d, 0x%04x, %p)", __FUNCTION__, dev,
   2740         devices, *format, *channel_mask, *sample_rate, acoustics, stream_in);
   2741 
   2742     if (check_input_parameters(config->sample_rate, config->format, channel_count) != 0)
   2743         return -EINVAL;
   2744 
   2745     in = (struct omap4_stream_in *)calloc(1, sizeof(struct omap4_stream_in));
   2746     if (!in)
   2747         return -ENOMEM;
   2748 
   2749     in->stream.common.get_sample_rate = in_get_sample_rate;
   2750     in->stream.common.set_sample_rate = in_set_sample_rate;
   2751     in->stream.common.get_buffer_size = in_get_buffer_size;
   2752     in->stream.common.get_channels = in_get_channels;
   2753     in->stream.common.get_format = in_get_format;
   2754     in->stream.common.set_format = in_set_format;
   2755     in->stream.common.standby = in_standby;
   2756     in->stream.common.dump = in_dump;
   2757     in->stream.common.set_parameters = in_set_parameters;
   2758     in->stream.common.get_parameters = in_get_parameters;
   2759     in->stream.common.add_audio_effect = in_add_audio_effect;
   2760     in->stream.common.remove_audio_effect = in_remove_audio_effect;
   2761     in->stream.set_gain = in_set_gain;
   2762     in->stream.read = in_read;
   2763     in->stream.get_input_frames_lost = in_get_input_frames_lost;
   2764     in->remix_at_driver = NULL;
   2765 
   2766     in->requested_rate = config->sample_rate;
   2767 
   2768     memcpy(&in->config, &pcm_config_mm_ul, sizeof(pcm_config_mm_ul));
   2769     in->config.channels = channel_count;
   2770 
   2771     in->buffer = malloc(2 * in->config.period_size * audio_stream_frame_size(&in->stream.common));
   2772     if (!in->buffer) {
   2773         ret = -ENOMEM;
   2774         goto err;
   2775     }
   2776 
   2777     if (in->requested_rate != in->config.rate) {
   2778         in->buf_provider.get_next_buffer = get_next_buffer;
   2779         in->buf_provider.release_buffer = release_buffer;
   2780         ret = create_resampler(in->config.rate,
   2781                                in->requested_rate,
   2782                                in->config.channels,
   2783                                RESAMPLER_QUALITY_DEFAULT,
   2784                                &in->buf_provider,
   2785                                &in->resampler);
   2786         if (ret != 0) {
   2787             ret = -EINVAL;
   2788             goto err;
   2789         }
   2790     }
   2791 
   2792     in->dev = ladev;
   2793     in->standby = 1;
   2794     in->device = devices;
   2795 
   2796     *stream_in = &in->stream;
   2797     return 0;
   2798 
   2799 err:
   2800     if (in->resampler)
   2801         release_resampler(in->resampler);
   2802 
   2803     free(in);
   2804     *stream_in = NULL;
   2805     return ret;
   2806 }
   2807 
   2808 static void adev_close_input_stream(struct audio_hw_device *dev,
   2809                                    struct audio_stream_in *stream)
   2810 {
   2811     struct omap4_stream_in *in = (struct omap4_stream_in *)stream;
   2812 
   2813     LOGFUNC("%s(%p, %p)", __FUNCTION__, dev, stream);
   2814 
   2815     in_standby(&stream->common);
   2816 
   2817     if (in->resampler) {
   2818         free(in->buffer);
   2819         release_resampler(in->resampler);
   2820     }
   2821 
   2822     if (in->remix_at_driver)
   2823         free(in->remix_at_driver);
   2824 
   2825     free(stream);
   2826     return;
   2827 }
   2828 
   2829 static int adev_dump(const audio_hw_device_t *device, int fd)
   2830 {
   2831     LOGFUNC("%s(%p, %d)", __FUNCTION__, device, fd);
   2832 
   2833     return 0;
   2834 }
   2835 
   2836 static int adev_close(hw_device_t *device)
   2837 {
   2838     struct omap4_audio_device *adev = (struct omap4_audio_device *)device;
   2839 
   2840     LOGFUNC("%s(%p)", __FUNCTION__, device);
   2841 
   2842     mixer_close(adev->mixer);
   2843     free(device);
   2844     return 0;
   2845 }
   2846 
   2847 static uint32_t adev_get_supported_devices(const struct audio_hw_device *dev)
   2848 {
   2849     LOGFUNC("%s(%p)", __FUNCTION__, dev);
   2850 
   2851     return (/* OUT */
   2852             AUDIO_DEVICE_OUT_EARPIECE |
   2853             AUDIO_DEVICE_OUT_SPEAKER |
   2854             AUDIO_DEVICE_OUT_WIRED_HEADSET |
   2855             AUDIO_DEVICE_OUT_WIRED_HEADPHONE |
   2856             AUDIO_DEVICE_OUT_AUX_DIGITAL |
   2857             AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET |
   2858             AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET |
   2859             AUDIO_DEVICE_OUT_ALL_SCO |
   2860             AUDIO_DEVICE_OUT_DEFAULT |
   2861             /* IN */
   2862             AUDIO_DEVICE_IN_COMMUNICATION |
   2863             AUDIO_DEVICE_IN_AMBIENT |
   2864             AUDIO_DEVICE_IN_BUILTIN_MIC |
   2865             AUDIO_DEVICE_IN_WIRED_HEADSET |
   2866             AUDIO_DEVICE_IN_AUX_DIGITAL |
   2867             AUDIO_DEVICE_IN_BACK_MIC |
   2868             AUDIO_DEVICE_IN_ALL_SCO |
   2869             AUDIO_DEVICE_IN_DEFAULT);
   2870 }
   2871 
   2872 static int adev_open(const hw_module_t* module, const char* name,
   2873                      hw_device_t** device)
   2874 {
   2875     struct omap4_audio_device *adev;
   2876     int ret;
   2877     pthread_mutexattr_t mta;
   2878 
   2879     LOGFUNC("%s(%p, %s, %p)", __FUNCTION__, module, name, device);
   2880 
   2881     if (strcmp(name, AUDIO_HARDWARE_INTERFACE) != 0)
   2882         return -EINVAL;
   2883 
   2884     adev = calloc(1, sizeof(struct omap4_audio_device));
   2885     if (!adev)
   2886         return -ENOMEM;
   2887 
   2888     adev->hw_device.common.tag = HARDWARE_DEVICE_TAG;
   2889     adev->hw_device.common.version = AUDIO_DEVICE_API_VERSION_2_0;
   2890     adev->hw_device.common.module = (struct hw_module_t *) module;
   2891     adev->hw_device.common.close = adev_close;
   2892 
   2893     adev->hw_device.get_supported_devices = adev_get_supported_devices;
   2894     adev->hw_device.init_check = adev_init_check;
   2895     adev->hw_device.set_voice_volume = adev_set_voice_volume;
   2896     adev->hw_device.set_master_volume = adev_set_master_volume;
   2897     adev->hw_device.set_mode = adev_set_mode;
   2898     adev->hw_device.set_mic_mute = adev_set_mic_mute;
   2899     adev->hw_device.get_mic_mute = adev_get_mic_mute;
   2900     adev->hw_device.set_parameters = adev_set_parameters;
   2901     adev->hw_device.get_parameters = adev_get_parameters;
   2902     adev->hw_device.get_input_buffer_size = adev_get_input_buffer_size;
   2903     adev->hw_device.open_output_stream = adev_open_output_stream;
   2904     adev->hw_device.close_output_stream = adev_close_output_stream;
   2905     adev->hw_device.open_input_stream = adev_open_input_stream;
   2906     adev->hw_device.close_input_stream = adev_close_input_stream;
   2907     adev->hw_device.dump = adev_dump;
   2908 
   2909     adev->mixer = mixer_open(0);
   2910     if (!adev->mixer) {
   2911         free(adev);
   2912         ALOGE("Unable to open the mixer, aborting.");
   2913         return -EINVAL;
   2914     }
   2915 
   2916     adev->mixer_ctls.dl1_eq = mixer_get_ctl_by_name(adev->mixer,
   2917                                            MIXER_DL1_EQUALIZER);
   2918     adev->mixer_ctls.mm_dl1 = mixer_get_ctl_by_name(adev->mixer,
   2919                                            MIXER_DL1_MIXER_MULTIMEDIA);
   2920     adev->mixer_ctls.vx_dl1 = mixer_get_ctl_by_name(adev->mixer,
   2921                                            MIXER_DL1_MIXER_VOICE);
   2922     adev->mixer_ctls.mm_dl2 = mixer_get_ctl_by_name(adev->mixer,
   2923                                            MIXER_DL2_MIXER_MULTIMEDIA);
   2924     adev->mixer_ctls.vx_dl2 = mixer_get_ctl_by_name(adev->mixer,
   2925                                            MIXER_DL2_MIXER_VOICE);
   2926     adev->mixer_ctls.dl2_mono = mixer_get_ctl_by_name(adev->mixer,
   2927                                            MIXER_DL2_MONO_MIXER);
   2928     adev->mixer_ctls.dl1_mono = mixer_get_ctl_by_name(adev->mixer,
   2929                                            MIXER_DL1_MONO_MIXER);
   2930     adev->mixer_ctls.dl1_headset = mixer_get_ctl_by_name(adev->mixer,
   2931                                            MIXER_DL1_PDM_SWITCH);
   2932     adev->mixer_ctls.dl1_bt = mixer_get_ctl_by_name(adev->mixer,
   2933                                            MIXER_DL1_BT_VX_SWITCH);
   2934     adev->mixer_ctls.earpiece_enable = mixer_get_ctl_by_name(adev->mixer,
   2935                                            MIXER_EARPHONE_ENABLE_SWITCH);
   2936     adev->mixer_ctls.left_capture = mixer_get_ctl_by_name(adev->mixer,
   2937                                            MIXER_ANALOG_LEFT_CAPTURE_ROUTE);
   2938     adev->mixer_ctls.right_capture = mixer_get_ctl_by_name(adev->mixer,
   2939                                            MIXER_ANALOG_RIGHT_CAPTURE_ROUTE);
   2940     adev->mixer_ctls.amic_ul_volume = mixer_get_ctl_by_name(adev->mixer,
   2941                                            MIXER_AMIC_UL_VOLUME);
   2942     adev->mixer_ctls.dmic1_ul_volume = mixer_get_ctl_by_name(adev->mixer,
   2943                                            MIXER_DMIC1_UL_VOLUME);
   2944     adev->mixer_ctls.voice_ul_volume = mixer_get_ctl_by_name(adev->mixer,
   2945                                            MIXER_AUDUL_VOICE_UL_VOLUME);
   2946     adev->mixer_ctls.sidetone_capture = mixer_get_ctl_by_name(adev->mixer,
   2947                                            MIXER_SIDETONE_MIXER_CAPTURE);
   2948     adev->mixer_ctls.headset_volume = mixer_get_ctl_by_name(adev->mixer,
   2949                                            MIXER_HEADSET_PLAYBACK_VOLUME);
   2950     adev->mixer_ctls.speaker_volume = mixer_get_ctl_by_name(adev->mixer,
   2951                                            MIXER_HANDSFREE_PLAYBACK_VOLUME);
   2952 
   2953     if (!adev->mixer_ctls.mm_dl1 || !adev->mixer_ctls.vx_dl1 ||
   2954         !adev->mixer_ctls.mm_dl2 || !adev->mixer_ctls.vx_dl2 ||
   2955         !adev->mixer_ctls.dl2_mono || !adev->mixer_ctls.dl1_mono ||
   2956         !adev->mixer_ctls.dl1_headset || !adev->mixer_ctls.dl1_bt ||
   2957         !adev->mixer_ctls.earpiece_enable || !adev->mixer_ctls.left_capture ||
   2958         !adev->mixer_ctls.right_capture || !adev->mixer_ctls.amic_ul_volume ||
   2959         !adev->mixer_ctls.sidetone_capture || !adev->mixer_ctls.headset_volume ||
   2960         !adev->mixer_ctls.speaker_volume || !adev->mixer_ctls.dmic1_ul_volume ||
   2961         !adev->mixer_ctls.dl1_eq || !adev->mixer_ctls.voice_ul_volume) {
   2962         mixer_close(adev->mixer);
   2963         free(adev);
   2964         ALOGE("Unable to locate all mixer controls, aborting.");
   2965         return -EINVAL;
   2966     }
   2967 
   2968     pthread_mutexattr_init(&mta);
   2969     pthread_mutexattr_settype(&mta, PTHREAD_MUTEX_NORMAL);
   2970     pthread_mutex_init(&adev->lock, &mta);
   2971     pthread_mutexattr_destroy(&mta);
   2972 
   2973     /* Set the default route before the PCM stream is opened */
   2974     pthread_mutex_lock(&adev->lock);
   2975     set_route_by_array(adev->mixer, defaults, 1);
   2976     adev->mode = AUDIO_MODE_NORMAL;
   2977     adev->devices = AUDIO_DEVICE_OUT_SPEAKER | AUDIO_DEVICE_IN_BUILTIN_MIC;
   2978     select_output_device(adev);
   2979 
   2980     adev->pcm_modem_dl = NULL;
   2981     adev->pcm_modem_ul = NULL;
   2982     adev->voice_volume = 1.0f;
   2983     adev->tty_mode = TTY_MODE_OFF;
   2984     if(get_boardtype(adev)) {
   2985         pthread_mutex_unlock(&adev->lock);
   2986         mixer_close(adev->mixer);
   2987         free(adev);
   2988         ALOGE("Unsupported boardtype, aborting.");
   2989         return -EINVAL;
   2990     }
   2991 
   2992     adev->input_requires_stereo = 0;
   2993     adev->bluetooth_nrec = true;
   2994     pthread_mutex_unlock(&adev->lock);
   2995     *device = &adev->hw_device.common;
   2996 
   2997     return 0;
   2998 }
   2999 
   3000 static struct hw_module_methods_t hal_module_methods = {
   3001     .open = adev_open,
   3002 };
   3003 
   3004 struct audio_module HAL_MODULE_INFO_SYM = {
   3005     .common = {
   3006         .tag = HARDWARE_MODULE_TAG,
   3007         .module_api_version = AUDIO_MODULE_API_VERSION_0_1,
   3008         .hal_api_version = HARDWARE_HAL_API_VERSION,
   3009         .id = AUDIO_HARDWARE_MODULE_ID,
   3010         .name = "OMAP4 audio HW HAL",
   3011         .author = "Texas Instruments",
   3012         .methods = &hal_module_methods,
   3013     },
   3014 };
   3015