Home | History | Annotate | Download | only in libaudio
      1 /*
      2 ** Copyright 2010, The Android Open-Source Project
      3 **
      4 ** Licensed under the Apache License, Version 2.0 (the "License");
      5 ** you may not use this file except in compliance with the License.
      6 ** You may obtain a copy of the License at
      7 **
      8 **     http://www.apache.org/licenses/LICENSE-2.0
      9 **
     10 ** Unless required by applicable law or agreed to in writing, software
     11 ** distributed under the License is distributed on an "AS IS" BASIS,
     12 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 ** See the License for the specific language governing permissions and
     14 ** limitations under the License.
     15 */
     16 
     17 #include <math.h>
     18 
     19 //#define LOG_NDEBUG 0
     20 #define LOG_TAG "AudioHardware"
     21 
     22 #include <utils/Log.h>
     23 #include <utils/String8.h>
     24 
     25 #include <stdio.h>
     26 #include <unistd.h>
     27 #include <sys/ioctl.h>
     28 #include <sys/types.h>
     29 #include <sys/stat.h>
     30 #include <sys/resource.h>
     31 #include <dlfcn.h>
     32 #include <fcntl.h>
     33 
     34 #include "AudioHardware.h"
     35 #include <audio_effects/effect_aec.h>
     36 
     37 extern "C" {
     38 #include <tinyalsa/asoundlib.h>
     39 }
     40 
     41 
     42 namespace android_audio_legacy {
     43 
     44 const uint32_t AudioHardware::inputConfigTable[][AudioHardware::INPUT_CONFIG_CNT] = {
     45         {8000, 4},
     46         {11025, 4},
     47         {16000, 2},
     48         {22050, 2},
     49         {32000, 1},
     50         {44100, 1}
     51 };
     52 
     53 //  trace driver operations for dump
     54 //
     55 #define DRIVER_TRACE
     56 
     57 enum {
     58     DRV_NONE,
     59     DRV_PCM_OPEN,
     60     DRV_PCM_CLOSE,
     61     DRV_PCM_WRITE,
     62     DRV_PCM_READ,
     63     DRV_MIXER_OPEN,
     64     DRV_MIXER_CLOSE,
     65     DRV_MIXER_GET,
     66     DRV_MIXER_SEL
     67 };
     68 
     69 #ifdef DRIVER_TRACE
     70 #define TRACE_DRIVER_IN(op) mDriverOp = op;
     71 #define TRACE_DRIVER_OUT mDriverOp = DRV_NONE;
     72 #else
     73 #define TRACE_DRIVER_IN(op)
     74 #define TRACE_DRIVER_OUT
     75 #endif
     76 
     77 // ----------------------------------------------------------------------------
     78 
     79 const char *AudioHardware::inputPathNameDefault = "Default";
     80 const char *AudioHardware::inputPathNameCamcorder = "Camcorder";
     81 const char *AudioHardware::inputPathNameVoiceRecognition = "Voice Recognition";
     82 
     83 AudioHardware::AudioHardware() :
     84     mInit(false),
     85     mMicMute(false),
     86     mPcm(NULL),
     87     mMixer(NULL),
     88     mPcmOpenCnt(0),
     89     mMixerOpenCnt(0),
     90     mInCallAudioMode(false),
     91     mVoiceVol(1.0f),
     92     mInputSource(AUDIO_SOURCE_DEFAULT),
     93     mBluetoothNrec(true),
     94     mTTYMode(TTY_MODE_OFF),
     95     mSecRilLibHandle(NULL),
     96     mRilClient(0),
     97     mActivatedCP(false),
     98     mEchoReference(NULL),
     99     mDriverOp(DRV_NONE)
    100 {
    101     loadRILD();
    102     mInit = true;
    103 }
    104 
    105 AudioHardware::~AudioHardware()
    106 {
    107     for (size_t index = 0; index < mInputs.size(); index++) {
    108         closeInputStream(mInputs[index].get());
    109     }
    110     mInputs.clear();
    111     closeOutputStream((AudioStreamOut*)mOutput.get());
    112 
    113     if (mMixer) {
    114         TRACE_DRIVER_IN(DRV_MIXER_CLOSE)
    115         mixer_close(mMixer);
    116         TRACE_DRIVER_OUT
    117     }
    118     if (mPcm) {
    119         TRACE_DRIVER_IN(DRV_PCM_CLOSE)
    120         pcm_close(mPcm);
    121         TRACE_DRIVER_OUT
    122     }
    123 
    124     if (mSecRilLibHandle) {
    125         if (disconnectRILD(mRilClient) != RIL_CLIENT_ERR_SUCCESS)
    126             ALOGE("Disconnect_RILD() error");
    127 
    128         if (closeClientRILD(mRilClient) != RIL_CLIENT_ERR_SUCCESS)
    129             ALOGE("CloseClient_RILD() error");
    130 
    131         mRilClient = 0;
    132 
    133         dlclose(mSecRilLibHandle);
    134         mSecRilLibHandle = NULL;
    135     }
    136 
    137     mInit = false;
    138 }
    139 
    140 status_t AudioHardware::initCheck()
    141 {
    142     return mInit ? NO_ERROR : NO_INIT;
    143 }
    144 
    145 void AudioHardware::loadRILD(void)
    146 {
    147     mSecRilLibHandle = dlopen("libsecril-client.so", RTLD_NOW);
    148 
    149     if (mSecRilLibHandle) {
    150         ALOGV("libsecril-client.so is loaded");
    151 
    152         openClientRILD   = (HRilClient (*)(void))
    153                               dlsym(mSecRilLibHandle, "OpenClient_RILD");
    154         disconnectRILD   = (int (*)(HRilClient))
    155                               dlsym(mSecRilLibHandle, "Disconnect_RILD");
    156         closeClientRILD  = (int (*)(HRilClient))
    157                               dlsym(mSecRilLibHandle, "CloseClient_RILD");
    158         isConnectedRILD  = (int (*)(HRilClient))
    159                               dlsym(mSecRilLibHandle, "isConnected_RILD");
    160         connectRILD      = (int (*)(HRilClient))
    161                               dlsym(mSecRilLibHandle, "Connect_RILD");
    162         setCallVolume    = (int (*)(HRilClient, SoundType, int))
    163                               dlsym(mSecRilLibHandle, "SetCallVolume");
    164         setCallAudioPath = (int (*)(HRilClient, AudioPath))
    165                               dlsym(mSecRilLibHandle, "SetCallAudioPath");
    166         setCallClockSync = (int (*)(HRilClient, SoundClockCondition))
    167                               dlsym(mSecRilLibHandle, "SetCallClockSync");
    168 
    169         if (!openClientRILD  || !disconnectRILD   || !closeClientRILD ||
    170             !isConnectedRILD || !connectRILD      ||
    171             !setCallVolume   || !setCallAudioPath || !setCallClockSync) {
    172             ALOGE("Can't load all functions from libsecril-client.so");
    173 
    174             dlclose(mSecRilLibHandle);
    175             mSecRilLibHandle = NULL;
    176         } else {
    177             mRilClient = openClientRILD();
    178             if (!mRilClient) {
    179                 ALOGE("OpenClient_RILD() error");
    180 
    181                 dlclose(mSecRilLibHandle);
    182                 mSecRilLibHandle = NULL;
    183             }
    184         }
    185     } else {
    186         ALOGE("Can't load libsecril-client.so");
    187     }
    188 }
    189 
    190 status_t AudioHardware::connectRILDIfRequired(void)
    191 {
    192     if (!mSecRilLibHandle) {
    193         ALOGE("connectIfRequired() lib is not loaded");
    194         return INVALID_OPERATION;
    195     }
    196 
    197     if (isConnectedRILD(mRilClient)) {
    198         return OK;
    199     }
    200 
    201     if (connectRILD(mRilClient) != RIL_CLIENT_ERR_SUCCESS) {
    202         ALOGE("Connect_RILD() error");
    203         return INVALID_OPERATION;
    204     }
    205 
    206     return OK;
    207 }
    208 
    209 AudioStreamOut* AudioHardware::openOutputStream(
    210     uint32_t devices, int *format, uint32_t *channels,
    211     uint32_t *sampleRate, status_t *status)
    212 {
    213     sp <AudioStreamOutALSA> out;
    214     status_t rc;
    215 
    216     { // scope for the lock
    217         Mutex::Autolock lock(mLock);
    218 
    219         // only one output stream allowed
    220         if (mOutput != 0) {
    221             if (status) {
    222                 *status = INVALID_OPERATION;
    223             }
    224             return NULL;
    225         }
    226 
    227         out = new AudioStreamOutALSA();
    228 
    229         rc = out->set(this, devices, format, channels, sampleRate);
    230         if (rc == NO_ERROR) {
    231             mOutput = out;
    232         }
    233     }
    234 
    235     if (rc != NO_ERROR) {
    236         if (out != 0) {
    237             out.clear();
    238         }
    239     }
    240     if (status) {
    241         *status = rc;
    242     }
    243 
    244     return out.get();
    245 }
    246 
    247 void AudioHardware::closeOutputStream(AudioStreamOut* out) {
    248     sp <AudioStreamOutALSA> spOut;
    249     sp<AudioStreamInALSA> spIn;
    250     {
    251         Mutex::Autolock lock(mLock);
    252         if (mOutput == 0 || mOutput.get() != out) {
    253             ALOGW("Attempt to close invalid output stream");
    254             return;
    255         }
    256         spOut = mOutput;
    257         mOutput.clear();
    258         if (mEchoReference != NULL) {
    259             spIn = getActiveInput_l();
    260         }
    261     }
    262     if (spIn != 0) {
    263         // this will safely release the echo reference by calling releaseEchoReference()
    264         // after placing the active input in standby
    265         spIn->standby();
    266     }
    267 
    268     spOut.clear();
    269 }
    270 
    271 AudioStreamIn* AudioHardware::openInputStream(
    272     uint32_t devices, int *format, uint32_t *channels,
    273     uint32_t *sampleRate, status_t *status,
    274     AudioSystem::audio_in_acoustics acoustic_flags)
    275 {
    276     // check for valid input source
    277     if (!AudioSystem::isInputDevice((AudioSystem::audio_devices)devices)) {
    278         if (status) {
    279             *status = BAD_VALUE;
    280         }
    281         return NULL;
    282     }
    283 
    284     status_t rc = NO_ERROR;
    285     sp <AudioStreamInALSA> in;
    286 
    287     { // scope for the lock
    288         Mutex::Autolock lock(mLock);
    289 
    290         in = new AudioStreamInALSA();
    291         rc = in->set(this, devices, format, channels, sampleRate, acoustic_flags);
    292         if (rc == NO_ERROR) {
    293             mInputs.add(in);
    294         }
    295     }
    296 
    297     if (rc != NO_ERROR) {
    298         if (in != 0) {
    299             in.clear();
    300         }
    301     }
    302     if (status) {
    303         *status = rc;
    304     }
    305 
    306     ALOGV("AudioHardware::openInputStream()%p", in.get());
    307     return in.get();
    308 }
    309 
    310 void AudioHardware::closeInputStream(AudioStreamIn* in) {
    311 
    312     sp<AudioStreamInALSA> spIn;
    313     {
    314         Mutex::Autolock lock(mLock);
    315 
    316         ssize_t index = mInputs.indexOf((AudioStreamInALSA *)in);
    317         if (index < 0) {
    318             ALOGW("Attempt to close invalid input stream");
    319             return;
    320         }
    321         spIn = mInputs[index];
    322         mInputs.removeAt(index);
    323     }
    324     ALOGV("AudioHardware::closeInputStream()%p", in);
    325     spIn.clear();
    326 }
    327 
    328 
    329 status_t AudioHardware::setMode(int mode)
    330 {
    331     sp<AudioStreamOutALSA> spOut;
    332     sp<AudioStreamInALSA> spIn;
    333     status_t status;
    334 
    335     // Mutex acquisition order is always out -> in -> hw
    336     AutoMutex lock(mLock);
    337 
    338     spOut = mOutput;
    339     while (spOut != 0) {
    340         if (!spOut->checkStandby()) {
    341             int cnt = spOut->prepareLock();
    342             mLock.unlock();
    343             spOut->lock();
    344             mLock.lock();
    345             // make sure that another thread did not change output state while the
    346             // mutex is released
    347             if ((spOut == mOutput) && (cnt == spOut->standbyCnt())) {
    348                 break;
    349             }
    350             spOut->unlock();
    351             spOut = mOutput;
    352         } else {
    353             spOut.clear();
    354         }
    355     }
    356     // spOut is not 0 here only if the output is active
    357 
    358     spIn = getActiveInput_l();
    359     while (spIn != 0) {
    360         int cnt = spIn->prepareLock();
    361         mLock.unlock();
    362         spIn->lock();
    363         mLock.lock();
    364         // make sure that another thread did not change input state while the
    365         // mutex is released
    366         if ((spIn == getActiveInput_l()) && (cnt == spIn->standbyCnt())) {
    367             break;
    368         }
    369         spIn->unlock();
    370         spIn = getActiveInput_l();
    371     }
    372     // spIn is not 0 here only if the input is active
    373 
    374     int prevMode = mMode;
    375     status = AudioHardwareBase::setMode(mode);
    376     ALOGV("setMode() : new %d, old %d", mMode, prevMode);
    377     if (status == NO_ERROR) {
    378         bool modeNeedsCPActive = mMode == AudioSystem::MODE_IN_CALL ||
    379                                     mMode == AudioSystem::MODE_RINGTONE;
    380         // activate call clock in radio when entering in call or ringtone mode
    381         if (modeNeedsCPActive)
    382         {
    383             if ((!mActivatedCP) && (mSecRilLibHandle) && (connectRILDIfRequired() == OK)) {
    384                 setCallClockSync(mRilClient, SOUND_CLOCK_START);
    385                 mActivatedCP = true;
    386             }
    387         }
    388 
    389         if (mMode == AudioSystem::MODE_IN_CALL && !mInCallAudioMode) {
    390             if (spOut != 0) {
    391                 ALOGV("setMode() in call force output standby");
    392                 spOut->doStandby_l();
    393             }
    394             if (spIn != 0) {
    395                 ALOGV("setMode() in call force input standby");
    396                 spIn->doStandby_l();
    397             }
    398 
    399             ALOGV("setMode() openPcmOut_l()");
    400             openPcmOut_l();
    401             openMixer_l();
    402             setInputSource_l(AUDIO_SOURCE_DEFAULT);
    403             setVoiceVolume_l(mVoiceVol);
    404             mInCallAudioMode = true;
    405         }
    406         if (mMode != AudioSystem::MODE_IN_CALL && mInCallAudioMode) {
    407             setInputSource_l(mInputSource);
    408             if (mMixer != NULL) {
    409                 TRACE_DRIVER_IN(DRV_MIXER_GET)
    410                 struct mixer_ctl *ctl= mixer_get_ctl_by_name(mMixer, "Playback Path");
    411                 TRACE_DRIVER_OUT
    412                 if (ctl != NULL) {
    413                     ALOGV("setMode() reset Playback Path to RCV");
    414                     TRACE_DRIVER_IN(DRV_MIXER_SEL)
    415                     mixer_ctl_set_enum_by_string(ctl, "RCV");
    416                     TRACE_DRIVER_OUT
    417                 }
    418             }
    419             ALOGV("setMode() closePcmOut_l()");
    420             closeMixer_l();
    421             closePcmOut_l();
    422 
    423             if (spOut != 0) {
    424                 ALOGV("setMode() off call force output standby");
    425                 spOut->doStandby_l();
    426             }
    427             if (spIn != 0) {
    428                 ALOGV("setMode() off call force input standby");
    429                 spIn->doStandby_l();
    430             }
    431 
    432             mInCallAudioMode = false;
    433         }
    434 
    435         if (!modeNeedsCPActive) {
    436             if(mActivatedCP)
    437                 mActivatedCP = false;
    438         }
    439     }
    440 
    441     if (spIn != 0) {
    442         spIn->unlock();
    443     }
    444     if (spOut != 0) {
    445         spOut->unlock();
    446     }
    447 
    448     return status;
    449 }
    450 
    451 status_t AudioHardware::setMicMute(bool state)
    452 {
    453     ALOGV("setMicMute(%d) mMicMute %d", state, mMicMute);
    454     sp<AudioStreamInALSA> spIn;
    455     {
    456         AutoMutex lock(mLock);
    457         if (mMicMute != state) {
    458             mMicMute = state;
    459             // in call mute is handled by RIL
    460             if (mMode != AudioSystem::MODE_IN_CALL) {
    461                 spIn = getActiveInput_l();
    462             }
    463         }
    464     }
    465 
    466     if (spIn != 0) {
    467         spIn->standby();
    468     }
    469 
    470     return NO_ERROR;
    471 }
    472 
    473 status_t AudioHardware::getMicMute(bool* state)
    474 {
    475     *state = mMicMute;
    476     return NO_ERROR;
    477 }
    478 
    479 status_t AudioHardware::setParameters(const String8& keyValuePairs)
    480 {
    481     AudioParameter param = AudioParameter(keyValuePairs);
    482     String8 value;
    483     String8 key;
    484     const char BT_NREC_KEY[] = "bt_headset_nrec";
    485     const char BT_NREC_VALUE_ON[] = "on";
    486     const char TTY_MODE_KEY[] = "tty_mode";
    487     const char TTY_MODE_VALUE_OFF[] = "tty_off";
    488     const char TTY_MODE_VALUE_VCO[] = "tty_vco";
    489     const char TTY_MODE_VALUE_HCO[] = "tty_hco";
    490     const char TTY_MODE_VALUE_FULL[] = "tty_full";
    491 
    492     key = String8(BT_NREC_KEY);
    493     if (param.get(key, value) == NO_ERROR) {
    494         if (value == BT_NREC_VALUE_ON) {
    495             mBluetoothNrec = true;
    496         } else {
    497             mBluetoothNrec = false;
    498             ALOGD("Turning noise reduction and echo cancellation off for BT "
    499                  "headset");
    500         }
    501         param.remove(String8(BT_NREC_KEY));
    502     }
    503 
    504     key = String8(TTY_MODE_KEY);
    505     if (param.get(key, value) == NO_ERROR) {
    506         int ttyMode;
    507         if (value == TTY_MODE_VALUE_OFF) {
    508             ttyMode = TTY_MODE_OFF;
    509         } else if (value == TTY_MODE_VALUE_VCO) {
    510             ttyMode = TTY_MODE_VCO;
    511         } else if (value == TTY_MODE_VALUE_HCO) {
    512             ttyMode = TTY_MODE_HCO;
    513         } else if (value == TTY_MODE_VALUE_FULL) {
    514             ttyMode = TTY_MODE_FULL;
    515         } else {
    516             return BAD_VALUE;
    517         }
    518 
    519         if (ttyMode != mTTYMode) {
    520             ALOGV("new tty mode %d", ttyMode);
    521             mTTYMode = ttyMode;
    522             if (mOutput != 0 && mMode == AudioSystem::MODE_IN_CALL) {
    523                 setIncallPath_l(mOutput->device());
    524             }
    525         }
    526         param.remove(String8(TTY_MODE_KEY));
    527      }
    528 
    529     return NO_ERROR;
    530 }
    531 
    532 String8 AudioHardware::getParameters(const String8& keys)
    533 {
    534     AudioParameter request = AudioParameter(keys);
    535     AudioParameter reply = AudioParameter();
    536 
    537     ALOGV("getParameters() %s", keys.string());
    538 
    539     return reply.toString();
    540 }
    541 
    542 size_t AudioHardware::getInputBufferSize(uint32_t sampleRate, int format, int channelCount)
    543 {
    544     if (format != AudioSystem::PCM_16_BIT) {
    545         ALOGW("getInputBufferSize bad format: %d", format);
    546         return 0;
    547     }
    548     if (channelCount < 1 || channelCount > 2) {
    549         ALOGW("getInputBufferSize bad channel count: %d", channelCount);
    550         return 0;
    551     }
    552 
    553     if (sampleRate != getInputSampleRate(sampleRate)) {
    554         ALOGW("getInputBufferSize bad sample rate: %d", sampleRate);
    555         return 0;
    556     }
    557 
    558     return AudioStreamInALSA::getBufferSize(sampleRate, channelCount);
    559 }
    560 
    561 status_t AudioHardware::setVoiceVolume(float volume)
    562 {
    563     AutoMutex lock(mLock);
    564 
    565     setVoiceVolume_l(volume);
    566 
    567     return NO_ERROR;
    568 }
    569 
    570 void AudioHardware::setVoiceVolume_l(float volume)
    571 {
    572     ALOGD("### setVoiceVolume_l");
    573 
    574     mVoiceVol = volume;
    575 
    576     if ( (AudioSystem::MODE_IN_CALL == mMode) && (mSecRilLibHandle) &&
    577          (connectRILDIfRequired() == OK) ) {
    578 
    579         uint32_t device = AudioSystem::DEVICE_OUT_EARPIECE;
    580         if (mOutput != 0) {
    581             device = mOutput->device();
    582         }
    583         int int_volume = (int)(volume * 5);
    584         SoundType type;
    585 
    586         ALOGD("### route(%d) call volume(%f)", device, volume);
    587         switch (device) {
    588             case AudioSystem::DEVICE_OUT_EARPIECE:
    589                 ALOGD("### earpiece call volume");
    590                 type = SOUND_TYPE_VOICE;
    591                 break;
    592 
    593             case AudioSystem::DEVICE_OUT_SPEAKER:
    594                 ALOGD("### speaker call volume");
    595                 type = SOUND_TYPE_SPEAKER;
    596                 break;
    597 
    598             case AudioSystem::DEVICE_OUT_BLUETOOTH_SCO:
    599             case AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_HEADSET:
    600             case AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_CARKIT:
    601                 ALOGD("### bluetooth call volume");
    602                 type = SOUND_TYPE_BTVOICE;
    603                 break;
    604 
    605             case AudioSystem::DEVICE_OUT_WIRED_HEADSET:
    606             case AudioSystem::DEVICE_OUT_WIRED_HEADPHONE: // Use receive path with 3 pole headset.
    607                 ALOGD("### headset call volume");
    608                 type = SOUND_TYPE_HEADSET;
    609                 break;
    610 
    611             default:
    612                 ALOGW("### Call volume setting error!!!0x%08x \n", device);
    613                 type = SOUND_TYPE_VOICE;
    614                 break;
    615         }
    616         setCallVolume(mRilClient, type, int_volume);
    617     }
    618 
    619 }
    620 
    621 status_t AudioHardware::setMasterVolume(float volume)
    622 {
    623     ALOGV("Set master volume to %f.\n", volume);
    624     // We return an error code here to let the audioflinger do in-software
    625     // volume on top of the maximum volume that we set through the SND API.
    626     // return error - software mixer will handle it
    627     return -1;
    628 }
    629 
    630 static const int kDumpLockRetries = 50;
    631 static const int kDumpLockSleep = 20000;
    632 
    633 static bool tryLock(Mutex& mutex)
    634 {
    635     bool locked = false;
    636     for (int i = 0; i < kDumpLockRetries; ++i) {
    637         if (mutex.tryLock() == NO_ERROR) {
    638             locked = true;
    639             break;
    640         }
    641         usleep(kDumpLockSleep);
    642     }
    643     return locked;
    644 }
    645 
    646 status_t AudioHardware::dump(int fd, const Vector<String16>& args)
    647 {
    648     const size_t SIZE = 256;
    649     char buffer[SIZE];
    650     String8 result;
    651 
    652     bool locked = tryLock(mLock);
    653     if (!locked) {
    654         snprintf(buffer, SIZE, "\n\tAudioHardware maybe deadlocked\n");
    655     } else {
    656         mLock.unlock();
    657     }
    658 
    659     snprintf(buffer, SIZE, "\tInit %s\n", (mInit) ? "OK" : "Failed");
    660     result.append(buffer);
    661     snprintf(buffer, SIZE, "\tMic Mute %s\n", (mMicMute) ? "ON" : "OFF");
    662     result.append(buffer);
    663     snprintf(buffer, SIZE, "\tmPcm: %p\n", mPcm);
    664     result.append(buffer);
    665     snprintf(buffer, SIZE, "\tmPcmOpenCnt: %d\n", mPcmOpenCnt);
    666     result.append(buffer);
    667     snprintf(buffer, SIZE, "\tmMixer: %p\n", mMixer);
    668     result.append(buffer);
    669     snprintf(buffer, SIZE, "\tmMixerOpenCnt: %d\n", mMixerOpenCnt);
    670     result.append(buffer);
    671     snprintf(buffer, SIZE, "\tIn Call Audio Mode %s\n",
    672              (mInCallAudioMode) ? "ON" : "OFF");
    673     result.append(buffer);
    674     snprintf(buffer, SIZE, "\tInput source %d\n", mInputSource);
    675     result.append(buffer);
    676     snprintf(buffer, SIZE, "\tmSecRilLibHandle: %p\n", mSecRilLibHandle);
    677     result.append(buffer);
    678     snprintf(buffer, SIZE, "\tmRilClient: %p\n", mRilClient);
    679     result.append(buffer);
    680     snprintf(buffer, SIZE, "\tCP %s\n",
    681              (mActivatedCP) ? "Activated" : "Deactivated");
    682     result.append(buffer);
    683     snprintf(buffer, SIZE, "\tmDriverOp: %d\n", mDriverOp);
    684     result.append(buffer);
    685 
    686     snprintf(buffer, SIZE, "\n\tmOutput %p dump:\n", mOutput.get());
    687     result.append(buffer);
    688     write(fd, result.string(), result.size());
    689     if (mOutput != 0) {
    690         mOutput->dump(fd, args);
    691     }
    692 
    693     snprintf(buffer, SIZE, "\n\t%d inputs opened:\n", mInputs.size());
    694     write(fd, buffer, strlen(buffer));
    695     for (size_t i = 0; i < mInputs.size(); i++) {
    696         snprintf(buffer, SIZE, "\t- input %d dump:\n", i);
    697         write(fd, buffer, strlen(buffer));
    698         mInputs[i]->dump(fd, args);
    699     }
    700 
    701     return NO_ERROR;
    702 }
    703 
    704 status_t AudioHardware::setIncallPath_l(uint32_t device)
    705 {
    706     ALOGV("setIncallPath_l: device %x", device);
    707 
    708     // Setup sound path for CP clocking
    709     if ((mSecRilLibHandle) &&
    710         (connectRILDIfRequired() == OK)) {
    711 
    712         if (mMode == AudioSystem::MODE_IN_CALL) {
    713             ALOGD("### incall mode route (%d)", device);
    714             AudioPath path;
    715             switch(device){
    716                 case AudioSystem::DEVICE_OUT_EARPIECE:
    717                     ALOGD("### incall mode earpiece route");
    718                     path = SOUND_AUDIO_PATH_HANDSET;
    719                     break;
    720 
    721                 case AudioSystem::DEVICE_OUT_SPEAKER:
    722                     ALOGD("### incall mode speaker route");
    723                     path = SOUND_AUDIO_PATH_SPEAKER;
    724                     break;
    725 
    726                 case AudioSystem::DEVICE_OUT_BLUETOOTH_SCO:
    727                 case AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_HEADSET:
    728                 case AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_CARKIT:
    729                     ALOGD("### incall mode bluetooth route %s NR", mBluetoothNrec ? "" : "NO");
    730                     if (mBluetoothNrec) {
    731                         path = SOUND_AUDIO_PATH_BLUETOOTH;
    732                     } else {
    733                         path = SOUND_AUDIO_PATH_BLUETOOTH_NO_NR;
    734                     }
    735                     break;
    736 
    737                 case AudioSystem::DEVICE_OUT_WIRED_HEADPHONE :
    738                     ALOGD("### incall mode headphone route");
    739                     path = SOUND_AUDIO_PATH_HEADPHONE;
    740                     break;
    741                 case AudioSystem::DEVICE_OUT_WIRED_HEADSET :
    742                     ALOGD("### incall mode headset route");
    743                     path = SOUND_AUDIO_PATH_HEADSET;
    744                     break;
    745                 default:
    746                     ALOGW("### incall mode Error!! route = [%d]", device);
    747                     path = SOUND_AUDIO_PATH_HANDSET;
    748                     break;
    749             }
    750 
    751             setCallAudioPath(mRilClient, path);
    752 
    753             if (mMixer != NULL) {
    754                 TRACE_DRIVER_IN(DRV_MIXER_GET)
    755                 struct mixer_ctl *ctl= mixer_get_ctl_by_name(mMixer, "Voice Call Path");
    756                 TRACE_DRIVER_OUT
    757                 ALOGE_IF(ctl == NULL, "setIncallPath_l() could not get mixer ctl");
    758                 if (ctl != NULL) {
    759                     ALOGV("setIncallPath_l() Voice Call Path, (%x)", device);
    760                     TRACE_DRIVER_IN(DRV_MIXER_SEL)
    761                     mixer_ctl_set_enum_by_string(ctl, getVoiceRouteFromDevice(device));
    762                     TRACE_DRIVER_OUT
    763                 }
    764             }
    765         }
    766     }
    767     return NO_ERROR;
    768 }
    769 
    770 struct pcm *AudioHardware::openPcmOut_l()
    771 {
    772     ALOGD("openPcmOut_l() mPcmOpenCnt: %d", mPcmOpenCnt);
    773     if (mPcmOpenCnt++ == 0) {
    774         if (mPcm != NULL) {
    775             ALOGE("openPcmOut_l() mPcmOpenCnt == 0 and mPcm == %p\n", mPcm);
    776             mPcmOpenCnt--;
    777             return NULL;
    778         }
    779         unsigned flags = PCM_OUT;
    780 
    781         struct pcm_config config = {
    782             channels : 2,
    783             rate : AUDIO_HW_OUT_SAMPLERATE,
    784             period_size : AUDIO_HW_OUT_PERIOD_SZ,
    785             period_count : AUDIO_HW_OUT_PERIOD_CNT,
    786             format : PCM_FORMAT_S16_LE,
    787             start_threshold : 0,
    788             stop_threshold : 0,
    789             silence_threshold : 0,
    790             avail_min : 0,
    791         };
    792 
    793         TRACE_DRIVER_IN(DRV_PCM_OPEN)
    794         mPcm = pcm_open(0, 0, flags, &config);
    795         TRACE_DRIVER_OUT
    796         if (!pcm_is_ready(mPcm)) {
    797             ALOGE("openPcmOut_l() cannot open pcm_out driver: %s\n", pcm_get_error(mPcm));
    798             TRACE_DRIVER_IN(DRV_PCM_CLOSE)
    799             pcm_close(mPcm);
    800             TRACE_DRIVER_OUT
    801             mPcmOpenCnt--;
    802             mPcm = NULL;
    803         }
    804     }
    805     return mPcm;
    806 }
    807 
    808 void AudioHardware::closePcmOut_l()
    809 {
    810     ALOGD("closePcmOut_l() mPcmOpenCnt: %d", mPcmOpenCnt);
    811     if (mPcmOpenCnt == 0) {
    812         ALOGE("closePcmOut_l() mPcmOpenCnt == 0");
    813         return;
    814     }
    815 
    816     if (--mPcmOpenCnt == 0) {
    817         TRACE_DRIVER_IN(DRV_PCM_CLOSE)
    818         pcm_close(mPcm);
    819         TRACE_DRIVER_OUT
    820         mPcm = NULL;
    821     }
    822 }
    823 
    824 struct mixer *AudioHardware::openMixer_l()
    825 {
    826     ALOGV("openMixer_l() mMixerOpenCnt: %d", mMixerOpenCnt);
    827     if (mMixerOpenCnt++ == 0) {
    828         if (mMixer != NULL) {
    829             ALOGE("openMixer_l() mMixerOpenCnt == 0 and mMixer == %p\n", mMixer);
    830             mMixerOpenCnt--;
    831             return NULL;
    832         }
    833         TRACE_DRIVER_IN(DRV_MIXER_OPEN)
    834         mMixer = mixer_open(0);
    835         TRACE_DRIVER_OUT
    836         if (mMixer == NULL) {
    837             ALOGE("openMixer_l() cannot open mixer");
    838             mMixerOpenCnt--;
    839             return NULL;
    840         }
    841     }
    842     return mMixer;
    843 }
    844 
    845 void AudioHardware::closeMixer_l()
    846 {
    847     ALOGV("closeMixer_l() mMixerOpenCnt: %d", mMixerOpenCnt);
    848     if (mMixerOpenCnt == 0) {
    849         ALOGE("closeMixer_l() mMixerOpenCnt == 0");
    850         return;
    851     }
    852 
    853     if (--mMixerOpenCnt == 0) {
    854         TRACE_DRIVER_IN(DRV_MIXER_CLOSE)
    855         mixer_close(mMixer);
    856         TRACE_DRIVER_OUT
    857         mMixer = NULL;
    858     }
    859 }
    860 
    861 const char *AudioHardware::getOutputRouteFromDevice(uint32_t device)
    862 {
    863     switch (device) {
    864     case AudioSystem::DEVICE_OUT_EARPIECE:
    865         return "RCV";
    866     case AudioSystem::DEVICE_OUT_SPEAKER:
    867         if (mMode == AudioSystem::MODE_RINGTONE) return "RING_SPK";
    868         else return "SPK";
    869     case AudioSystem::DEVICE_OUT_WIRED_HEADPHONE:
    870         if (mMode == AudioSystem::MODE_RINGTONE) return "RING_NO_MIC";
    871         else return "HP_NO_MIC";
    872     case AudioSystem::DEVICE_OUT_WIRED_HEADSET:
    873         if (mMode == AudioSystem::MODE_RINGTONE) return "RING_HP";
    874         else return "HP";
    875     case (AudioSystem::DEVICE_OUT_SPEAKER|AudioSystem::DEVICE_OUT_WIRED_HEADPHONE):
    876     case (AudioSystem::DEVICE_OUT_SPEAKER|AudioSystem::DEVICE_OUT_WIRED_HEADSET):
    877         if (mMode == AudioSystem::MODE_RINGTONE) return "RING_SPK_HP";
    878         else return "SPK_HP";
    879     case AudioSystem::DEVICE_OUT_BLUETOOTH_SCO:
    880     case AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_HEADSET:
    881     case AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_CARKIT:
    882         return "BT";
    883     default:
    884         return "OFF";
    885     }
    886 }
    887 
    888 const char *AudioHardware::getVoiceRouteFromDevice(uint32_t device)
    889 {
    890     switch (device) {
    891     case AudioSystem::DEVICE_OUT_EARPIECE:
    892         return "RCV";
    893     case AudioSystem::DEVICE_OUT_SPEAKER:
    894         return "SPK";
    895     case AudioSystem::DEVICE_OUT_WIRED_HEADPHONE:
    896     case AudioSystem::DEVICE_OUT_WIRED_HEADSET:
    897         switch (mTTYMode) {
    898         case TTY_MODE_VCO:
    899             return "TTY_VCO";
    900         case TTY_MODE_HCO:
    901             return "TTY_HCO";
    902         case TTY_MODE_FULL:
    903             return "TTY_FULL";
    904         case TTY_MODE_OFF:
    905         default:
    906             if (device == AudioSystem::DEVICE_OUT_WIRED_HEADPHONE) {
    907                 return "HP_NO_MIC";
    908             } else {
    909                 return "HP";
    910             }
    911         }
    912     case AudioSystem::DEVICE_OUT_BLUETOOTH_SCO:
    913     case AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_HEADSET:
    914     case AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_CARKIT:
    915         return "BT";
    916     default:
    917         return "OFF";
    918     }
    919 }
    920 
    921 const char *AudioHardware::getInputRouteFromDevice(uint32_t device)
    922 {
    923     if (mMicMute) {
    924         return "MIC OFF";
    925     }
    926 
    927     switch (device) {
    928     case AudioSystem::DEVICE_IN_BUILTIN_MIC:
    929         return "Main Mic";
    930     case AudioSystem::DEVICE_IN_WIRED_HEADSET:
    931         return "Hands Free Mic";
    932     case AudioSystem::DEVICE_IN_BLUETOOTH_SCO_HEADSET:
    933         return "BT Sco Mic";
    934     default:
    935         return "MIC OFF";
    936     }
    937 }
    938 
    939 uint32_t AudioHardware::getInputSampleRate(uint32_t sampleRate)
    940 {
    941     size_t i;
    942     uint32_t prevDelta;
    943     uint32_t delta;
    944     size_t size = sizeof(inputConfigTable)/sizeof(uint32_t)/INPUT_CONFIG_CNT;
    945 
    946     for (i = 0, prevDelta = 0xFFFFFFFF; i < size; i++, prevDelta = delta) {
    947         delta = abs(sampleRate - inputConfigTable[i][INPUT_CONFIG_SAMPLE_RATE]);
    948         if (delta > prevDelta) break;
    949     }
    950     // i is always > 0 here
    951     return inputConfigTable[i-1][INPUT_CONFIG_SAMPLE_RATE];
    952 }
    953 
    954 // getActiveInput_l() must be called with mLock held
    955 sp <AudioHardware::AudioStreamInALSA> AudioHardware::getActiveInput_l()
    956 {
    957     sp< AudioHardware::AudioStreamInALSA> spIn;
    958 
    959     for (size_t i = 0; i < mInputs.size(); i++) {
    960         // return first input found not being in standby mode
    961         // as only one input can be in this state
    962         if (!mInputs[i]->checkStandby()) {
    963             spIn = mInputs[i];
    964             break;
    965         }
    966     }
    967 
    968     return spIn;
    969 }
    970 
    971 status_t AudioHardware::setInputSource_l(audio_source source)
    972 {
    973      ALOGV("setInputSource_l(%d)", source);
    974      if (source != mInputSource) {
    975          if ((source == AUDIO_SOURCE_DEFAULT) || (mMode != AudioSystem::MODE_IN_CALL)) {
    976              if (mMixer) {
    977                  TRACE_DRIVER_IN(DRV_MIXER_GET)
    978                  struct mixer_ctl *ctl= mixer_get_ctl_by_name(mMixer, "Input Source");
    979                  TRACE_DRIVER_OUT
    980                  if (ctl == NULL) {
    981                      return NO_INIT;
    982                  }
    983                  const char* sourceName;
    984                  switch (source) {
    985                      case AUDIO_SOURCE_DEFAULT: // intended fall-through
    986                      case AUDIO_SOURCE_MIC:     // intended fall-through
    987                      case AUDIO_SOURCE_VOICE_COMMUNICATION:
    988                          sourceName = inputPathNameDefault;
    989                          break;
    990                      case AUDIO_SOURCE_CAMCORDER:
    991                          sourceName = inputPathNameCamcorder;
    992                          break;
    993                      case AUDIO_SOURCE_VOICE_RECOGNITION:
    994                          sourceName = inputPathNameVoiceRecognition;
    995                          break;
    996                      case AUDIO_SOURCE_VOICE_UPLINK:   // intended fall-through
    997                      case AUDIO_SOURCE_VOICE_DOWNLINK: // intended fall-through
    998                      case AUDIO_SOURCE_VOICE_CALL:     // intended fall-through
    999                      default:
   1000                          return NO_INIT;
   1001                  }
   1002                  ALOGV("mixer_ctl_set_enum_by_string, Input Source, (%s)", sourceName);
   1003                  TRACE_DRIVER_IN(DRV_MIXER_SEL)
   1004                  mixer_ctl_set_enum_by_string(ctl, sourceName);
   1005                  TRACE_DRIVER_OUT
   1006              }
   1007          }
   1008          mInputSource = source;
   1009      }
   1010 
   1011      return NO_ERROR;
   1012 }
   1013 
   1014 struct echo_reference_itfe *AudioHardware::getEchoReference(audio_format_t format,
   1015                                                               uint32_t channelCount,
   1016                                                               uint32_t samplingRate)
   1017 {
   1018     ALOGV("AudioHardware::getEchoReference %p", mEchoReference);
   1019     releaseEchoReference(mEchoReference);
   1020     if (mOutput != NULL) {
   1021         uint32_t wrChannelCount = popcount(mOutput->channels());
   1022         uint32_t wrSampleRate = mOutput->sampleRate();
   1023 
   1024         int status = create_echo_reference(AUDIO_FORMAT_PCM_16_BIT,
   1025                               channelCount,
   1026                               samplingRate,
   1027                               AUDIO_FORMAT_PCM_16_BIT,
   1028                               wrChannelCount,
   1029                               wrSampleRate,
   1030                               &mEchoReference);
   1031         if (status == 0) {
   1032             mOutput->addEchoReference(mEchoReference);
   1033         }
   1034     }
   1035     return mEchoReference;
   1036 }
   1037 
   1038 void AudioHardware::releaseEchoReference(struct echo_reference_itfe *reference)
   1039 {
   1040     ALOGV("AudioHardware::releaseEchoReference %p", mEchoReference);
   1041     if (mEchoReference != NULL && reference == mEchoReference) {
   1042         if (mOutput != NULL) {
   1043             mOutput->removeEchoReference(reference);
   1044         }
   1045         release_echo_reference(mEchoReference);
   1046         mEchoReference = NULL;
   1047     }
   1048 }
   1049 
   1050 
   1051 //------------------------------------------------------------------------------
   1052 //  AudioStreamOutALSA
   1053 //------------------------------------------------------------------------------
   1054 
   1055 AudioHardware::AudioStreamOutALSA::AudioStreamOutALSA() :
   1056     mHardware(0), mPcm(0), mMixer(0), mRouteCtl(0),
   1057     mStandby(true), mDevices(0), mChannels(AUDIO_HW_OUT_CHANNELS),
   1058     mSampleRate(AUDIO_HW_OUT_SAMPLERATE), mBufferSize(AUDIO_HW_OUT_PERIOD_BYTES),
   1059     mDriverOp(DRV_NONE), mStandbyCnt(0), mSleepReq(false), mEchoReference(NULL)
   1060 {
   1061 }
   1062 
   1063 status_t AudioHardware::AudioStreamOutALSA::set(
   1064     AudioHardware* hw, uint32_t devices, int *pFormat,
   1065     uint32_t *pChannels, uint32_t *pRate)
   1066 {
   1067     int lFormat = pFormat ? *pFormat : 0;
   1068     uint32_t lChannels = pChannels ? *pChannels : 0;
   1069     uint32_t lRate = pRate ? *pRate : 0;
   1070 
   1071     mHardware = hw;
   1072     mDevices = devices;
   1073 
   1074     // fix up defaults
   1075     if (lFormat == 0) lFormat = format();
   1076     if (lChannels == 0) lChannels = channels();
   1077     if (lRate == 0) lRate = sampleRate();
   1078 
   1079     // check values
   1080     if ((lFormat != format()) ||
   1081         (lChannels != channels()) ||
   1082         (lRate != sampleRate())) {
   1083         if (pFormat) *pFormat = format();
   1084         if (pChannels) *pChannels = channels();
   1085         if (pRate) *pRate = sampleRate();
   1086         return BAD_VALUE;
   1087     }
   1088 
   1089     if (pFormat) *pFormat = lFormat;
   1090     if (pChannels) *pChannels = lChannels;
   1091     if (pRate) *pRate = lRate;
   1092 
   1093     mChannels = lChannels;
   1094     mSampleRate = lRate;
   1095     mBufferSize = AUDIO_HW_OUT_PERIOD_BYTES;
   1096 
   1097     return NO_ERROR;
   1098 }
   1099 
   1100 AudioHardware::AudioStreamOutALSA::~AudioStreamOutALSA()
   1101 {
   1102     standby();
   1103 }
   1104 
   1105 int AudioHardware::AudioStreamOutALSA::getPlaybackDelay(size_t frames,
   1106                                                         struct echo_reference_buffer *buffer)
   1107 {
   1108     size_t kernelFr;
   1109 
   1110     int rc = pcm_get_htimestamp(mPcm, &kernelFr, &buffer->time_stamp);
   1111     if (rc < 0) {
   1112         buffer->time_stamp.tv_sec  = 0;
   1113         buffer->time_stamp.tv_nsec = 0;
   1114         buffer->delay_ns           = 0;
   1115         ALOGV("getPlaybackDelay(): pcm_get_htimestamp error, setting playbackTimestamp to 0");
   1116         return rc;
   1117     }
   1118 
   1119     kernelFr = pcm_get_buffer_size(mPcm) - kernelFr;
   1120 
   1121     // adjust render time stamp with delay added by current driver buffer.
   1122     // Add the duration of current frame as we want the render time of the last
   1123     // sample being written.
   1124     long delayNs = (long)(((int64_t)(kernelFr + frames)* 1000000000) /AUDIO_HW_OUT_SAMPLERATE);
   1125 
   1126     ALOGV("AudioStreamOutALSA::getPlaybackDelay delayNs: [%ld], "\
   1127          "kernelFr:[%d], frames:[%d], buffSize:[%d], time_stamp:[%ld].[%ld]",
   1128          delayNs, (int)kernelFr, (int)frames, pcm_get_buffer_size(mPcm),
   1129          (long)buffer->time_stamp.tv_sec, buffer->time_stamp.tv_nsec);
   1130 
   1131     buffer->delay_ns = delayNs;
   1132 
   1133     return 0;
   1134 }
   1135 
   1136 ssize_t AudioHardware::AudioStreamOutALSA::write(const void* buffer, size_t bytes)
   1137 {
   1138     ALOGV("-----AudioStreamInALSA::write(%p, %d) START", buffer, (int)bytes);
   1139     status_t status = NO_INIT;
   1140     const uint8_t* p = static_cast<const uint8_t*>(buffer);
   1141     int ret;
   1142 
   1143     if (mHardware == NULL) return NO_INIT;
   1144 
   1145     if (mSleepReq) {
   1146         // 10ms are always shorter than the time to reconfigure the audio path
   1147         // which is the only condition when mSleepReq would be true.
   1148         usleep(10000);
   1149     }
   1150 
   1151     { // scope for the lock
   1152 
   1153         AutoMutex lock(mLock);
   1154 
   1155         if (mStandby) {
   1156             AutoMutex hwLock(mHardware->lock());
   1157 
   1158             ALOGD("AudioHardware pcm playback is exiting standby.");
   1159             sp<AudioStreamInALSA> spIn = mHardware->getActiveInput_l();
   1160             while (spIn != 0) {
   1161                 int cnt = spIn->prepareLock();
   1162                 mHardware->lock().unlock();
   1163                 // Mutex acquisition order is always out -> in -> hw
   1164                 spIn->lock();
   1165                 mHardware->lock().lock();
   1166                 // make sure that another thread did not change input state
   1167                 // while the mutex is released
   1168                 if ((spIn == mHardware->getActiveInput_l()) &&
   1169                         (cnt == spIn->standbyCnt())) {
   1170                     ALOGV("AudioStreamOutALSA::write() force input standby");
   1171                     spIn->close_l();
   1172                     break;
   1173                 }
   1174                 spIn->unlock();
   1175                 spIn = mHardware->getActiveInput_l();
   1176             }
   1177             // spIn is not 0 here only if the input was active and has been
   1178             // closed above
   1179 
   1180             // open output before input
   1181             open_l();
   1182 
   1183             if (spIn != 0) {
   1184                 if (spIn->open_l() != NO_ERROR) {
   1185                     spIn->doStandby_l();
   1186                 }
   1187                 spIn->unlock();
   1188             }
   1189             if (mPcm == NULL) {
   1190                 goto Error;
   1191             }
   1192             mStandby = false;
   1193         }
   1194 
   1195         if (mEchoReference != NULL) {
   1196             struct echo_reference_buffer b;
   1197             b.raw = (void *)buffer;
   1198             b.frame_count = bytes / frameSize();
   1199 
   1200             getPlaybackDelay(bytes / frameSize(), &b);
   1201             mEchoReference->write(mEchoReference, &b);
   1202         }
   1203 
   1204         TRACE_DRIVER_IN(DRV_PCM_WRITE)
   1205         ret = pcm_write(mPcm,(void*) p, bytes);
   1206         TRACE_DRIVER_OUT
   1207 
   1208         if (ret == 0) {
   1209             ALOGV("-----AudioStreamInALSA::write(%p, %d) END", buffer, (int)bytes);
   1210             return bytes;
   1211         }
   1212         ALOGW("write error: %d", errno);
   1213         status = -errno;
   1214     }
   1215 Error:
   1216     standby();
   1217 
   1218     // Simulate audio output timing in case of error
   1219     usleep((((bytes * 1000) / frameSize()) * 1000) / sampleRate());
   1220     ALOGE("AudioStreamOutALSA::write END WITH ERROR !!!!!!!!!(%p, %u)", buffer, bytes);
   1221     return status;
   1222 }
   1223 
   1224 status_t AudioHardware::AudioStreamOutALSA::standby()
   1225 {
   1226     if (mHardware == NULL) return NO_INIT;
   1227 
   1228     mSleepReq = true;
   1229     {
   1230         AutoMutex lock(mLock);
   1231         mSleepReq = false;
   1232 
   1233         { // scope for the AudioHardware lock
   1234             AutoMutex hwLock(mHardware->lock());
   1235 
   1236             doStandby_l();
   1237         }
   1238     }
   1239 
   1240     return NO_ERROR;
   1241 }
   1242 
   1243 void AudioHardware::AudioStreamOutALSA::doStandby_l()
   1244 {
   1245     mStandbyCnt++;
   1246 
   1247     if (!mStandby) {
   1248         ALOGD("AudioHardware pcm playback is going to standby.");
   1249         // stop echo reference capture
   1250         if (mEchoReference != NULL) {
   1251             mEchoReference->write(mEchoReference, NULL);
   1252         }
   1253         mStandby = true;
   1254     }
   1255 
   1256     close_l();
   1257 }
   1258 
   1259 void AudioHardware::AudioStreamOutALSA::close_l()
   1260 {
   1261     if (mMixer) {
   1262         mHardware->closeMixer_l();
   1263         mMixer = NULL;
   1264         mRouteCtl = NULL;
   1265     }
   1266     if (mPcm) {
   1267         mHardware->closePcmOut_l();
   1268         mPcm = NULL;
   1269     }
   1270 }
   1271 
   1272 status_t AudioHardware::AudioStreamOutALSA::open_l()
   1273 {
   1274     ALOGV("open pcm_out driver");
   1275     mPcm = mHardware->openPcmOut_l();
   1276     if (mPcm == NULL) {
   1277         return NO_INIT;
   1278     }
   1279 
   1280     mMixer = mHardware->openMixer_l();
   1281     if (mMixer) {
   1282         ALOGV("open playback normal");
   1283         TRACE_DRIVER_IN(DRV_MIXER_GET)
   1284         mRouteCtl = mixer_get_ctl_by_name(mMixer, "Playback Path");
   1285         TRACE_DRIVER_OUT
   1286     }
   1287     if (mHardware->mode() != AudioSystem::MODE_IN_CALL) {
   1288         const char *route = mHardware->getOutputRouteFromDevice(mDevices);
   1289         ALOGV("write() wakeup setting route %s", route);
   1290         if (mRouteCtl) {
   1291             TRACE_DRIVER_IN(DRV_MIXER_SEL)
   1292             mixer_ctl_set_enum_by_string(mRouteCtl, route);
   1293             TRACE_DRIVER_OUT
   1294         }
   1295     }
   1296     return NO_ERROR;
   1297 }
   1298 
   1299 status_t AudioHardware::AudioStreamOutALSA::dump(int fd, const Vector<String16>& args)
   1300 {
   1301     const size_t SIZE = 256;
   1302     char buffer[SIZE];
   1303     String8 result;
   1304 
   1305     bool locked = tryLock(mLock);
   1306     if (!locked) {
   1307         snprintf(buffer, SIZE, "\n\t\tAudioStreamOutALSA maybe deadlocked\n");
   1308     } else {
   1309         mLock.unlock();
   1310     }
   1311 
   1312     snprintf(buffer, SIZE, "\t\tmHardware: %p\n", mHardware);
   1313     result.append(buffer);
   1314     snprintf(buffer, SIZE, "\t\tmPcm: %p\n", mPcm);
   1315     result.append(buffer);
   1316     snprintf(buffer, SIZE, "\t\tmMixer: %p\n", mMixer);
   1317     result.append(buffer);
   1318     snprintf(buffer, SIZE, "\t\tmRouteCtl: %p\n", mRouteCtl);
   1319     result.append(buffer);
   1320     snprintf(buffer, SIZE, "\t\tStandby %s\n", (mStandby) ? "ON" : "OFF");
   1321     result.append(buffer);
   1322     snprintf(buffer, SIZE, "\t\tmDevices: 0x%08x\n", mDevices);
   1323     result.append(buffer);
   1324     snprintf(buffer, SIZE, "\t\tmChannels: 0x%08x\n", mChannels);
   1325     result.append(buffer);
   1326     snprintf(buffer, SIZE, "\t\tmSampleRate: %d\n", mSampleRate);
   1327     result.append(buffer);
   1328     snprintf(buffer, SIZE, "\t\tmBufferSize: %d\n", mBufferSize);
   1329     result.append(buffer);
   1330     snprintf(buffer, SIZE, "\t\tmDriverOp: %d\n", mDriverOp);
   1331     result.append(buffer);
   1332 
   1333     ::write(fd, result.string(), result.size());
   1334 
   1335     return NO_ERROR;
   1336 }
   1337 
   1338 bool AudioHardware::AudioStreamOutALSA::checkStandby()
   1339 {
   1340     return mStandby;
   1341 }
   1342 
   1343 status_t AudioHardware::AudioStreamOutALSA::setParameters(const String8& keyValuePairs)
   1344 {
   1345     AudioParameter param = AudioParameter(keyValuePairs);
   1346     status_t status = NO_ERROR;
   1347     int device;
   1348     ALOGD("AudioStreamOutALSA::setParameters() %s", keyValuePairs.string());
   1349 
   1350     if (mHardware == NULL) return NO_INIT;
   1351 
   1352     mSleepReq = true;
   1353     {
   1354         AutoMutex lock(mLock);
   1355         mSleepReq = false;
   1356         if (param.getInt(String8(AudioParameter::keyRouting), device) == NO_ERROR)
   1357         {
   1358             if (device != 0) {
   1359                 AutoMutex hwLock(mHardware->lock());
   1360 
   1361                 if (mDevices != (uint32_t)device) {
   1362                     mDevices = (uint32_t)device;
   1363                     if (mHardware->mode() != AudioSystem::MODE_IN_CALL) {
   1364                         doStandby_l();
   1365                     }
   1366                 }
   1367                 if (mHardware->mode() == AudioSystem::MODE_IN_CALL) {
   1368                     mHardware->setIncallPath_l(device);
   1369                 }
   1370             }
   1371             param.remove(String8(AudioParameter::keyRouting));
   1372         }
   1373     }
   1374 
   1375     if (param.size()) {
   1376         status = BAD_VALUE;
   1377     }
   1378 
   1379 
   1380     return status;
   1381 
   1382 }
   1383 
   1384 String8 AudioHardware::AudioStreamOutALSA::getParameters(const String8& keys)
   1385 {
   1386     AudioParameter param = AudioParameter(keys);
   1387     String8 value;
   1388     String8 key = String8(AudioParameter::keyRouting);
   1389 
   1390     if (param.get(key, value) == NO_ERROR) {
   1391         param.addInt(key, (int)mDevices);
   1392     }
   1393 
   1394     ALOGV("AudioStreamOutALSA::getParameters() %s", param.toString().string());
   1395     return param.toString();
   1396 }
   1397 
   1398 status_t AudioHardware::AudioStreamOutALSA::getRenderPosition(uint32_t *dspFrames)
   1399 {
   1400     //TODO
   1401     return INVALID_OPERATION;
   1402 }
   1403 
   1404 int AudioHardware::AudioStreamOutALSA::prepareLock()
   1405 {
   1406     // request sleep next time write() is called so that caller can acquire
   1407     // mLock
   1408     mSleepReq = true;
   1409     return mStandbyCnt;
   1410 }
   1411 
   1412 void AudioHardware::AudioStreamOutALSA::lock()
   1413 {
   1414     mLock.lock();
   1415     mSleepReq = false;
   1416 }
   1417 
   1418 void AudioHardware::AudioStreamOutALSA::unlock() {
   1419     mLock.unlock();
   1420 }
   1421 
   1422 void AudioHardware::AudioStreamOutALSA::addEchoReference(struct echo_reference_itfe *reference)
   1423 {
   1424     ALOGV("AudioStreamOutALSA::addEchoReference %p", mEchoReference);
   1425     if (mEchoReference == NULL) {
   1426         mEchoReference = reference;
   1427     }
   1428 }
   1429 
   1430 void AudioHardware::AudioStreamOutALSA::removeEchoReference(struct echo_reference_itfe *reference)
   1431 {
   1432     ALOGV("AudioStreamOutALSA::removeEchoReference %p", mEchoReference);
   1433     if (mEchoReference == reference) {
   1434         mEchoReference->write(mEchoReference, NULL);
   1435         mEchoReference = NULL;
   1436     }
   1437 }
   1438 
   1439 
   1440 //------------------------------------------------------------------------------
   1441 //  AudioStreamInALSA
   1442 //------------------------------------------------------------------------------
   1443 
   1444 AudioHardware::AudioStreamInALSA::AudioStreamInALSA() :
   1445     mHardware(0), mPcm(0), mMixer(0), mRouteCtl(0),
   1446     mStandby(true), mDevices(0), mChannels(AUDIO_HW_IN_CHANNELS), mChannelCount(1),
   1447     mSampleRate(AUDIO_HW_IN_SAMPLERATE), mBufferSize(AUDIO_HW_IN_PERIOD_BYTES),
   1448     mDownSampler(NULL), mReadStatus(NO_ERROR), mInputBuf(NULL),
   1449     mDriverOp(DRV_NONE), mStandbyCnt(0), mSleepReq(false),
   1450     mProcBuf(NULL), mProcBufSize(0), mRefBuf(NULL), mRefBufSize(0),
   1451     mEchoReference(NULL), mNeedEchoReference(false)
   1452 {
   1453 }
   1454 
   1455 status_t AudioHardware::AudioStreamInALSA::set(
   1456     AudioHardware* hw, uint32_t devices, int *pFormat,
   1457     uint32_t *pChannels, uint32_t *pRate, AudioSystem::audio_in_acoustics acoustics)
   1458 {
   1459     if (pFormat == 0 || *pFormat != AUDIO_HW_IN_FORMAT) {
   1460         *pFormat = AUDIO_HW_IN_FORMAT;
   1461         return BAD_VALUE;
   1462     }
   1463     if (pRate == 0) {
   1464         return BAD_VALUE;
   1465     }
   1466     uint32_t rate = AudioHardware::getInputSampleRate(*pRate);
   1467     if (rate != *pRate) {
   1468         *pRate = rate;
   1469         return BAD_VALUE;
   1470     }
   1471 
   1472     if (pChannels == 0 || (*pChannels != AudioSystem::CHANNEL_IN_MONO &&
   1473         *pChannels != AudioSystem::CHANNEL_IN_STEREO)) {
   1474         *pChannels = AUDIO_HW_IN_CHANNELS;
   1475         return BAD_VALUE;
   1476     }
   1477 
   1478     mHardware = hw;
   1479 
   1480     ALOGV("AudioStreamInALSA::set(%d, %d, %u)", *pFormat, *pChannels, *pRate);
   1481 
   1482     mBufferSize = getBufferSize(*pRate, AudioSystem::popCount(*pChannels));
   1483     mDevices = devices;
   1484     mChannels = *pChannels;
   1485     mChannelCount = AudioSystem::popCount(mChannels);
   1486     mSampleRate = rate;
   1487     if (mSampleRate != AUDIO_HW_OUT_SAMPLERATE) {
   1488         mBufferProvider.mProvider.get_next_buffer = getNextBufferStatic;
   1489         mBufferProvider.mProvider.release_buffer = releaseBufferStatic;
   1490         mBufferProvider.mInputStream = this;
   1491         int status = create_resampler(AUDIO_HW_OUT_SAMPLERATE,
   1492                                                     mSampleRate,
   1493                                                     mChannelCount,
   1494                                                     RESAMPLER_QUALITY_VOIP,
   1495                                                     &mBufferProvider.mProvider,
   1496                                                     &mDownSampler);
   1497         if (status != 0) {
   1498             ALOGW("AudioStreamInALSA::set() downsampler init failed: %d", status);
   1499             mDownSampler = NULL;
   1500             return status;
   1501         }
   1502     }
   1503     mInputBuf = new int16_t[AUDIO_HW_IN_PERIOD_SZ * mChannelCount];
   1504 
   1505     return NO_ERROR;
   1506 }
   1507 
   1508 AudioHardware::AudioStreamInALSA::~AudioStreamInALSA()
   1509 {
   1510     standby();
   1511 
   1512     if (mDownSampler != NULL) {
   1513         release_resampler(mDownSampler);
   1514     }
   1515     delete[] mInputBuf;
   1516     delete[] mProcBuf;
   1517 }
   1518 
   1519 // readFrames() reads frames from kernel driver, down samples to capture rate if necessary
   1520 // and output the number of frames requested to the buffer specified
   1521 ssize_t AudioHardware::AudioStreamInALSA::readFrames(void* buffer, ssize_t frames)
   1522 {
   1523     ssize_t framesWr = 0;
   1524     while (framesWr < frames) {
   1525         size_t framesRd = frames - framesWr;
   1526         if (mDownSampler != NULL) {
   1527             mDownSampler->resample_from_provider(mDownSampler,
   1528                     (int16_t *)((char *)buffer + framesWr * frameSize()),
   1529                     &framesRd);
   1530         } else {
   1531             struct resampler_buffer buf = {
   1532                     { raw : NULL, },
   1533                     frame_count : framesRd,
   1534             };
   1535             getNextBuffer(&buf);
   1536             if (buf.raw != NULL) {
   1537                 memcpy((char *)buffer + framesWr * frameSize(),
   1538                         buf.raw,
   1539                         buf.frame_count * frameSize());
   1540                 framesRd = buf.frame_count;
   1541             }
   1542             releaseBuffer(&buf);
   1543         }
   1544         // mReadStatus is updated by getNextBuffer() also called by
   1545         // mDownSampler->resample_from_provider()
   1546         if (mReadStatus != 0) {
   1547             return mReadStatus;
   1548         }
   1549         framesWr += framesRd;
   1550     }
   1551     return framesWr;
   1552 }
   1553 
   1554 // processFrames() reads frames from kernel driver (via readFrames()), calls the active
   1555 // audio pre processings and output the number of frames requested to the buffer specified
   1556 ssize_t AudioHardware::AudioStreamInALSA::processFrames(void* buffer, ssize_t frames)
   1557 {
   1558     ssize_t framesWr = 0;
   1559     while (framesWr < frames) {
   1560         // first reload enough frames at the end of process input buffer
   1561         if (mProcFramesIn < (size_t)frames) {
   1562             // expand process input buffer if necessary
   1563             if (mProcBufSize < (size_t)frames) {
   1564                 mProcBufSize = (size_t)frames;
   1565                 mProcBuf = (int16_t *)realloc(mProcBuf,
   1566                                               mProcBufSize * mChannelCount * sizeof(int16_t));
   1567                 ALOGV("processFrames(): mProcBuf %p size extended to %d frames",
   1568                      mProcBuf, mProcBufSize);
   1569             }
   1570             ssize_t framesRd = readFrames(mProcBuf + mProcFramesIn * mChannelCount,
   1571                                           frames - mProcFramesIn);
   1572             if (framesRd < 0) {
   1573                 framesWr = framesRd;
   1574                 break;
   1575             }
   1576             mProcFramesIn += framesRd;
   1577         }
   1578 
   1579         if (mEchoReference != NULL) {
   1580             pushEchoReference(mProcFramesIn);
   1581         }
   1582 
   1583         //inBuf.frameCount and outBuf.frameCount indicate respectively the maximum number of frames
   1584         //to be consumed and produced by process()
   1585         audio_buffer_t inBuf = {
   1586                 mProcFramesIn,
   1587                 {mProcBuf}
   1588         };
   1589         audio_buffer_t outBuf = {
   1590                 frames - framesWr,
   1591                 {(int16_t *)buffer + framesWr * mChannelCount}
   1592         };
   1593 
   1594         for (size_t i = 0; i < mPreprocessors.size(); i++) {
   1595             (*mPreprocessors[i])->process(mPreprocessors[i],
   1596                                                    &inBuf,
   1597                                                    &outBuf);
   1598         }
   1599 
   1600         // process() has updated the number of frames consumed and produced in
   1601         // inBuf.frameCount and outBuf.frameCount respectively
   1602         // move remaining frames to the beginning of mProcBuf
   1603         mProcFramesIn -= inBuf.frameCount;
   1604         if (mProcFramesIn) {
   1605             memcpy(mProcBuf,
   1606                    mProcBuf + inBuf.frameCount * mChannelCount,
   1607                    mProcFramesIn * mChannelCount * sizeof(int16_t));
   1608         }
   1609 
   1610         // if not enough frames were passed to process(), read more and retry.
   1611         if (outBuf.frameCount == 0) {
   1612             continue;
   1613         }
   1614         framesWr += outBuf.frameCount;
   1615     }
   1616     return framesWr;
   1617 }
   1618 
   1619 int32_t AudioHardware::AudioStreamInALSA::updateEchoReference(size_t frames)
   1620 {
   1621     struct echo_reference_buffer b;
   1622     b.delay_ns = 0;
   1623 
   1624     ALOGV("updateEchoReference1 START, frames = [%d], mRefFramesIn = [%d],  b.frame_count = [%d]",
   1625          frames, mRefFramesIn, frames - mRefFramesIn);
   1626     if (mRefFramesIn < frames) {
   1627         if (mRefBufSize < frames) {
   1628             mRefBufSize = frames;
   1629             mRefBuf = (int16_t *)realloc(mRefBuf,
   1630                                          mRefBufSize * mChannelCount * sizeof(int16_t));
   1631         }
   1632 
   1633         b.frame_count = frames - mRefFramesIn;
   1634         b.raw = (void *)(mRefBuf + mRefFramesIn * mChannelCount);
   1635 
   1636         getCaptureDelay(frames, &b);
   1637 
   1638         if (mEchoReference->read(mEchoReference, &b) == NO_ERROR)
   1639         {
   1640             mRefFramesIn += b.frame_count;
   1641             ALOGV("updateEchoReference2: mRefFramesIn:[%d], mRefBufSize:[%d], "\
   1642                  "frames:[%d], b.frame_count:[%d]", mRefFramesIn, mRefBufSize,frames,b.frame_count);
   1643         }
   1644 
   1645     }else{
   1646         ALOGV("updateEchoReference3: NOT enough frames to read ref buffer");
   1647     }
   1648     return b.delay_ns;
   1649 }
   1650 
   1651 void AudioHardware::AudioStreamInALSA::pushEchoReference(size_t frames)
   1652 {
   1653     // read frames from echo reference buffer and update echo delay
   1654     // mRefFramesIn is updated with frames available in mRefBuf
   1655     int32_t delayUs = (int32_t)(updateEchoReference(frames)/1000);
   1656 
   1657     if (mRefFramesIn < frames) {
   1658         frames = mRefFramesIn;
   1659     }
   1660 
   1661     audio_buffer_t refBuf = {
   1662             frames,
   1663             {mRefBuf}
   1664     };
   1665 
   1666     for (size_t i = 0; i < mPreprocessors.size(); i++) {
   1667         if ((*mPreprocessors[i])->process_reverse == NULL) {
   1668             continue;
   1669         }
   1670         (*mPreprocessors[i])->process_reverse(mPreprocessors[i],
   1671                                                &refBuf,
   1672                                                NULL);
   1673         setPreProcessorEchoDelay(mPreprocessors[i], delayUs);
   1674     }
   1675 
   1676     mRefFramesIn -= refBuf.frameCount;
   1677     if (mRefFramesIn) {
   1678     ALOGV("pushEchoReference5: shifting mRefBuf down by = %d frames", mRefFramesIn);
   1679         memcpy(mRefBuf,
   1680                mRefBuf + refBuf.frameCount * mChannelCount,
   1681                mRefFramesIn * mChannelCount * sizeof(int16_t));
   1682     }
   1683 }
   1684 
   1685 status_t AudioHardware::AudioStreamInALSA::setPreProcessorEchoDelay(effect_handle_t handle,
   1686                                                                     int32_t delayUs)
   1687 {
   1688     uint32_t buf[sizeof(effect_param_t) / sizeof(uint32_t) + 2];
   1689     effect_param_t *param = (effect_param_t *)buf;
   1690 
   1691     param->psize = sizeof(uint32_t);
   1692     param->vsize = sizeof(uint32_t);
   1693     *(uint32_t *)param->data = AEC_PARAM_ECHO_DELAY;
   1694     *((int32_t *)param->data + 1) = delayUs;
   1695 
   1696     ALOGV("setPreProcessorEchoDelay: %d us", delayUs);
   1697 
   1698     return setPreprocessorParam(handle, param);
   1699 }
   1700 
   1701 status_t AudioHardware::AudioStreamInALSA::setPreprocessorParam(effect_handle_t handle,
   1702                                                                 effect_param_t *param)
   1703 {
   1704     uint32_t size = sizeof(int);
   1705     uint32_t psize = ((param->psize - 1) / sizeof(int) + 1) * sizeof(int) + param->vsize;
   1706 
   1707     status_t status = (*handle)->command(handle,
   1708                                            EFFECT_CMD_SET_PARAM,
   1709                                            sizeof (effect_param_t) + psize,
   1710                                            param,
   1711                                            &size,
   1712                                            &param->status);
   1713     if (status == NO_ERROR) {
   1714         status = param->status;
   1715     }
   1716     return status;
   1717 }
   1718 
   1719 void AudioHardware::AudioStreamInALSA::getCaptureDelay(size_t frames,
   1720                                                        struct echo_reference_buffer *buffer)
   1721 {
   1722 
   1723     // read frames available in kernel driver buffer
   1724     size_t kernelFr;
   1725     struct timespec tstamp;
   1726 
   1727     if (pcm_get_htimestamp(mPcm, &kernelFr, &tstamp) < 0) {
   1728         buffer->time_stamp.tv_sec  = 0;
   1729         buffer->time_stamp.tv_nsec = 0;
   1730         buffer->delay_ns           = 0;
   1731         ALOGW("read getCaptureDelay(): pcm_htimestamp error");
   1732         return;
   1733     }
   1734 
   1735     // read frames available in audio HAL input buffer
   1736     // add number of frames being read as we want the capture time of first sample in current
   1737     // buffer
   1738     long bufDelay = (long)(((int64_t)(mInputFramesIn + mProcFramesIn) * 1000000000)
   1739                                     / AUDIO_HW_IN_SAMPLERATE);
   1740     // add delay introduced by resampler
   1741     long rsmpDelay = 0;
   1742     if (mDownSampler) {
   1743         rsmpDelay = mDownSampler->delay_ns(mDownSampler);
   1744     }
   1745 
   1746     long kernelDelay = (long)(((int64_t)kernelFr * 1000000000) / AUDIO_HW_IN_SAMPLERATE);
   1747 
   1748     // correct capture time stamp
   1749     long delayNs = kernelDelay + bufDelay + rsmpDelay;
   1750 
   1751     buffer->time_stamp = tstamp;
   1752     buffer->delay_ns   = delayNs;
   1753     ALOGV("AudioStreamInALSA::getCaptureDelay TimeStamp = [%ld].[%ld], delayCaptureNs: [%d],"\
   1754          " kernelDelay:[%ld], bufDelay:[%ld], rsmpDelay:[%ld], kernelFr:[%d], "\
   1755          "mInputFramesIn:[%d], mProcFramesIn:[%d], frames:[%d]",
   1756          buffer->time_stamp.tv_sec , buffer->time_stamp.tv_nsec, buffer->delay_ns,
   1757          kernelDelay, bufDelay, rsmpDelay, kernelFr, mInputFramesIn, mProcFramesIn, frames);
   1758 
   1759 }
   1760 
   1761 ssize_t AudioHardware::AudioStreamInALSA::read(void* buffer, ssize_t bytes)
   1762 {
   1763     ALOGV("-----AudioStreamInALSA::read(%p, %d) START", buffer, (int)bytes);
   1764     status_t status = NO_INIT;
   1765 
   1766     if (mHardware == NULL) return NO_INIT;
   1767 
   1768     if (mSleepReq) {
   1769         // 10ms are always shorter than the time to reconfigure the audio path
   1770         // which is the only condition when mSleepReq would be true.
   1771         usleep(10000);
   1772     }
   1773 
   1774     { // scope for the lock
   1775         AutoMutex lock(mLock);
   1776 
   1777         if (mStandby) {
   1778             AutoMutex hwLock(mHardware->lock());
   1779 
   1780             ALOGD("AudioHardware pcm capture is exiting standby.");
   1781             sp<AudioStreamOutALSA> spOut = mHardware->output();
   1782             while (spOut != 0) {
   1783                 spOut->prepareLock();
   1784                 mHardware->lock().unlock();
   1785                 mLock.unlock();
   1786                 // Mutex acquisition order is always out -> in -> hw
   1787                 spOut->lock();
   1788                 mLock.lock();
   1789                 mHardware->lock().lock();
   1790                 // make sure that another thread did not change output state
   1791                 // while the mutex is released
   1792                 if (spOut == mHardware->output()) {
   1793                     break;
   1794                 }
   1795                 spOut->unlock();
   1796                 spOut = mHardware->output();
   1797             }
   1798             // open output before input
   1799             if (spOut != 0) {
   1800                 if (!spOut->checkStandby()) {
   1801                     ALOGV("AudioStreamInALSA::read() force output standby");
   1802                     spOut->close_l();
   1803                     if (spOut->open_l() != NO_ERROR) {
   1804                         spOut->doStandby_l();
   1805                     }
   1806                 }
   1807                 ALOGV("AudioStreamInALSA exit standby mNeedEchoReference %d mEchoReference %p",
   1808                      mNeedEchoReference, mEchoReference);
   1809                 if (mNeedEchoReference && mEchoReference == NULL) {
   1810                     mEchoReference = mHardware->getEchoReference(AUDIO_FORMAT_PCM_16_BIT,
   1811                                                                  mChannelCount,
   1812                                                                  mSampleRate);
   1813                 }
   1814                 spOut->unlock();
   1815             }
   1816 
   1817             open_l();
   1818 
   1819             if (mPcm == NULL) {
   1820                 goto Error;
   1821             }
   1822             mStandby = false;
   1823         }
   1824 
   1825         size_t framesRq = bytes / mChannelCount/sizeof(int16_t);
   1826         ssize_t framesRd;
   1827 
   1828         if (mPreprocessors.size() == 0) {
   1829             framesRd = readFrames(buffer, framesRq);
   1830         } else {
   1831             framesRd = processFrames(buffer, framesRq);
   1832         }
   1833 
   1834         if (framesRd >= 0) {
   1835             ALOGV("-----AudioStreamInALSA::read(%p, %d) END", buffer, (int)bytes);
   1836             return framesRd * mChannelCount * sizeof(int16_t);
   1837         }
   1838 
   1839         ALOGW("read error: %d", (int)framesRd);
   1840         status = framesRd;
   1841     }
   1842 
   1843 Error:
   1844 
   1845     standby();
   1846 
   1847     // Simulate audio output timing in case of error
   1848     usleep((((bytes * 1000) / frameSize()) * 1000) / sampleRate());
   1849     ALOGE("-----AudioStreamInALSA::read(%p, %d) END ERROR", buffer, (int)bytes);
   1850     return status;
   1851 }
   1852 
   1853 status_t AudioHardware::AudioStreamInALSA::standby()
   1854 {
   1855     if (mHardware == NULL) return NO_INIT;
   1856 
   1857     mSleepReq = true;
   1858     {
   1859         AutoMutex lock(mLock);
   1860         mSleepReq = false;
   1861 
   1862         { // scope for AudioHardware lock
   1863             AutoMutex hwLock(mHardware->lock());
   1864 
   1865             doStandby_l();
   1866         }
   1867     }
   1868     return NO_ERROR;
   1869 }
   1870 
   1871 void AudioHardware::AudioStreamInALSA::doStandby_l()
   1872 {
   1873     mStandbyCnt++;
   1874 
   1875     if (!mStandby) {
   1876         ALOGD("AudioHardware pcm capture is going to standby.");
   1877         if (mEchoReference != NULL) {
   1878             // stop reading from echo reference
   1879             mEchoReference->read(mEchoReference, NULL);
   1880             // Mutex acquisition order is always out -> in -> hw
   1881             sp<AudioStreamOutALSA> spOut = mHardware->output();
   1882             if (spOut != 0) {
   1883                 spOut->prepareLock();
   1884                 mHardware->lock().unlock();
   1885                 mLock.unlock();
   1886                 spOut->lock();
   1887                 mLock.lock();
   1888                 mHardware->lock().lock();
   1889                 mHardware->releaseEchoReference(mEchoReference);
   1890                 spOut->unlock();
   1891             }
   1892             mEchoReference = NULL;
   1893         }
   1894 
   1895         mStandby = true;
   1896     }
   1897     close_l();
   1898 }
   1899 
   1900 void AudioHardware::AudioStreamInALSA::close_l()
   1901 {
   1902     if (mMixer) {
   1903         mHardware->closeMixer_l();
   1904         mMixer = NULL;
   1905         mRouteCtl = NULL;
   1906     }
   1907 
   1908     if (mPcm) {
   1909         TRACE_DRIVER_IN(DRV_PCM_CLOSE)
   1910         pcm_close(mPcm);
   1911         TRACE_DRIVER_OUT
   1912         mPcm = NULL;
   1913     }
   1914 
   1915     delete[] mProcBuf;
   1916     mProcBuf = NULL;
   1917     mProcBufSize = 0;
   1918     delete[] mRefBuf;
   1919     mRefBuf = NULL;
   1920     mRefBufSize = 0;
   1921 }
   1922 
   1923 status_t AudioHardware::AudioStreamInALSA::open_l()
   1924 {
   1925     unsigned flags = PCM_IN;
   1926 
   1927     struct pcm_config config = {
   1928         channels : mChannelCount,
   1929         rate : AUDIO_HW_IN_SAMPLERATE,
   1930         period_size : AUDIO_HW_IN_PERIOD_SZ,
   1931         period_count : AUDIO_HW_IN_PERIOD_CNT,
   1932         format : PCM_FORMAT_S16_LE,
   1933         start_threshold : 0,
   1934         stop_threshold : 0,
   1935         silence_threshold : 0,
   1936         avail_min : 0,
   1937     };
   1938 
   1939     ALOGV("open pcm_in driver");
   1940     TRACE_DRIVER_IN(DRV_PCM_OPEN)
   1941     mPcm = pcm_open(0, 0, flags, &config);
   1942     TRACE_DRIVER_OUT
   1943     if (!pcm_is_ready(mPcm)) {
   1944         ALOGE("cannot open pcm_in driver: %s\n", pcm_get_error(mPcm));
   1945         TRACE_DRIVER_IN(DRV_PCM_CLOSE)
   1946         pcm_close(mPcm);
   1947         TRACE_DRIVER_OUT
   1948         mPcm = NULL;
   1949         return NO_INIT;
   1950     }
   1951 
   1952     if (mDownSampler != NULL) {
   1953         mDownSampler->reset(mDownSampler);
   1954     }
   1955     mInputFramesIn = 0;
   1956 
   1957     mProcBufSize = 0;
   1958     mProcFramesIn = 0;
   1959     mRefBufSize = 0;
   1960     mRefFramesIn = 0;
   1961 
   1962     mMixer = mHardware->openMixer_l();
   1963     if (mMixer) {
   1964         TRACE_DRIVER_IN(DRV_MIXER_GET)
   1965         mRouteCtl = mixer_get_ctl_by_name(mMixer, "Capture MIC Path");
   1966         TRACE_DRIVER_OUT
   1967     }
   1968 
   1969     if (mHardware->mode() != AudioSystem::MODE_IN_CALL) {
   1970         const char *route = mHardware->getInputRouteFromDevice(mDevices);
   1971         ALOGV("read() wakeup setting route %s", route);
   1972         if (mRouteCtl) {
   1973             TRACE_DRIVER_IN(DRV_MIXER_SEL)
   1974             mixer_ctl_set_enum_by_string(mRouteCtl, route);
   1975             TRACE_DRIVER_OUT
   1976         }
   1977     }
   1978 
   1979     return NO_ERROR;
   1980 }
   1981 
   1982 status_t AudioHardware::AudioStreamInALSA::dump(int fd, const Vector<String16>& args)
   1983 {
   1984     const size_t SIZE = 256;
   1985     char buffer[SIZE];
   1986     String8 result;
   1987 
   1988     bool locked = tryLock(mLock);
   1989     if (!locked) {
   1990         snprintf(buffer, SIZE, "\n\t\tAudioStreamInALSA maybe deadlocked\n");
   1991     } else {
   1992         mLock.unlock();
   1993     }
   1994 
   1995     snprintf(buffer, SIZE, "\t\tmHardware: %p\n", mHardware);
   1996     result.append(buffer);
   1997     snprintf(buffer, SIZE, "\t\tmPcm: %p\n", mPcm);
   1998     result.append(buffer);
   1999     snprintf(buffer, SIZE, "\t\tmMixer: %p\n", mMixer);
   2000     result.append(buffer);
   2001     snprintf(buffer, SIZE, "\t\tStandby %s\n", (mStandby) ? "ON" : "OFF");
   2002     result.append(buffer);
   2003     snprintf(buffer, SIZE, "\t\tmDevices: 0x%08x\n", mDevices);
   2004     result.append(buffer);
   2005     snprintf(buffer, SIZE, "\t\tmChannels: 0x%08x\n", mChannels);
   2006     result.append(buffer);
   2007     snprintf(buffer, SIZE, "\t\tmSampleRate: %d\n", mSampleRate);
   2008     result.append(buffer);
   2009     snprintf(buffer, SIZE, "\t\tmBufferSize: %d\n", mBufferSize);
   2010     result.append(buffer);
   2011     snprintf(buffer, SIZE, "\t\tmDriverOp: %d\n", mDriverOp);
   2012     result.append(buffer);
   2013     write(fd, result.string(), result.size());
   2014 
   2015     return NO_ERROR;
   2016 }
   2017 
   2018 bool AudioHardware::AudioStreamInALSA::checkStandby()
   2019 {
   2020     return mStandby;
   2021 }
   2022 
   2023 status_t AudioHardware::AudioStreamInALSA::setParameters(const String8& keyValuePairs)
   2024 {
   2025     AudioParameter param = AudioParameter(keyValuePairs);
   2026     status_t status = NO_ERROR;
   2027     int value;
   2028 
   2029     ALOGD("AudioStreamInALSA::setParameters() %s", keyValuePairs.string());
   2030 
   2031     if (mHardware == NULL) return NO_INIT;
   2032 
   2033     mSleepReq = true;
   2034     {
   2035         AutoMutex lock(mLock);
   2036         mSleepReq = false;
   2037 
   2038         if (param.getInt(String8(AudioParameter::keyInputSource), value) == NO_ERROR) {
   2039             AutoMutex hwLock(mHardware->lock());
   2040 
   2041             mHardware->openMixer_l();
   2042             mHardware->setInputSource_l((audio_source)value);
   2043             mHardware->closeMixer_l();
   2044 
   2045             param.remove(String8(AudioParameter::keyInputSource));
   2046         }
   2047 
   2048         if (param.getInt(String8(AudioParameter::keyRouting), value) == NO_ERROR)
   2049         {
   2050             if (value != 0) {
   2051                 AutoMutex hwLock(mHardware->lock());
   2052 
   2053                 if (mDevices != (uint32_t)value) {
   2054                     mDevices = (uint32_t)value;
   2055                     if (mHardware->mode() != AudioSystem::MODE_IN_CALL) {
   2056                         doStandby_l();
   2057                     }
   2058                 }
   2059             }
   2060             param.remove(String8(AudioParameter::keyRouting));
   2061         }
   2062     }
   2063 
   2064 
   2065     if (param.size()) {
   2066         status = BAD_VALUE;
   2067     }
   2068 
   2069     return status;
   2070 
   2071 }
   2072 
   2073 String8 AudioHardware::AudioStreamInALSA::getParameters(const String8& keys)
   2074 {
   2075     AudioParameter param = AudioParameter(keys);
   2076     String8 value;
   2077     String8 key = String8(AudioParameter::keyRouting);
   2078 
   2079     if (param.get(key, value) == NO_ERROR) {
   2080         param.addInt(key, (int)mDevices);
   2081     }
   2082 
   2083     ALOGV("AudioStreamInALSA::getParameters() %s", param.toString().string());
   2084     return param.toString();
   2085 }
   2086 
   2087 status_t AudioHardware::AudioStreamInALSA::addAudioEffect(effect_handle_t effect)
   2088 {
   2089     ALOGV("AudioStreamInALSA::addAudioEffect() %p", effect);
   2090 
   2091     effect_descriptor_t desc;
   2092     status_t status = (*effect)->get_descriptor(effect, &desc);
   2093     if (status == 0) {
   2094         if (memcmp(&desc.type, FX_IID_AEC, sizeof(effect_uuid_t)) == 0) {
   2095             ALOGV("AudioStreamInALSA::addAudioEffect() mNeedEchoReference true");
   2096             mNeedEchoReference = true;
   2097             standby();
   2098         }
   2099         ALOGV("AudioStreamInALSA::addAudioEffect() name %s", desc.name);
   2100     } else {
   2101         ALOGV("AudioStreamInALSA::addAudioEffect() get_descriptor() error");
   2102     }
   2103 
   2104     AutoMutex lock(mLock);
   2105     mPreprocessors.add(effect);
   2106     return NO_ERROR;
   2107 }
   2108 
   2109 status_t AudioHardware::AudioStreamInALSA::removeAudioEffect(effect_handle_t effect)
   2110 {
   2111     status_t status = INVALID_OPERATION;
   2112     ALOGV("AudioStreamInALSA::removeAudioEffect() %p", effect);
   2113     {
   2114         AutoMutex lock(mLock);
   2115         for (size_t i = 0; i < mPreprocessors.size(); i++) {
   2116             if (mPreprocessors[i] == effect) {
   2117                 mPreprocessors.removeAt(i);
   2118                 status = NO_ERROR;
   2119                 break;
   2120             }
   2121         }
   2122     }
   2123 
   2124     if (status == NO_ERROR) {
   2125         effect_descriptor_t desc;
   2126         if ((*effect)->get_descriptor(effect, &desc) == 0) {
   2127             if (memcmp(&desc.type, FX_IID_AEC, sizeof(effect_uuid_t)) == 0) {
   2128                 ALOGV("AudioStreamInALSA::removeAudioEffect() mNeedEchoReference false");
   2129                 mNeedEchoReference = false;
   2130                 standby();
   2131             }
   2132         }
   2133     }
   2134 
   2135     return status;
   2136 }
   2137 
   2138 extern "C" {
   2139 int AudioHardware::AudioStreamInALSA::getNextBufferStatic(
   2140                                                     struct resampler_buffer_provider *provider,
   2141                                                     struct resampler_buffer* buffer)
   2142 {
   2143     ResamplerBufferProvider *bufferProvider = (ResamplerBufferProvider *)provider;
   2144     return bufferProvider->mInputStream->getNextBuffer(buffer);
   2145 }
   2146 
   2147 void AudioHardware::AudioStreamInALSA::releaseBufferStatic(
   2148                                                     struct resampler_buffer_provider *provider,
   2149                                                     struct resampler_buffer* buffer)
   2150 {
   2151     ResamplerBufferProvider *bufferProvider = (ResamplerBufferProvider *)provider;
   2152     return bufferProvider->mInputStream->releaseBuffer(buffer);
   2153 }
   2154 
   2155 }; // extern "C"
   2156 
   2157 status_t AudioHardware::AudioStreamInALSA::getNextBuffer(struct resampler_buffer *buffer)
   2158 {
   2159     if (mPcm == NULL) {
   2160         buffer->raw = NULL;
   2161         buffer->frame_count = 0;
   2162         mReadStatus = NO_INIT;
   2163         return NO_INIT;
   2164     }
   2165 
   2166     if (mInputFramesIn == 0) {
   2167         TRACE_DRIVER_IN(DRV_PCM_READ)
   2168         mReadStatus = pcm_read(mPcm,(void*) mInputBuf, AUDIO_HW_IN_PERIOD_SZ * frameSize());
   2169         TRACE_DRIVER_OUT
   2170         if (mReadStatus != 0) {
   2171             buffer->raw = NULL;
   2172             buffer->frame_count = 0;
   2173             return mReadStatus;
   2174         }
   2175         mInputFramesIn = AUDIO_HW_IN_PERIOD_SZ;
   2176     }
   2177 
   2178     buffer->frame_count = (buffer->frame_count > mInputFramesIn) ? mInputFramesIn:buffer->frame_count;
   2179     buffer->i16 = mInputBuf + (AUDIO_HW_IN_PERIOD_SZ - mInputFramesIn) * mChannelCount;
   2180 
   2181     return mReadStatus;
   2182 }
   2183 
   2184 void AudioHardware::AudioStreamInALSA::releaseBuffer(struct resampler_buffer *buffer)
   2185 {
   2186     mInputFramesIn -= buffer->frame_count;
   2187 }
   2188 
   2189 size_t AudioHardware::AudioStreamInALSA::getBufferSize(uint32_t sampleRate, int channelCount)
   2190 {
   2191     size_t i;
   2192     size_t size = sizeof(inputConfigTable)/sizeof(uint32_t)/INPUT_CONFIG_CNT;
   2193 
   2194     for (i = 0; i < size; i++) {
   2195         if (sampleRate == inputConfigTable[i][INPUT_CONFIG_SAMPLE_RATE]) {
   2196             return (AUDIO_HW_IN_PERIOD_SZ*channelCount*sizeof(int16_t)) /
   2197                     inputConfigTable[i][INPUT_CONFIG_BUFFER_RATIO];
   2198         }
   2199     }
   2200     // this should never happen as getBufferSize() is always called after getInputSampleRate()
   2201     // that checks for valid sampling rates.
   2202     ALOGE("AudioStreamInALSA::getBufferSize() invalid sampling rate %d", sampleRate);
   2203     return 0;
   2204 }
   2205 
   2206 int AudioHardware::AudioStreamInALSA::prepareLock()
   2207 {
   2208     // request sleep next time read() is called so that caller can acquire
   2209     // mLock
   2210     mSleepReq = true;
   2211     return mStandbyCnt;
   2212 }
   2213 
   2214 void AudioHardware::AudioStreamInALSA::lock()
   2215 {
   2216     mLock.lock();
   2217     mSleepReq = false;
   2218 }
   2219 
   2220 void AudioHardware::AudioStreamInALSA::unlock() {
   2221     mLock.unlock();
   2222 }
   2223 
   2224 //------------------------------------------------------------------------------
   2225 //  Factory
   2226 //------------------------------------------------------------------------------
   2227 
   2228 extern "C" AudioHardwareInterface* createAudioHardware(void) {
   2229     return new AudioHardware();
   2230 }
   2231 
   2232 }; // namespace android
   2233