Home | History | Annotate | Download | only in audioflinger
      1 /* //device/include/server/AudioFlinger/AudioFlinger.cpp
      2 **
      3 ** Copyright 2007, The Android Open Source Project
      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 */
     17 
     18 
     19 #define LOG_TAG "AudioFlinger"
     20 //#define LOG_NDEBUG 0
     21 
     22 #include <math.h>
     23 #include <signal.h>
     24 #include <sys/time.h>
     25 #include <sys/resource.h>
     26 
     27 #include <binder/IServiceManager.h>
     28 #include <utils/Log.h>
     29 #include <binder/Parcel.h>
     30 #include <binder/IPCThreadState.h>
     31 #include <utils/String16.h>
     32 #include <utils/threads.h>
     33 
     34 #include <cutils/properties.h>
     35 
     36 #include <media/AudioTrack.h>
     37 #include <media/AudioRecord.h>
     38 
     39 #include <private/media/AudioTrackShared.h>
     40 #include <private/media/AudioEffectShared.h>
     41 #include <hardware_legacy/AudioHardwareInterface.h>
     42 
     43 #include "AudioMixer.h"
     44 #include "AudioFlinger.h"
     45 
     46 #ifdef WITH_A2DP
     47 #include "A2dpAudioInterface.h"
     48 #endif
     49 
     50 #ifdef LVMX
     51 #include "lifevibes.h"
     52 #endif
     53 
     54 #include <media/EffectsFactoryApi.h>
     55 #include <media/EffectVisualizerApi.h>
     56 
     57 // ----------------------------------------------------------------------------
     58 // the sim build doesn't have gettid
     59 
     60 #ifndef HAVE_GETTID
     61 # define gettid getpid
     62 #endif
     63 
     64 // ----------------------------------------------------------------------------
     65 
     66 extern const char * const gEffectLibPath;
     67 
     68 namespace android {
     69 
     70 static const char* kDeadlockedString = "AudioFlinger may be deadlocked\n";
     71 static const char* kHardwareLockedString = "Hardware lock is taken\n";
     72 
     73 //static const nsecs_t kStandbyTimeInNsecs = seconds(3);
     74 static const float MAX_GAIN = 4096.0f;
     75 static const float MAX_GAIN_INT = 0x1000;
     76 
     77 // retry counts for buffer fill timeout
     78 // 50 * ~20msecs = 1 second
     79 static const int8_t kMaxTrackRetries = 50;
     80 static const int8_t kMaxTrackStartupRetries = 50;
     81 // allow less retry attempts on direct output thread.
     82 // direct outputs can be a scarce resource in audio hardware and should
     83 // be released as quickly as possible.
     84 static const int8_t kMaxTrackRetriesDirect = 2;
     85 
     86 static const int kDumpLockRetries = 50;
     87 static const int kDumpLockSleep = 20000;
     88 
     89 static const nsecs_t kWarningThrottle = seconds(5);
     90 
     91 
     92 #define AUDIOFLINGER_SECURITY_ENABLED 1
     93 
     94 // ----------------------------------------------------------------------------
     95 
     96 static bool recordingAllowed() {
     97 #ifndef HAVE_ANDROID_OS
     98     return true;
     99 #endif
    100 #if AUDIOFLINGER_SECURITY_ENABLED
    101     if (getpid() == IPCThreadState::self()->getCallingPid()) return true;
    102     bool ok = checkCallingPermission(String16("android.permission.RECORD_AUDIO"));
    103     if (!ok) LOGE("Request requires android.permission.RECORD_AUDIO");
    104     return ok;
    105 #else
    106     if (!checkCallingPermission(String16("android.permission.RECORD_AUDIO")))
    107         LOGW("WARNING: Need to add android.permission.RECORD_AUDIO to manifest");
    108     return true;
    109 #endif
    110 }
    111 
    112 static bool settingsAllowed() {
    113 #ifndef HAVE_ANDROID_OS
    114     return true;
    115 #endif
    116 #if AUDIOFLINGER_SECURITY_ENABLED
    117     if (getpid() == IPCThreadState::self()->getCallingPid()) return true;
    118     bool ok = checkCallingPermission(String16("android.permission.MODIFY_AUDIO_SETTINGS"));
    119     if (!ok) LOGE("Request requires android.permission.MODIFY_AUDIO_SETTINGS");
    120     return ok;
    121 #else
    122     if (!checkCallingPermission(String16("android.permission.MODIFY_AUDIO_SETTINGS")))
    123         LOGW("WARNING: Need to add android.permission.MODIFY_AUDIO_SETTINGS to manifest");
    124     return true;
    125 #endif
    126 }
    127 
    128 // ----------------------------------------------------------------------------
    129 
    130 AudioFlinger::AudioFlinger()
    131     : BnAudioFlinger(),
    132         mAudioHardware(0), mMasterVolume(1.0f), mMasterMute(false), mNextUniqueId(1)
    133 {
    134     mHardwareStatus = AUDIO_HW_IDLE;
    135 
    136     mAudioHardware = AudioHardwareInterface::create();
    137 
    138     mHardwareStatus = AUDIO_HW_INIT;
    139     if (mAudioHardware->initCheck() == NO_ERROR) {
    140         // open 16-bit output stream for s/w mixer
    141         mMode = AudioSystem::MODE_NORMAL;
    142         setMode(mMode);
    143 
    144         setMasterVolume(1.0f);
    145         setMasterMute(false);
    146     } else {
    147         LOGE("Couldn't even initialize the stubbed audio hardware!");
    148     }
    149 #ifdef LVMX
    150     LifeVibes::init();
    151     mLifeVibesClientPid = -1;
    152 #endif
    153 }
    154 
    155 AudioFlinger::~AudioFlinger()
    156 {
    157     while (!mRecordThreads.isEmpty()) {
    158         // closeInput() will remove first entry from mRecordThreads
    159         closeInput(mRecordThreads.keyAt(0));
    160     }
    161     while (!mPlaybackThreads.isEmpty()) {
    162         // closeOutput() will remove first entry from mPlaybackThreads
    163         closeOutput(mPlaybackThreads.keyAt(0));
    164     }
    165     if (mAudioHardware) {
    166         delete mAudioHardware;
    167     }
    168 }
    169 
    170 
    171 
    172 status_t AudioFlinger::dumpClients(int fd, const Vector<String16>& args)
    173 {
    174     const size_t SIZE = 256;
    175     char buffer[SIZE];
    176     String8 result;
    177 
    178     result.append("Clients:\n");
    179     for (size_t i = 0; i < mClients.size(); ++i) {
    180         wp<Client> wClient = mClients.valueAt(i);
    181         if (wClient != 0) {
    182             sp<Client> client = wClient.promote();
    183             if (client != 0) {
    184                 snprintf(buffer, SIZE, "  pid: %d\n", client->pid());
    185                 result.append(buffer);
    186             }
    187         }
    188     }
    189     write(fd, result.string(), result.size());
    190     return NO_ERROR;
    191 }
    192 
    193 
    194 status_t AudioFlinger::dumpInternals(int fd, const Vector<String16>& args)
    195 {
    196     const size_t SIZE = 256;
    197     char buffer[SIZE];
    198     String8 result;
    199     int hardwareStatus = mHardwareStatus;
    200 
    201     snprintf(buffer, SIZE, "Hardware status: %d\n", hardwareStatus);
    202     result.append(buffer);
    203     write(fd, result.string(), result.size());
    204     return NO_ERROR;
    205 }
    206 
    207 status_t AudioFlinger::dumpPermissionDenial(int fd, const Vector<String16>& args)
    208 {
    209     const size_t SIZE = 256;
    210     char buffer[SIZE];
    211     String8 result;
    212     snprintf(buffer, SIZE, "Permission Denial: "
    213             "can't dump AudioFlinger from pid=%d, uid=%d\n",
    214             IPCThreadState::self()->getCallingPid(),
    215             IPCThreadState::self()->getCallingUid());
    216     result.append(buffer);
    217     write(fd, result.string(), result.size());
    218     return NO_ERROR;
    219 }
    220 
    221 static bool tryLock(Mutex& mutex)
    222 {
    223     bool locked = false;
    224     for (int i = 0; i < kDumpLockRetries; ++i) {
    225         if (mutex.tryLock() == NO_ERROR) {
    226             locked = true;
    227             break;
    228         }
    229         usleep(kDumpLockSleep);
    230     }
    231     return locked;
    232 }
    233 
    234 status_t AudioFlinger::dump(int fd, const Vector<String16>& args)
    235 {
    236     if (checkCallingPermission(String16("android.permission.DUMP")) == false) {
    237         dumpPermissionDenial(fd, args);
    238     } else {
    239         // get state of hardware lock
    240         bool hardwareLocked = tryLock(mHardwareLock);
    241         if (!hardwareLocked) {
    242             String8 result(kHardwareLockedString);
    243             write(fd, result.string(), result.size());
    244         } else {
    245             mHardwareLock.unlock();
    246         }
    247 
    248         bool locked = tryLock(mLock);
    249 
    250         // failed to lock - AudioFlinger is probably deadlocked
    251         if (!locked) {
    252             String8 result(kDeadlockedString);
    253             write(fd, result.string(), result.size());
    254         }
    255 
    256         dumpClients(fd, args);
    257         dumpInternals(fd, args);
    258 
    259         // dump playback threads
    260         for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
    261             mPlaybackThreads.valueAt(i)->dump(fd, args);
    262         }
    263 
    264         // dump record threads
    265         for (size_t i = 0; i < mRecordThreads.size(); i++) {
    266             mRecordThreads.valueAt(i)->dump(fd, args);
    267         }
    268 
    269         if (mAudioHardware) {
    270             mAudioHardware->dumpState(fd, args);
    271         }
    272         if (locked) mLock.unlock();
    273     }
    274     return NO_ERROR;
    275 }
    276 
    277 
    278 // IAudioFlinger interface
    279 
    280 
    281 sp<IAudioTrack> AudioFlinger::createTrack(
    282         pid_t pid,
    283         int streamType,
    284         uint32_t sampleRate,
    285         int format,
    286         int channelCount,
    287         int frameCount,
    288         uint32_t flags,
    289         const sp<IMemory>& sharedBuffer,
    290         int output,
    291         int *sessionId,
    292         status_t *status)
    293 {
    294     sp<PlaybackThread::Track> track;
    295     sp<TrackHandle> trackHandle;
    296     sp<Client> client;
    297     wp<Client> wclient;
    298     status_t lStatus;
    299     int lSessionId;
    300 
    301     if (streamType >= AudioSystem::NUM_STREAM_TYPES) {
    302         LOGE("invalid stream type");
    303         lStatus = BAD_VALUE;
    304         goto Exit;
    305     }
    306 
    307     {
    308         Mutex::Autolock _l(mLock);
    309         PlaybackThread *thread = checkPlaybackThread_l(output);
    310         PlaybackThread *effectThread = NULL;
    311         if (thread == NULL) {
    312             LOGE("unknown output thread");
    313             lStatus = BAD_VALUE;
    314             goto Exit;
    315         }
    316 
    317         wclient = mClients.valueFor(pid);
    318 
    319         if (wclient != NULL) {
    320             client = wclient.promote();
    321         } else {
    322             client = new Client(this, pid);
    323             mClients.add(pid, client);
    324         }
    325 
    326         LOGV("createTrack() sessionId: %d", (sessionId == NULL) ? -2 : *sessionId);
    327         if (sessionId != NULL && *sessionId != AudioSystem::SESSION_OUTPUT_MIX) {
    328             for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
    329                 sp<PlaybackThread> t = mPlaybackThreads.valueAt(i);
    330                 if (mPlaybackThreads.keyAt(i) != output) {
    331                     // prevent same audio session on different output threads
    332                     uint32_t sessions = t->hasAudioSession(*sessionId);
    333                     if (sessions & PlaybackThread::TRACK_SESSION) {
    334                         lStatus = BAD_VALUE;
    335                         goto Exit;
    336                     }
    337                     // check if an effect with same session ID is waiting for a track to be created
    338                     if (sessions & PlaybackThread::EFFECT_SESSION) {
    339                         effectThread = t.get();
    340                     }
    341                 }
    342             }
    343             lSessionId = *sessionId;
    344         } else {
    345             // if no audio session id is provided, create one here
    346             lSessionId = nextUniqueId();
    347             if (sessionId != NULL) {
    348                 *sessionId = lSessionId;
    349             }
    350         }
    351         LOGV("createTrack() lSessionId: %d", lSessionId);
    352 
    353         track = thread->createTrack_l(client, streamType, sampleRate, format,
    354                 channelCount, frameCount, sharedBuffer, lSessionId, &lStatus);
    355 
    356         // move effect chain to this output thread if an effect on same session was waiting
    357         // for a track to be created
    358         if (lStatus == NO_ERROR && effectThread != NULL) {
    359             Mutex::Autolock _dl(thread->mLock);
    360             Mutex::Autolock _sl(effectThread->mLock);
    361             moveEffectChain_l(lSessionId, effectThread, thread, true);
    362         }
    363     }
    364     if (lStatus == NO_ERROR) {
    365         trackHandle = new TrackHandle(track);
    366     } else {
    367         // remove local strong reference to Client before deleting the Track so that the Client
    368         // destructor is called by the TrackBase destructor with mLock held
    369         client.clear();
    370         track.clear();
    371     }
    372 
    373 Exit:
    374     if(status) {
    375         *status = lStatus;
    376     }
    377     return trackHandle;
    378 }
    379 
    380 uint32_t AudioFlinger::sampleRate(int output) const
    381 {
    382     Mutex::Autolock _l(mLock);
    383     PlaybackThread *thread = checkPlaybackThread_l(output);
    384     if (thread == NULL) {
    385         LOGW("sampleRate() unknown thread %d", output);
    386         return 0;
    387     }
    388     return thread->sampleRate();
    389 }
    390 
    391 int AudioFlinger::channelCount(int output) const
    392 {
    393     Mutex::Autolock _l(mLock);
    394     PlaybackThread *thread = checkPlaybackThread_l(output);
    395     if (thread == NULL) {
    396         LOGW("channelCount() unknown thread %d", output);
    397         return 0;
    398     }
    399     return thread->channelCount();
    400 }
    401 
    402 int AudioFlinger::format(int output) const
    403 {
    404     Mutex::Autolock _l(mLock);
    405     PlaybackThread *thread = checkPlaybackThread_l(output);
    406     if (thread == NULL) {
    407         LOGW("format() unknown thread %d", output);
    408         return 0;
    409     }
    410     return thread->format();
    411 }
    412 
    413 size_t AudioFlinger::frameCount(int output) const
    414 {
    415     Mutex::Autolock _l(mLock);
    416     PlaybackThread *thread = checkPlaybackThread_l(output);
    417     if (thread == NULL) {
    418         LOGW("frameCount() unknown thread %d", output);
    419         return 0;
    420     }
    421     return thread->frameCount();
    422 }
    423 
    424 uint32_t AudioFlinger::latency(int output) const
    425 {
    426     Mutex::Autolock _l(mLock);
    427     PlaybackThread *thread = checkPlaybackThread_l(output);
    428     if (thread == NULL) {
    429         LOGW("latency() unknown thread %d", output);
    430         return 0;
    431     }
    432     return thread->latency();
    433 }
    434 
    435 status_t AudioFlinger::setMasterVolume(float value)
    436 {
    437     // check calling permissions
    438     if (!settingsAllowed()) {
    439         return PERMISSION_DENIED;
    440     }
    441 
    442     // when hw supports master volume, don't scale in sw mixer
    443     AutoMutex lock(mHardwareLock);
    444     mHardwareStatus = AUDIO_HW_SET_MASTER_VOLUME;
    445     if (mAudioHardware->setMasterVolume(value) == NO_ERROR) {
    446         value = 1.0f;
    447     }
    448     mHardwareStatus = AUDIO_HW_IDLE;
    449 
    450     mMasterVolume = value;
    451     for (uint32_t i = 0; i < mPlaybackThreads.size(); i++)
    452        mPlaybackThreads.valueAt(i)->setMasterVolume(value);
    453 
    454     return NO_ERROR;
    455 }
    456 
    457 status_t AudioFlinger::setMode(int mode)
    458 {
    459     status_t ret;
    460 
    461     // check calling permissions
    462     if (!settingsAllowed()) {
    463         return PERMISSION_DENIED;
    464     }
    465     if ((mode < 0) || (mode >= AudioSystem::NUM_MODES)) {
    466         LOGW("Illegal value: setMode(%d)", mode);
    467         return BAD_VALUE;
    468     }
    469 
    470     { // scope for the lock
    471         AutoMutex lock(mHardwareLock);
    472         mHardwareStatus = AUDIO_HW_SET_MODE;
    473         ret = mAudioHardware->setMode(mode);
    474         mHardwareStatus = AUDIO_HW_IDLE;
    475     }
    476 
    477     if (NO_ERROR == ret) {
    478         Mutex::Autolock _l(mLock);
    479         mMode = mode;
    480         for (uint32_t i = 0; i < mPlaybackThreads.size(); i++)
    481            mPlaybackThreads.valueAt(i)->setMode(mode);
    482 #ifdef LVMX
    483         LifeVibes::setMode(mode);
    484 #endif
    485     }
    486 
    487     return ret;
    488 }
    489 
    490 status_t AudioFlinger::setMicMute(bool state)
    491 {
    492     // check calling permissions
    493     if (!settingsAllowed()) {
    494         return PERMISSION_DENIED;
    495     }
    496 
    497     AutoMutex lock(mHardwareLock);
    498     mHardwareStatus = AUDIO_HW_SET_MIC_MUTE;
    499     status_t ret = mAudioHardware->setMicMute(state);
    500     mHardwareStatus = AUDIO_HW_IDLE;
    501     return ret;
    502 }
    503 
    504 bool AudioFlinger::getMicMute() const
    505 {
    506     bool state = AudioSystem::MODE_INVALID;
    507     mHardwareStatus = AUDIO_HW_GET_MIC_MUTE;
    508     mAudioHardware->getMicMute(&state);
    509     mHardwareStatus = AUDIO_HW_IDLE;
    510     return state;
    511 }
    512 
    513 status_t AudioFlinger::setMasterMute(bool muted)
    514 {
    515     // check calling permissions
    516     if (!settingsAllowed()) {
    517         return PERMISSION_DENIED;
    518     }
    519 
    520     mMasterMute = muted;
    521     for (uint32_t i = 0; i < mPlaybackThreads.size(); i++)
    522        mPlaybackThreads.valueAt(i)->setMasterMute(muted);
    523 
    524     return NO_ERROR;
    525 }
    526 
    527 float AudioFlinger::masterVolume() const
    528 {
    529     return mMasterVolume;
    530 }
    531 
    532 bool AudioFlinger::masterMute() const
    533 {
    534     return mMasterMute;
    535 }
    536 
    537 status_t AudioFlinger::setStreamVolume(int stream, float value, int output)
    538 {
    539     // check calling permissions
    540     if (!settingsAllowed()) {
    541         return PERMISSION_DENIED;
    542     }
    543 
    544     if (stream < 0 || uint32_t(stream) >= AudioSystem::NUM_STREAM_TYPES) {
    545         return BAD_VALUE;
    546     }
    547 
    548     AutoMutex lock(mLock);
    549     PlaybackThread *thread = NULL;
    550     if (output) {
    551         thread = checkPlaybackThread_l(output);
    552         if (thread == NULL) {
    553             return BAD_VALUE;
    554         }
    555     }
    556 
    557     mStreamTypes[stream].volume = value;
    558 
    559     if (thread == NULL) {
    560         for (uint32_t i = 0; i < mPlaybackThreads.size(); i++) {
    561            mPlaybackThreads.valueAt(i)->setStreamVolume(stream, value);
    562         }
    563     } else {
    564         thread->setStreamVolume(stream, value);
    565     }
    566 
    567     return NO_ERROR;
    568 }
    569 
    570 status_t AudioFlinger::setStreamMute(int stream, bool muted)
    571 {
    572     // check calling permissions
    573     if (!settingsAllowed()) {
    574         return PERMISSION_DENIED;
    575     }
    576 
    577     if (stream < 0 || uint32_t(stream) >= AudioSystem::NUM_STREAM_TYPES ||
    578         uint32_t(stream) == AudioSystem::ENFORCED_AUDIBLE) {
    579         return BAD_VALUE;
    580     }
    581 
    582     mStreamTypes[stream].mute = muted;
    583     for (uint32_t i = 0; i < mPlaybackThreads.size(); i++)
    584        mPlaybackThreads.valueAt(i)->setStreamMute(stream, muted);
    585 
    586     return NO_ERROR;
    587 }
    588 
    589 float AudioFlinger::streamVolume(int stream, int output) const
    590 {
    591     if (stream < 0 || uint32_t(stream) >= AudioSystem::NUM_STREAM_TYPES) {
    592         return 0.0f;
    593     }
    594 
    595     AutoMutex lock(mLock);
    596     float volume;
    597     if (output) {
    598         PlaybackThread *thread = checkPlaybackThread_l(output);
    599         if (thread == NULL) {
    600             return 0.0f;
    601         }
    602         volume = thread->streamVolume(stream);
    603     } else {
    604         volume = mStreamTypes[stream].volume;
    605     }
    606 
    607     return volume;
    608 }
    609 
    610 bool AudioFlinger::streamMute(int stream) const
    611 {
    612     if (stream < 0 || stream >= (int)AudioSystem::NUM_STREAM_TYPES) {
    613         return true;
    614     }
    615 
    616     return mStreamTypes[stream].mute;
    617 }
    618 
    619 bool AudioFlinger::isStreamActive(int stream) const
    620 {
    621     Mutex::Autolock _l(mLock);
    622     for (uint32_t i = 0; i < mPlaybackThreads.size(); i++) {
    623         if (mPlaybackThreads.valueAt(i)->isStreamActive(stream)) {
    624             return true;
    625         }
    626     }
    627     return false;
    628 }
    629 
    630 status_t AudioFlinger::setParameters(int ioHandle, const String8& keyValuePairs)
    631 {
    632     status_t result;
    633 
    634     LOGV("setParameters(): io %d, keyvalue %s, tid %d, calling tid %d",
    635             ioHandle, keyValuePairs.string(), gettid(), IPCThreadState::self()->getCallingPid());
    636     // check calling permissions
    637     if (!settingsAllowed()) {
    638         return PERMISSION_DENIED;
    639     }
    640 
    641 #ifdef LVMX
    642     AudioParameter param = AudioParameter(keyValuePairs);
    643     LifeVibes::setParameters(ioHandle,keyValuePairs);
    644     String8 key = String8(AudioParameter::keyRouting);
    645     int device;
    646     if (NO_ERROR != param.getInt(key, device)) {
    647         device = -1;
    648     }
    649 
    650     key = String8(LifevibesTag);
    651     String8 value;
    652     int musicEnabled = -1;
    653     if (NO_ERROR == param.get(key, value)) {
    654         if (value == LifevibesEnable) {
    655             mLifeVibesClientPid = IPCThreadState::self()->getCallingPid();
    656             musicEnabled = 1;
    657         } else if (value == LifevibesDisable) {
    658             mLifeVibesClientPid = -1;
    659             musicEnabled = 0;
    660         }
    661     }
    662 #endif
    663 
    664     // ioHandle == 0 means the parameters are global to the audio hardware interface
    665     if (ioHandle == 0) {
    666         AutoMutex lock(mHardwareLock);
    667         mHardwareStatus = AUDIO_SET_PARAMETER;
    668         result = mAudioHardware->setParameters(keyValuePairs);
    669 #ifdef LVMX
    670         if (musicEnabled != -1) {
    671             LifeVibes::enableMusic((bool) musicEnabled);
    672         }
    673 #endif
    674         mHardwareStatus = AUDIO_HW_IDLE;
    675         return result;
    676     }
    677 
    678     // hold a strong ref on thread in case closeOutput() or closeInput() is called
    679     // and the thread is exited once the lock is released
    680     sp<ThreadBase> thread;
    681     {
    682         Mutex::Autolock _l(mLock);
    683         thread = checkPlaybackThread_l(ioHandle);
    684         if (thread == NULL) {
    685             thread = checkRecordThread_l(ioHandle);
    686         }
    687     }
    688     if (thread != NULL) {
    689         result = thread->setParameters(keyValuePairs);
    690 #ifdef LVMX
    691         if ((NO_ERROR == result) && (device != -1)) {
    692             LifeVibes::setDevice(LifeVibes::threadIdToAudioOutputType(thread->id()), device);
    693         }
    694 #endif
    695         return result;
    696     }
    697     return BAD_VALUE;
    698 }
    699 
    700 String8 AudioFlinger::getParameters(int ioHandle, const String8& keys)
    701 {
    702 //    LOGV("getParameters() io %d, keys %s, tid %d, calling tid %d",
    703 //            ioHandle, keys.string(), gettid(), IPCThreadState::self()->getCallingPid());
    704 
    705     if (ioHandle == 0) {
    706         return mAudioHardware->getParameters(keys);
    707     }
    708 
    709     Mutex::Autolock _l(mLock);
    710 
    711     PlaybackThread *playbackThread = checkPlaybackThread_l(ioHandle);
    712     if (playbackThread != NULL) {
    713         return playbackThread->getParameters(keys);
    714     }
    715     RecordThread *recordThread = checkRecordThread_l(ioHandle);
    716     if (recordThread != NULL) {
    717         return recordThread->getParameters(keys);
    718     }
    719     return String8("");
    720 }
    721 
    722 size_t AudioFlinger::getInputBufferSize(uint32_t sampleRate, int format, int channelCount)
    723 {
    724     return mAudioHardware->getInputBufferSize(sampleRate, format, channelCount);
    725 }
    726 
    727 unsigned int AudioFlinger::getInputFramesLost(int ioHandle)
    728 {
    729     if (ioHandle == 0) {
    730         return 0;
    731     }
    732 
    733     Mutex::Autolock _l(mLock);
    734 
    735     RecordThread *recordThread = checkRecordThread_l(ioHandle);
    736     if (recordThread != NULL) {
    737         return recordThread->getInputFramesLost();
    738     }
    739     return 0;
    740 }
    741 
    742 status_t AudioFlinger::setVoiceVolume(float value)
    743 {
    744     // check calling permissions
    745     if (!settingsAllowed()) {
    746         return PERMISSION_DENIED;
    747     }
    748 
    749     AutoMutex lock(mHardwareLock);
    750     mHardwareStatus = AUDIO_SET_VOICE_VOLUME;
    751     status_t ret = mAudioHardware->setVoiceVolume(value);
    752     mHardwareStatus = AUDIO_HW_IDLE;
    753 
    754     return ret;
    755 }
    756 
    757 status_t AudioFlinger::getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int output)
    758 {
    759     status_t status;
    760 
    761     Mutex::Autolock _l(mLock);
    762 
    763     PlaybackThread *playbackThread = checkPlaybackThread_l(output);
    764     if (playbackThread != NULL) {
    765         return playbackThread->getRenderPosition(halFrames, dspFrames);
    766     }
    767 
    768     return BAD_VALUE;
    769 }
    770 
    771 void AudioFlinger::registerClient(const sp<IAudioFlingerClient>& client)
    772 {
    773 
    774     Mutex::Autolock _l(mLock);
    775 
    776     int pid = IPCThreadState::self()->getCallingPid();
    777     if (mNotificationClients.indexOfKey(pid) < 0) {
    778         sp<NotificationClient> notificationClient = new NotificationClient(this,
    779                                                                             client,
    780                                                                             pid);
    781         LOGV("registerClient() client %p, pid %d", notificationClient.get(), pid);
    782 
    783         mNotificationClients.add(pid, notificationClient);
    784 
    785         sp<IBinder> binder = client->asBinder();
    786         binder->linkToDeath(notificationClient);
    787 
    788         // the config change is always sent from playback or record threads to avoid deadlock
    789         // with AudioSystem::gLock
    790         for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
    791             mPlaybackThreads.valueAt(i)->sendConfigEvent(AudioSystem::OUTPUT_OPENED);
    792         }
    793 
    794         for (size_t i = 0; i < mRecordThreads.size(); i++) {
    795             mRecordThreads.valueAt(i)->sendConfigEvent(AudioSystem::INPUT_OPENED);
    796         }
    797     }
    798 }
    799 
    800 void AudioFlinger::removeNotificationClient(pid_t pid)
    801 {
    802     Mutex::Autolock _l(mLock);
    803 
    804     int index = mNotificationClients.indexOfKey(pid);
    805     if (index >= 0) {
    806         sp <NotificationClient> client = mNotificationClients.valueFor(pid);
    807         LOGV("removeNotificationClient() %p, pid %d", client.get(), pid);
    808 #ifdef LVMX
    809         if (pid == mLifeVibesClientPid) {
    810             LOGV("Disabling lifevibes");
    811             LifeVibes::enableMusic(false);
    812             mLifeVibesClientPid = -1;
    813         }
    814 #endif
    815         mNotificationClients.removeItem(pid);
    816     }
    817 }
    818 
    819 // audioConfigChanged_l() must be called with AudioFlinger::mLock held
    820 void AudioFlinger::audioConfigChanged_l(int event, int ioHandle, void *param2)
    821 {
    822     size_t size = mNotificationClients.size();
    823     for (size_t i = 0; i < size; i++) {
    824         mNotificationClients.valueAt(i)->client()->ioConfigChanged(event, ioHandle, param2);
    825     }
    826 }
    827 
    828 // removeClient_l() must be called with AudioFlinger::mLock held
    829 void AudioFlinger::removeClient_l(pid_t pid)
    830 {
    831     LOGV("removeClient_l() pid %d, tid %d, calling tid %d", pid, gettid(), IPCThreadState::self()->getCallingPid());
    832     mClients.removeItem(pid);
    833 }
    834 
    835 
    836 // ----------------------------------------------------------------------------
    837 
    838 AudioFlinger::ThreadBase::ThreadBase(const sp<AudioFlinger>& audioFlinger, int id)
    839     :   Thread(false),
    840         mAudioFlinger(audioFlinger), mSampleRate(0), mFrameCount(0), mChannelCount(0),
    841         mFrameSize(1), mFormat(0), mStandby(false), mId(id), mExiting(false)
    842 {
    843 }
    844 
    845 AudioFlinger::ThreadBase::~ThreadBase()
    846 {
    847     mParamCond.broadcast();
    848     mNewParameters.clear();
    849 }
    850 
    851 void AudioFlinger::ThreadBase::exit()
    852 {
    853     // keep a strong ref on ourself so that we wont get
    854     // destroyed in the middle of requestExitAndWait()
    855     sp <ThreadBase> strongMe = this;
    856 
    857     LOGV("ThreadBase::exit");
    858     {
    859         AutoMutex lock(&mLock);
    860         mExiting = true;
    861         requestExit();
    862         mWaitWorkCV.signal();
    863     }
    864     requestExitAndWait();
    865 }
    866 
    867 uint32_t AudioFlinger::ThreadBase::sampleRate() const
    868 {
    869     return mSampleRate;
    870 }
    871 
    872 int AudioFlinger::ThreadBase::channelCount() const
    873 {
    874     return (int)mChannelCount;
    875 }
    876 
    877 int AudioFlinger::ThreadBase::format() const
    878 {
    879     return mFormat;
    880 }
    881 
    882 size_t AudioFlinger::ThreadBase::frameCount() const
    883 {
    884     return mFrameCount;
    885 }
    886 
    887 status_t AudioFlinger::ThreadBase::setParameters(const String8& keyValuePairs)
    888 {
    889     status_t status;
    890 
    891     LOGV("ThreadBase::setParameters() %s", keyValuePairs.string());
    892     Mutex::Autolock _l(mLock);
    893 
    894     mNewParameters.add(keyValuePairs);
    895     mWaitWorkCV.signal();
    896     // wait condition with timeout in case the thread loop has exited
    897     // before the request could be processed
    898     if (mParamCond.waitRelative(mLock, seconds(2)) == NO_ERROR) {
    899         status = mParamStatus;
    900         mWaitWorkCV.signal();
    901     } else {
    902         status = TIMED_OUT;
    903     }
    904     return status;
    905 }
    906 
    907 void AudioFlinger::ThreadBase::sendConfigEvent(int event, int param)
    908 {
    909     Mutex::Autolock _l(mLock);
    910     sendConfigEvent_l(event, param);
    911 }
    912 
    913 // sendConfigEvent_l() must be called with ThreadBase::mLock held
    914 void AudioFlinger::ThreadBase::sendConfigEvent_l(int event, int param)
    915 {
    916     ConfigEvent *configEvent = new ConfigEvent();
    917     configEvent->mEvent = event;
    918     configEvent->mParam = param;
    919     mConfigEvents.add(configEvent);
    920     LOGV("sendConfigEvent() num events %d event %d, param %d", mConfigEvents.size(), event, param);
    921     mWaitWorkCV.signal();
    922 }
    923 
    924 void AudioFlinger::ThreadBase::processConfigEvents()
    925 {
    926     mLock.lock();
    927     while(!mConfigEvents.isEmpty()) {
    928         LOGV("processConfigEvents() remaining events %d", mConfigEvents.size());
    929         ConfigEvent *configEvent = mConfigEvents[0];
    930         mConfigEvents.removeAt(0);
    931         // release mLock before locking AudioFlinger mLock: lock order is always
    932         // AudioFlinger then ThreadBase to avoid cross deadlock
    933         mLock.unlock();
    934         mAudioFlinger->mLock.lock();
    935         audioConfigChanged_l(configEvent->mEvent, configEvent->mParam);
    936         mAudioFlinger->mLock.unlock();
    937         delete configEvent;
    938         mLock.lock();
    939     }
    940     mLock.unlock();
    941 }
    942 
    943 status_t AudioFlinger::ThreadBase::dumpBase(int fd, const Vector<String16>& args)
    944 {
    945     const size_t SIZE = 256;
    946     char buffer[SIZE];
    947     String8 result;
    948 
    949     bool locked = tryLock(mLock);
    950     if (!locked) {
    951         snprintf(buffer, SIZE, "thread %p maybe dead locked\n", this);
    952         write(fd, buffer, strlen(buffer));
    953     }
    954 
    955     snprintf(buffer, SIZE, "standby: %d\n", mStandby);
    956     result.append(buffer);
    957     snprintf(buffer, SIZE, "Sample rate: %d\n", mSampleRate);
    958     result.append(buffer);
    959     snprintf(buffer, SIZE, "Frame count: %d\n", mFrameCount);
    960     result.append(buffer);
    961     snprintf(buffer, SIZE, "Channel Count: %d\n", mChannelCount);
    962     result.append(buffer);
    963     snprintf(buffer, SIZE, "Format: %d\n", mFormat);
    964     result.append(buffer);
    965     snprintf(buffer, SIZE, "Frame size: %d\n", mFrameSize);
    966     result.append(buffer);
    967 
    968     snprintf(buffer, SIZE, "\nPending setParameters commands: \n");
    969     result.append(buffer);
    970     result.append(" Index Command");
    971     for (size_t i = 0; i < mNewParameters.size(); ++i) {
    972         snprintf(buffer, SIZE, "\n %02d    ", i);
    973         result.append(buffer);
    974         result.append(mNewParameters[i]);
    975     }
    976 
    977     snprintf(buffer, SIZE, "\n\nPending config events: \n");
    978     result.append(buffer);
    979     snprintf(buffer, SIZE, " Index event param\n");
    980     result.append(buffer);
    981     for (size_t i = 0; i < mConfigEvents.size(); i++) {
    982         snprintf(buffer, SIZE, " %02d    %02d    %d\n", i, mConfigEvents[i]->mEvent, mConfigEvents[i]->mParam);
    983         result.append(buffer);
    984     }
    985     result.append("\n");
    986 
    987     write(fd, result.string(), result.size());
    988 
    989     if (locked) {
    990         mLock.unlock();
    991     }
    992     return NO_ERROR;
    993 }
    994 
    995 
    996 // ----------------------------------------------------------------------------
    997 
    998 AudioFlinger::PlaybackThread::PlaybackThread(const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id, uint32_t device)
    999     :   ThreadBase(audioFlinger, id),
   1000         mMixBuffer(0), mSuspended(0), mBytesWritten(0), mOutput(output),
   1001         mLastWriteTime(0), mNumWrites(0), mNumDelayedWrites(0), mInWrite(false),
   1002         mDevice(device)
   1003 {
   1004     readOutputParameters();
   1005 
   1006     mMasterVolume = mAudioFlinger->masterVolume();
   1007     mMasterMute = mAudioFlinger->masterMute();
   1008 
   1009     for (int stream = 0; stream < AudioSystem::NUM_STREAM_TYPES; stream++) {
   1010         mStreamTypes[stream].volume = mAudioFlinger->streamVolumeInternal(stream);
   1011         mStreamTypes[stream].mute = mAudioFlinger->streamMute(stream);
   1012     }
   1013 }
   1014 
   1015 AudioFlinger::PlaybackThread::~PlaybackThread()
   1016 {
   1017     delete [] mMixBuffer;
   1018 }
   1019 
   1020 status_t AudioFlinger::PlaybackThread::dump(int fd, const Vector<String16>& args)
   1021 {
   1022     dumpInternals(fd, args);
   1023     dumpTracks(fd, args);
   1024     dumpEffectChains(fd, args);
   1025     return NO_ERROR;
   1026 }
   1027 
   1028 status_t AudioFlinger::PlaybackThread::dumpTracks(int fd, const Vector<String16>& args)
   1029 {
   1030     const size_t SIZE = 256;
   1031     char buffer[SIZE];
   1032     String8 result;
   1033 
   1034     snprintf(buffer, SIZE, "Output thread %p tracks\n", this);
   1035     result.append(buffer);
   1036     result.append("   Name  Clien Typ Fmt Chn Session Buf  S M F SRate LeftV RighV  Serv       User       Main buf   Aux Buf\n");
   1037     for (size_t i = 0; i < mTracks.size(); ++i) {
   1038         sp<Track> track = mTracks[i];
   1039         if (track != 0) {
   1040             track->dump(buffer, SIZE);
   1041             result.append(buffer);
   1042         }
   1043     }
   1044 
   1045     snprintf(buffer, SIZE, "Output thread %p active tracks\n", this);
   1046     result.append(buffer);
   1047     result.append("   Name  Clien Typ Fmt Chn Session Buf  S M F SRate LeftV RighV  Serv       User       Main buf   Aux Buf\n");
   1048     for (size_t i = 0; i < mActiveTracks.size(); ++i) {
   1049         wp<Track> wTrack = mActiveTracks[i];
   1050         if (wTrack != 0) {
   1051             sp<Track> track = wTrack.promote();
   1052             if (track != 0) {
   1053                 track->dump(buffer, SIZE);
   1054                 result.append(buffer);
   1055             }
   1056         }
   1057     }
   1058     write(fd, result.string(), result.size());
   1059     return NO_ERROR;
   1060 }
   1061 
   1062 status_t AudioFlinger::PlaybackThread::dumpEffectChains(int fd, const Vector<String16>& args)
   1063 {
   1064     const size_t SIZE = 256;
   1065     char buffer[SIZE];
   1066     String8 result;
   1067 
   1068     snprintf(buffer, SIZE, "\n- %d Effect Chains:\n", mEffectChains.size());
   1069     write(fd, buffer, strlen(buffer));
   1070 
   1071     for (size_t i = 0; i < mEffectChains.size(); ++i) {
   1072         sp<EffectChain> chain = mEffectChains[i];
   1073         if (chain != 0) {
   1074             chain->dump(fd, args);
   1075         }
   1076     }
   1077     return NO_ERROR;
   1078 }
   1079 
   1080 status_t AudioFlinger::PlaybackThread::dumpInternals(int fd, const Vector<String16>& args)
   1081 {
   1082     const size_t SIZE = 256;
   1083     char buffer[SIZE];
   1084     String8 result;
   1085 
   1086     snprintf(buffer, SIZE, "\nOutput thread %p internals\n", this);
   1087     result.append(buffer);
   1088     snprintf(buffer, SIZE, "last write occurred (msecs): %llu\n", ns2ms(systemTime() - mLastWriteTime));
   1089     result.append(buffer);
   1090     snprintf(buffer, SIZE, "total writes: %d\n", mNumWrites);
   1091     result.append(buffer);
   1092     snprintf(buffer, SIZE, "delayed writes: %d\n", mNumDelayedWrites);
   1093     result.append(buffer);
   1094     snprintf(buffer, SIZE, "blocked in write: %d\n", mInWrite);
   1095     result.append(buffer);
   1096     snprintf(buffer, SIZE, "suspend count: %d\n", mSuspended);
   1097     result.append(buffer);
   1098     snprintf(buffer, SIZE, "mix buffer : %p\n", mMixBuffer);
   1099     result.append(buffer);
   1100     write(fd, result.string(), result.size());
   1101 
   1102     dumpBase(fd, args);
   1103 
   1104     return NO_ERROR;
   1105 }
   1106 
   1107 // Thread virtuals
   1108 status_t AudioFlinger::PlaybackThread::readyToRun()
   1109 {
   1110     if (mSampleRate == 0) {
   1111         LOGE("No working audio driver found.");
   1112         return NO_INIT;
   1113     }
   1114     LOGI("AudioFlinger's thread %p ready to run", this);
   1115     return NO_ERROR;
   1116 }
   1117 
   1118 void AudioFlinger::PlaybackThread::onFirstRef()
   1119 {
   1120     const size_t SIZE = 256;
   1121     char buffer[SIZE];
   1122 
   1123     snprintf(buffer, SIZE, "Playback Thread %p", this);
   1124 
   1125     run(buffer, ANDROID_PRIORITY_URGENT_AUDIO);
   1126 }
   1127 
   1128 // PlaybackThread::createTrack_l() must be called with AudioFlinger::mLock held
   1129 sp<AudioFlinger::PlaybackThread::Track>  AudioFlinger::PlaybackThread::createTrack_l(
   1130         const sp<AudioFlinger::Client>& client,
   1131         int streamType,
   1132         uint32_t sampleRate,
   1133         int format,
   1134         int channelCount,
   1135         int frameCount,
   1136         const sp<IMemory>& sharedBuffer,
   1137         int sessionId,
   1138         status_t *status)
   1139 {
   1140     sp<Track> track;
   1141     status_t lStatus;
   1142 
   1143     if (mType == DIRECT) {
   1144         if (sampleRate != mSampleRate || format != mFormat || channelCount != (int)mChannelCount) {
   1145             LOGE("createTrack_l() Bad parameter:  sampleRate %d format %d, channelCount %d for output %p",
   1146                  sampleRate, format, channelCount, mOutput);
   1147             lStatus = BAD_VALUE;
   1148             goto Exit;
   1149         }
   1150     } else {
   1151         // Resampler implementation limits input sampling rate to 2 x output sampling rate.
   1152         if (sampleRate > mSampleRate*2) {
   1153             LOGE("Sample rate out of range: %d mSampleRate %d", sampleRate, mSampleRate);
   1154             lStatus = BAD_VALUE;
   1155             goto Exit;
   1156         }
   1157     }
   1158 
   1159     if (mOutput == 0) {
   1160         LOGE("Audio driver not initialized.");
   1161         lStatus = NO_INIT;
   1162         goto Exit;
   1163     }
   1164 
   1165     { // scope for mLock
   1166         Mutex::Autolock _l(mLock);
   1167 
   1168         // all tracks in same audio session must share the same routing strategy otherwise
   1169         // conflicts will happen when tracks are moved from one output to another by audio policy
   1170         // manager
   1171         uint32_t strategy =
   1172                 AudioSystem::getStrategyForStream((AudioSystem::stream_type)streamType);
   1173         for (size_t i = 0; i < mTracks.size(); ++i) {
   1174             sp<Track> t = mTracks[i];
   1175             if (t != 0) {
   1176                 if (sessionId == t->sessionId() &&
   1177                         strategy != AudioSystem::getStrategyForStream((AudioSystem::stream_type)t->type())) {
   1178                     lStatus = BAD_VALUE;
   1179                     goto Exit;
   1180                 }
   1181             }
   1182         }
   1183 
   1184         track = new Track(this, client, streamType, sampleRate, format,
   1185                 channelCount, frameCount, sharedBuffer, sessionId);
   1186         if (track->getCblk() == NULL || track->name() < 0) {
   1187             lStatus = NO_MEMORY;
   1188             goto Exit;
   1189         }
   1190         mTracks.add(track);
   1191 
   1192         sp<EffectChain> chain = getEffectChain_l(sessionId);
   1193         if (chain != 0) {
   1194             LOGV("createTrack_l() setting main buffer %p", chain->inBuffer());
   1195             track->setMainBuffer(chain->inBuffer());
   1196             chain->setStrategy(AudioSystem::getStrategyForStream((AudioSystem::stream_type)track->type()));
   1197         }
   1198     }
   1199     lStatus = NO_ERROR;
   1200 
   1201 Exit:
   1202     if(status) {
   1203         *status = lStatus;
   1204     }
   1205     return track;
   1206 }
   1207 
   1208 uint32_t AudioFlinger::PlaybackThread::latency() const
   1209 {
   1210     if (mOutput) {
   1211         return mOutput->latency();
   1212     }
   1213     else {
   1214         return 0;
   1215     }
   1216 }
   1217 
   1218 status_t AudioFlinger::PlaybackThread::setMasterVolume(float value)
   1219 {
   1220 #ifdef LVMX
   1221     int audioOutputType = LifeVibes::getMixerType(mId, mType);
   1222     if (LifeVibes::audioOutputTypeIsLifeVibes(audioOutputType)) {
   1223         LifeVibes::setMasterVolume(audioOutputType, value);
   1224     }
   1225 #endif
   1226     mMasterVolume = value;
   1227     return NO_ERROR;
   1228 }
   1229 
   1230 status_t AudioFlinger::PlaybackThread::setMasterMute(bool muted)
   1231 {
   1232 #ifdef LVMX
   1233     int audioOutputType = LifeVibes::getMixerType(mId, mType);
   1234     if (LifeVibes::audioOutputTypeIsLifeVibes(audioOutputType)) {
   1235         LifeVibes::setMasterMute(audioOutputType, muted);
   1236     }
   1237 #endif
   1238     mMasterMute = muted;
   1239     return NO_ERROR;
   1240 }
   1241 
   1242 float AudioFlinger::PlaybackThread::masterVolume() const
   1243 {
   1244     return mMasterVolume;
   1245 }
   1246 
   1247 bool AudioFlinger::PlaybackThread::masterMute() const
   1248 {
   1249     return mMasterMute;
   1250 }
   1251 
   1252 status_t AudioFlinger::PlaybackThread::setStreamVolume(int stream, float value)
   1253 {
   1254 #ifdef LVMX
   1255     int audioOutputType = LifeVibes::getMixerType(mId, mType);
   1256     if (LifeVibes::audioOutputTypeIsLifeVibes(audioOutputType)) {
   1257         LifeVibes::setStreamVolume(audioOutputType, stream, value);
   1258     }
   1259 #endif
   1260     mStreamTypes[stream].volume = value;
   1261     return NO_ERROR;
   1262 }
   1263 
   1264 status_t AudioFlinger::PlaybackThread::setStreamMute(int stream, bool muted)
   1265 {
   1266 #ifdef LVMX
   1267     int audioOutputType = LifeVibes::getMixerType(mId, mType);
   1268     if (LifeVibes::audioOutputTypeIsLifeVibes(audioOutputType)) {
   1269         LifeVibes::setStreamMute(audioOutputType, stream, muted);
   1270     }
   1271 #endif
   1272     mStreamTypes[stream].mute = muted;
   1273     return NO_ERROR;
   1274 }
   1275 
   1276 float AudioFlinger::PlaybackThread::streamVolume(int stream) const
   1277 {
   1278     return mStreamTypes[stream].volume;
   1279 }
   1280 
   1281 bool AudioFlinger::PlaybackThread::streamMute(int stream) const
   1282 {
   1283     return mStreamTypes[stream].mute;
   1284 }
   1285 
   1286 bool AudioFlinger::PlaybackThread::isStreamActive(int stream) const
   1287 {
   1288     Mutex::Autolock _l(mLock);
   1289     size_t count = mActiveTracks.size();
   1290     for (size_t i = 0 ; i < count ; ++i) {
   1291         sp<Track> t = mActiveTracks[i].promote();
   1292         if (t == 0) continue;
   1293         Track* const track = t.get();
   1294         if (t->type() == stream)
   1295             return true;
   1296     }
   1297     return false;
   1298 }
   1299 
   1300 // addTrack_l() must be called with ThreadBase::mLock held
   1301 status_t AudioFlinger::PlaybackThread::addTrack_l(const sp<Track>& track)
   1302 {
   1303     status_t status = ALREADY_EXISTS;
   1304 
   1305     // set retry count for buffer fill
   1306     track->mRetryCount = kMaxTrackStartupRetries;
   1307     if (mActiveTracks.indexOf(track) < 0) {
   1308         // the track is newly added, make sure it fills up all its
   1309         // buffers before playing. This is to ensure the client will
   1310         // effectively get the latency it requested.
   1311         track->mFillingUpStatus = Track::FS_FILLING;
   1312         track->mResetDone = false;
   1313         mActiveTracks.add(track);
   1314         if (track->mainBuffer() != mMixBuffer) {
   1315             sp<EffectChain> chain = getEffectChain_l(track->sessionId());
   1316             if (chain != 0) {
   1317                 LOGV("addTrack_l() starting track on chain %p for session %d", chain.get(), track->sessionId());
   1318                 chain->startTrack();
   1319             }
   1320         }
   1321 
   1322         status = NO_ERROR;
   1323     }
   1324 
   1325     LOGV("mWaitWorkCV.broadcast");
   1326     mWaitWorkCV.broadcast();
   1327 
   1328     return status;
   1329 }
   1330 
   1331 // destroyTrack_l() must be called with ThreadBase::mLock held
   1332 void AudioFlinger::PlaybackThread::destroyTrack_l(const sp<Track>& track)
   1333 {
   1334     track->mState = TrackBase::TERMINATED;
   1335     if (mActiveTracks.indexOf(track) < 0) {
   1336         mTracks.remove(track);
   1337         deleteTrackName_l(track->name());
   1338     }
   1339 }
   1340 
   1341 String8 AudioFlinger::PlaybackThread::getParameters(const String8& keys)
   1342 {
   1343     return mOutput->getParameters(keys);
   1344 }
   1345 
   1346 // destroyTrack_l() must be called with AudioFlinger::mLock held
   1347 void AudioFlinger::PlaybackThread::audioConfigChanged_l(int event, int param) {
   1348     AudioSystem::OutputDescriptor desc;
   1349     void *param2 = 0;
   1350 
   1351     LOGV("PlaybackThread::audioConfigChanged_l, thread %p, event %d, param %d", this, event, param);
   1352 
   1353     switch (event) {
   1354     case AudioSystem::OUTPUT_OPENED:
   1355     case AudioSystem::OUTPUT_CONFIG_CHANGED:
   1356         desc.channels = mChannels;
   1357         desc.samplingRate = mSampleRate;
   1358         desc.format = mFormat;
   1359         desc.frameCount = mFrameCount;
   1360         desc.latency = latency();
   1361         param2 = &desc;
   1362         break;
   1363 
   1364     case AudioSystem::STREAM_CONFIG_CHANGED:
   1365         param2 = &param;
   1366     case AudioSystem::OUTPUT_CLOSED:
   1367     default:
   1368         break;
   1369     }
   1370     mAudioFlinger->audioConfigChanged_l(event, mId, param2);
   1371 }
   1372 
   1373 void AudioFlinger::PlaybackThread::readOutputParameters()
   1374 {
   1375     mSampleRate = mOutput->sampleRate();
   1376     mChannels = mOutput->channels();
   1377     mChannelCount = (uint16_t)AudioSystem::popCount(mChannels);
   1378     mFormat = mOutput->format();
   1379     mFrameSize = (uint16_t)mOutput->frameSize();
   1380     mFrameCount = mOutput->bufferSize() / mFrameSize;
   1381 
   1382     // FIXME - Current mixer implementation only supports stereo output: Always
   1383     // Allocate a stereo buffer even if HW output is mono.
   1384     if (mMixBuffer != NULL) delete[] mMixBuffer;
   1385     mMixBuffer = new int16_t[mFrameCount * 2];
   1386     memset(mMixBuffer, 0, mFrameCount * 2 * sizeof(int16_t));
   1387 
   1388     // force reconfiguration of effect chains and engines to take new buffer size and audio
   1389     // parameters into account
   1390     // Note that mLock is not held when readOutputParameters() is called from the constructor
   1391     // but in this case nothing is done below as no audio sessions have effect yet so it doesn't
   1392     // matter.
   1393     // create a copy of mEffectChains as calling moveEffectChain_l() can reorder some effect chains
   1394     Vector< sp<EffectChain> > effectChains = mEffectChains;
   1395     for (size_t i = 0; i < effectChains.size(); i ++) {
   1396         mAudioFlinger->moveEffectChain_l(effectChains[i]->sessionId(), this, this, false);
   1397     }
   1398 }
   1399 
   1400 status_t AudioFlinger::PlaybackThread::getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames)
   1401 {
   1402     if (halFrames == 0 || dspFrames == 0) {
   1403         return BAD_VALUE;
   1404     }
   1405     if (mOutput == 0) {
   1406         return INVALID_OPERATION;
   1407     }
   1408     *halFrames = mBytesWritten/mOutput->frameSize();
   1409 
   1410     return mOutput->getRenderPosition(dspFrames);
   1411 }
   1412 
   1413 uint32_t AudioFlinger::PlaybackThread::hasAudioSession(int sessionId)
   1414 {
   1415     Mutex::Autolock _l(mLock);
   1416     uint32_t result = 0;
   1417     if (getEffectChain_l(sessionId) != 0) {
   1418         result = EFFECT_SESSION;
   1419     }
   1420 
   1421     for (size_t i = 0; i < mTracks.size(); ++i) {
   1422         sp<Track> track = mTracks[i];
   1423         if (sessionId == track->sessionId() &&
   1424                 !(track->mCblk->flags & CBLK_INVALID_MSK)) {
   1425             result |= TRACK_SESSION;
   1426             break;
   1427         }
   1428     }
   1429 
   1430     return result;
   1431 }
   1432 
   1433 uint32_t AudioFlinger::PlaybackThread::getStrategyForSession_l(int sessionId)
   1434 {
   1435     // session AudioSystem::SESSION_OUTPUT_MIX is placed in same strategy as MUSIC stream so that
   1436     // it is moved to correct output by audio policy manager when A2DP is connected or disconnected
   1437     if (sessionId == AudioSystem::SESSION_OUTPUT_MIX) {
   1438         return AudioSystem::getStrategyForStream(AudioSystem::MUSIC);
   1439     }
   1440     for (size_t i = 0; i < mTracks.size(); i++) {
   1441         sp<Track> track = mTracks[i];
   1442         if (sessionId == track->sessionId() &&
   1443                 !(track->mCblk->flags & CBLK_INVALID_MSK)) {
   1444             return AudioSystem::getStrategyForStream((AudioSystem::stream_type) track->type());
   1445         }
   1446     }
   1447     return AudioSystem::getStrategyForStream(AudioSystem::MUSIC);
   1448 }
   1449 
   1450 sp<AudioFlinger::EffectChain> AudioFlinger::PlaybackThread::getEffectChain(int sessionId)
   1451 {
   1452     Mutex::Autolock _l(mLock);
   1453     return getEffectChain_l(sessionId);
   1454 }
   1455 
   1456 sp<AudioFlinger::EffectChain> AudioFlinger::PlaybackThread::getEffectChain_l(int sessionId)
   1457 {
   1458     sp<EffectChain> chain;
   1459 
   1460     size_t size = mEffectChains.size();
   1461     for (size_t i = 0; i < size; i++) {
   1462         if (mEffectChains[i]->sessionId() == sessionId) {
   1463             chain = mEffectChains[i];
   1464             break;
   1465         }
   1466     }
   1467     return chain;
   1468 }
   1469 
   1470 void AudioFlinger::PlaybackThread::setMode(uint32_t mode)
   1471 {
   1472     Mutex::Autolock _l(mLock);
   1473     size_t size = mEffectChains.size();
   1474     for (size_t i = 0; i < size; i++) {
   1475         mEffectChains[i]->setMode_l(mode);
   1476     }
   1477 }
   1478 
   1479 // ----------------------------------------------------------------------------
   1480 
   1481 AudioFlinger::MixerThread::MixerThread(const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id, uint32_t device)
   1482     :   PlaybackThread(audioFlinger, output, id, device),
   1483         mAudioMixer(0)
   1484 {
   1485     mType = PlaybackThread::MIXER;
   1486     mAudioMixer = new AudioMixer(mFrameCount, mSampleRate);
   1487 
   1488     // FIXME - Current mixer implementation only supports stereo output
   1489     if (mChannelCount == 1) {
   1490         LOGE("Invalid audio hardware channel count");
   1491     }
   1492 }
   1493 
   1494 AudioFlinger::MixerThread::~MixerThread()
   1495 {
   1496     delete mAudioMixer;
   1497 }
   1498 
   1499 bool AudioFlinger::MixerThread::threadLoop()
   1500 {
   1501     Vector< sp<Track> > tracksToRemove;
   1502     uint32_t mixerStatus = MIXER_IDLE;
   1503     nsecs_t standbyTime = systemTime();
   1504     size_t mixBufferSize = mFrameCount * mFrameSize;
   1505     // FIXME: Relaxed timing because of a certain device that can't meet latency
   1506     // Should be reduced to 2x after the vendor fixes the driver issue
   1507     nsecs_t maxPeriod = seconds(mFrameCount) / mSampleRate * 3;
   1508     nsecs_t lastWarning = 0;
   1509     bool longStandbyExit = false;
   1510     uint32_t activeSleepTime = activeSleepTimeUs();
   1511     uint32_t idleSleepTime = idleSleepTimeUs();
   1512     uint32_t sleepTime = idleSleepTime;
   1513     Vector< sp<EffectChain> > effectChains;
   1514 
   1515     while (!exitPending())
   1516     {
   1517         processConfigEvents();
   1518 
   1519         mixerStatus = MIXER_IDLE;
   1520         { // scope for mLock
   1521 
   1522             Mutex::Autolock _l(mLock);
   1523 
   1524             if (checkForNewParameters_l()) {
   1525                 mixBufferSize = mFrameCount * mFrameSize;
   1526                 // FIXME: Relaxed timing because of a certain device that can't meet latency
   1527                 // Should be reduced to 2x after the vendor fixes the driver issue
   1528                 maxPeriod = seconds(mFrameCount) / mSampleRate * 3;
   1529                 activeSleepTime = activeSleepTimeUs();
   1530                 idleSleepTime = idleSleepTimeUs();
   1531             }
   1532 
   1533             const SortedVector< wp<Track> >& activeTracks = mActiveTracks;
   1534 
   1535             // put audio hardware into standby after short delay
   1536             if UNLIKELY((!activeTracks.size() && systemTime() > standbyTime) ||
   1537                         mSuspended) {
   1538                 if (!mStandby) {
   1539                     LOGV("Audio hardware entering standby, mixer %p, mSuspended %d\n", this, mSuspended);
   1540                     mOutput->standby();
   1541                     mStandby = true;
   1542                     mBytesWritten = 0;
   1543                 }
   1544 
   1545                 if (!activeTracks.size() && mConfigEvents.isEmpty()) {
   1546                     // we're about to wait, flush the binder command buffer
   1547                     IPCThreadState::self()->flushCommands();
   1548 
   1549                     if (exitPending()) break;
   1550 
   1551                     // wait until we have something to do...
   1552                     LOGV("MixerThread %p TID %d going to sleep\n", this, gettid());
   1553                     mWaitWorkCV.wait(mLock);
   1554                     LOGV("MixerThread %p TID %d waking up\n", this, gettid());
   1555 
   1556                     if (mMasterMute == false) {
   1557                         char value[PROPERTY_VALUE_MAX];
   1558                         property_get("ro.audio.silent", value, "0");
   1559                         if (atoi(value)) {
   1560                             LOGD("Silence is golden");
   1561                             setMasterMute(true);
   1562                         }
   1563                     }
   1564 
   1565                     standbyTime = systemTime() + kStandbyTimeInNsecs;
   1566                     sleepTime = idleSleepTime;
   1567                     continue;
   1568                 }
   1569             }
   1570 
   1571             mixerStatus = prepareTracks_l(activeTracks, &tracksToRemove);
   1572 
   1573             // prevent any changes in effect chain list and in each effect chain
   1574             // during mixing and effect process as the audio buffers could be deleted
   1575             // or modified if an effect is created or deleted
   1576             lockEffectChains_l(effectChains);
   1577        }
   1578 
   1579         if (LIKELY(mixerStatus == MIXER_TRACKS_READY)) {
   1580             // mix buffers...
   1581             mAudioMixer->process();
   1582             sleepTime = 0;
   1583             standbyTime = systemTime() + kStandbyTimeInNsecs;
   1584             //TODO: delay standby when effects have a tail
   1585         } else {
   1586             // If no tracks are ready, sleep once for the duration of an output
   1587             // buffer size, then write 0s to the output
   1588             if (sleepTime == 0) {
   1589                 if (mixerStatus == MIXER_TRACKS_ENABLED) {
   1590                     sleepTime = activeSleepTime;
   1591                 } else {
   1592                     sleepTime = idleSleepTime;
   1593                 }
   1594             } else if (mBytesWritten != 0 ||
   1595                        (mixerStatus == MIXER_TRACKS_ENABLED && longStandbyExit)) {
   1596                 memset (mMixBuffer, 0, mixBufferSize);
   1597                 sleepTime = 0;
   1598                 LOGV_IF((mBytesWritten == 0 && (mixerStatus == MIXER_TRACKS_ENABLED && longStandbyExit)), "anticipated start");
   1599             }
   1600             // TODO add standby time extension fct of effect tail
   1601         }
   1602 
   1603         if (mSuspended) {
   1604             sleepTime = suspendSleepTimeUs();
   1605         }
   1606         // sleepTime == 0 means we must write to audio hardware
   1607         if (sleepTime == 0) {
   1608              for (size_t i = 0; i < effectChains.size(); i ++) {
   1609                  effectChains[i]->process_l();
   1610              }
   1611              // enable changes in effect chain
   1612              unlockEffectChains(effectChains);
   1613 #ifdef LVMX
   1614             int audioOutputType = LifeVibes::getMixerType(mId, mType);
   1615             if (LifeVibes::audioOutputTypeIsLifeVibes(audioOutputType)) {
   1616                LifeVibes::process(audioOutputType, mMixBuffer, mixBufferSize);
   1617             }
   1618 #endif
   1619             mLastWriteTime = systemTime();
   1620             mInWrite = true;
   1621             mBytesWritten += mixBufferSize;
   1622 
   1623             int bytesWritten = (int)mOutput->write(mMixBuffer, mixBufferSize);
   1624             if (bytesWritten < 0) mBytesWritten -= mixBufferSize;
   1625             mNumWrites++;
   1626             mInWrite = false;
   1627             nsecs_t now = systemTime();
   1628             nsecs_t delta = now - mLastWriteTime;
   1629             if (delta > maxPeriod) {
   1630                 mNumDelayedWrites++;
   1631                 if ((now - lastWarning) > kWarningThrottle) {
   1632                     LOGW("write blocked for %llu msecs, %d delayed writes, thread %p",
   1633                             ns2ms(delta), mNumDelayedWrites, this);
   1634                     lastWarning = now;
   1635                 }
   1636                 if (mStandby) {
   1637                     longStandbyExit = true;
   1638                 }
   1639             }
   1640             mStandby = false;
   1641         } else {
   1642             // enable changes in effect chain
   1643             unlockEffectChains(effectChains);
   1644             usleep(sleepTime);
   1645         }
   1646 
   1647         // finally let go of all our tracks, without the lock held
   1648         // since we can't guarantee the destructors won't acquire that
   1649         // same lock.
   1650         tracksToRemove.clear();
   1651 
   1652         // Effect chains will be actually deleted here if they were removed from
   1653         // mEffectChains list during mixing or effects processing
   1654         effectChains.clear();
   1655     }
   1656 
   1657     if (!mStandby) {
   1658         mOutput->standby();
   1659     }
   1660 
   1661     LOGV("MixerThread %p exiting", this);
   1662     return false;
   1663 }
   1664 
   1665 // prepareTracks_l() must be called with ThreadBase::mLock held
   1666 uint32_t AudioFlinger::MixerThread::prepareTracks_l(const SortedVector< wp<Track> >& activeTracks, Vector< sp<Track> > *tracksToRemove)
   1667 {
   1668 
   1669     uint32_t mixerStatus = MIXER_IDLE;
   1670     // find out which tracks need to be processed
   1671     size_t count = activeTracks.size();
   1672     size_t mixedTracks = 0;
   1673     size_t tracksWithEffect = 0;
   1674 
   1675     float masterVolume = mMasterVolume;
   1676     bool  masterMute = mMasterMute;
   1677 
   1678     if (masterMute) {
   1679         masterVolume = 0;
   1680     }
   1681 #ifdef LVMX
   1682     bool tracksConnectedChanged = false;
   1683     bool stateChanged = false;
   1684 
   1685     int audioOutputType = LifeVibes::getMixerType(mId, mType);
   1686     if (LifeVibes::audioOutputTypeIsLifeVibes(audioOutputType))
   1687     {
   1688         int activeTypes = 0;
   1689         for (size_t i=0 ; i<count ; i++) {
   1690             sp<Track> t = activeTracks[i].promote();
   1691             if (t == 0) continue;
   1692             Track* const track = t.get();
   1693             int iTracktype=track->type();
   1694             activeTypes |= 1<<track->type();
   1695         }
   1696         LifeVibes::computeVolumes(audioOutputType, activeTypes, tracksConnectedChanged, stateChanged, masterVolume, masterMute);
   1697     }
   1698 #endif
   1699     // Delegate master volume control to effect in output mix effect chain if needed
   1700     sp<EffectChain> chain = getEffectChain_l(AudioSystem::SESSION_OUTPUT_MIX);
   1701     if (chain != 0) {
   1702         uint32_t v = (uint32_t)(masterVolume * (1 << 24));
   1703         chain->setVolume_l(&v, &v);
   1704         masterVolume = (float)((v + (1 << 23)) >> 24);
   1705         chain.clear();
   1706     }
   1707 
   1708     for (size_t i=0 ; i<count ; i++) {
   1709         sp<Track> t = activeTracks[i].promote();
   1710         if (t == 0) continue;
   1711 
   1712         Track* const track = t.get();
   1713         audio_track_cblk_t* cblk = track->cblk();
   1714 
   1715         // The first time a track is added we wait
   1716         // for all its buffers to be filled before processing it
   1717         mAudioMixer->setActiveTrack(track->name());
   1718         if (cblk->framesReady() && track->isReady() &&
   1719                 !track->isPaused() && !track->isTerminated())
   1720         {
   1721             //LOGV("track %d u=%08x, s=%08x [OK] on thread %p", track->name(), cblk->user, cblk->server, this);
   1722 
   1723             mixedTracks++;
   1724 
   1725             // track->mainBuffer() != mMixBuffer means there is an effect chain
   1726             // connected to the track
   1727             chain.clear();
   1728             if (track->mainBuffer() != mMixBuffer) {
   1729                 chain = getEffectChain_l(track->sessionId());
   1730                 // Delegate volume control to effect in track effect chain if needed
   1731                 if (chain != 0) {
   1732                     tracksWithEffect++;
   1733                 } else {
   1734                     LOGW("prepareTracks_l(): track %08x attached to effect but no chain found on session %d",
   1735                             track->name(), track->sessionId());
   1736                 }
   1737             }
   1738 
   1739 
   1740             int param = AudioMixer::VOLUME;
   1741             if (track->mFillingUpStatus == Track::FS_FILLED) {
   1742                 // no ramp for the first volume setting
   1743                 track->mFillingUpStatus = Track::FS_ACTIVE;
   1744                 if (track->mState == TrackBase::RESUMING) {
   1745                     track->mState = TrackBase::ACTIVE;
   1746                     param = AudioMixer::RAMP_VOLUME;
   1747                 }
   1748             } else if (cblk->server != 0) {
   1749                 // If the track is stopped before the first frame was mixed,
   1750                 // do not apply ramp
   1751                 param = AudioMixer::RAMP_VOLUME;
   1752             }
   1753 
   1754             // compute volume for this track
   1755             uint32_t vl, vr, va;
   1756             if (track->isMuted() || track->isPausing() ||
   1757                 mStreamTypes[track->type()].mute) {
   1758                 vl = vr = va = 0;
   1759                 if (track->isPausing()) {
   1760                     track->setPaused();
   1761                 }
   1762             } else {
   1763 
   1764                 // read original volumes with volume control
   1765                 float typeVolume = mStreamTypes[track->type()].volume;
   1766 #ifdef LVMX
   1767                 bool streamMute=false;
   1768                 // read the volume from the LivesVibes audio engine.
   1769                 if (LifeVibes::audioOutputTypeIsLifeVibes(audioOutputType))
   1770                 {
   1771                     LifeVibes::getStreamVolumes(audioOutputType, track->type(), &typeVolume, &streamMute);
   1772                     if (streamMute) {
   1773                         typeVolume = 0;
   1774                     }
   1775                 }
   1776 #endif
   1777                 float v = masterVolume * typeVolume;
   1778                 vl = (uint32_t)(v * cblk->volume[0]) << 12;
   1779                 vr = (uint32_t)(v * cblk->volume[1]) << 12;
   1780 
   1781                 va = (uint32_t)(v * cblk->sendLevel);
   1782             }
   1783             // Delegate volume control to effect in track effect chain if needed
   1784             if (chain != 0 && chain->setVolume_l(&vl, &vr)) {
   1785                 // Do not ramp volume if volume is controlled by effect
   1786                 param = AudioMixer::VOLUME;
   1787                 track->mHasVolumeController = true;
   1788             } else {
   1789                 // force no volume ramp when volume controller was just disabled or removed
   1790                 // from effect chain to avoid volume spike
   1791                 if (track->mHasVolumeController) {
   1792                     param = AudioMixer::VOLUME;
   1793                 }
   1794                 track->mHasVolumeController = false;
   1795             }
   1796 
   1797             // Convert volumes from 8.24 to 4.12 format
   1798             int16_t left, right, aux;
   1799             uint32_t v_clamped = (vl + (1 << 11)) >> 12;
   1800             if (v_clamped > MAX_GAIN_INT) v_clamped = MAX_GAIN_INT;
   1801             left = int16_t(v_clamped);
   1802             v_clamped = (vr + (1 << 11)) >> 12;
   1803             if (v_clamped > MAX_GAIN_INT) v_clamped = MAX_GAIN_INT;
   1804             right = int16_t(v_clamped);
   1805 
   1806             if (va > MAX_GAIN_INT) va = MAX_GAIN_INT;
   1807             aux = int16_t(va);
   1808 
   1809 #ifdef LVMX
   1810             if ( tracksConnectedChanged || stateChanged )
   1811             {
   1812                  // only do the ramp when the volume is changed by the user / application
   1813                  param = AudioMixer::VOLUME;
   1814             }
   1815 #endif
   1816 
   1817             // XXX: these things DON'T need to be done each time
   1818             mAudioMixer->setBufferProvider(track);
   1819             mAudioMixer->enable(AudioMixer::MIXING);
   1820 
   1821             mAudioMixer->setParameter(param, AudioMixer::VOLUME0, (void *)left);
   1822             mAudioMixer->setParameter(param, AudioMixer::VOLUME1, (void *)right);
   1823             mAudioMixer->setParameter(param, AudioMixer::AUXLEVEL, (void *)aux);
   1824             mAudioMixer->setParameter(
   1825                 AudioMixer::TRACK,
   1826                 AudioMixer::FORMAT, (void *)track->format());
   1827             mAudioMixer->setParameter(
   1828                 AudioMixer::TRACK,
   1829                 AudioMixer::CHANNEL_COUNT, (void *)track->channelCount());
   1830             mAudioMixer->setParameter(
   1831                 AudioMixer::RESAMPLE,
   1832                 AudioMixer::SAMPLE_RATE,
   1833                 (void *)(cblk->sampleRate));
   1834             mAudioMixer->setParameter(
   1835                 AudioMixer::TRACK,
   1836                 AudioMixer::MAIN_BUFFER, (void *)track->mainBuffer());
   1837             mAudioMixer->setParameter(
   1838                 AudioMixer::TRACK,
   1839                 AudioMixer::AUX_BUFFER, (void *)track->auxBuffer());
   1840 
   1841             // reset retry count
   1842             track->mRetryCount = kMaxTrackRetries;
   1843             mixerStatus = MIXER_TRACKS_READY;
   1844         } else {
   1845             //LOGV("track %d u=%08x, s=%08x [NOT READY] on thread %p", track->name(), cblk->user, cblk->server, this);
   1846             if (track->isStopped()) {
   1847                 track->reset();
   1848             }
   1849             if (track->isTerminated() || track->isStopped() || track->isPaused()) {
   1850                 // We have consumed all the buffers of this track.
   1851                 // Remove it from the list of active tracks.
   1852                 tracksToRemove->add(track);
   1853             } else {
   1854                 // No buffers for this track. Give it a few chances to
   1855                 // fill a buffer, then remove it from active list.
   1856                 if (--(track->mRetryCount) <= 0) {
   1857                     LOGV("BUFFER TIMEOUT: remove(%d) from active list on thread %p", track->name(), this);
   1858                     tracksToRemove->add(track);
   1859                     // indicate to client process that the track was disabled because of underrun
   1860                     cblk->flags |= CBLK_DISABLED_ON;
   1861                 } else if (mixerStatus != MIXER_TRACKS_READY) {
   1862                     mixerStatus = MIXER_TRACKS_ENABLED;
   1863                 }
   1864             }
   1865             mAudioMixer->disable(AudioMixer::MIXING);
   1866         }
   1867     }
   1868 
   1869     // remove all the tracks that need to be...
   1870     count = tracksToRemove->size();
   1871     if (UNLIKELY(count)) {
   1872         for (size_t i=0 ; i<count ; i++) {
   1873             const sp<Track>& track = tracksToRemove->itemAt(i);
   1874             mActiveTracks.remove(track);
   1875             if (track->mainBuffer() != mMixBuffer) {
   1876                 chain = getEffectChain_l(track->sessionId());
   1877                 if (chain != 0) {
   1878                     LOGV("stopping track on chain %p for session Id: %d", chain.get(), track->sessionId());
   1879                     chain->stopTrack();
   1880                 }
   1881             }
   1882             if (track->isTerminated()) {
   1883                 mTracks.remove(track);
   1884                 deleteTrackName_l(track->mName);
   1885             }
   1886         }
   1887     }
   1888 
   1889     // mix buffer must be cleared if all tracks are connected to an
   1890     // effect chain as in this case the mixer will not write to
   1891     // mix buffer and track effects will accumulate into it
   1892     if (mixedTracks != 0 && mixedTracks == tracksWithEffect) {
   1893         memset(mMixBuffer, 0, mFrameCount * mChannelCount * sizeof(int16_t));
   1894     }
   1895 
   1896     return mixerStatus;
   1897 }
   1898 
   1899 void AudioFlinger::MixerThread::invalidateTracks(int streamType)
   1900 {
   1901     LOGV ("MixerThread::invalidateTracks() mixer %p, streamType %d, mTracks.size %d",
   1902             this,  streamType, mTracks.size());
   1903     Mutex::Autolock _l(mLock);
   1904 
   1905     size_t size = mTracks.size();
   1906     for (size_t i = 0; i < size; i++) {
   1907         sp<Track> t = mTracks[i];
   1908         if (t->type() == streamType) {
   1909             t->mCblk->lock.lock();
   1910             t->mCblk->flags |= CBLK_INVALID_ON;
   1911             t->mCblk->cv.signal();
   1912             t->mCblk->lock.unlock();
   1913         }
   1914     }
   1915 }
   1916 
   1917 
   1918 // getTrackName_l() must be called with ThreadBase::mLock held
   1919 int AudioFlinger::MixerThread::getTrackName_l()
   1920 {
   1921     return mAudioMixer->getTrackName();
   1922 }
   1923 
   1924 // deleteTrackName_l() must be called with ThreadBase::mLock held
   1925 void AudioFlinger::MixerThread::deleteTrackName_l(int name)
   1926 {
   1927     LOGV("remove track (%d) and delete from mixer", name);
   1928     mAudioMixer->deleteTrackName(name);
   1929 }
   1930 
   1931 // checkForNewParameters_l() must be called with ThreadBase::mLock held
   1932 bool AudioFlinger::MixerThread::checkForNewParameters_l()
   1933 {
   1934     bool reconfig = false;
   1935 
   1936     while (!mNewParameters.isEmpty()) {
   1937         status_t status = NO_ERROR;
   1938         String8 keyValuePair = mNewParameters[0];
   1939         AudioParameter param = AudioParameter(keyValuePair);
   1940         int value;
   1941 
   1942         if (param.getInt(String8(AudioParameter::keySamplingRate), value) == NO_ERROR) {
   1943             reconfig = true;
   1944         }
   1945         if (param.getInt(String8(AudioParameter::keyFormat), value) == NO_ERROR) {
   1946             if (value != AudioSystem::PCM_16_BIT) {
   1947                 status = BAD_VALUE;
   1948             } else {
   1949                 reconfig = true;
   1950             }
   1951         }
   1952         if (param.getInt(String8(AudioParameter::keyChannels), value) == NO_ERROR) {
   1953             if (value != AudioSystem::CHANNEL_OUT_STEREO) {
   1954                 status = BAD_VALUE;
   1955             } else {
   1956                 reconfig = true;
   1957             }
   1958         }
   1959         if (param.getInt(String8(AudioParameter::keyFrameCount), value) == NO_ERROR) {
   1960             // do not accept frame count changes if tracks are open as the track buffer
   1961             // size depends on frame count and correct behavior would not be garantied
   1962             // if frame count is changed after track creation
   1963             if (!mTracks.isEmpty()) {
   1964                 status = INVALID_OPERATION;
   1965             } else {
   1966                 reconfig = true;
   1967             }
   1968         }
   1969         if (param.getInt(String8(AudioParameter::keyRouting), value) == NO_ERROR) {
   1970             // forward device change to effects that have requested to be
   1971             // aware of attached audio device.
   1972             mDevice = (uint32_t)value;
   1973             for (size_t i = 0; i < mEffectChains.size(); i++) {
   1974                 mEffectChains[i]->setDevice_l(mDevice);
   1975             }
   1976         }
   1977 
   1978         if (status == NO_ERROR) {
   1979             status = mOutput->setParameters(keyValuePair);
   1980             if (!mStandby && status == INVALID_OPERATION) {
   1981                mOutput->standby();
   1982                mStandby = true;
   1983                mBytesWritten = 0;
   1984                status = mOutput->setParameters(keyValuePair);
   1985             }
   1986             if (status == NO_ERROR && reconfig) {
   1987                 delete mAudioMixer;
   1988                 readOutputParameters();
   1989                 mAudioMixer = new AudioMixer(mFrameCount, mSampleRate);
   1990                 for (size_t i = 0; i < mTracks.size() ; i++) {
   1991                     int name = getTrackName_l();
   1992                     if (name < 0) break;
   1993                     mTracks[i]->mName = name;
   1994                     // limit track sample rate to 2 x new output sample rate
   1995                     if (mTracks[i]->mCblk->sampleRate > 2 * sampleRate()) {
   1996                         mTracks[i]->mCblk->sampleRate = 2 * sampleRate();
   1997                     }
   1998                 }
   1999                 sendConfigEvent_l(AudioSystem::OUTPUT_CONFIG_CHANGED);
   2000             }
   2001         }
   2002 
   2003         mNewParameters.removeAt(0);
   2004 
   2005         mParamStatus = status;
   2006         mParamCond.signal();
   2007         mWaitWorkCV.wait(mLock);
   2008     }
   2009     return reconfig;
   2010 }
   2011 
   2012 status_t AudioFlinger::MixerThread::dumpInternals(int fd, const Vector<String16>& args)
   2013 {
   2014     const size_t SIZE = 256;
   2015     char buffer[SIZE];
   2016     String8 result;
   2017 
   2018     PlaybackThread::dumpInternals(fd, args);
   2019 
   2020     snprintf(buffer, SIZE, "AudioMixer tracks: %08x\n", mAudioMixer->trackNames());
   2021     result.append(buffer);
   2022     write(fd, result.string(), result.size());
   2023     return NO_ERROR;
   2024 }
   2025 
   2026 uint32_t AudioFlinger::MixerThread::activeSleepTimeUs()
   2027 {
   2028     return (uint32_t)(mOutput->latency() * 1000) / 2;
   2029 }
   2030 
   2031 uint32_t AudioFlinger::MixerThread::idleSleepTimeUs()
   2032 {
   2033     return (uint32_t)(((mFrameCount * 1000) / mSampleRate) * 1000) / 2;
   2034 }
   2035 
   2036 uint32_t AudioFlinger::MixerThread::suspendSleepTimeUs()
   2037 {
   2038     return (uint32_t)(((mFrameCount * 1000) / mSampleRate) * 1000);
   2039 }
   2040 
   2041 // ----------------------------------------------------------------------------
   2042 AudioFlinger::DirectOutputThread::DirectOutputThread(const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id, uint32_t device)
   2043     :   PlaybackThread(audioFlinger, output, id, device)
   2044 {
   2045     mType = PlaybackThread::DIRECT;
   2046 }
   2047 
   2048 AudioFlinger::DirectOutputThread::~DirectOutputThread()
   2049 {
   2050 }
   2051 
   2052 
   2053 static inline int16_t clamp16(int32_t sample)
   2054 {
   2055     if ((sample>>15) ^ (sample>>31))
   2056         sample = 0x7FFF ^ (sample>>31);
   2057     return sample;
   2058 }
   2059 
   2060 static inline
   2061 int32_t mul(int16_t in, int16_t v)
   2062 {
   2063 #if defined(__arm__) && !defined(__thumb__)
   2064     int32_t out;
   2065     asm( "smulbb %[out], %[in], %[v] \n"
   2066          : [out]"=r"(out)
   2067          : [in]"%r"(in), [v]"r"(v)
   2068          : );
   2069     return out;
   2070 #else
   2071     return in * int32_t(v);
   2072 #endif
   2073 }
   2074 
   2075 void AudioFlinger::DirectOutputThread::applyVolume(uint16_t leftVol, uint16_t rightVol, bool ramp)
   2076 {
   2077     // Do not apply volume on compressed audio
   2078     if (!AudioSystem::isLinearPCM(mFormat)) {
   2079         return;
   2080     }
   2081 
   2082     // convert to signed 16 bit before volume calculation
   2083     if (mFormat == AudioSystem::PCM_8_BIT) {
   2084         size_t count = mFrameCount * mChannelCount;
   2085         uint8_t *src = (uint8_t *)mMixBuffer + count-1;
   2086         int16_t *dst = mMixBuffer + count-1;
   2087         while(count--) {
   2088             *dst-- = (int16_t)(*src--^0x80) << 8;
   2089         }
   2090     }
   2091 
   2092     size_t frameCount = mFrameCount;
   2093     int16_t *out = mMixBuffer;
   2094     if (ramp) {
   2095         if (mChannelCount == 1) {
   2096             int32_t d = ((int32_t)leftVol - (int32_t)mLeftVolShort) << 16;
   2097             int32_t vlInc = d / (int32_t)frameCount;
   2098             int32_t vl = ((int32_t)mLeftVolShort << 16);
   2099             do {
   2100                 out[0] = clamp16(mul(out[0], vl >> 16) >> 12);
   2101                 out++;
   2102                 vl += vlInc;
   2103             } while (--frameCount);
   2104 
   2105         } else {
   2106             int32_t d = ((int32_t)leftVol - (int32_t)mLeftVolShort) << 16;
   2107             int32_t vlInc = d / (int32_t)frameCount;
   2108             d = ((int32_t)rightVol - (int32_t)mRightVolShort) << 16;
   2109             int32_t vrInc = d / (int32_t)frameCount;
   2110             int32_t vl = ((int32_t)mLeftVolShort << 16);
   2111             int32_t vr = ((int32_t)mRightVolShort << 16);
   2112             do {
   2113                 out[0] = clamp16(mul(out[0], vl >> 16) >> 12);
   2114                 out[1] = clamp16(mul(out[1], vr >> 16) >> 12);
   2115                 out += 2;
   2116                 vl += vlInc;
   2117                 vr += vrInc;
   2118             } while (--frameCount);
   2119         }
   2120     } else {
   2121         if (mChannelCount == 1) {
   2122             do {
   2123                 out[0] = clamp16(mul(out[0], leftVol) >> 12);
   2124                 out++;
   2125             } while (--frameCount);
   2126         } else {
   2127             do {
   2128                 out[0] = clamp16(mul(out[0], leftVol) >> 12);
   2129                 out[1] = clamp16(mul(out[1], rightVol) >> 12);
   2130                 out += 2;
   2131             } while (--frameCount);
   2132         }
   2133     }
   2134 
   2135     // convert back to unsigned 8 bit after volume calculation
   2136     if (mFormat == AudioSystem::PCM_8_BIT) {
   2137         size_t count = mFrameCount * mChannelCount;
   2138         int16_t *src = mMixBuffer;
   2139         uint8_t *dst = (uint8_t *)mMixBuffer;
   2140         while(count--) {
   2141             *dst++ = (uint8_t)(((int32_t)*src++ + (1<<7)) >> 8)^0x80;
   2142         }
   2143     }
   2144 
   2145     mLeftVolShort = leftVol;
   2146     mRightVolShort = rightVol;
   2147 }
   2148 
   2149 bool AudioFlinger::DirectOutputThread::threadLoop()
   2150 {
   2151     uint32_t mixerStatus = MIXER_IDLE;
   2152     sp<Track> trackToRemove;
   2153     sp<Track> activeTrack;
   2154     nsecs_t standbyTime = systemTime();
   2155     int8_t *curBuf;
   2156     size_t mixBufferSize = mFrameCount*mFrameSize;
   2157     uint32_t activeSleepTime = activeSleepTimeUs();
   2158     uint32_t idleSleepTime = idleSleepTimeUs();
   2159     uint32_t sleepTime = idleSleepTime;
   2160     // use shorter standby delay as on normal output to release
   2161     // hardware resources as soon as possible
   2162     nsecs_t standbyDelay = microseconds(activeSleepTime*2);
   2163 
   2164     while (!exitPending())
   2165     {
   2166         bool rampVolume;
   2167         uint16_t leftVol;
   2168         uint16_t rightVol;
   2169         Vector< sp<EffectChain> > effectChains;
   2170 
   2171         processConfigEvents();
   2172 
   2173         mixerStatus = MIXER_IDLE;
   2174 
   2175         { // scope for the mLock
   2176 
   2177             Mutex::Autolock _l(mLock);
   2178 
   2179             if (checkForNewParameters_l()) {
   2180                 mixBufferSize = mFrameCount*mFrameSize;
   2181                 activeSleepTime = activeSleepTimeUs();
   2182                 idleSleepTime = idleSleepTimeUs();
   2183                 standbyDelay = microseconds(activeSleepTime*2);
   2184             }
   2185 
   2186             // put audio hardware into standby after short delay
   2187             if UNLIKELY((!mActiveTracks.size() && systemTime() > standbyTime) ||
   2188                         mSuspended) {
   2189                 // wait until we have something to do...
   2190                 if (!mStandby) {
   2191                     LOGV("Audio hardware entering standby, mixer %p\n", this);
   2192                     mOutput->standby();
   2193                     mStandby = true;
   2194                     mBytesWritten = 0;
   2195                 }
   2196 
   2197                 if (!mActiveTracks.size() && mConfigEvents.isEmpty()) {
   2198                     // we're about to wait, flush the binder command buffer
   2199                     IPCThreadState::self()->flushCommands();
   2200 
   2201                     if (exitPending()) break;
   2202 
   2203                     LOGV("DirectOutputThread %p TID %d going to sleep\n", this, gettid());
   2204                     mWaitWorkCV.wait(mLock);
   2205                     LOGV("DirectOutputThread %p TID %d waking up in active mode\n", this, gettid());
   2206 
   2207                     if (mMasterMute == false) {
   2208                         char value[PROPERTY_VALUE_MAX];
   2209                         property_get("ro.audio.silent", value, "0");
   2210                         if (atoi(value)) {
   2211                             LOGD("Silence is golden");
   2212                             setMasterMute(true);
   2213                         }
   2214                     }
   2215 
   2216                     standbyTime = systemTime() + standbyDelay;
   2217                     sleepTime = idleSleepTime;
   2218                     continue;
   2219                 }
   2220             }
   2221 
   2222             effectChains = mEffectChains;
   2223 
   2224             // find out which tracks need to be processed
   2225             if (mActiveTracks.size() != 0) {
   2226                 sp<Track> t = mActiveTracks[0].promote();
   2227                 if (t == 0) continue;
   2228 
   2229                 Track* const track = t.get();
   2230                 audio_track_cblk_t* cblk = track->cblk();
   2231 
   2232                 // The first time a track is added we wait
   2233                 // for all its buffers to be filled before processing it
   2234                 if (cblk->framesReady() && track->isReady() &&
   2235                         !track->isPaused() && !track->isTerminated())
   2236                 {
   2237                     //LOGV("track %d u=%08x, s=%08x [OK]", track->name(), cblk->user, cblk->server);
   2238 
   2239                     if (track->mFillingUpStatus == Track::FS_FILLED) {
   2240                         track->mFillingUpStatus = Track::FS_ACTIVE;
   2241                         mLeftVolFloat = mRightVolFloat = 0;
   2242                         mLeftVolShort = mRightVolShort = 0;
   2243                         if (track->mState == TrackBase::RESUMING) {
   2244                             track->mState = TrackBase::ACTIVE;
   2245                             rampVolume = true;
   2246                         }
   2247                     } else if (cblk->server != 0) {
   2248                         // If the track is stopped before the first frame was mixed,
   2249                         // do not apply ramp
   2250                         rampVolume = true;
   2251                     }
   2252                     // compute volume for this track
   2253                     float left, right;
   2254                     if (track->isMuted() || mMasterMute || track->isPausing() ||
   2255                         mStreamTypes[track->type()].mute) {
   2256                         left = right = 0;
   2257                         if (track->isPausing()) {
   2258                             track->setPaused();
   2259                         }
   2260                     } else {
   2261                         float typeVolume = mStreamTypes[track->type()].volume;
   2262                         float v = mMasterVolume * typeVolume;
   2263                         float v_clamped = v * cblk->volume[0];
   2264                         if (v_clamped > MAX_GAIN) v_clamped = MAX_GAIN;
   2265                         left = v_clamped/MAX_GAIN;
   2266                         v_clamped = v * cblk->volume[1];
   2267                         if (v_clamped > MAX_GAIN) v_clamped = MAX_GAIN;
   2268                         right = v_clamped/MAX_GAIN;
   2269                     }
   2270 
   2271                     if (left != mLeftVolFloat || right != mRightVolFloat) {
   2272                         mLeftVolFloat = left;
   2273                         mRightVolFloat = right;
   2274 
   2275                         // If audio HAL implements volume control,
   2276                         // force software volume to nominal value
   2277                         if (mOutput->setVolume(left, right) == NO_ERROR) {
   2278                             left = 1.0f;
   2279                             right = 1.0f;
   2280                         }
   2281 
   2282                         // Convert volumes from float to 8.24
   2283                         uint32_t vl = (uint32_t)(left * (1 << 24));
   2284                         uint32_t vr = (uint32_t)(right * (1 << 24));
   2285 
   2286                         // Delegate volume control to effect in track effect chain if needed
   2287                         // only one effect chain can be present on DirectOutputThread, so if
   2288                         // there is one, the track is connected to it
   2289                         if (!effectChains.isEmpty()) {
   2290                             // Do not ramp volume if volume is controlled by effect
   2291                             if(effectChains[0]->setVolume_l(&vl, &vr)) {
   2292                                 rampVolume = false;
   2293                             }
   2294                         }
   2295 
   2296                         // Convert volumes from 8.24 to 4.12 format
   2297                         uint32_t v_clamped = (vl + (1 << 11)) >> 12;
   2298                         if (v_clamped > MAX_GAIN_INT) v_clamped = MAX_GAIN_INT;
   2299                         leftVol = (uint16_t)v_clamped;
   2300                         v_clamped = (vr + (1 << 11)) >> 12;
   2301                         if (v_clamped > MAX_GAIN_INT) v_clamped = MAX_GAIN_INT;
   2302                         rightVol = (uint16_t)v_clamped;
   2303                     } else {
   2304                         leftVol = mLeftVolShort;
   2305                         rightVol = mRightVolShort;
   2306                         rampVolume = false;
   2307                     }
   2308 
   2309                     // reset retry count
   2310                     track->mRetryCount = kMaxTrackRetriesDirect;
   2311                     activeTrack = t;
   2312                     mixerStatus = MIXER_TRACKS_READY;
   2313                 } else {
   2314                     //LOGV("track %d u=%08x, s=%08x [NOT READY]", track->name(), cblk->user, cblk->server);
   2315                     if (track->isStopped()) {
   2316                         track->reset();
   2317                     }
   2318                     if (track->isTerminated() || track->isStopped() || track->isPaused()) {
   2319                         // We have consumed all the buffers of this track.
   2320                         // Remove it from the list of active tracks.
   2321                         trackToRemove = track;
   2322                     } else {
   2323                         // No buffers for this track. Give it a few chances to
   2324                         // fill a buffer, then remove it from active list.
   2325                         if (--(track->mRetryCount) <= 0) {
   2326                             LOGV("BUFFER TIMEOUT: remove(%d) from active list", track->name());
   2327                             trackToRemove = track;
   2328                         } else {
   2329                             mixerStatus = MIXER_TRACKS_ENABLED;
   2330                         }
   2331                     }
   2332                 }
   2333             }
   2334 
   2335             // remove all the tracks that need to be...
   2336             if (UNLIKELY(trackToRemove != 0)) {
   2337                 mActiveTracks.remove(trackToRemove);
   2338                 if (!effectChains.isEmpty()) {
   2339                     LOGV("stopping track on chain %p for session Id: %d", effectChains[0].get(),
   2340                             trackToRemove->sessionId());
   2341                     effectChains[0]->stopTrack();
   2342                 }
   2343                 if (trackToRemove->isTerminated()) {
   2344                     mTracks.remove(trackToRemove);
   2345                     deleteTrackName_l(trackToRemove->mName);
   2346                 }
   2347             }
   2348 
   2349             lockEffectChains_l(effectChains);
   2350        }
   2351 
   2352         if (LIKELY(mixerStatus == MIXER_TRACKS_READY)) {
   2353             AudioBufferProvider::Buffer buffer;
   2354             size_t frameCount = mFrameCount;
   2355             curBuf = (int8_t *)mMixBuffer;
   2356             // output audio to hardware
   2357             while (frameCount) {
   2358                 buffer.frameCount = frameCount;
   2359                 activeTrack->getNextBuffer(&buffer);
   2360                 if (UNLIKELY(buffer.raw == 0)) {
   2361                     memset(curBuf, 0, frameCount * mFrameSize);
   2362                     break;
   2363                 }
   2364                 memcpy(curBuf, buffer.raw, buffer.frameCount * mFrameSize);
   2365                 frameCount -= buffer.frameCount;
   2366                 curBuf += buffer.frameCount * mFrameSize;
   2367                 activeTrack->releaseBuffer(&buffer);
   2368             }
   2369             sleepTime = 0;
   2370             standbyTime = systemTime() + standbyDelay;
   2371         } else {
   2372             if (sleepTime == 0) {
   2373                 if (mixerStatus == MIXER_TRACKS_ENABLED) {
   2374                     sleepTime = activeSleepTime;
   2375                 } else {
   2376                     sleepTime = idleSleepTime;
   2377                 }
   2378             } else if (mBytesWritten != 0 && AudioSystem::isLinearPCM(mFormat)) {
   2379                 memset (mMixBuffer, 0, mFrameCount * mFrameSize);
   2380                 sleepTime = 0;
   2381             }
   2382         }
   2383 
   2384         if (mSuspended) {
   2385             sleepTime = suspendSleepTimeUs();
   2386         }
   2387         // sleepTime == 0 means we must write to audio hardware
   2388         if (sleepTime == 0) {
   2389             if (mixerStatus == MIXER_TRACKS_READY) {
   2390                 applyVolume(leftVol, rightVol, rampVolume);
   2391             }
   2392             for (size_t i = 0; i < effectChains.size(); i ++) {
   2393                 effectChains[i]->process_l();
   2394             }
   2395             unlockEffectChains(effectChains);
   2396 
   2397             mLastWriteTime = systemTime();
   2398             mInWrite = true;
   2399             mBytesWritten += mixBufferSize;
   2400             int bytesWritten = (int)mOutput->write(mMixBuffer, mixBufferSize);
   2401             if (bytesWritten < 0) mBytesWritten -= mixBufferSize;
   2402             mNumWrites++;
   2403             mInWrite = false;
   2404             mStandby = false;
   2405         } else {
   2406             unlockEffectChains(effectChains);
   2407             usleep(sleepTime);
   2408         }
   2409 
   2410         // finally let go of removed track, without the lock held
   2411         // since we can't guarantee the destructors won't acquire that
   2412         // same lock.
   2413         trackToRemove.clear();
   2414         activeTrack.clear();
   2415 
   2416         // Effect chains will be actually deleted here if they were removed from
   2417         // mEffectChains list during mixing or effects processing
   2418         effectChains.clear();
   2419     }
   2420 
   2421     if (!mStandby) {
   2422         mOutput->standby();
   2423     }
   2424 
   2425     LOGV("DirectOutputThread %p exiting", this);
   2426     return false;
   2427 }
   2428 
   2429 // getTrackName_l() must be called with ThreadBase::mLock held
   2430 int AudioFlinger::DirectOutputThread::getTrackName_l()
   2431 {
   2432     return 0;
   2433 }
   2434 
   2435 // deleteTrackName_l() must be called with ThreadBase::mLock held
   2436 void AudioFlinger::DirectOutputThread::deleteTrackName_l(int name)
   2437 {
   2438 }
   2439 
   2440 // checkForNewParameters_l() must be called with ThreadBase::mLock held
   2441 bool AudioFlinger::DirectOutputThread::checkForNewParameters_l()
   2442 {
   2443     bool reconfig = false;
   2444 
   2445     while (!mNewParameters.isEmpty()) {
   2446         status_t status = NO_ERROR;
   2447         String8 keyValuePair = mNewParameters[0];
   2448         AudioParameter param = AudioParameter(keyValuePair);
   2449         int value;
   2450 
   2451         if (param.getInt(String8(AudioParameter::keyFrameCount), value) == NO_ERROR) {
   2452             // do not accept frame count changes if tracks are open as the track buffer
   2453             // size depends on frame count and correct behavior would not be garantied
   2454             // if frame count is changed after track creation
   2455             if (!mTracks.isEmpty()) {
   2456                 status = INVALID_OPERATION;
   2457             } else {
   2458                 reconfig = true;
   2459             }
   2460         }
   2461         if (status == NO_ERROR) {
   2462             status = mOutput->setParameters(keyValuePair);
   2463             if (!mStandby && status == INVALID_OPERATION) {
   2464                mOutput->standby();
   2465                mStandby = true;
   2466                mBytesWritten = 0;
   2467                status = mOutput->setParameters(keyValuePair);
   2468             }
   2469             if (status == NO_ERROR && reconfig) {
   2470                 readOutputParameters();
   2471                 sendConfigEvent_l(AudioSystem::OUTPUT_CONFIG_CHANGED);
   2472             }
   2473         }
   2474 
   2475         mNewParameters.removeAt(0);
   2476 
   2477         mParamStatus = status;
   2478         mParamCond.signal();
   2479         mWaitWorkCV.wait(mLock);
   2480     }
   2481     return reconfig;
   2482 }
   2483 
   2484 uint32_t AudioFlinger::DirectOutputThread::activeSleepTimeUs()
   2485 {
   2486     uint32_t time;
   2487     if (AudioSystem::isLinearPCM(mFormat)) {
   2488         time = (uint32_t)(mOutput->latency() * 1000) / 2;
   2489     } else {
   2490         time = 10000;
   2491     }
   2492     return time;
   2493 }
   2494 
   2495 uint32_t AudioFlinger::DirectOutputThread::idleSleepTimeUs()
   2496 {
   2497     uint32_t time;
   2498     if (AudioSystem::isLinearPCM(mFormat)) {
   2499         time = (uint32_t)(((mFrameCount * 1000) / mSampleRate) * 1000) / 2;
   2500     } else {
   2501         time = 10000;
   2502     }
   2503     return time;
   2504 }
   2505 
   2506 uint32_t AudioFlinger::DirectOutputThread::suspendSleepTimeUs()
   2507 {
   2508     uint32_t time;
   2509     if (AudioSystem::isLinearPCM(mFormat)) {
   2510         time = (uint32_t)(((mFrameCount * 1000) / mSampleRate) * 1000);
   2511     } else {
   2512         time = 10000;
   2513     }
   2514     return time;
   2515 }
   2516 
   2517 
   2518 // ----------------------------------------------------------------------------
   2519 
   2520 AudioFlinger::DuplicatingThread::DuplicatingThread(const sp<AudioFlinger>& audioFlinger, AudioFlinger::MixerThread* mainThread, int id)
   2521     :   MixerThread(audioFlinger, mainThread->getOutput(), id, mainThread->device()), mWaitTimeMs(UINT_MAX)
   2522 {
   2523     mType = PlaybackThread::DUPLICATING;
   2524     addOutputTrack(mainThread);
   2525 }
   2526 
   2527 AudioFlinger::DuplicatingThread::~DuplicatingThread()
   2528 {
   2529     for (size_t i = 0; i < mOutputTracks.size(); i++) {
   2530         mOutputTracks[i]->destroy();
   2531     }
   2532     mOutputTracks.clear();
   2533 }
   2534 
   2535 bool AudioFlinger::DuplicatingThread::threadLoop()
   2536 {
   2537     Vector< sp<Track> > tracksToRemove;
   2538     uint32_t mixerStatus = MIXER_IDLE;
   2539     nsecs_t standbyTime = systemTime();
   2540     size_t mixBufferSize = mFrameCount*mFrameSize;
   2541     SortedVector< sp<OutputTrack> > outputTracks;
   2542     uint32_t writeFrames = 0;
   2543     uint32_t activeSleepTime = activeSleepTimeUs();
   2544     uint32_t idleSleepTime = idleSleepTimeUs();
   2545     uint32_t sleepTime = idleSleepTime;
   2546     Vector< sp<EffectChain> > effectChains;
   2547 
   2548     while (!exitPending())
   2549     {
   2550         processConfigEvents();
   2551 
   2552         mixerStatus = MIXER_IDLE;
   2553         { // scope for the mLock
   2554 
   2555             Mutex::Autolock _l(mLock);
   2556 
   2557             if (checkForNewParameters_l()) {
   2558                 mixBufferSize = mFrameCount*mFrameSize;
   2559                 updateWaitTime();
   2560                 activeSleepTime = activeSleepTimeUs();
   2561                 idleSleepTime = idleSleepTimeUs();
   2562             }
   2563 
   2564             const SortedVector< wp<Track> >& activeTracks = mActiveTracks;
   2565 
   2566             for (size_t i = 0; i < mOutputTracks.size(); i++) {
   2567                 outputTracks.add(mOutputTracks[i]);
   2568             }
   2569 
   2570             // put audio hardware into standby after short delay
   2571             if UNLIKELY((!activeTracks.size() && systemTime() > standbyTime) ||
   2572                          mSuspended) {
   2573                 if (!mStandby) {
   2574                     for (size_t i = 0; i < outputTracks.size(); i++) {
   2575                         outputTracks[i]->stop();
   2576                     }
   2577                     mStandby = true;
   2578                     mBytesWritten = 0;
   2579                 }
   2580 
   2581                 if (!activeTracks.size() && mConfigEvents.isEmpty()) {
   2582                     // we're about to wait, flush the binder command buffer
   2583                     IPCThreadState::self()->flushCommands();
   2584                     outputTracks.clear();
   2585 
   2586                     if (exitPending()) break;
   2587 
   2588                     LOGV("DuplicatingThread %p TID %d going to sleep\n", this, gettid());
   2589                     mWaitWorkCV.wait(mLock);
   2590                     LOGV("DuplicatingThread %p TID %d waking up\n", this, gettid());
   2591                     if (mMasterMute == false) {
   2592                         char value[PROPERTY_VALUE_MAX];
   2593                         property_get("ro.audio.silent", value, "0");
   2594                         if (atoi(value)) {
   2595                             LOGD("Silence is golden");
   2596                             setMasterMute(true);
   2597                         }
   2598                     }
   2599 
   2600                     standbyTime = systemTime() + kStandbyTimeInNsecs;
   2601                     sleepTime = idleSleepTime;
   2602                     continue;
   2603                 }
   2604             }
   2605 
   2606             mixerStatus = prepareTracks_l(activeTracks, &tracksToRemove);
   2607 
   2608             // prevent any changes in effect chain list and in each effect chain
   2609             // during mixing and effect process as the audio buffers could be deleted
   2610             // or modified if an effect is created or deleted
   2611             lockEffectChains_l(effectChains);
   2612         }
   2613 
   2614         if (LIKELY(mixerStatus == MIXER_TRACKS_READY)) {
   2615             // mix buffers...
   2616             if (outputsReady(outputTracks)) {
   2617                 mAudioMixer->process();
   2618             } else {
   2619                 memset(mMixBuffer, 0, mixBufferSize);
   2620             }
   2621             sleepTime = 0;
   2622             writeFrames = mFrameCount;
   2623         } else {
   2624             if (sleepTime == 0) {
   2625                 if (mixerStatus == MIXER_TRACKS_ENABLED) {
   2626                     sleepTime = activeSleepTime;
   2627                 } else {
   2628                     sleepTime = idleSleepTime;
   2629                 }
   2630             } else if (mBytesWritten != 0) {
   2631                 // flush remaining overflow buffers in output tracks
   2632                 for (size_t i = 0; i < outputTracks.size(); i++) {
   2633                     if (outputTracks[i]->isActive()) {
   2634                         sleepTime = 0;
   2635                         writeFrames = 0;
   2636                         memset(mMixBuffer, 0, mixBufferSize);
   2637                         break;
   2638                     }
   2639                 }
   2640             }
   2641         }
   2642 
   2643         if (mSuspended) {
   2644             sleepTime = suspendSleepTimeUs();
   2645         }
   2646         // sleepTime == 0 means we must write to audio hardware
   2647         if (sleepTime == 0) {
   2648             for (size_t i = 0; i < effectChains.size(); i ++) {
   2649                 effectChains[i]->process_l();
   2650             }
   2651             // enable changes in effect chain
   2652             unlockEffectChains(effectChains);
   2653 
   2654             standbyTime = systemTime() + kStandbyTimeInNsecs;
   2655             for (size_t i = 0; i < outputTracks.size(); i++) {
   2656                 outputTracks[i]->write(mMixBuffer, writeFrames);
   2657             }
   2658             mStandby = false;
   2659             mBytesWritten += mixBufferSize;
   2660         } else {
   2661             // enable changes in effect chain
   2662             unlockEffectChains(effectChains);
   2663             usleep(sleepTime);
   2664         }
   2665 
   2666         // finally let go of all our tracks, without the lock held
   2667         // since we can't guarantee the destructors won't acquire that
   2668         // same lock.
   2669         tracksToRemove.clear();
   2670         outputTracks.clear();
   2671 
   2672         // Effect chains will be actually deleted here if they were removed from
   2673         // mEffectChains list during mixing or effects processing
   2674         effectChains.clear();
   2675     }
   2676 
   2677     return false;
   2678 }
   2679 
   2680 void AudioFlinger::DuplicatingThread::addOutputTrack(MixerThread *thread)
   2681 {
   2682     int frameCount = (3 * mFrameCount * mSampleRate) / thread->sampleRate();
   2683     OutputTrack *outputTrack = new OutputTrack((ThreadBase *)thread,
   2684                                             this,
   2685                                             mSampleRate,
   2686                                             mFormat,
   2687                                             mChannelCount,
   2688                                             frameCount);
   2689     if (outputTrack->cblk() != NULL) {
   2690         thread->setStreamVolume(AudioSystem::NUM_STREAM_TYPES, 1.0f);
   2691         mOutputTracks.add(outputTrack);
   2692         LOGV("addOutputTrack() track %p, on thread %p", outputTrack, thread);
   2693         updateWaitTime();
   2694     }
   2695 }
   2696 
   2697 void AudioFlinger::DuplicatingThread::removeOutputTrack(MixerThread *thread)
   2698 {
   2699     Mutex::Autolock _l(mLock);
   2700     for (size_t i = 0; i < mOutputTracks.size(); i++) {
   2701         if (mOutputTracks[i]->thread() == (ThreadBase *)thread) {
   2702             mOutputTracks[i]->destroy();
   2703             mOutputTracks.removeAt(i);
   2704             updateWaitTime();
   2705             return;
   2706         }
   2707     }
   2708     LOGV("removeOutputTrack(): unkonwn thread: %p", thread);
   2709 }
   2710 
   2711 void AudioFlinger::DuplicatingThread::updateWaitTime()
   2712 {
   2713     mWaitTimeMs = UINT_MAX;
   2714     for (size_t i = 0; i < mOutputTracks.size(); i++) {
   2715         sp<ThreadBase> strong = mOutputTracks[i]->thread().promote();
   2716         if (strong != NULL) {
   2717             uint32_t waitTimeMs = (strong->frameCount() * 2 * 1000) / strong->sampleRate();
   2718             if (waitTimeMs < mWaitTimeMs) {
   2719                 mWaitTimeMs = waitTimeMs;
   2720             }
   2721         }
   2722     }
   2723 }
   2724 
   2725 
   2726 bool AudioFlinger::DuplicatingThread::outputsReady(SortedVector< sp<OutputTrack> > &outputTracks)
   2727 {
   2728     for (size_t i = 0; i < outputTracks.size(); i++) {
   2729         sp <ThreadBase> thread = outputTracks[i]->thread().promote();
   2730         if (thread == 0) {
   2731             LOGW("DuplicatingThread::outputsReady() could not promote thread on output track %p", outputTracks[i].get());
   2732             return false;
   2733         }
   2734         PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
   2735         if (playbackThread->standby() && !playbackThread->isSuspended()) {
   2736             LOGV("DuplicatingThread output track %p on thread %p Not Ready", outputTracks[i].get(), thread.get());
   2737             return false;
   2738         }
   2739     }
   2740     return true;
   2741 }
   2742 
   2743 uint32_t AudioFlinger::DuplicatingThread::activeSleepTimeUs()
   2744 {
   2745     return (mWaitTimeMs * 1000) / 2;
   2746 }
   2747 
   2748 // ----------------------------------------------------------------------------
   2749 
   2750 // TrackBase constructor must be called with AudioFlinger::mLock held
   2751 AudioFlinger::ThreadBase::TrackBase::TrackBase(
   2752             const wp<ThreadBase>& thread,
   2753             const sp<Client>& client,
   2754             uint32_t sampleRate,
   2755             int format,
   2756             int channelCount,
   2757             int frameCount,
   2758             uint32_t flags,
   2759             const sp<IMemory>& sharedBuffer,
   2760             int sessionId)
   2761     :   RefBase(),
   2762         mThread(thread),
   2763         mClient(client),
   2764         mCblk(0),
   2765         mFrameCount(0),
   2766         mState(IDLE),
   2767         mClientTid(-1),
   2768         mFormat(format),
   2769         mFlags(flags & ~SYSTEM_FLAGS_MASK),
   2770         mSessionId(sessionId)
   2771 {
   2772     LOGV_IF(sharedBuffer != 0, "sharedBuffer: %p, size: %d", sharedBuffer->pointer(), sharedBuffer->size());
   2773 
   2774     // LOGD("Creating track with %d buffers @ %d bytes", bufferCount, bufferSize);
   2775    size_t size = sizeof(audio_track_cblk_t);
   2776    size_t bufferSize = frameCount*channelCount*sizeof(int16_t);
   2777    if (sharedBuffer == 0) {
   2778        size += bufferSize;
   2779    }
   2780 
   2781    if (client != NULL) {
   2782         mCblkMemory = client->heap()->allocate(size);
   2783         if (mCblkMemory != 0) {
   2784             mCblk = static_cast<audio_track_cblk_t *>(mCblkMemory->pointer());
   2785             if (mCblk) { // construct the shared structure in-place.
   2786                 new(mCblk) audio_track_cblk_t();
   2787                 // clear all buffers
   2788                 mCblk->frameCount = frameCount;
   2789                 mCblk->sampleRate = sampleRate;
   2790                 mCblk->channelCount = (uint8_t)channelCount;
   2791                 if (sharedBuffer == 0) {
   2792                     mBuffer = (char*)mCblk + sizeof(audio_track_cblk_t);
   2793                     memset(mBuffer, 0, frameCount*channelCount*sizeof(int16_t));
   2794                     // Force underrun condition to avoid false underrun callback until first data is
   2795                     // written to buffer (other flags are cleared)
   2796                     mCblk->flags = CBLK_UNDERRUN_ON;
   2797                 } else {
   2798                     mBuffer = sharedBuffer->pointer();
   2799                 }
   2800                 mBufferEnd = (uint8_t *)mBuffer + bufferSize;
   2801             }
   2802         } else {
   2803             LOGE("not enough memory for AudioTrack size=%u", size);
   2804             client->heap()->dump("AudioTrack");
   2805             return;
   2806         }
   2807    } else {
   2808        mCblk = (audio_track_cblk_t *)(new uint8_t[size]);
   2809        if (mCblk) { // construct the shared structure in-place.
   2810            new(mCblk) audio_track_cblk_t();
   2811            // clear all buffers
   2812            mCblk->frameCount = frameCount;
   2813            mCblk->sampleRate = sampleRate;
   2814            mCblk->channelCount = (uint8_t)channelCount;
   2815            mBuffer = (char*)mCblk + sizeof(audio_track_cblk_t);
   2816            memset(mBuffer, 0, frameCount*channelCount*sizeof(int16_t));
   2817            // Force underrun condition to avoid false underrun callback until first data is
   2818            // written to buffer (other flags are cleared)
   2819            mCblk->flags = CBLK_UNDERRUN_ON;
   2820            mBufferEnd = (uint8_t *)mBuffer + bufferSize;
   2821        }
   2822    }
   2823 }
   2824 
   2825 AudioFlinger::ThreadBase::TrackBase::~TrackBase()
   2826 {
   2827     if (mCblk) {
   2828         mCblk->~audio_track_cblk_t();   // destroy our shared-structure.
   2829         if (mClient == NULL) {
   2830             delete mCblk;
   2831         }
   2832     }
   2833     mCblkMemory.clear();            // and free the shared memory
   2834     if (mClient != NULL) {
   2835         Mutex::Autolock _l(mClient->audioFlinger()->mLock);
   2836         mClient.clear();
   2837     }
   2838 }
   2839 
   2840 void AudioFlinger::ThreadBase::TrackBase::releaseBuffer(AudioBufferProvider::Buffer* buffer)
   2841 {
   2842     buffer->raw = 0;
   2843     mFrameCount = buffer->frameCount;
   2844     step();
   2845     buffer->frameCount = 0;
   2846 }
   2847 
   2848 bool AudioFlinger::ThreadBase::TrackBase::step() {
   2849     bool result;
   2850     audio_track_cblk_t* cblk = this->cblk();
   2851 
   2852     result = cblk->stepServer(mFrameCount);
   2853     if (!result) {
   2854         LOGV("stepServer failed acquiring cblk mutex");
   2855         mFlags |= STEPSERVER_FAILED;
   2856     }
   2857     return result;
   2858 }
   2859 
   2860 void AudioFlinger::ThreadBase::TrackBase::reset() {
   2861     audio_track_cblk_t* cblk = this->cblk();
   2862 
   2863     cblk->user = 0;
   2864     cblk->server = 0;
   2865     cblk->userBase = 0;
   2866     cblk->serverBase = 0;
   2867     mFlags &= (uint32_t)(~SYSTEM_FLAGS_MASK);
   2868     LOGV("TrackBase::reset");
   2869 }
   2870 
   2871 sp<IMemory> AudioFlinger::ThreadBase::TrackBase::getCblk() const
   2872 {
   2873     return mCblkMemory;
   2874 }
   2875 
   2876 int AudioFlinger::ThreadBase::TrackBase::sampleRate() const {
   2877     return (int)mCblk->sampleRate;
   2878 }
   2879 
   2880 int AudioFlinger::ThreadBase::TrackBase::channelCount() const {
   2881     return (int)mCblk->channelCount;
   2882 }
   2883 
   2884 void* AudioFlinger::ThreadBase::TrackBase::getBuffer(uint32_t offset, uint32_t frames) const {
   2885     audio_track_cblk_t* cblk = this->cblk();
   2886     int8_t *bufferStart = (int8_t *)mBuffer + (offset-cblk->serverBase)*cblk->frameSize;
   2887     int8_t *bufferEnd = bufferStart + frames * cblk->frameSize;
   2888 
   2889     // Check validity of returned pointer in case the track control block would have been corrupted.
   2890     if (bufferStart < mBuffer || bufferStart > bufferEnd || bufferEnd > mBufferEnd ||
   2891         ((unsigned long)bufferStart & (unsigned long)(cblk->frameSize - 1))) {
   2892         LOGE("TrackBase::getBuffer buffer out of range:\n    start: %p, end %p , mBuffer %p mBufferEnd %p\n    \
   2893                 server %d, serverBase %d, user %d, userBase %d, channelCount %d",
   2894                 bufferStart, bufferEnd, mBuffer, mBufferEnd,
   2895                 cblk->server, cblk->serverBase, cblk->user, cblk->userBase, cblk->channelCount);
   2896         return 0;
   2897     }
   2898 
   2899     return bufferStart;
   2900 }
   2901 
   2902 // ----------------------------------------------------------------------------
   2903 
   2904 // Track constructor must be called with AudioFlinger::mLock and ThreadBase::mLock held
   2905 AudioFlinger::PlaybackThread::Track::Track(
   2906             const wp<ThreadBase>& thread,
   2907             const sp<Client>& client,
   2908             int streamType,
   2909             uint32_t sampleRate,
   2910             int format,
   2911             int channelCount,
   2912             int frameCount,
   2913             const sp<IMemory>& sharedBuffer,
   2914             int sessionId)
   2915     :   TrackBase(thread, client, sampleRate, format, channelCount, frameCount, 0, sharedBuffer, sessionId),
   2916     mMute(false), mSharedBuffer(sharedBuffer), mName(-1), mMainBuffer(NULL), mAuxBuffer(NULL),
   2917     mAuxEffectId(0), mHasVolumeController(false)
   2918 {
   2919     if (mCblk != NULL) {
   2920         sp<ThreadBase> baseThread = thread.promote();
   2921         if (baseThread != 0) {
   2922             PlaybackThread *playbackThread = (PlaybackThread *)baseThread.get();
   2923             mName = playbackThread->getTrackName_l();
   2924             mMainBuffer = playbackThread->mixBuffer();
   2925         }
   2926         LOGV("Track constructor name %d, calling thread %d", mName, IPCThreadState::self()->getCallingPid());
   2927         if (mName < 0) {
   2928             LOGE("no more track names available");
   2929         }
   2930         mVolume[0] = 1.0f;
   2931         mVolume[1] = 1.0f;
   2932         mStreamType = streamType;
   2933         // NOTE: audio_track_cblk_t::frameSize for 8 bit PCM data is based on a sample size of
   2934         // 16 bit because data is converted to 16 bit before being stored in buffer by AudioTrack
   2935         mCblk->frameSize = AudioSystem::isLinearPCM(format) ? channelCount * sizeof(int16_t) : sizeof(int8_t);
   2936     }
   2937 }
   2938 
   2939 AudioFlinger::PlaybackThread::Track::~Track()
   2940 {
   2941     LOGV("PlaybackThread::Track destructor");
   2942     sp<ThreadBase> thread = mThread.promote();
   2943     if (thread != 0) {
   2944         Mutex::Autolock _l(thread->mLock);
   2945         mState = TERMINATED;
   2946     }
   2947 }
   2948 
   2949 void AudioFlinger::PlaybackThread::Track::destroy()
   2950 {
   2951     // NOTE: destroyTrack_l() can remove a strong reference to this Track
   2952     // by removing it from mTracks vector, so there is a risk that this Tracks's
   2953     // desctructor is called. As the destructor needs to lock mLock,
   2954     // we must acquire a strong reference on this Track before locking mLock
   2955     // here so that the destructor is called only when exiting this function.
   2956     // On the other hand, as long as Track::destroy() is only called by
   2957     // TrackHandle destructor, the TrackHandle still holds a strong ref on
   2958     // this Track with its member mTrack.
   2959     sp<Track> keep(this);
   2960     { // scope for mLock
   2961         sp<ThreadBase> thread = mThread.promote();
   2962         if (thread != 0) {
   2963             if (!isOutputTrack()) {
   2964                 if (mState == ACTIVE || mState == RESUMING) {
   2965                     AudioSystem::stopOutput(thread->id(),
   2966                                             (AudioSystem::stream_type)mStreamType,
   2967                                             mSessionId);
   2968                 }
   2969                 AudioSystem::releaseOutput(thread->id());
   2970             }
   2971             Mutex::Autolock _l(thread->mLock);
   2972             PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
   2973             playbackThread->destroyTrack_l(this);
   2974         }
   2975     }
   2976 }
   2977 
   2978 void AudioFlinger::PlaybackThread::Track::dump(char* buffer, size_t size)
   2979 {
   2980     snprintf(buffer, size, "   %05d %05d %03u %03u %03u %05u   %04u %1d %1d %1d %05u %05u %05u  0x%08x 0x%08x 0x%08x 0x%08x\n",
   2981             mName - AudioMixer::TRACK0,
   2982             (mClient == NULL) ? getpid() : mClient->pid(),
   2983             mStreamType,
   2984             mFormat,
   2985             mCblk->channelCount,
   2986             mSessionId,
   2987             mFrameCount,
   2988             mState,
   2989             mMute,
   2990             mFillingUpStatus,
   2991             mCblk->sampleRate,
   2992             mCblk->volume[0],
   2993             mCblk->volume[1],
   2994             mCblk->server,
   2995             mCblk->user,
   2996             (int)mMainBuffer,
   2997             (int)mAuxBuffer);
   2998 }
   2999 
   3000 status_t AudioFlinger::PlaybackThread::Track::getNextBuffer(AudioBufferProvider::Buffer* buffer)
   3001 {
   3002      audio_track_cblk_t* cblk = this->cblk();
   3003      uint32_t framesReady;
   3004      uint32_t framesReq = buffer->frameCount;
   3005 
   3006      // Check if last stepServer failed, try to step now
   3007      if (mFlags & TrackBase::STEPSERVER_FAILED) {
   3008          if (!step())  goto getNextBuffer_exit;
   3009          LOGV("stepServer recovered");
   3010          mFlags &= ~TrackBase::STEPSERVER_FAILED;
   3011      }
   3012 
   3013      framesReady = cblk->framesReady();
   3014 
   3015      if (LIKELY(framesReady)) {
   3016         uint32_t s = cblk->server;
   3017         uint32_t bufferEnd = cblk->serverBase + cblk->frameCount;
   3018 
   3019         bufferEnd = (cblk->loopEnd < bufferEnd) ? cblk->loopEnd : bufferEnd;
   3020         if (framesReq > framesReady) {
   3021             framesReq = framesReady;
   3022         }
   3023         if (s + framesReq > bufferEnd) {
   3024             framesReq = bufferEnd - s;
   3025         }
   3026 
   3027          buffer->raw = getBuffer(s, framesReq);
   3028          if (buffer->raw == 0) goto getNextBuffer_exit;
   3029 
   3030          buffer->frameCount = framesReq;
   3031         return NO_ERROR;
   3032      }
   3033 
   3034 getNextBuffer_exit:
   3035      buffer->raw = 0;
   3036      buffer->frameCount = 0;
   3037      LOGV("getNextBuffer() no more data for track %d on thread %p", mName, mThread.unsafe_get());
   3038      return NOT_ENOUGH_DATA;
   3039 }
   3040 
   3041 bool AudioFlinger::PlaybackThread::Track::isReady() const {
   3042     if (mFillingUpStatus != FS_FILLING || isStopped() || isPausing()) return true;
   3043 
   3044     if (mCblk->framesReady() >= mCblk->frameCount ||
   3045             (mCblk->flags & CBLK_FORCEREADY_MSK)) {
   3046         mFillingUpStatus = FS_FILLED;
   3047         mCblk->flags &= ~CBLK_FORCEREADY_MSK;
   3048         return true;
   3049     }
   3050     return false;
   3051 }
   3052 
   3053 status_t AudioFlinger::PlaybackThread::Track::start()
   3054 {
   3055     status_t status = NO_ERROR;
   3056     LOGV("start(%d), calling thread %d session %d",
   3057             mName, IPCThreadState::self()->getCallingPid(), mSessionId);
   3058     sp<ThreadBase> thread = mThread.promote();
   3059     if (thread != 0) {
   3060         Mutex::Autolock _l(thread->mLock);
   3061         int state = mState;
   3062         // here the track could be either new, or restarted
   3063         // in both cases "unstop" the track
   3064         if (mState == PAUSED) {
   3065             mState = TrackBase::RESUMING;
   3066             LOGV("PAUSED => RESUMING (%d) on thread %p", mName, this);
   3067         } else {
   3068             mState = TrackBase::ACTIVE;
   3069             LOGV("? => ACTIVE (%d) on thread %p", mName, this);
   3070         }
   3071 
   3072         if (!isOutputTrack() && state != ACTIVE && state != RESUMING) {
   3073             thread->mLock.unlock();
   3074             status = AudioSystem::startOutput(thread->id(),
   3075                                               (AudioSystem::stream_type)mStreamType,
   3076                                               mSessionId);
   3077             thread->mLock.lock();
   3078         }
   3079         if (status == NO_ERROR) {
   3080             PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
   3081             playbackThread->addTrack_l(this);
   3082         } else {
   3083             mState = state;
   3084         }
   3085     } else {
   3086         status = BAD_VALUE;
   3087     }
   3088     return status;
   3089 }
   3090 
   3091 void AudioFlinger::PlaybackThread::Track::stop()
   3092 {
   3093     LOGV("stop(%d), calling thread %d", mName, IPCThreadState::self()->getCallingPid());
   3094     sp<ThreadBase> thread = mThread.promote();
   3095     if (thread != 0) {
   3096         Mutex::Autolock _l(thread->mLock);
   3097         int state = mState;
   3098         if (mState > STOPPED) {
   3099             mState = STOPPED;
   3100             // If the track is not active (PAUSED and buffers full), flush buffers
   3101             PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
   3102             if (playbackThread->mActiveTracks.indexOf(this) < 0) {
   3103                 reset();
   3104             }
   3105             LOGV("(> STOPPED) => STOPPED (%d) on thread %p", mName, playbackThread);
   3106         }
   3107         if (!isOutputTrack() && (state == ACTIVE || state == RESUMING)) {
   3108             thread->mLock.unlock();
   3109             AudioSystem::stopOutput(thread->id(),
   3110                                     (AudioSystem::stream_type)mStreamType,
   3111                                     mSessionId);
   3112             thread->mLock.lock();
   3113         }
   3114     }
   3115 }
   3116 
   3117 void AudioFlinger::PlaybackThread::Track::pause()
   3118 {
   3119     LOGV("pause(%d), calling thread %d", mName, IPCThreadState::self()->getCallingPid());
   3120     sp<ThreadBase> thread = mThread.promote();
   3121     if (thread != 0) {
   3122         Mutex::Autolock _l(thread->mLock);
   3123         if (mState == ACTIVE || mState == RESUMING) {
   3124             mState = PAUSING;
   3125             LOGV("ACTIVE/RESUMING => PAUSING (%d) on thread %p", mName, thread.get());
   3126             if (!isOutputTrack()) {
   3127                 thread->mLock.unlock();
   3128                 AudioSystem::stopOutput(thread->id(),
   3129                                         (AudioSystem::stream_type)mStreamType,
   3130                                         mSessionId);
   3131                 thread->mLock.lock();
   3132             }
   3133         }
   3134     }
   3135 }
   3136 
   3137 void AudioFlinger::PlaybackThread::Track::flush()
   3138 {
   3139     LOGV("flush(%d)", mName);
   3140     sp<ThreadBase> thread = mThread.promote();
   3141     if (thread != 0) {
   3142         Mutex::Autolock _l(thread->mLock);
   3143         if (mState != STOPPED && mState != PAUSED && mState != PAUSING) {
   3144             return;
   3145         }
   3146         // No point remaining in PAUSED state after a flush => go to
   3147         // STOPPED state
   3148         mState = STOPPED;
   3149 
   3150         mCblk->lock.lock();
   3151         // NOTE: reset() will reset cblk->user and cblk->server with
   3152         // the risk that at the same time, the AudioMixer is trying to read
   3153         // data. In this case, getNextBuffer() would return a NULL pointer
   3154         // as audio buffer => the AudioMixer code MUST always test that pointer
   3155         // returned by getNextBuffer() is not NULL!
   3156         reset();
   3157         mCblk->lock.unlock();
   3158     }
   3159 }
   3160 
   3161 void AudioFlinger::PlaybackThread::Track::reset()
   3162 {
   3163     // Do not reset twice to avoid discarding data written just after a flush and before
   3164     // the audioflinger thread detects the track is stopped.
   3165     if (!mResetDone) {
   3166         TrackBase::reset();
   3167         // Force underrun condition to avoid false underrun callback until first data is
   3168         // written to buffer
   3169         mCblk->flags |= CBLK_UNDERRUN_ON;
   3170         mCblk->flags &= ~CBLK_FORCEREADY_MSK;
   3171         mFillingUpStatus = FS_FILLING;
   3172         mResetDone = true;
   3173     }
   3174 }
   3175 
   3176 void AudioFlinger::PlaybackThread::Track::mute(bool muted)
   3177 {
   3178     mMute = muted;
   3179 }
   3180 
   3181 void AudioFlinger::PlaybackThread::Track::setVolume(float left, float right)
   3182 {
   3183     mVolume[0] = left;
   3184     mVolume[1] = right;
   3185 }
   3186 
   3187 status_t AudioFlinger::PlaybackThread::Track::attachAuxEffect(int EffectId)
   3188 {
   3189     status_t status = DEAD_OBJECT;
   3190     sp<ThreadBase> thread = mThread.promote();
   3191     if (thread != 0) {
   3192        PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
   3193        status = playbackThread->attachAuxEffect(this, EffectId);
   3194     }
   3195     return status;
   3196 }
   3197 
   3198 void AudioFlinger::PlaybackThread::Track::setAuxBuffer(int EffectId, int32_t *buffer)
   3199 {
   3200     mAuxEffectId = EffectId;
   3201     mAuxBuffer = buffer;
   3202 }
   3203 
   3204 // ----------------------------------------------------------------------------
   3205 
   3206 // RecordTrack constructor must be called with AudioFlinger::mLock held
   3207 AudioFlinger::RecordThread::RecordTrack::RecordTrack(
   3208             const wp<ThreadBase>& thread,
   3209             const sp<Client>& client,
   3210             uint32_t sampleRate,
   3211             int format,
   3212             int channelCount,
   3213             int frameCount,
   3214             uint32_t flags,
   3215             int sessionId)
   3216     :   TrackBase(thread, client, sampleRate, format,
   3217                   channelCount, frameCount, flags, 0, sessionId),
   3218         mOverflow(false)
   3219 {
   3220     if (mCblk != NULL) {
   3221        LOGV("RecordTrack constructor, size %d", (int)mBufferEnd - (int)mBuffer);
   3222        if (format == AudioSystem::PCM_16_BIT) {
   3223            mCblk->frameSize = channelCount * sizeof(int16_t);
   3224        } else if (format == AudioSystem::PCM_8_BIT) {
   3225            mCblk->frameSize = channelCount * sizeof(int8_t);
   3226        } else {
   3227            mCblk->frameSize = sizeof(int8_t);
   3228        }
   3229     }
   3230 }
   3231 
   3232 AudioFlinger::RecordThread::RecordTrack::~RecordTrack()
   3233 {
   3234     sp<ThreadBase> thread = mThread.promote();
   3235     if (thread != 0) {
   3236         AudioSystem::releaseInput(thread->id());
   3237     }
   3238 }
   3239 
   3240 status_t AudioFlinger::RecordThread::RecordTrack::getNextBuffer(AudioBufferProvider::Buffer* buffer)
   3241 {
   3242     audio_track_cblk_t* cblk = this->cblk();
   3243     uint32_t framesAvail;
   3244     uint32_t framesReq = buffer->frameCount;
   3245 
   3246      // Check if last stepServer failed, try to step now
   3247     if (mFlags & TrackBase::STEPSERVER_FAILED) {
   3248         if (!step()) goto getNextBuffer_exit;
   3249         LOGV("stepServer recovered");
   3250         mFlags &= ~TrackBase::STEPSERVER_FAILED;
   3251     }
   3252 
   3253     framesAvail = cblk->framesAvailable_l();
   3254 
   3255     if (LIKELY(framesAvail)) {
   3256         uint32_t s = cblk->server;
   3257         uint32_t bufferEnd = cblk->serverBase + cblk->frameCount;
   3258 
   3259         if (framesReq > framesAvail) {
   3260             framesReq = framesAvail;
   3261         }
   3262         if (s + framesReq > bufferEnd) {
   3263             framesReq = bufferEnd - s;
   3264         }
   3265 
   3266         buffer->raw = getBuffer(s, framesReq);
   3267         if (buffer->raw == 0) goto getNextBuffer_exit;
   3268 
   3269         buffer->frameCount = framesReq;
   3270         return NO_ERROR;
   3271     }
   3272 
   3273 getNextBuffer_exit:
   3274     buffer->raw = 0;
   3275     buffer->frameCount = 0;
   3276     return NOT_ENOUGH_DATA;
   3277 }
   3278 
   3279 status_t AudioFlinger::RecordThread::RecordTrack::start()
   3280 {
   3281     sp<ThreadBase> thread = mThread.promote();
   3282     if (thread != 0) {
   3283         RecordThread *recordThread = (RecordThread *)thread.get();
   3284         return recordThread->start(this);
   3285     } else {
   3286         return BAD_VALUE;
   3287     }
   3288 }
   3289 
   3290 void AudioFlinger::RecordThread::RecordTrack::stop()
   3291 {
   3292     sp<ThreadBase> thread = mThread.promote();
   3293     if (thread != 0) {
   3294         RecordThread *recordThread = (RecordThread *)thread.get();
   3295         recordThread->stop(this);
   3296         TrackBase::reset();
   3297         // Force overerrun condition to avoid false overrun callback until first data is
   3298         // read from buffer
   3299         mCblk->flags |= CBLK_UNDERRUN_ON;
   3300     }
   3301 }
   3302 
   3303 void AudioFlinger::RecordThread::RecordTrack::dump(char* buffer, size_t size)
   3304 {
   3305     snprintf(buffer, size, "   %05d %03u %03u %05d   %04u %01d %05u  %08x %08x\n",
   3306             (mClient == NULL) ? getpid() : mClient->pid(),
   3307             mFormat,
   3308             mCblk->channelCount,
   3309             mSessionId,
   3310             mFrameCount,
   3311             mState,
   3312             mCblk->sampleRate,
   3313             mCblk->server,
   3314             mCblk->user);
   3315 }
   3316 
   3317 
   3318 // ----------------------------------------------------------------------------
   3319 
   3320 AudioFlinger::PlaybackThread::OutputTrack::OutputTrack(
   3321             const wp<ThreadBase>& thread,
   3322             DuplicatingThread *sourceThread,
   3323             uint32_t sampleRate,
   3324             int format,
   3325             int channelCount,
   3326             int frameCount)
   3327     :   Track(thread, NULL, AudioSystem::NUM_STREAM_TYPES, sampleRate, format, channelCount, frameCount, NULL, 0),
   3328     mActive(false), mSourceThread(sourceThread)
   3329 {
   3330 
   3331     PlaybackThread *playbackThread = (PlaybackThread *)thread.unsafe_get();
   3332     if (mCblk != NULL) {
   3333         mCblk->flags |= CBLK_DIRECTION_OUT;
   3334         mCblk->buffers = (char*)mCblk + sizeof(audio_track_cblk_t);
   3335         mCblk->volume[0] = mCblk->volume[1] = 0x1000;
   3336         mOutBuffer.frameCount = 0;
   3337         playbackThread->mTracks.add(this);
   3338         LOGV("OutputTrack constructor mCblk %p, mBuffer %p, mCblk->buffers %p, mCblk->frameCount %d, mCblk->sampleRate %d, mCblk->channelCount %d mBufferEnd %p",
   3339                 mCblk, mBuffer, mCblk->buffers, mCblk->frameCount, mCblk->sampleRate, mCblk->channelCount, mBufferEnd);
   3340     } else {
   3341         LOGW("Error creating output track on thread %p", playbackThread);
   3342     }
   3343 }
   3344 
   3345 AudioFlinger::PlaybackThread::OutputTrack::~OutputTrack()
   3346 {
   3347     clearBufferQueue();
   3348 }
   3349 
   3350 status_t AudioFlinger::PlaybackThread::OutputTrack::start()
   3351 {
   3352     status_t status = Track::start();
   3353     if (status != NO_ERROR) {
   3354         return status;
   3355     }
   3356 
   3357     mActive = true;
   3358     mRetryCount = 127;
   3359     return status;
   3360 }
   3361 
   3362 void AudioFlinger::PlaybackThread::OutputTrack::stop()
   3363 {
   3364     Track::stop();
   3365     clearBufferQueue();
   3366     mOutBuffer.frameCount = 0;
   3367     mActive = false;
   3368 }
   3369 
   3370 bool AudioFlinger::PlaybackThread::OutputTrack::write(int16_t* data, uint32_t frames)
   3371 {
   3372     Buffer *pInBuffer;
   3373     Buffer inBuffer;
   3374     uint32_t channelCount = mCblk->channelCount;
   3375     bool outputBufferFull = false;
   3376     inBuffer.frameCount = frames;
   3377     inBuffer.i16 = data;
   3378 
   3379     uint32_t waitTimeLeftMs = mSourceThread->waitTimeMs();
   3380 
   3381     if (!mActive && frames != 0) {
   3382         start();
   3383         sp<ThreadBase> thread = mThread.promote();
   3384         if (thread != 0) {
   3385             MixerThread *mixerThread = (MixerThread *)thread.get();
   3386             if (mCblk->frameCount > frames){
   3387                 if (mBufferQueue.size() < kMaxOverFlowBuffers) {
   3388                     uint32_t startFrames = (mCblk->frameCount - frames);
   3389                     pInBuffer = new Buffer;
   3390                     pInBuffer->mBuffer = new int16_t[startFrames * channelCount];
   3391                     pInBuffer->frameCount = startFrames;
   3392                     pInBuffer->i16 = pInBuffer->mBuffer;
   3393                     memset(pInBuffer->raw, 0, startFrames * channelCount * sizeof(int16_t));
   3394                     mBufferQueue.add(pInBuffer);
   3395                 } else {
   3396                     LOGW ("OutputTrack::write() %p no more buffers in queue", this);
   3397                 }
   3398             }
   3399         }
   3400     }
   3401 
   3402     while (waitTimeLeftMs) {
   3403         // First write pending buffers, then new data
   3404         if (mBufferQueue.size()) {
   3405             pInBuffer = mBufferQueue.itemAt(0);
   3406         } else {
   3407             pInBuffer = &inBuffer;
   3408         }
   3409 
   3410         if (pInBuffer->frameCount == 0) {
   3411             break;
   3412         }
   3413 
   3414         if (mOutBuffer.frameCount == 0) {
   3415             mOutBuffer.frameCount = pInBuffer->frameCount;
   3416             nsecs_t startTime = systemTime();
   3417             if (obtainBuffer(&mOutBuffer, waitTimeLeftMs) == (status_t)AudioTrack::NO_MORE_BUFFERS) {
   3418                 LOGV ("OutputTrack::write() %p thread %p no more output buffers", this, mThread.unsafe_get());
   3419                 outputBufferFull = true;
   3420                 break;
   3421             }
   3422             uint32_t waitTimeMs = (uint32_t)ns2ms(systemTime() - startTime);
   3423             if (waitTimeLeftMs >= waitTimeMs) {
   3424                 waitTimeLeftMs -= waitTimeMs;
   3425             } else {
   3426                 waitTimeLeftMs = 0;
   3427             }
   3428         }
   3429 
   3430         uint32_t outFrames = pInBuffer->frameCount > mOutBuffer.frameCount ? mOutBuffer.frameCount : pInBuffer->frameCount;
   3431         memcpy(mOutBuffer.raw, pInBuffer->raw, outFrames * channelCount * sizeof(int16_t));
   3432         mCblk->stepUser(outFrames);
   3433         pInBuffer->frameCount -= outFrames;
   3434         pInBuffer->i16 += outFrames * channelCount;
   3435         mOutBuffer.frameCount -= outFrames;
   3436         mOutBuffer.i16 += outFrames * channelCount;
   3437 
   3438         if (pInBuffer->frameCount == 0) {
   3439             if (mBufferQueue.size()) {
   3440                 mBufferQueue.removeAt(0);
   3441                 delete [] pInBuffer->mBuffer;
   3442                 delete pInBuffer;
   3443                 LOGV("OutputTrack::write() %p thread %p released overflow buffer %d", this, mThread.unsafe_get(), mBufferQueue.size());
   3444             } else {
   3445                 break;
   3446             }
   3447         }
   3448     }
   3449 
   3450     // If we could not write all frames, allocate a buffer and queue it for next time.
   3451     if (inBuffer.frameCount) {
   3452         sp<ThreadBase> thread = mThread.promote();
   3453         if (thread != 0 && !thread->standby()) {
   3454             if (mBufferQueue.size() < kMaxOverFlowBuffers) {
   3455                 pInBuffer = new Buffer;
   3456                 pInBuffer->mBuffer = new int16_t[inBuffer.frameCount * channelCount];
   3457                 pInBuffer->frameCount = inBuffer.frameCount;
   3458                 pInBuffer->i16 = pInBuffer->mBuffer;
   3459                 memcpy(pInBuffer->raw, inBuffer.raw, inBuffer.frameCount * channelCount * sizeof(int16_t));
   3460                 mBufferQueue.add(pInBuffer);
   3461                 LOGV("OutputTrack::write() %p thread %p adding overflow buffer %d", this, mThread.unsafe_get(), mBufferQueue.size());
   3462             } else {
   3463                 LOGW("OutputTrack::write() %p thread %p no more overflow buffers", mThread.unsafe_get(), this);
   3464             }
   3465         }
   3466     }
   3467 
   3468     // Calling write() with a 0 length buffer, means that no more data will be written:
   3469     // If no more buffers are pending, fill output track buffer to make sure it is started
   3470     // by output mixer.
   3471     if (frames == 0 && mBufferQueue.size() == 0) {
   3472         if (mCblk->user < mCblk->frameCount) {
   3473             frames = mCblk->frameCount - mCblk->user;
   3474             pInBuffer = new Buffer;
   3475             pInBuffer->mBuffer = new int16_t[frames * channelCount];
   3476             pInBuffer->frameCount = frames;
   3477             pInBuffer->i16 = pInBuffer->mBuffer;
   3478             memset(pInBuffer->raw, 0, frames * channelCount * sizeof(int16_t));
   3479             mBufferQueue.add(pInBuffer);
   3480         } else if (mActive) {
   3481             stop();
   3482         }
   3483     }
   3484 
   3485     return outputBufferFull;
   3486 }
   3487 
   3488 status_t AudioFlinger::PlaybackThread::OutputTrack::obtainBuffer(AudioBufferProvider::Buffer* buffer, uint32_t waitTimeMs)
   3489 {
   3490     int active;
   3491     status_t result;
   3492     audio_track_cblk_t* cblk = mCblk;
   3493     uint32_t framesReq = buffer->frameCount;
   3494 
   3495 //    LOGV("OutputTrack::obtainBuffer user %d, server %d", cblk->user, cblk->server);
   3496     buffer->frameCount  = 0;
   3497 
   3498     uint32_t framesAvail = cblk->framesAvailable();
   3499 
   3500 
   3501     if (framesAvail == 0) {
   3502         Mutex::Autolock _l(cblk->lock);
   3503         goto start_loop_here;
   3504         while (framesAvail == 0) {
   3505             active = mActive;
   3506             if (UNLIKELY(!active)) {
   3507                 LOGV("Not active and NO_MORE_BUFFERS");
   3508                 return AudioTrack::NO_MORE_BUFFERS;
   3509             }
   3510             result = cblk->cv.waitRelative(cblk->lock, milliseconds(waitTimeMs));
   3511             if (result != NO_ERROR) {
   3512                 return AudioTrack::NO_MORE_BUFFERS;
   3513             }
   3514             // read the server count again
   3515         start_loop_here:
   3516             framesAvail = cblk->framesAvailable_l();
   3517         }
   3518     }
   3519 
   3520 //    if (framesAvail < framesReq) {
   3521 //        return AudioTrack::NO_MORE_BUFFERS;
   3522 //    }
   3523 
   3524     if (framesReq > framesAvail) {
   3525         framesReq = framesAvail;
   3526     }
   3527 
   3528     uint32_t u = cblk->user;
   3529     uint32_t bufferEnd = cblk->userBase + cblk->frameCount;
   3530 
   3531     if (u + framesReq > bufferEnd) {
   3532         framesReq = bufferEnd - u;
   3533     }
   3534 
   3535     buffer->frameCount  = framesReq;
   3536     buffer->raw         = (void *)cblk->buffer(u);
   3537     return NO_ERROR;
   3538 }
   3539 
   3540 
   3541 void AudioFlinger::PlaybackThread::OutputTrack::clearBufferQueue()
   3542 {
   3543     size_t size = mBufferQueue.size();
   3544     Buffer *pBuffer;
   3545 
   3546     for (size_t i = 0; i < size; i++) {
   3547         pBuffer = mBufferQueue.itemAt(i);
   3548         delete [] pBuffer->mBuffer;
   3549         delete pBuffer;
   3550     }
   3551     mBufferQueue.clear();
   3552 }
   3553 
   3554 // ----------------------------------------------------------------------------
   3555 
   3556 AudioFlinger::Client::Client(const sp<AudioFlinger>& audioFlinger, pid_t pid)
   3557     :   RefBase(),
   3558         mAudioFlinger(audioFlinger),
   3559         mMemoryDealer(new MemoryDealer(1024*1024, "AudioFlinger::Client")),
   3560         mPid(pid)
   3561 {
   3562     // 1 MB of address space is good for 32 tracks, 8 buffers each, 4 KB/buffer
   3563 }
   3564 
   3565 // Client destructor must be called with AudioFlinger::mLock held
   3566 AudioFlinger::Client::~Client()
   3567 {
   3568     mAudioFlinger->removeClient_l(mPid);
   3569 }
   3570 
   3571 const sp<MemoryDealer>& AudioFlinger::Client::heap() const
   3572 {
   3573     return mMemoryDealer;
   3574 }
   3575 
   3576 // ----------------------------------------------------------------------------
   3577 
   3578 AudioFlinger::NotificationClient::NotificationClient(const sp<AudioFlinger>& audioFlinger,
   3579                                                      const sp<IAudioFlingerClient>& client,
   3580                                                      pid_t pid)
   3581     : mAudioFlinger(audioFlinger), mPid(pid), mClient(client)
   3582 {
   3583 }
   3584 
   3585 AudioFlinger::NotificationClient::~NotificationClient()
   3586 {
   3587     mClient.clear();
   3588 }
   3589 
   3590 void AudioFlinger::NotificationClient::binderDied(const wp<IBinder>& who)
   3591 {
   3592     sp<NotificationClient> keep(this);
   3593     {
   3594         mAudioFlinger->removeNotificationClient(mPid);
   3595     }
   3596 }
   3597 
   3598 // ----------------------------------------------------------------------------
   3599 
   3600 AudioFlinger::TrackHandle::TrackHandle(const sp<AudioFlinger::PlaybackThread::Track>& track)
   3601     : BnAudioTrack(),
   3602       mTrack(track)
   3603 {
   3604 }
   3605 
   3606 AudioFlinger::TrackHandle::~TrackHandle() {
   3607     // just stop the track on deletion, associated resources
   3608     // will be freed from the main thread once all pending buffers have
   3609     // been played. Unless it's not in the active track list, in which
   3610     // case we free everything now...
   3611     mTrack->destroy();
   3612 }
   3613 
   3614 status_t AudioFlinger::TrackHandle::start() {
   3615     return mTrack->start();
   3616 }
   3617 
   3618 void AudioFlinger::TrackHandle::stop() {
   3619     mTrack->stop();
   3620 }
   3621 
   3622 void AudioFlinger::TrackHandle::flush() {
   3623     mTrack->flush();
   3624 }
   3625 
   3626 void AudioFlinger::TrackHandle::mute(bool e) {
   3627     mTrack->mute(e);
   3628 }
   3629 
   3630 void AudioFlinger::TrackHandle::pause() {
   3631     mTrack->pause();
   3632 }
   3633 
   3634 void AudioFlinger::TrackHandle::setVolume(float left, float right) {
   3635     mTrack->setVolume(left, right);
   3636 }
   3637 
   3638 sp<IMemory> AudioFlinger::TrackHandle::getCblk() const {
   3639     return mTrack->getCblk();
   3640 }
   3641 
   3642 status_t AudioFlinger::TrackHandle::attachAuxEffect(int EffectId)
   3643 {
   3644     return mTrack->attachAuxEffect(EffectId);
   3645 }
   3646 
   3647 status_t AudioFlinger::TrackHandle::onTransact(
   3648     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
   3649 {
   3650     return BnAudioTrack::onTransact(code, data, reply, flags);
   3651 }
   3652 
   3653 // ----------------------------------------------------------------------------
   3654 
   3655 sp<IAudioRecord> AudioFlinger::openRecord(
   3656         pid_t pid,
   3657         int input,
   3658         uint32_t sampleRate,
   3659         int format,
   3660         int channelCount,
   3661         int frameCount,
   3662         uint32_t flags,
   3663         int *sessionId,
   3664         status_t *status)
   3665 {
   3666     sp<RecordThread::RecordTrack> recordTrack;
   3667     sp<RecordHandle> recordHandle;
   3668     sp<Client> client;
   3669     wp<Client> wclient;
   3670     status_t lStatus;
   3671     RecordThread *thread;
   3672     size_t inFrameCount;
   3673     int lSessionId;
   3674 
   3675     // check calling permissions
   3676     if (!recordingAllowed()) {
   3677         lStatus = PERMISSION_DENIED;
   3678         goto Exit;
   3679     }
   3680 
   3681     // add client to list
   3682     { // scope for mLock
   3683         Mutex::Autolock _l(mLock);
   3684         thread = checkRecordThread_l(input);
   3685         if (thread == NULL) {
   3686             lStatus = BAD_VALUE;
   3687             goto Exit;
   3688         }
   3689 
   3690         wclient = mClients.valueFor(pid);
   3691         if (wclient != NULL) {
   3692             client = wclient.promote();
   3693         } else {
   3694             client = new Client(this, pid);
   3695             mClients.add(pid, client);
   3696         }
   3697 
   3698         // If no audio session id is provided, create one here
   3699         if (sessionId != NULL && *sessionId != AudioSystem::SESSION_OUTPUT_MIX) {
   3700             lSessionId = *sessionId;
   3701         } else {
   3702             lSessionId = nextUniqueId();
   3703             if (sessionId != NULL) {
   3704                 *sessionId = lSessionId;
   3705             }
   3706         }
   3707         // create new record track. The record track uses one track in mHardwareMixerThread by convention.
   3708         recordTrack = new RecordThread::RecordTrack(thread, client, sampleRate,
   3709                                                    format, channelCount, frameCount, flags, lSessionId);
   3710     }
   3711     if (recordTrack->getCblk() == NULL) {
   3712         // remove local strong reference to Client before deleting the RecordTrack so that the Client
   3713         // destructor is called by the TrackBase destructor with mLock held
   3714         client.clear();
   3715         recordTrack.clear();
   3716         lStatus = NO_MEMORY;
   3717         goto Exit;
   3718     }
   3719 
   3720     // return to handle to client
   3721     recordHandle = new RecordHandle(recordTrack);
   3722     lStatus = NO_ERROR;
   3723 
   3724 Exit:
   3725     if (status) {
   3726         *status = lStatus;
   3727     }
   3728     return recordHandle;
   3729 }
   3730 
   3731 // ----------------------------------------------------------------------------
   3732 
   3733 AudioFlinger::RecordHandle::RecordHandle(const sp<AudioFlinger::RecordThread::RecordTrack>& recordTrack)
   3734     : BnAudioRecord(),
   3735     mRecordTrack(recordTrack)
   3736 {
   3737 }
   3738 
   3739 AudioFlinger::RecordHandle::~RecordHandle() {
   3740     stop();
   3741 }
   3742 
   3743 status_t AudioFlinger::RecordHandle::start() {
   3744     LOGV("RecordHandle::start()");
   3745     return mRecordTrack->start();
   3746 }
   3747 
   3748 void AudioFlinger::RecordHandle::stop() {
   3749     LOGV("RecordHandle::stop()");
   3750     mRecordTrack->stop();
   3751 }
   3752 
   3753 sp<IMemory> AudioFlinger::RecordHandle::getCblk() const {
   3754     return mRecordTrack->getCblk();
   3755 }
   3756 
   3757 status_t AudioFlinger::RecordHandle::onTransact(
   3758     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
   3759 {
   3760     return BnAudioRecord::onTransact(code, data, reply, flags);
   3761 }
   3762 
   3763 // ----------------------------------------------------------------------------
   3764 
   3765 AudioFlinger::RecordThread::RecordThread(const sp<AudioFlinger>& audioFlinger, AudioStreamIn *input, uint32_t sampleRate, uint32_t channels, int id) :
   3766     ThreadBase(audioFlinger, id),
   3767     mInput(input), mResampler(0), mRsmpOutBuffer(0), mRsmpInBuffer(0)
   3768 {
   3769     mReqChannelCount = AudioSystem::popCount(channels);
   3770     mReqSampleRate = sampleRate;
   3771     readInputParameters();
   3772 }
   3773 
   3774 
   3775 AudioFlinger::RecordThread::~RecordThread()
   3776 {
   3777     delete[] mRsmpInBuffer;
   3778     if (mResampler != 0) {
   3779         delete mResampler;
   3780         delete[] mRsmpOutBuffer;
   3781     }
   3782 }
   3783 
   3784 void AudioFlinger::RecordThread::onFirstRef()
   3785 {
   3786     const size_t SIZE = 256;
   3787     char buffer[SIZE];
   3788 
   3789     snprintf(buffer, SIZE, "Record Thread %p", this);
   3790 
   3791     run(buffer, PRIORITY_URGENT_AUDIO);
   3792 }
   3793 
   3794 bool AudioFlinger::RecordThread::threadLoop()
   3795 {
   3796     AudioBufferProvider::Buffer buffer;
   3797     sp<RecordTrack> activeTrack;
   3798 
   3799     nsecs_t lastWarning = 0;
   3800 
   3801     // start recording
   3802     while (!exitPending()) {
   3803 
   3804         processConfigEvents();
   3805 
   3806         { // scope for mLock
   3807             Mutex::Autolock _l(mLock);
   3808             checkForNewParameters_l();
   3809             if (mActiveTrack == 0 && mConfigEvents.isEmpty()) {
   3810                 if (!mStandby) {
   3811                     mInput->standby();
   3812                     mStandby = true;
   3813                 }
   3814 
   3815                 if (exitPending()) break;
   3816 
   3817                 LOGV("RecordThread: loop stopping");
   3818                 // go to sleep
   3819                 mWaitWorkCV.wait(mLock);
   3820                 LOGV("RecordThread: loop starting");
   3821                 continue;
   3822             }
   3823             if (mActiveTrack != 0) {
   3824                 if (mActiveTrack->mState == TrackBase::PAUSING) {
   3825                     if (!mStandby) {
   3826                         mInput->standby();
   3827                         mStandby = true;
   3828                     }
   3829                     mActiveTrack.clear();
   3830                     mStartStopCond.broadcast();
   3831                 } else if (mActiveTrack->mState == TrackBase::RESUMING) {
   3832                     if (mReqChannelCount != mActiveTrack->channelCount()) {
   3833                         mActiveTrack.clear();
   3834                         mStartStopCond.broadcast();
   3835                     } else if (mBytesRead != 0) {
   3836                         // record start succeeds only if first read from audio input
   3837                         // succeeds
   3838                         if (mBytesRead > 0) {
   3839                             mActiveTrack->mState = TrackBase::ACTIVE;
   3840                         } else {
   3841                             mActiveTrack.clear();
   3842                         }
   3843                         mStartStopCond.broadcast();
   3844                     }
   3845                     mStandby = false;
   3846                 }
   3847             }
   3848         }
   3849 
   3850         if (mActiveTrack != 0) {
   3851             if (mActiveTrack->mState != TrackBase::ACTIVE &&
   3852                 mActiveTrack->mState != TrackBase::RESUMING) {
   3853                 usleep(5000);
   3854                 continue;
   3855             }
   3856             buffer.frameCount = mFrameCount;
   3857             if (LIKELY(mActiveTrack->getNextBuffer(&buffer) == NO_ERROR)) {
   3858                 size_t framesOut = buffer.frameCount;
   3859                 if (mResampler == 0) {
   3860                     // no resampling
   3861                     while (framesOut) {
   3862                         size_t framesIn = mFrameCount - mRsmpInIndex;
   3863                         if (framesIn) {
   3864                             int8_t *src = (int8_t *)mRsmpInBuffer + mRsmpInIndex * mFrameSize;
   3865                             int8_t *dst = buffer.i8 + (buffer.frameCount - framesOut) * mActiveTrack->mCblk->frameSize;
   3866                             if (framesIn > framesOut)
   3867                                 framesIn = framesOut;
   3868                             mRsmpInIndex += framesIn;
   3869                             framesOut -= framesIn;
   3870                             if ((int)mChannelCount == mReqChannelCount ||
   3871                                 mFormat != AudioSystem::PCM_16_BIT) {
   3872                                 memcpy(dst, src, framesIn * mFrameSize);
   3873                             } else {
   3874                                 int16_t *src16 = (int16_t *)src;
   3875                                 int16_t *dst16 = (int16_t *)dst;
   3876                                 if (mChannelCount == 1) {
   3877                                     while (framesIn--) {
   3878                                         *dst16++ = *src16;
   3879                                         *dst16++ = *src16++;
   3880                                     }
   3881                                 } else {
   3882                                     while (framesIn--) {
   3883                                         *dst16++ = (int16_t)(((int32_t)*src16 + (int32_t)*(src16 + 1)) >> 1);
   3884                                         src16 += 2;
   3885                                     }
   3886                                 }
   3887                             }
   3888                         }
   3889                         if (framesOut && mFrameCount == mRsmpInIndex) {
   3890                             if (framesOut == mFrameCount &&
   3891                                 ((int)mChannelCount == mReqChannelCount || mFormat != AudioSystem::PCM_16_BIT)) {
   3892                                 mBytesRead = mInput->read(buffer.raw, mInputBytes);
   3893                                 framesOut = 0;
   3894                             } else {
   3895                                 mBytesRead = mInput->read(mRsmpInBuffer, mInputBytes);
   3896                                 mRsmpInIndex = 0;
   3897                             }
   3898                             if (mBytesRead < 0) {
   3899                                 LOGE("Error reading audio input");
   3900                                 if (mActiveTrack->mState == TrackBase::ACTIVE) {
   3901                                     // Force input into standby so that it tries to
   3902                                     // recover at next read attempt
   3903                                     mInput->standby();
   3904                                     usleep(5000);
   3905                                 }
   3906                                 mRsmpInIndex = mFrameCount;
   3907                                 framesOut = 0;
   3908                                 buffer.frameCount = 0;
   3909                             }
   3910                         }
   3911                     }
   3912                 } else {
   3913                     // resampling
   3914 
   3915                     memset(mRsmpOutBuffer, 0, framesOut * 2 * sizeof(int32_t));
   3916                     // alter output frame count as if we were expecting stereo samples
   3917                     if (mChannelCount == 1 && mReqChannelCount == 1) {
   3918                         framesOut >>= 1;
   3919                     }
   3920                     mResampler->resample(mRsmpOutBuffer, framesOut, this);
   3921                     // ditherAndClamp() works as long as all buffers returned by mActiveTrack->getNextBuffer()
   3922                     // are 32 bit aligned which should be always true.
   3923                     if (mChannelCount == 2 && mReqChannelCount == 1) {
   3924                         AudioMixer::ditherAndClamp(mRsmpOutBuffer, mRsmpOutBuffer, framesOut);
   3925                         // the resampler always outputs stereo samples: do post stereo to mono conversion
   3926                         int16_t *src = (int16_t *)mRsmpOutBuffer;
   3927                         int16_t *dst = buffer.i16;
   3928                         while (framesOut--) {
   3929                             *dst++ = (int16_t)(((int32_t)*src + (int32_t)*(src + 1)) >> 1);
   3930                             src += 2;
   3931                         }
   3932                     } else {
   3933                         AudioMixer::ditherAndClamp((int32_t *)buffer.raw, mRsmpOutBuffer, framesOut);
   3934                     }
   3935 
   3936                 }
   3937                 mActiveTrack->releaseBuffer(&buffer);
   3938                 mActiveTrack->overflow();
   3939             }
   3940             // client isn't retrieving buffers fast enough
   3941             else {
   3942                 if (!mActiveTrack->setOverflow()) {
   3943                     nsecs_t now = systemTime();
   3944                     if ((now - lastWarning) > kWarningThrottle) {
   3945                         LOGW("RecordThread: buffer overflow");
   3946                         lastWarning = now;
   3947                     }
   3948                 }
   3949                 // Release the processor for a while before asking for a new buffer.
   3950                 // This will give the application more chance to read from the buffer and
   3951                 // clear the overflow.
   3952                 usleep(5000);
   3953             }
   3954         }
   3955     }
   3956 
   3957     if (!mStandby) {
   3958         mInput->standby();
   3959     }
   3960     mActiveTrack.clear();
   3961 
   3962     mStartStopCond.broadcast();
   3963 
   3964     LOGV("RecordThread %p exiting", this);
   3965     return false;
   3966 }
   3967 
   3968 status_t AudioFlinger::RecordThread::start(RecordThread::RecordTrack* recordTrack)
   3969 {
   3970     LOGV("RecordThread::start");
   3971     sp <ThreadBase> strongMe = this;
   3972     status_t status = NO_ERROR;
   3973     {
   3974         AutoMutex lock(&mLock);
   3975         if (mActiveTrack != 0) {
   3976             if (recordTrack != mActiveTrack.get()) {
   3977                 status = -EBUSY;
   3978             } else if (mActiveTrack->mState == TrackBase::PAUSING) {
   3979                 mActiveTrack->mState = TrackBase::ACTIVE;
   3980             }
   3981             return status;
   3982         }
   3983 
   3984         recordTrack->mState = TrackBase::IDLE;
   3985         mActiveTrack = recordTrack;
   3986         mLock.unlock();
   3987         status_t status = AudioSystem::startInput(mId);
   3988         mLock.lock();
   3989         if (status != NO_ERROR) {
   3990             mActiveTrack.clear();
   3991             return status;
   3992         }
   3993         mActiveTrack->mState = TrackBase::RESUMING;
   3994         mRsmpInIndex = mFrameCount;
   3995         mBytesRead = 0;
   3996         // signal thread to start
   3997         LOGV("Signal record thread");
   3998         mWaitWorkCV.signal();
   3999         // do not wait for mStartStopCond if exiting
   4000         if (mExiting) {
   4001             mActiveTrack.clear();
   4002             status = INVALID_OPERATION;
   4003             goto startError;
   4004         }
   4005         mStartStopCond.wait(mLock);
   4006         if (mActiveTrack == 0) {
   4007             LOGV("Record failed to start");
   4008             status = BAD_VALUE;
   4009             goto startError;
   4010         }
   4011         LOGV("Record started OK");
   4012         return status;
   4013     }
   4014 startError:
   4015     AudioSystem::stopInput(mId);
   4016     return status;
   4017 }
   4018 
   4019 void AudioFlinger::RecordThread::stop(RecordThread::RecordTrack* recordTrack) {
   4020     LOGV("RecordThread::stop");
   4021     sp <ThreadBase> strongMe = this;
   4022     {
   4023         AutoMutex lock(&mLock);
   4024         if (mActiveTrack != 0 && recordTrack == mActiveTrack.get()) {
   4025             mActiveTrack->mState = TrackBase::PAUSING;
   4026             // do not wait for mStartStopCond if exiting
   4027             if (mExiting) {
   4028                 return;
   4029             }
   4030             mStartStopCond.wait(mLock);
   4031             // if we have been restarted, recordTrack == mActiveTrack.get() here
   4032             if (mActiveTrack == 0 || recordTrack != mActiveTrack.get()) {
   4033                 mLock.unlock();
   4034                 AudioSystem::stopInput(mId);
   4035                 mLock.lock();
   4036                 LOGV("Record stopped OK");
   4037             }
   4038         }
   4039     }
   4040 }
   4041 
   4042 status_t AudioFlinger::RecordThread::dump(int fd, const Vector<String16>& args)
   4043 {
   4044     const size_t SIZE = 256;
   4045     char buffer[SIZE];
   4046     String8 result;
   4047     pid_t pid = 0;
   4048 
   4049     snprintf(buffer, SIZE, "\nInput thread %p internals\n", this);
   4050     result.append(buffer);
   4051 
   4052     if (mActiveTrack != 0) {
   4053         result.append("Active Track:\n");
   4054         result.append("   Clien Fmt Chn Session Buf  S SRate  Serv     User\n");
   4055         mActiveTrack->dump(buffer, SIZE);
   4056         result.append(buffer);
   4057 
   4058         snprintf(buffer, SIZE, "In index: %d\n", mRsmpInIndex);
   4059         result.append(buffer);
   4060         snprintf(buffer, SIZE, "In size: %d\n", mInputBytes);
   4061         result.append(buffer);
   4062         snprintf(buffer, SIZE, "Resampling: %d\n", (mResampler != 0));
   4063         result.append(buffer);
   4064         snprintf(buffer, SIZE, "Out channel count: %d\n", mReqChannelCount);
   4065         result.append(buffer);
   4066         snprintf(buffer, SIZE, "Out sample rate: %d\n", mReqSampleRate);
   4067         result.append(buffer);
   4068 
   4069 
   4070     } else {
   4071         result.append("No record client\n");
   4072     }
   4073     write(fd, result.string(), result.size());
   4074 
   4075     dumpBase(fd, args);
   4076 
   4077     return NO_ERROR;
   4078 }
   4079 
   4080 status_t AudioFlinger::RecordThread::getNextBuffer(AudioBufferProvider::Buffer* buffer)
   4081 {
   4082     size_t framesReq = buffer->frameCount;
   4083     size_t framesReady = mFrameCount - mRsmpInIndex;
   4084     int channelCount;
   4085 
   4086     if (framesReady == 0) {
   4087         mBytesRead = mInput->read(mRsmpInBuffer, mInputBytes);
   4088         if (mBytesRead < 0) {
   4089             LOGE("RecordThread::getNextBuffer() Error reading audio input");
   4090             if (mActiveTrack->mState == TrackBase::ACTIVE) {
   4091                 // Force input into standby so that it tries to
   4092                 // recover at next read attempt
   4093                 mInput->standby();
   4094                 usleep(5000);
   4095             }
   4096             buffer->raw = 0;
   4097             buffer->frameCount = 0;
   4098             return NOT_ENOUGH_DATA;
   4099         }
   4100         mRsmpInIndex = 0;
   4101         framesReady = mFrameCount;
   4102     }
   4103 
   4104     if (framesReq > framesReady) {
   4105         framesReq = framesReady;
   4106     }
   4107 
   4108     if (mChannelCount == 1 && mReqChannelCount == 2) {
   4109         channelCount = 1;
   4110     } else {
   4111         channelCount = 2;
   4112     }
   4113     buffer->raw = mRsmpInBuffer + mRsmpInIndex * channelCount;
   4114     buffer->frameCount = framesReq;
   4115     return NO_ERROR;
   4116 }
   4117 
   4118 void AudioFlinger::RecordThread::releaseBuffer(AudioBufferProvider::Buffer* buffer)
   4119 {
   4120     mRsmpInIndex += buffer->frameCount;
   4121     buffer->frameCount = 0;
   4122 }
   4123 
   4124 bool AudioFlinger::RecordThread::checkForNewParameters_l()
   4125 {
   4126     bool reconfig = false;
   4127 
   4128     while (!mNewParameters.isEmpty()) {
   4129         status_t status = NO_ERROR;
   4130         String8 keyValuePair = mNewParameters[0];
   4131         AudioParameter param = AudioParameter(keyValuePair);
   4132         int value;
   4133         int reqFormat = mFormat;
   4134         int reqSamplingRate = mReqSampleRate;
   4135         int reqChannelCount = mReqChannelCount;
   4136 
   4137         if (param.getInt(String8(AudioParameter::keySamplingRate), value) == NO_ERROR) {
   4138             reqSamplingRate = value;
   4139             reconfig = true;
   4140         }
   4141         if (param.getInt(String8(AudioParameter::keyFormat), value) == NO_ERROR) {
   4142             reqFormat = value;
   4143             reconfig = true;
   4144         }
   4145         if (param.getInt(String8(AudioParameter::keyChannels), value) == NO_ERROR) {
   4146             reqChannelCount = AudioSystem::popCount(value);
   4147             reconfig = true;
   4148         }
   4149         if (param.getInt(String8(AudioParameter::keyFrameCount), value) == NO_ERROR) {
   4150             // do not accept frame count changes if tracks are open as the track buffer
   4151             // size depends on frame count and correct behavior would not be garantied
   4152             // if frame count is changed after track creation
   4153             if (mActiveTrack != 0) {
   4154                 status = INVALID_OPERATION;
   4155             } else {
   4156                 reconfig = true;
   4157             }
   4158         }
   4159         if (status == NO_ERROR) {
   4160             status = mInput->setParameters(keyValuePair);
   4161             if (status == INVALID_OPERATION) {
   4162                mInput->standby();
   4163                status = mInput->setParameters(keyValuePair);
   4164             }
   4165             if (reconfig) {
   4166                 if (status == BAD_VALUE &&
   4167                     reqFormat == mInput->format() && reqFormat == AudioSystem::PCM_16_BIT &&
   4168                     ((int)mInput->sampleRate() <= 2 * reqSamplingRate) &&
   4169                     (AudioSystem::popCount(mInput->channels()) < 3) && (reqChannelCount < 3)) {
   4170                     status = NO_ERROR;
   4171                 }
   4172                 if (status == NO_ERROR) {
   4173                     readInputParameters();
   4174                     sendConfigEvent_l(AudioSystem::INPUT_CONFIG_CHANGED);
   4175                 }
   4176             }
   4177         }
   4178 
   4179         mNewParameters.removeAt(0);
   4180 
   4181         mParamStatus = status;
   4182         mParamCond.signal();
   4183         mWaitWorkCV.wait(mLock);
   4184     }
   4185     return reconfig;
   4186 }
   4187 
   4188 String8 AudioFlinger::RecordThread::getParameters(const String8& keys)
   4189 {
   4190     return mInput->getParameters(keys);
   4191 }
   4192 
   4193 void AudioFlinger::RecordThread::audioConfigChanged_l(int event, int param) {
   4194     AudioSystem::OutputDescriptor desc;
   4195     void *param2 = 0;
   4196 
   4197     switch (event) {
   4198     case AudioSystem::INPUT_OPENED:
   4199     case AudioSystem::INPUT_CONFIG_CHANGED:
   4200         desc.channels = mChannels;
   4201         desc.samplingRate = mSampleRate;
   4202         desc.format = mFormat;
   4203         desc.frameCount = mFrameCount;
   4204         desc.latency = 0;
   4205         param2 = &desc;
   4206         break;
   4207 
   4208     case AudioSystem::INPUT_CLOSED:
   4209     default:
   4210         break;
   4211     }
   4212     mAudioFlinger->audioConfigChanged_l(event, mId, param2);
   4213 }
   4214 
   4215 void AudioFlinger::RecordThread::readInputParameters()
   4216 {
   4217     if (mRsmpInBuffer) delete mRsmpInBuffer;
   4218     if (mRsmpOutBuffer) delete mRsmpOutBuffer;
   4219     if (mResampler) delete mResampler;
   4220     mResampler = 0;
   4221 
   4222     mSampleRate = mInput->sampleRate();
   4223     mChannels = mInput->channels();
   4224     mChannelCount = (uint16_t)AudioSystem::popCount(mChannels);
   4225     mFormat = mInput->format();
   4226     mFrameSize = (uint16_t)mInput->frameSize();
   4227     mInputBytes = mInput->bufferSize();
   4228     mFrameCount = mInputBytes / mFrameSize;
   4229     mRsmpInBuffer = new int16_t[mFrameCount * mChannelCount];
   4230 
   4231     if (mSampleRate != mReqSampleRate && mChannelCount < 3 && mReqChannelCount < 3)
   4232     {
   4233         int channelCount;
   4234          // optmization: if mono to mono, use the resampler in stereo to stereo mode to avoid
   4235          // stereo to mono post process as the resampler always outputs stereo.
   4236         if (mChannelCount == 1 && mReqChannelCount == 2) {
   4237             channelCount = 1;
   4238         } else {
   4239             channelCount = 2;
   4240         }
   4241         mResampler = AudioResampler::create(16, channelCount, mReqSampleRate);
   4242         mResampler->setSampleRate(mSampleRate);
   4243         mResampler->setVolume(AudioMixer::UNITY_GAIN, AudioMixer::UNITY_GAIN);
   4244         mRsmpOutBuffer = new int32_t[mFrameCount * 2];
   4245 
   4246         // optmization: if mono to mono, alter input frame count as if we were inputing stereo samples
   4247         if (mChannelCount == 1 && mReqChannelCount == 1) {
   4248             mFrameCount >>= 1;
   4249         }
   4250 
   4251     }
   4252     mRsmpInIndex = mFrameCount;
   4253 }
   4254 
   4255 unsigned int AudioFlinger::RecordThread::getInputFramesLost()
   4256 {
   4257     return mInput->getInputFramesLost();
   4258 }
   4259 
   4260 // ----------------------------------------------------------------------------
   4261 
   4262 int AudioFlinger::openOutput(uint32_t *pDevices,
   4263                                 uint32_t *pSamplingRate,
   4264                                 uint32_t *pFormat,
   4265                                 uint32_t *pChannels,
   4266                                 uint32_t *pLatencyMs,
   4267                                 uint32_t flags)
   4268 {
   4269     status_t status;
   4270     PlaybackThread *thread = NULL;
   4271     mHardwareStatus = AUDIO_HW_OUTPUT_OPEN;
   4272     uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0;
   4273     uint32_t format = pFormat ? *pFormat : 0;
   4274     uint32_t channels = pChannels ? *pChannels : 0;
   4275     uint32_t latency = pLatencyMs ? *pLatencyMs : 0;
   4276 
   4277     LOGV("openOutput(), Device %x, SamplingRate %d, Format %d, Channels %x, flags %x",
   4278             pDevices ? *pDevices : 0,
   4279             samplingRate,
   4280             format,
   4281             channels,
   4282             flags);
   4283 
   4284     if (pDevices == NULL || *pDevices == 0) {
   4285         return 0;
   4286     }
   4287     Mutex::Autolock _l(mLock);
   4288 
   4289     AudioStreamOut *output = mAudioHardware->openOutputStream(*pDevices,
   4290                                                              (int *)&format,
   4291                                                              &channels,
   4292                                                              &samplingRate,
   4293                                                              &status);
   4294     LOGV("openOutput() openOutputStream returned output %p, SamplingRate %d, Format %d, Channels %x, status %d",
   4295             output,
   4296             samplingRate,
   4297             format,
   4298             channels,
   4299             status);
   4300 
   4301     mHardwareStatus = AUDIO_HW_IDLE;
   4302     if (output != 0) {
   4303         int id = nextUniqueId();
   4304         if ((flags & AudioSystem::OUTPUT_FLAG_DIRECT) ||
   4305             (format != AudioSystem::PCM_16_BIT) ||
   4306             (channels != AudioSystem::CHANNEL_OUT_STEREO)) {
   4307             thread = new DirectOutputThread(this, output, id, *pDevices);
   4308             LOGV("openOutput() created direct output: ID %d thread %p", id, thread);
   4309         } else {
   4310             thread = new MixerThread(this, output, id, *pDevices);
   4311             LOGV("openOutput() created mixer output: ID %d thread %p", id, thread);
   4312 
   4313 #ifdef LVMX
   4314             unsigned bitsPerSample =
   4315                 (format == AudioSystem::PCM_16_BIT) ? 16 :
   4316                     ((format == AudioSystem::PCM_8_BIT) ? 8 : 0);
   4317             unsigned channelCount = (channels == AudioSystem::CHANNEL_OUT_STEREO) ? 2 : 1;
   4318             int audioOutputType = LifeVibes::threadIdToAudioOutputType(thread->id());
   4319 
   4320             LifeVibes::init_aot(audioOutputType, samplingRate, bitsPerSample, channelCount);
   4321             LifeVibes::setDevice(audioOutputType, *pDevices);
   4322 #endif
   4323 
   4324         }
   4325         mPlaybackThreads.add(id, thread);
   4326 
   4327         if (pSamplingRate) *pSamplingRate = samplingRate;
   4328         if (pFormat) *pFormat = format;
   4329         if (pChannels) *pChannels = channels;
   4330         if (pLatencyMs) *pLatencyMs = thread->latency();
   4331 
   4332         // notify client processes of the new output creation
   4333         thread->audioConfigChanged_l(AudioSystem::OUTPUT_OPENED);
   4334         return id;
   4335     }
   4336 
   4337     return 0;
   4338 }
   4339 
   4340 int AudioFlinger::openDuplicateOutput(int output1, int output2)
   4341 {
   4342     Mutex::Autolock _l(mLock);
   4343     MixerThread *thread1 = checkMixerThread_l(output1);
   4344     MixerThread *thread2 = checkMixerThread_l(output2);
   4345 
   4346     if (thread1 == NULL || thread2 == NULL) {
   4347         LOGW("openDuplicateOutput() wrong output mixer type for output %d or %d", output1, output2);
   4348         return 0;
   4349     }
   4350 
   4351     int id = nextUniqueId();
   4352     DuplicatingThread *thread = new DuplicatingThread(this, thread1, id);
   4353     thread->addOutputTrack(thread2);
   4354     mPlaybackThreads.add(id, thread);
   4355     // notify client processes of the new output creation
   4356     thread->audioConfigChanged_l(AudioSystem::OUTPUT_OPENED);
   4357     return id;
   4358 }
   4359 
   4360 status_t AudioFlinger::closeOutput(int output)
   4361 {
   4362     // keep strong reference on the playback thread so that
   4363     // it is not destroyed while exit() is executed
   4364     sp <PlaybackThread> thread;
   4365     {
   4366         Mutex::Autolock _l(mLock);
   4367         thread = checkPlaybackThread_l(output);
   4368         if (thread == NULL) {
   4369             return BAD_VALUE;
   4370         }
   4371 
   4372         LOGV("closeOutput() %d", output);
   4373 
   4374         if (thread->type() == PlaybackThread::MIXER) {
   4375             for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
   4376                 if (mPlaybackThreads.valueAt(i)->type() == PlaybackThread::DUPLICATING) {
   4377                     DuplicatingThread *dupThread = (DuplicatingThread *)mPlaybackThreads.valueAt(i).get();
   4378                     dupThread->removeOutputTrack((MixerThread *)thread.get());
   4379                 }
   4380             }
   4381         }
   4382         void *param2 = 0;
   4383         audioConfigChanged_l(AudioSystem::OUTPUT_CLOSED, output, param2);
   4384         mPlaybackThreads.removeItem(output);
   4385     }
   4386     thread->exit();
   4387 
   4388     if (thread->type() != PlaybackThread::DUPLICATING) {
   4389         mAudioHardware->closeOutputStream(thread->getOutput());
   4390     }
   4391     return NO_ERROR;
   4392 }
   4393 
   4394 status_t AudioFlinger::suspendOutput(int output)
   4395 {
   4396     Mutex::Autolock _l(mLock);
   4397     PlaybackThread *thread = checkPlaybackThread_l(output);
   4398 
   4399     if (thread == NULL) {
   4400         return BAD_VALUE;
   4401     }
   4402 
   4403     LOGV("suspendOutput() %d", output);
   4404     thread->suspend();
   4405 
   4406     return NO_ERROR;
   4407 }
   4408 
   4409 status_t AudioFlinger::restoreOutput(int output)
   4410 {
   4411     Mutex::Autolock _l(mLock);
   4412     PlaybackThread *thread = checkPlaybackThread_l(output);
   4413 
   4414     if (thread == NULL) {
   4415         return BAD_VALUE;
   4416     }
   4417 
   4418     LOGV("restoreOutput() %d", output);
   4419 
   4420     thread->restore();
   4421 
   4422     return NO_ERROR;
   4423 }
   4424 
   4425 int AudioFlinger::openInput(uint32_t *pDevices,
   4426                                 uint32_t *pSamplingRate,
   4427                                 uint32_t *pFormat,
   4428                                 uint32_t *pChannels,
   4429                                 uint32_t acoustics)
   4430 {
   4431     status_t status;
   4432     RecordThread *thread = NULL;
   4433     uint32_t samplingRate = pSamplingRate ? *pSamplingRate : 0;
   4434     uint32_t format = pFormat ? *pFormat : 0;
   4435     uint32_t channels = pChannels ? *pChannels : 0;
   4436     uint32_t reqSamplingRate = samplingRate;
   4437     uint32_t reqFormat = format;
   4438     uint32_t reqChannels = channels;
   4439 
   4440     if (pDevices == NULL || *pDevices == 0) {
   4441         return 0;
   4442     }
   4443     Mutex::Autolock _l(mLock);
   4444 
   4445     AudioStreamIn *input = mAudioHardware->openInputStream(*pDevices,
   4446                                                              (int *)&format,
   4447                                                              &channels,
   4448                                                              &samplingRate,
   4449                                                              &status,
   4450                                                              (AudioSystem::audio_in_acoustics)acoustics);
   4451     LOGV("openInput() openInputStream returned input %p, SamplingRate %d, Format %d, Channels %x, acoustics %x, status %d",
   4452             input,
   4453             samplingRate,
   4454             format,
   4455             channels,
   4456             acoustics,
   4457             status);
   4458 
   4459     // If the input could not be opened with the requested parameters and we can handle the conversion internally,
   4460     // try to open again with the proposed parameters. The AudioFlinger can resample the input and do mono to stereo
   4461     // or stereo to mono conversions on 16 bit PCM inputs.
   4462     if (input == 0 && status == BAD_VALUE &&
   4463         reqFormat == format && format == AudioSystem::PCM_16_BIT &&
   4464         (samplingRate <= 2 * reqSamplingRate) &&
   4465         (AudioSystem::popCount(channels) < 3) && (AudioSystem::popCount(reqChannels) < 3)) {
   4466         LOGV("openInput() reopening with proposed sampling rate and channels");
   4467         input = mAudioHardware->openInputStream(*pDevices,
   4468                                                  (int *)&format,
   4469                                                  &channels,
   4470                                                  &samplingRate,
   4471                                                  &status,
   4472                                                  (AudioSystem::audio_in_acoustics)acoustics);
   4473     }
   4474 
   4475     if (input != 0) {
   4476         int id = nextUniqueId();
   4477          // Start record thread
   4478         thread = new RecordThread(this, input, reqSamplingRate, reqChannels, id);
   4479         mRecordThreads.add(id, thread);
   4480         LOGV("openInput() created record thread: ID %d thread %p", id, thread);
   4481         if (pSamplingRate) *pSamplingRate = reqSamplingRate;
   4482         if (pFormat) *pFormat = format;
   4483         if (pChannels) *pChannels = reqChannels;
   4484 
   4485         input->standby();
   4486 
   4487         // notify client processes of the new input creation
   4488         thread->audioConfigChanged_l(AudioSystem::INPUT_OPENED);
   4489         return id;
   4490     }
   4491 
   4492     return 0;
   4493 }
   4494 
   4495 status_t AudioFlinger::closeInput(int input)
   4496 {
   4497     // keep strong reference on the record thread so that
   4498     // it is not destroyed while exit() is executed
   4499     sp <RecordThread> thread;
   4500     {
   4501         Mutex::Autolock _l(mLock);
   4502         thread = checkRecordThread_l(input);
   4503         if (thread == NULL) {
   4504             return BAD_VALUE;
   4505         }
   4506 
   4507         LOGV("closeInput() %d", input);
   4508         void *param2 = 0;
   4509         audioConfigChanged_l(AudioSystem::INPUT_CLOSED, input, param2);
   4510         mRecordThreads.removeItem(input);
   4511     }
   4512     thread->exit();
   4513 
   4514     mAudioHardware->closeInputStream(thread->getInput());
   4515 
   4516     return NO_ERROR;
   4517 }
   4518 
   4519 status_t AudioFlinger::setStreamOutput(uint32_t stream, int output)
   4520 {
   4521     Mutex::Autolock _l(mLock);
   4522     MixerThread *dstThread = checkMixerThread_l(output);
   4523     if (dstThread == NULL) {
   4524         LOGW("setStreamOutput() bad output id %d", output);
   4525         return BAD_VALUE;
   4526     }
   4527 
   4528     LOGV("setStreamOutput() stream %d to output %d", stream, output);
   4529     audioConfigChanged_l(AudioSystem::STREAM_CONFIG_CHANGED, output, &stream);
   4530 
   4531     for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
   4532         PlaybackThread *thread = mPlaybackThreads.valueAt(i).get();
   4533         if (thread != dstThread &&
   4534             thread->type() != PlaybackThread::DIRECT) {
   4535             MixerThread *srcThread = (MixerThread *)thread;
   4536             srcThread->invalidateTracks(stream);
   4537         }
   4538     }
   4539 
   4540     return NO_ERROR;
   4541 }
   4542 
   4543 
   4544 int AudioFlinger::newAudioSessionId()
   4545 {
   4546     return nextUniqueId();
   4547 }
   4548 
   4549 // checkPlaybackThread_l() must be called with AudioFlinger::mLock held
   4550 AudioFlinger::PlaybackThread *AudioFlinger::checkPlaybackThread_l(int output) const
   4551 {
   4552     PlaybackThread *thread = NULL;
   4553     if (mPlaybackThreads.indexOfKey(output) >= 0) {
   4554         thread = (PlaybackThread *)mPlaybackThreads.valueFor(output).get();
   4555     }
   4556     return thread;
   4557 }
   4558 
   4559 // checkMixerThread_l() must be called with AudioFlinger::mLock held
   4560 AudioFlinger::MixerThread *AudioFlinger::checkMixerThread_l(int output) const
   4561 {
   4562     PlaybackThread *thread = checkPlaybackThread_l(output);
   4563     if (thread != NULL) {
   4564         if (thread->type() == PlaybackThread::DIRECT) {
   4565             thread = NULL;
   4566         }
   4567     }
   4568     return (MixerThread *)thread;
   4569 }
   4570 
   4571 // checkRecordThread_l() must be called with AudioFlinger::mLock held
   4572 AudioFlinger::RecordThread *AudioFlinger::checkRecordThread_l(int input) const
   4573 {
   4574     RecordThread *thread = NULL;
   4575     if (mRecordThreads.indexOfKey(input) >= 0) {
   4576         thread = (RecordThread *)mRecordThreads.valueFor(input).get();
   4577     }
   4578     return thread;
   4579 }
   4580 
   4581 int AudioFlinger::nextUniqueId()
   4582 {
   4583     return android_atomic_inc(&mNextUniqueId);
   4584 }
   4585 
   4586 // ----------------------------------------------------------------------------
   4587 //  Effect management
   4588 // ----------------------------------------------------------------------------
   4589 
   4590 
   4591 status_t AudioFlinger::loadEffectLibrary(const char *libPath, int *handle)
   4592 {
   4593     // check calling permissions
   4594     if (!settingsAllowed()) {
   4595         return PERMISSION_DENIED;
   4596     }
   4597     // only allow libraries loaded from /system/lib/soundfx for now
   4598     if (strncmp(gEffectLibPath, libPath, strlen(gEffectLibPath)) != 0) {
   4599         return PERMISSION_DENIED;
   4600     }
   4601 
   4602     Mutex::Autolock _l(mLock);
   4603     return EffectLoadLibrary(libPath, handle);
   4604 }
   4605 
   4606 status_t AudioFlinger::unloadEffectLibrary(int handle)
   4607 {
   4608     // check calling permissions
   4609     if (!settingsAllowed()) {
   4610         return PERMISSION_DENIED;
   4611     }
   4612 
   4613     Mutex::Autolock _l(mLock);
   4614     return EffectUnloadLibrary(handle);
   4615 }
   4616 
   4617 status_t AudioFlinger::queryNumberEffects(uint32_t *numEffects)
   4618 {
   4619     Mutex::Autolock _l(mLock);
   4620     return EffectQueryNumberEffects(numEffects);
   4621 }
   4622 
   4623 status_t AudioFlinger::queryEffect(uint32_t index, effect_descriptor_t *descriptor)
   4624 {
   4625     Mutex::Autolock _l(mLock);
   4626     return EffectQueryEffect(index, descriptor);
   4627 }
   4628 
   4629 status_t AudioFlinger::getEffectDescriptor(effect_uuid_t *pUuid, effect_descriptor_t *descriptor)
   4630 {
   4631     Mutex::Autolock _l(mLock);
   4632     return EffectGetDescriptor(pUuid, descriptor);
   4633 }
   4634 
   4635 
   4636 // this UUID must match the one defined in media/libeffects/EffectVisualizer.cpp
   4637 static const effect_uuid_t VISUALIZATION_UUID_ =
   4638     {0xd069d9e0, 0x8329, 0x11df, 0x9168, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}};
   4639 
   4640 sp<IEffect> AudioFlinger::createEffect(pid_t pid,
   4641         effect_descriptor_t *pDesc,
   4642         const sp<IEffectClient>& effectClient,
   4643         int32_t priority,
   4644         int output,
   4645         int sessionId,
   4646         status_t *status,
   4647         int *id,
   4648         int *enabled)
   4649 {
   4650     status_t lStatus = NO_ERROR;
   4651     sp<EffectHandle> handle;
   4652     effect_interface_t itfe;
   4653     effect_descriptor_t desc;
   4654     sp<Client> client;
   4655     wp<Client> wclient;
   4656 
   4657     LOGV("createEffect pid %d, client %p, priority %d, sessionId %d, output %d",
   4658             pid, effectClient.get(), priority, sessionId, output);
   4659 
   4660     if (pDesc == NULL) {
   4661         lStatus = BAD_VALUE;
   4662         goto Exit;
   4663     }
   4664 
   4665     // check audio settings permission for global effects
   4666     if (sessionId == AudioSystem::SESSION_OUTPUT_MIX && !settingsAllowed()) {
   4667         lStatus = PERMISSION_DENIED;
   4668         goto Exit;
   4669     }
   4670 
   4671     // Session AudioSystem::SESSION_OUTPUT_STAGE is reserved for output stage effects
   4672     // that can only be created by audio policy manager (running in same process)
   4673     if (sessionId == AudioSystem::SESSION_OUTPUT_STAGE && getpid() != pid) {
   4674         lStatus = PERMISSION_DENIED;
   4675         goto Exit;
   4676     }
   4677 
   4678     // check recording permission for visualizer
   4679     if ((memcmp(&pDesc->type, SL_IID_VISUALIZATION, sizeof(effect_uuid_t)) == 0 ||
   4680          memcmp(&pDesc->uuid, &VISUALIZATION_UUID_, sizeof(effect_uuid_t)) == 0) &&
   4681         !recordingAllowed()) {
   4682         lStatus = PERMISSION_DENIED;
   4683         goto Exit;
   4684     }
   4685 
   4686     if (output == 0) {
   4687         if (sessionId == AudioSystem::SESSION_OUTPUT_STAGE) {
   4688             // output must be specified by AudioPolicyManager when using session
   4689             // AudioSystem::SESSION_OUTPUT_STAGE
   4690             lStatus = BAD_VALUE;
   4691             goto Exit;
   4692         } else if (sessionId == AudioSystem::SESSION_OUTPUT_MIX) {
   4693             // if the output returned by getOutputForEffect() is removed before we lock the
   4694             // mutex below, the call to checkPlaybackThread_l(output) below will detect it
   4695             // and we will exit safely
   4696             output = AudioSystem::getOutputForEffect(&desc);
   4697         }
   4698     }
   4699 
   4700     {
   4701         Mutex::Autolock _l(mLock);
   4702 
   4703 
   4704         if (!EffectIsNullUuid(&pDesc->uuid)) {
   4705             // if uuid is specified, request effect descriptor
   4706             lStatus = EffectGetDescriptor(&pDesc->uuid, &desc);
   4707             if (lStatus < 0) {
   4708                 LOGW("createEffect() error %d from EffectGetDescriptor", lStatus);
   4709                 goto Exit;
   4710             }
   4711         } else {
   4712             // if uuid is not specified, look for an available implementation
   4713             // of the required type in effect factory
   4714             if (EffectIsNullUuid(&pDesc->type)) {
   4715                 LOGW("createEffect() no effect type");
   4716                 lStatus = BAD_VALUE;
   4717                 goto Exit;
   4718             }
   4719             uint32_t numEffects = 0;
   4720             effect_descriptor_t d;
   4721             bool found = false;
   4722 
   4723             lStatus = EffectQueryNumberEffects(&numEffects);
   4724             if (lStatus < 0) {
   4725                 LOGW("createEffect() error %d from EffectQueryNumberEffects", lStatus);
   4726                 goto Exit;
   4727             }
   4728             for (uint32_t i = 0; i < numEffects; i++) {
   4729                 lStatus = EffectQueryEffect(i, &desc);
   4730                 if (lStatus < 0) {
   4731                     LOGW("createEffect() error %d from EffectQueryEffect", lStatus);
   4732                     continue;
   4733                 }
   4734                 if (memcmp(&desc.type, &pDesc->type, sizeof(effect_uuid_t)) == 0) {
   4735                     // If matching type found save effect descriptor. If the session is
   4736                     // 0 and the effect is not auxiliary, continue enumeration in case
   4737                     // an auxiliary version of this effect type is available
   4738                     found = true;
   4739                     memcpy(&d, &desc, sizeof(effect_descriptor_t));
   4740                     if (sessionId != AudioSystem::SESSION_OUTPUT_MIX ||
   4741                             (desc.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) {
   4742                         break;
   4743                     }
   4744                 }
   4745             }
   4746             if (!found) {
   4747                 lStatus = BAD_VALUE;
   4748                 LOGW("createEffect() effect not found");
   4749                 goto Exit;
   4750             }
   4751             // For same effect type, chose auxiliary version over insert version if
   4752             // connect to output mix (Compliance to OpenSL ES)
   4753             if (sessionId == AudioSystem::SESSION_OUTPUT_MIX &&
   4754                     (d.flags & EFFECT_FLAG_TYPE_MASK) != EFFECT_FLAG_TYPE_AUXILIARY) {
   4755                 memcpy(&desc, &d, sizeof(effect_descriptor_t));
   4756             }
   4757         }
   4758 
   4759         // Do not allow auxiliary effects on a session different from 0 (output mix)
   4760         if (sessionId != AudioSystem::SESSION_OUTPUT_MIX &&
   4761              (desc.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) {
   4762             lStatus = INVALID_OPERATION;
   4763             goto Exit;
   4764         }
   4765 
   4766         // return effect descriptor
   4767         memcpy(pDesc, &desc, sizeof(effect_descriptor_t));
   4768 
   4769         // If output is not specified try to find a matching audio session ID in one of the
   4770         // output threads.
   4771         // If output is 0 here, sessionId is neither SESSION_OUTPUT_STAGE nor SESSION_OUTPUT_MIX
   4772         // because of code checking output when entering the function.
   4773         if (output == 0) {
   4774              // look for the thread where the specified audio session is present
   4775             for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
   4776                 if (mPlaybackThreads.valueAt(i)->hasAudioSession(sessionId) != 0) {
   4777                     output = mPlaybackThreads.keyAt(i);
   4778                     break;
   4779                 }
   4780             }
   4781             // If no output thread contains the requested session ID, default to
   4782             // first output. The effect chain will be moved to the correct output
   4783             // thread when a track with the same session ID is created
   4784             if (output == 0 && mPlaybackThreads.size()) {
   4785                 output = mPlaybackThreads.keyAt(0);
   4786             }
   4787         }
   4788         LOGV("createEffect() got output %d for effect %s", output, desc.name);
   4789         PlaybackThread *thread = checkPlaybackThread_l(output);
   4790         if (thread == NULL) {
   4791             LOGE("createEffect() unknown output thread");
   4792             lStatus = BAD_VALUE;
   4793             goto Exit;
   4794         }
   4795 
   4796         // TODO: allow attachment of effect to inputs
   4797 
   4798         wclient = mClients.valueFor(pid);
   4799 
   4800         if (wclient != NULL) {
   4801             client = wclient.promote();
   4802         } else {
   4803             client = new Client(this, pid);
   4804             mClients.add(pid, client);
   4805         }
   4806 
   4807         // create effect on selected output trhead
   4808         handle = thread->createEffect_l(client, effectClient, priority, sessionId,
   4809                 &desc, enabled, &lStatus);
   4810         if (handle != 0 && id != NULL) {
   4811             *id = handle->id();
   4812         }
   4813     }
   4814 
   4815 Exit:
   4816     if(status) {
   4817         *status = lStatus;
   4818     }
   4819     return handle;
   4820 }
   4821 
   4822 status_t AudioFlinger::moveEffects(int session, int srcOutput, int dstOutput)
   4823 {
   4824     LOGV("moveEffects() session %d, srcOutput %d, dstOutput %d",
   4825             session, srcOutput, dstOutput);
   4826     Mutex::Autolock _l(mLock);
   4827     if (srcOutput == dstOutput) {
   4828         LOGW("moveEffects() same dst and src outputs %d", dstOutput);
   4829         return NO_ERROR;
   4830     }
   4831     PlaybackThread *srcThread = checkPlaybackThread_l(srcOutput);
   4832     if (srcThread == NULL) {
   4833         LOGW("moveEffects() bad srcOutput %d", srcOutput);
   4834         return BAD_VALUE;
   4835     }
   4836     PlaybackThread *dstThread = checkPlaybackThread_l(dstOutput);
   4837     if (dstThread == NULL) {
   4838         LOGW("moveEffects() bad dstOutput %d", dstOutput);
   4839         return BAD_VALUE;
   4840     }
   4841 
   4842     Mutex::Autolock _dl(dstThread->mLock);
   4843     Mutex::Autolock _sl(srcThread->mLock);
   4844     moveEffectChain_l(session, srcThread, dstThread, false);
   4845 
   4846     return NO_ERROR;
   4847 }
   4848 
   4849 // moveEffectChain_l mustbe called with both srcThread and dstThread mLocks held
   4850 status_t AudioFlinger::moveEffectChain_l(int session,
   4851                                    AudioFlinger::PlaybackThread *srcThread,
   4852                                    AudioFlinger::PlaybackThread *dstThread,
   4853                                    bool reRegister)
   4854 {
   4855     LOGV("moveEffectChain_l() session %d from thread %p to thread %p",
   4856             session, srcThread, dstThread);
   4857 
   4858     sp<EffectChain> chain = srcThread->getEffectChain_l(session);
   4859     if (chain == 0) {
   4860         LOGW("moveEffectChain_l() effect chain for session %d not on source thread %p",
   4861                 session, srcThread);
   4862         return INVALID_OPERATION;
   4863     }
   4864 
   4865     // remove chain first. This is useful only if reconfiguring effect chain on same output thread,
   4866     // so that a new chain is created with correct parameters when first effect is added. This is
   4867     // otherwise unecessary as removeEffect_l() will remove the chain when last effect is
   4868     // removed.
   4869     srcThread->removeEffectChain_l(chain);
   4870 
   4871     // transfer all effects one by one so that new effect chain is created on new thread with
   4872     // correct buffer sizes and audio parameters and effect engines reconfigured accordingly
   4873     int dstOutput = dstThread->id();
   4874     sp<EffectChain> dstChain;
   4875     uint32_t strategy;
   4876     sp<EffectModule> effect = chain->getEffectFromId_l(0);
   4877     while (effect != 0) {
   4878         srcThread->removeEffect_l(effect);
   4879         dstThread->addEffect_l(effect);
   4880         // if the move request is not received from audio policy manager, the effect must be
   4881         // re-registered with the new strategy and output
   4882         if (dstChain == 0) {
   4883             dstChain = effect->chain().promote();
   4884             if (dstChain == 0) {
   4885                 LOGW("moveEffectChain_l() cannot get chain from effect %p", effect.get());
   4886                 srcThread->addEffect_l(effect);
   4887                 return NO_INIT;
   4888             }
   4889             strategy = dstChain->strategy();
   4890         }
   4891         if (reRegister) {
   4892             AudioSystem::unregisterEffect(effect->id());
   4893             AudioSystem::registerEffect(&effect->desc(),
   4894                                         dstOutput,
   4895                                         strategy,
   4896                                         session,
   4897                                         effect->id());
   4898         }
   4899         effect = chain->getEffectFromId_l(0);
   4900     }
   4901 
   4902     return NO_ERROR;
   4903 }
   4904 
   4905 // PlaybackThread::createEffect_l() must be called with AudioFlinger::mLock held
   4906 sp<AudioFlinger::EffectHandle> AudioFlinger::PlaybackThread::createEffect_l(
   4907         const sp<AudioFlinger::Client>& client,
   4908         const sp<IEffectClient>& effectClient,
   4909         int32_t priority,
   4910         int sessionId,
   4911         effect_descriptor_t *desc,
   4912         int *enabled,
   4913         status_t *status
   4914         )
   4915 {
   4916     sp<EffectModule> effect;
   4917     sp<EffectHandle> handle;
   4918     status_t lStatus;
   4919     sp<Track> track;
   4920     sp<EffectChain> chain;
   4921     bool chainCreated = false;
   4922     bool effectCreated = false;
   4923     bool effectRegistered = false;
   4924 
   4925     if (mOutput == 0) {
   4926         LOGW("createEffect_l() Audio driver not initialized.");
   4927         lStatus = NO_INIT;
   4928         goto Exit;
   4929     }
   4930 
   4931     // Do not allow auxiliary effect on session other than 0
   4932     if ((desc->flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY &&
   4933         sessionId != AudioSystem::SESSION_OUTPUT_MIX) {
   4934         LOGW("createEffect_l() Cannot add auxiliary effect %s to session %d",
   4935                 desc->name, sessionId);
   4936         lStatus = BAD_VALUE;
   4937         goto Exit;
   4938     }
   4939 
   4940     // Do not allow effects with session ID 0 on direct output or duplicating threads
   4941     // TODO: add rule for hw accelerated effects on direct outputs with non PCM format
   4942     if (sessionId == AudioSystem::SESSION_OUTPUT_MIX && mType != MIXER) {
   4943         LOGW("createEffect_l() Cannot add auxiliary effect %s to session %d",
   4944                 desc->name, sessionId);
   4945         lStatus = BAD_VALUE;
   4946         goto Exit;
   4947     }
   4948 
   4949     LOGV("createEffect_l() thread %p effect %s on session %d", this, desc->name, sessionId);
   4950 
   4951     { // scope for mLock
   4952         Mutex::Autolock _l(mLock);
   4953 
   4954         // check for existing effect chain with the requested audio session
   4955         chain = getEffectChain_l(sessionId);
   4956         if (chain == 0) {
   4957             // create a new chain for this session
   4958             LOGV("createEffect_l() new effect chain for session %d", sessionId);
   4959             chain = new EffectChain(this, sessionId);
   4960             addEffectChain_l(chain);
   4961             chain->setStrategy(getStrategyForSession_l(sessionId));
   4962             chainCreated = true;
   4963         } else {
   4964             effect = chain->getEffectFromDesc_l(desc);
   4965         }
   4966 
   4967         LOGV("createEffect_l() got effect %p on chain %p", effect == 0 ? 0 : effect.get(), chain.get());
   4968 
   4969         if (effect == 0) {
   4970             int id = mAudioFlinger->nextUniqueId();
   4971             // Check CPU and memory usage
   4972             lStatus = AudioSystem::registerEffect(desc, mId, chain->strategy(), sessionId, id);
   4973             if (lStatus != NO_ERROR) {
   4974                 goto Exit;
   4975             }
   4976             effectRegistered = true;
   4977             // create a new effect module if none present in the chain
   4978             effect = new EffectModule(this, chain, desc, id, sessionId);
   4979             lStatus = effect->status();
   4980             if (lStatus != NO_ERROR) {
   4981                 goto Exit;
   4982             }
   4983             lStatus = chain->addEffect_l(effect);
   4984             if (lStatus != NO_ERROR) {
   4985                 goto Exit;
   4986             }
   4987             effectCreated = true;
   4988 
   4989             effect->setDevice(mDevice);
   4990             effect->setMode(mAudioFlinger->getMode());
   4991         }
   4992         // create effect handle and connect it to effect module
   4993         handle = new EffectHandle(effect, client, effectClient, priority);
   4994         lStatus = effect->addHandle(handle);
   4995         if (enabled) {
   4996             *enabled = (int)effect->isEnabled();
   4997         }
   4998     }
   4999 
   5000 Exit:
   5001     if (lStatus != NO_ERROR && lStatus != ALREADY_EXISTS) {
   5002         Mutex::Autolock _l(mLock);
   5003         if (effectCreated) {
   5004             chain->removeEffect_l(effect);
   5005         }
   5006         if (effectRegistered) {
   5007             AudioSystem::unregisterEffect(effect->id());
   5008         }
   5009         if (chainCreated) {
   5010             removeEffectChain_l(chain);
   5011         }
   5012         handle.clear();
   5013     }
   5014 
   5015     if(status) {
   5016         *status = lStatus;
   5017     }
   5018     return handle;
   5019 }
   5020 
   5021 // PlaybackThread::addEffect_l() must be called with AudioFlinger::mLock and
   5022 // PlaybackThread::mLock held
   5023 status_t AudioFlinger::PlaybackThread::addEffect_l(const sp<EffectModule>& effect)
   5024 {
   5025     // check for existing effect chain with the requested audio session
   5026     int sessionId = effect->sessionId();
   5027     sp<EffectChain> chain = getEffectChain_l(sessionId);
   5028     bool chainCreated = false;
   5029 
   5030     if (chain == 0) {
   5031         // create a new chain for this session
   5032         LOGV("addEffect_l() new effect chain for session %d", sessionId);
   5033         chain = new EffectChain(this, sessionId);
   5034         addEffectChain_l(chain);
   5035         chain->setStrategy(getStrategyForSession_l(sessionId));
   5036         chainCreated = true;
   5037     }
   5038     LOGV("addEffect_l() %p chain %p effect %p", this, chain.get(), effect.get());
   5039 
   5040     if (chain->getEffectFromId_l(effect->id()) != 0) {
   5041         LOGW("addEffect_l() %p effect %s already present in chain %p",
   5042                 this, effect->desc().name, chain.get());
   5043         return BAD_VALUE;
   5044     }
   5045 
   5046     status_t status = chain->addEffect_l(effect);
   5047     if (status != NO_ERROR) {
   5048         if (chainCreated) {
   5049             removeEffectChain_l(chain);
   5050         }
   5051         return status;
   5052     }
   5053 
   5054     effect->setDevice(mDevice);
   5055     effect->setMode(mAudioFlinger->getMode());
   5056     return NO_ERROR;
   5057 }
   5058 
   5059 void AudioFlinger::PlaybackThread::removeEffect_l(const sp<EffectModule>& effect) {
   5060 
   5061     LOGV("removeEffect_l() %p effect %p", this, effect.get());
   5062     effect_descriptor_t desc = effect->desc();
   5063     if ((desc.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) {
   5064         detachAuxEffect_l(effect->id());
   5065     }
   5066 
   5067     sp<EffectChain> chain = effect->chain().promote();
   5068     if (chain != 0) {
   5069         // remove effect chain if removing last effect
   5070         if (chain->removeEffect_l(effect) == 0) {
   5071             removeEffectChain_l(chain);
   5072         }
   5073     } else {
   5074         LOGW("removeEffect_l() %p cannot promote chain for effect %p", this, effect.get());
   5075     }
   5076 }
   5077 
   5078 void AudioFlinger::PlaybackThread::disconnectEffect(const sp<EffectModule>& effect,
   5079                                                     const wp<EffectHandle>& handle) {
   5080     Mutex::Autolock _l(mLock);
   5081     LOGV("disconnectEffect() %p effect %p", this, effect.get());
   5082     // delete the effect module if removing last handle on it
   5083     if (effect->removeHandle(handle) == 0) {
   5084         removeEffect_l(effect);
   5085         AudioSystem::unregisterEffect(effect->id());
   5086     }
   5087 }
   5088 
   5089 status_t AudioFlinger::PlaybackThread::addEffectChain_l(const sp<EffectChain>& chain)
   5090 {
   5091     int session = chain->sessionId();
   5092     int16_t *buffer = mMixBuffer;
   5093     bool ownsBuffer = false;
   5094 
   5095     LOGV("addEffectChain_l() %p on thread %p for session %d", chain.get(), this, session);
   5096     if (session > 0) {
   5097         // Only one effect chain can be present in direct output thread and it uses
   5098         // the mix buffer as input
   5099         if (mType != DIRECT) {
   5100             size_t numSamples = mFrameCount * mChannelCount;
   5101             buffer = new int16_t[numSamples];
   5102             memset(buffer, 0, numSamples * sizeof(int16_t));
   5103             LOGV("addEffectChain_l() creating new input buffer %p session %d", buffer, session);
   5104             ownsBuffer = true;
   5105         }
   5106 
   5107         // Attach all tracks with same session ID to this chain.
   5108         for (size_t i = 0; i < mTracks.size(); ++i) {
   5109             sp<Track> track = mTracks[i];
   5110             if (session == track->sessionId()) {
   5111                 LOGV("addEffectChain_l() track->setMainBuffer track %p buffer %p", track.get(), buffer);
   5112                 track->setMainBuffer(buffer);
   5113             }
   5114         }
   5115 
   5116         // indicate all active tracks in the chain
   5117         for (size_t i = 0 ; i < mActiveTracks.size() ; ++i) {
   5118             sp<Track> track = mActiveTracks[i].promote();
   5119             if (track == 0) continue;
   5120             if (session == track->sessionId()) {
   5121                 LOGV("addEffectChain_l() activating track %p on session %d", track.get(), session);
   5122                 chain->startTrack();
   5123             }
   5124         }
   5125     }
   5126 
   5127     chain->setInBuffer(buffer, ownsBuffer);
   5128     chain->setOutBuffer(mMixBuffer);
   5129     // Effect chain for session AudioSystem::SESSION_OUTPUT_STAGE is inserted at end of effect
   5130     // chains list in order to be processed last as it contains output stage effects
   5131     // Effect chain for session AudioSystem::SESSION_OUTPUT_MIX is inserted before
   5132     // session AudioSystem::SESSION_OUTPUT_STAGE to be processed
   5133     // after track specific effects and before output stage
   5134     // It is therefore mandatory that AudioSystem::SESSION_OUTPUT_MIX == 0 and
   5135     // that AudioSystem::SESSION_OUTPUT_STAGE < AudioSystem::SESSION_OUTPUT_MIX
   5136     // Effect chain for other sessions are inserted at beginning of effect
   5137     // chains list to be processed before output mix effects. Relative order between other
   5138     // sessions is not important
   5139     size_t size = mEffectChains.size();
   5140     size_t i = 0;
   5141     for (i = 0; i < size; i++) {
   5142         if (mEffectChains[i]->sessionId() < session) break;
   5143     }
   5144     mEffectChains.insertAt(chain, i);
   5145 
   5146     return NO_ERROR;
   5147 }
   5148 
   5149 size_t AudioFlinger::PlaybackThread::removeEffectChain_l(const sp<EffectChain>& chain)
   5150 {
   5151     int session = chain->sessionId();
   5152 
   5153     LOGV("removeEffectChain_l() %p from thread %p for session %d", chain.get(), this, session);
   5154 
   5155     for (size_t i = 0; i < mEffectChains.size(); i++) {
   5156         if (chain == mEffectChains[i]) {
   5157             mEffectChains.removeAt(i);
   5158             // detach all tracks with same session ID from this chain
   5159             for (size_t i = 0; i < mTracks.size(); ++i) {
   5160                 sp<Track> track = mTracks[i];
   5161                 if (session == track->sessionId()) {
   5162                     track->setMainBuffer(mMixBuffer);
   5163                 }
   5164             }
   5165             break;
   5166         }
   5167     }
   5168     return mEffectChains.size();
   5169 }
   5170 
   5171 void AudioFlinger::PlaybackThread::lockEffectChains_l(
   5172         Vector<sp <AudioFlinger::EffectChain> >& effectChains)
   5173 {
   5174     effectChains = mEffectChains;
   5175     for (size_t i = 0; i < mEffectChains.size(); i++) {
   5176         mEffectChains[i]->lock();
   5177     }
   5178 }
   5179 
   5180 void AudioFlinger::PlaybackThread::unlockEffectChains(
   5181         Vector<sp <AudioFlinger::EffectChain> >& effectChains)
   5182 {
   5183     for (size_t i = 0; i < effectChains.size(); i++) {
   5184         effectChains[i]->unlock();
   5185     }
   5186 }
   5187 
   5188 
   5189 sp<AudioFlinger::EffectModule> AudioFlinger::PlaybackThread::getEffect_l(int sessionId, int effectId)
   5190 {
   5191     sp<EffectModule> effect;
   5192 
   5193     sp<EffectChain> chain = getEffectChain_l(sessionId);
   5194     if (chain != 0) {
   5195         effect = chain->getEffectFromId_l(effectId);
   5196     }
   5197     return effect;
   5198 }
   5199 
   5200 status_t AudioFlinger::PlaybackThread::attachAuxEffect(
   5201         const sp<AudioFlinger::PlaybackThread::Track> track, int EffectId)
   5202 {
   5203     Mutex::Autolock _l(mLock);
   5204     return attachAuxEffect_l(track, EffectId);
   5205 }
   5206 
   5207 status_t AudioFlinger::PlaybackThread::attachAuxEffect_l(
   5208         const sp<AudioFlinger::PlaybackThread::Track> track, int EffectId)
   5209 {
   5210     status_t status = NO_ERROR;
   5211 
   5212     if (EffectId == 0) {
   5213         track->setAuxBuffer(0, NULL);
   5214     } else {
   5215         // Auxiliary effects are always in audio session AudioSystem::SESSION_OUTPUT_MIX
   5216         sp<EffectModule> effect = getEffect_l(AudioSystem::SESSION_OUTPUT_MIX, EffectId);
   5217         if (effect != 0) {
   5218             if ((effect->desc().flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) {
   5219                 track->setAuxBuffer(EffectId, (int32_t *)effect->inBuffer());
   5220             } else {
   5221                 status = INVALID_OPERATION;
   5222             }
   5223         } else {
   5224             status = BAD_VALUE;
   5225         }
   5226     }
   5227     return status;
   5228 }
   5229 
   5230 void AudioFlinger::PlaybackThread::detachAuxEffect_l(int effectId)
   5231 {
   5232      for (size_t i = 0; i < mTracks.size(); ++i) {
   5233         sp<Track> track = mTracks[i];
   5234         if (track->auxEffectId() == effectId) {
   5235             attachAuxEffect_l(track, 0);
   5236         }
   5237     }
   5238 }
   5239 
   5240 // ----------------------------------------------------------------------------
   5241 //  EffectModule implementation
   5242 // ----------------------------------------------------------------------------
   5243 
   5244 #undef LOG_TAG
   5245 #define LOG_TAG "AudioFlinger::EffectModule"
   5246 
   5247 AudioFlinger::EffectModule::EffectModule(const wp<ThreadBase>& wThread,
   5248                                         const wp<AudioFlinger::EffectChain>& chain,
   5249                                         effect_descriptor_t *desc,
   5250                                         int id,
   5251                                         int sessionId)
   5252     : mThread(wThread), mChain(chain), mId(id), mSessionId(sessionId), mEffectInterface(NULL),
   5253       mStatus(NO_INIT), mState(IDLE)
   5254 {
   5255     LOGV("Constructor %p", this);
   5256     int lStatus;
   5257     sp<ThreadBase> thread = mThread.promote();
   5258     if (thread == 0) {
   5259         return;
   5260     }
   5261     PlaybackThread *p = (PlaybackThread *)thread.get();
   5262 
   5263     memcpy(&mDescriptor, desc, sizeof(effect_descriptor_t));
   5264 
   5265     // create effect engine from effect factory
   5266     mStatus = EffectCreate(&desc->uuid, sessionId, p->id(), &mEffectInterface);
   5267 
   5268     if (mStatus != NO_ERROR) {
   5269         return;
   5270     }
   5271     lStatus = init();
   5272     if (lStatus < 0) {
   5273         mStatus = lStatus;
   5274         goto Error;
   5275     }
   5276 
   5277     LOGV("Constructor success name %s, Interface %p", mDescriptor.name, mEffectInterface);
   5278     return;
   5279 Error:
   5280     EffectRelease(mEffectInterface);
   5281     mEffectInterface = NULL;
   5282     LOGV("Constructor Error %d", mStatus);
   5283 }
   5284 
   5285 AudioFlinger::EffectModule::~EffectModule()
   5286 {
   5287     LOGV("Destructor %p", this);
   5288     if (mEffectInterface != NULL) {
   5289         // release effect engine
   5290         EffectRelease(mEffectInterface);
   5291     }
   5292 }
   5293 
   5294 status_t AudioFlinger::EffectModule::addHandle(sp<EffectHandle>& handle)
   5295 {
   5296     status_t status;
   5297 
   5298     Mutex::Autolock _l(mLock);
   5299     // First handle in mHandles has highest priority and controls the effect module
   5300     int priority = handle->priority();
   5301     size_t size = mHandles.size();
   5302     sp<EffectHandle> h;
   5303     size_t i;
   5304     for (i = 0; i < size; i++) {
   5305         h = mHandles[i].promote();
   5306         if (h == 0) continue;
   5307         if (h->priority() <= priority) break;
   5308     }
   5309     // if inserted in first place, move effect control from previous owner to this handle
   5310     if (i == 0) {
   5311         if (h != 0) {
   5312             h->setControl(false, true);
   5313         }
   5314         handle->setControl(true, false);
   5315         status = NO_ERROR;
   5316     } else {
   5317         status = ALREADY_EXISTS;
   5318     }
   5319     mHandles.insertAt(handle, i);
   5320     return status;
   5321 }
   5322 
   5323 size_t AudioFlinger::EffectModule::removeHandle(const wp<EffectHandle>& handle)
   5324 {
   5325     Mutex::Autolock _l(mLock);
   5326     size_t size = mHandles.size();
   5327     size_t i;
   5328     for (i = 0; i < size; i++) {
   5329         if (mHandles[i] == handle) break;
   5330     }
   5331     if (i == size) {
   5332         return size;
   5333     }
   5334     mHandles.removeAt(i);
   5335     size = mHandles.size();
   5336     // if removed from first place, move effect control from this handle to next in line
   5337     if (i == 0 && size != 0) {
   5338         sp<EffectHandle> h = mHandles[0].promote();
   5339         if (h != 0) {
   5340             h->setControl(true, true);
   5341         }
   5342     }
   5343 
   5344     // Release effect engine here so that it is done immediately. Otherwise it will be released
   5345     // by the destructor when the last strong reference on the this object is released which can
   5346     // happen after next process is called on this effect.
   5347     if (size == 0 && mEffectInterface != NULL) {
   5348         // release effect engine
   5349         EffectRelease(mEffectInterface);
   5350         mEffectInterface = NULL;
   5351     }
   5352 
   5353     return size;
   5354 }
   5355 
   5356 void AudioFlinger::EffectModule::disconnect(const wp<EffectHandle>& handle)
   5357 {
   5358     // keep a strong reference on this EffectModule to avoid calling the
   5359     // destructor before we exit
   5360     sp<EffectModule> keep(this);
   5361     {
   5362         sp<ThreadBase> thread = mThread.promote();
   5363         if (thread != 0) {
   5364             PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
   5365             playbackThread->disconnectEffect(keep, handle);
   5366         }
   5367     }
   5368 }
   5369 
   5370 void AudioFlinger::EffectModule::updateState() {
   5371     Mutex::Autolock _l(mLock);
   5372 
   5373     switch (mState) {
   5374     case RESTART:
   5375         reset_l();
   5376         // FALL THROUGH
   5377 
   5378     case STARTING:
   5379         // clear auxiliary effect input buffer for next accumulation
   5380         if ((mDescriptor.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) {
   5381             memset(mConfig.inputCfg.buffer.raw,
   5382                    0,
   5383                    mConfig.inputCfg.buffer.frameCount*sizeof(int32_t));
   5384         }
   5385         start_l();
   5386         mState = ACTIVE;
   5387         break;
   5388     case STOPPING:
   5389         stop_l();
   5390         mDisableWaitCnt = mMaxDisableWaitCnt;
   5391         mState = STOPPED;
   5392         break;
   5393     case STOPPED:
   5394         // mDisableWaitCnt is forced to 1 by process() when the engine indicates the end of the
   5395         // turn off sequence.
   5396         if (--mDisableWaitCnt == 0) {
   5397             reset_l();
   5398             mState = IDLE;
   5399         }
   5400         break;
   5401     default: //IDLE , ACTIVE
   5402         break;
   5403     }
   5404 }
   5405 
   5406 void AudioFlinger::EffectModule::process()
   5407 {
   5408     Mutex::Autolock _l(mLock);
   5409 
   5410     if (mEffectInterface == NULL ||
   5411             mConfig.inputCfg.buffer.raw == NULL ||
   5412             mConfig.outputCfg.buffer.raw == NULL) {
   5413         return;
   5414     }
   5415 
   5416     if (isProcessEnabled()) {
   5417         // do 32 bit to 16 bit conversion for auxiliary effect input buffer
   5418         if ((mDescriptor.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) {
   5419             AudioMixer::ditherAndClamp(mConfig.inputCfg.buffer.s32,
   5420                                         mConfig.inputCfg.buffer.s32,
   5421                                         mConfig.inputCfg.buffer.frameCount/2);
   5422         }
   5423 
   5424         // do the actual processing in the effect engine
   5425         int ret = (*mEffectInterface)->process(mEffectInterface,
   5426                                                &mConfig.inputCfg.buffer,
   5427                                                &mConfig.outputCfg.buffer);
   5428 
   5429         // force transition to IDLE state when engine is ready
   5430         if (mState == STOPPED && ret == -ENODATA) {
   5431             mDisableWaitCnt = 1;
   5432         }
   5433 
   5434         // clear auxiliary effect input buffer for next accumulation
   5435         if ((mDescriptor.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) {
   5436             memset(mConfig.inputCfg.buffer.raw, 0, mConfig.inputCfg.buffer.frameCount*sizeof(int32_t));
   5437         }
   5438     } else if ((mDescriptor.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_INSERT &&
   5439                 mConfig.inputCfg.buffer.raw != mConfig.outputCfg.buffer.raw){
   5440         // If an insert effect is idle and input buffer is different from output buffer, copy input to
   5441         // output
   5442         sp<EffectChain> chain = mChain.promote();
   5443         if (chain != 0 && chain->activeTracks() != 0) {
   5444             size_t size = mConfig.inputCfg.buffer.frameCount * sizeof(int16_t);
   5445             if (mConfig.inputCfg.channels == CHANNEL_STEREO) {
   5446                 size *= 2;
   5447             }
   5448             memcpy(mConfig.outputCfg.buffer.raw, mConfig.inputCfg.buffer.raw, size);
   5449         }
   5450     }
   5451 }
   5452 
   5453 void AudioFlinger::EffectModule::reset_l()
   5454 {
   5455     if (mEffectInterface == NULL) {
   5456         return;
   5457     }
   5458     (*mEffectInterface)->command(mEffectInterface, EFFECT_CMD_RESET, 0, NULL, 0, NULL);
   5459 }
   5460 
   5461 status_t AudioFlinger::EffectModule::configure()
   5462 {
   5463     uint32_t channels;
   5464     if (mEffectInterface == NULL) {
   5465         return NO_INIT;
   5466     }
   5467 
   5468     sp<ThreadBase> thread = mThread.promote();
   5469     if (thread == 0) {
   5470         return DEAD_OBJECT;
   5471     }
   5472 
   5473     // TODO: handle configuration of effects replacing track process
   5474     if (thread->channelCount() == 1) {
   5475         channels = CHANNEL_MONO;
   5476     } else {
   5477         channels = CHANNEL_STEREO;
   5478     }
   5479 
   5480     if ((mDescriptor.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) {
   5481         mConfig.inputCfg.channels = CHANNEL_MONO;
   5482     } else {
   5483         mConfig.inputCfg.channels = channels;
   5484     }
   5485     mConfig.outputCfg.channels = channels;
   5486     mConfig.inputCfg.format = SAMPLE_FORMAT_PCM_S15;
   5487     mConfig.outputCfg.format = SAMPLE_FORMAT_PCM_S15;
   5488     mConfig.inputCfg.samplingRate = thread->sampleRate();
   5489     mConfig.outputCfg.samplingRate = mConfig.inputCfg.samplingRate;
   5490     mConfig.inputCfg.bufferProvider.cookie = NULL;
   5491     mConfig.inputCfg.bufferProvider.getBuffer = NULL;
   5492     mConfig.inputCfg.bufferProvider.releaseBuffer = NULL;
   5493     mConfig.outputCfg.bufferProvider.cookie = NULL;
   5494     mConfig.outputCfg.bufferProvider.getBuffer = NULL;
   5495     mConfig.outputCfg.bufferProvider.releaseBuffer = NULL;
   5496     mConfig.inputCfg.accessMode = EFFECT_BUFFER_ACCESS_READ;
   5497     // Insert effect:
   5498     // - in session AudioSystem::SESSION_OUTPUT_MIX or AudioSystem::SESSION_OUTPUT_STAGE,
   5499     // always overwrites output buffer: input buffer == output buffer
   5500     // - in other sessions:
   5501     //      last effect in the chain accumulates in output buffer: input buffer != output buffer
   5502     //      other effect: overwrites output buffer: input buffer == output buffer
   5503     // Auxiliary effect:
   5504     //      accumulates in output buffer: input buffer != output buffer
   5505     // Therefore: accumulate <=> input buffer != output buffer
   5506     if (mConfig.inputCfg.buffer.raw != mConfig.outputCfg.buffer.raw) {
   5507         mConfig.outputCfg.accessMode = EFFECT_BUFFER_ACCESS_ACCUMULATE;
   5508     } else {
   5509         mConfig.outputCfg.accessMode = EFFECT_BUFFER_ACCESS_WRITE;
   5510     }
   5511     mConfig.inputCfg.mask = EFFECT_CONFIG_ALL;
   5512     mConfig.outputCfg.mask = EFFECT_CONFIG_ALL;
   5513     mConfig.inputCfg.buffer.frameCount = thread->frameCount();
   5514     mConfig.outputCfg.buffer.frameCount = mConfig.inputCfg.buffer.frameCount;
   5515 
   5516     LOGV("configure() %p thread %p buffer %p framecount %d",
   5517             this, thread.get(), mConfig.inputCfg.buffer.raw, mConfig.inputCfg.buffer.frameCount);
   5518 
   5519     status_t cmdStatus;
   5520     uint32_t size = sizeof(int);
   5521     status_t status = (*mEffectInterface)->command(mEffectInterface,
   5522                                                    EFFECT_CMD_CONFIGURE,
   5523                                                    sizeof(effect_config_t),
   5524                                                    &mConfig,
   5525                                                    &size,
   5526                                                    &cmdStatus);
   5527     if (status == 0) {
   5528         status = cmdStatus;
   5529     }
   5530 
   5531     mMaxDisableWaitCnt = (MAX_DISABLE_TIME_MS * mConfig.outputCfg.samplingRate) /
   5532             (1000 * mConfig.outputCfg.buffer.frameCount);
   5533 
   5534     return status;
   5535 }
   5536 
   5537 status_t AudioFlinger::EffectModule::init()
   5538 {
   5539     Mutex::Autolock _l(mLock);
   5540     if (mEffectInterface == NULL) {
   5541         return NO_INIT;
   5542     }
   5543     status_t cmdStatus;
   5544     uint32_t size = sizeof(status_t);
   5545     status_t status = (*mEffectInterface)->command(mEffectInterface,
   5546                                                    EFFECT_CMD_INIT,
   5547                                                    0,
   5548                                                    NULL,
   5549                                                    &size,
   5550                                                    &cmdStatus);
   5551     if (status == 0) {
   5552         status = cmdStatus;
   5553     }
   5554     return status;
   5555 }
   5556 
   5557 status_t AudioFlinger::EffectModule::start_l()
   5558 {
   5559     if (mEffectInterface == NULL) {
   5560         return NO_INIT;
   5561     }
   5562     status_t cmdStatus;
   5563     uint32_t size = sizeof(status_t);
   5564     status_t status = (*mEffectInterface)->command(mEffectInterface,
   5565                                                    EFFECT_CMD_ENABLE,
   5566                                                    0,
   5567                                                    NULL,
   5568                                                    &size,
   5569                                                    &cmdStatus);
   5570     if (status == 0) {
   5571         status = cmdStatus;
   5572     }
   5573     return status;
   5574 }
   5575 
   5576 status_t AudioFlinger::EffectModule::stop_l()
   5577 {
   5578     if (mEffectInterface == NULL) {
   5579         return NO_INIT;
   5580     }
   5581     status_t cmdStatus;
   5582     uint32_t size = sizeof(status_t);
   5583     status_t status = (*mEffectInterface)->command(mEffectInterface,
   5584                                                    EFFECT_CMD_DISABLE,
   5585                                                    0,
   5586                                                    NULL,
   5587                                                    &size,
   5588                                                    &cmdStatus);
   5589     if (status == 0) {
   5590         status = cmdStatus;
   5591     }
   5592     return status;
   5593 }
   5594 
   5595 status_t AudioFlinger::EffectModule::command(uint32_t cmdCode,
   5596                                              uint32_t cmdSize,
   5597                                              void *pCmdData,
   5598                                              uint32_t *replySize,
   5599                                              void *pReplyData)
   5600 {
   5601     Mutex::Autolock _l(mLock);
   5602 //    LOGV("command(), cmdCode: %d, mEffectInterface: %p", cmdCode, mEffectInterface);
   5603 
   5604     if (mEffectInterface == NULL) {
   5605         return NO_INIT;
   5606     }
   5607     status_t status = (*mEffectInterface)->command(mEffectInterface,
   5608                                                    cmdCode,
   5609                                                    cmdSize,
   5610                                                    pCmdData,
   5611                                                    replySize,
   5612                                                    pReplyData);
   5613     if (cmdCode != EFFECT_CMD_GET_PARAM && status == NO_ERROR) {
   5614         uint32_t size = (replySize == NULL) ? 0 : *replySize;
   5615         for (size_t i = 1; i < mHandles.size(); i++) {
   5616             sp<EffectHandle> h = mHandles[i].promote();
   5617             if (h != 0) {
   5618                 h->commandExecuted(cmdCode, cmdSize, pCmdData, size, pReplyData);
   5619             }
   5620         }
   5621     }
   5622     return status;
   5623 }
   5624 
   5625 status_t AudioFlinger::EffectModule::setEnabled(bool enabled)
   5626 {
   5627     Mutex::Autolock _l(mLock);
   5628     LOGV("setEnabled %p enabled %d", this, enabled);
   5629 
   5630     if (enabled != isEnabled()) {
   5631         switch (mState) {
   5632         // going from disabled to enabled
   5633         case IDLE:
   5634             mState = STARTING;
   5635             break;
   5636         case STOPPED:
   5637             mState = RESTART;
   5638             break;
   5639         case STOPPING:
   5640             mState = ACTIVE;
   5641             break;
   5642 
   5643         // going from enabled to disabled
   5644         case RESTART:
   5645             mState = STOPPED;
   5646             break;
   5647         case STARTING:
   5648             mState = IDLE;
   5649             break;
   5650         case ACTIVE:
   5651             mState = STOPPING;
   5652             break;
   5653         }
   5654         for (size_t i = 1; i < mHandles.size(); i++) {
   5655             sp<EffectHandle> h = mHandles[i].promote();
   5656             if (h != 0) {
   5657                 h->setEnabled(enabled);
   5658             }
   5659         }
   5660     }
   5661     return NO_ERROR;
   5662 }
   5663 
   5664 bool AudioFlinger::EffectModule::isEnabled()
   5665 {
   5666     switch (mState) {
   5667     case RESTART:
   5668     case STARTING:
   5669     case ACTIVE:
   5670         return true;
   5671     case IDLE:
   5672     case STOPPING:
   5673     case STOPPED:
   5674     default:
   5675         return false;
   5676     }
   5677 }
   5678 
   5679 bool AudioFlinger::EffectModule::isProcessEnabled()
   5680 {
   5681     switch (mState) {
   5682     case RESTART:
   5683     case ACTIVE:
   5684     case STOPPING:
   5685     case STOPPED:
   5686         return true;
   5687     case IDLE:
   5688     case STARTING:
   5689     default:
   5690         return false;
   5691     }
   5692 }
   5693 
   5694 status_t AudioFlinger::EffectModule::setVolume(uint32_t *left, uint32_t *right, bool controller)
   5695 {
   5696     Mutex::Autolock _l(mLock);
   5697     status_t status = NO_ERROR;
   5698 
   5699     // Send volume indication if EFFECT_FLAG_VOLUME_IND is set and read back altered volume
   5700     // if controller flag is set (Note that controller == TRUE => EFFECT_FLAG_VOLUME_CTRL set)
   5701     if (isProcessEnabled() &&
   5702             ((mDescriptor.flags & EFFECT_FLAG_VOLUME_MASK) == EFFECT_FLAG_VOLUME_CTRL ||
   5703             (mDescriptor.flags & EFFECT_FLAG_VOLUME_MASK) == EFFECT_FLAG_VOLUME_IND)) {
   5704         status_t cmdStatus;
   5705         uint32_t volume[2];
   5706         uint32_t *pVolume = NULL;
   5707         uint32_t size = sizeof(volume);
   5708         volume[0] = *left;
   5709         volume[1] = *right;
   5710         if (controller) {
   5711             pVolume = volume;
   5712         }
   5713         status = (*mEffectInterface)->command(mEffectInterface,
   5714                                               EFFECT_CMD_SET_VOLUME,
   5715                                               size,
   5716                                               volume,
   5717                                               &size,
   5718                                               pVolume);
   5719         if (controller && status == NO_ERROR && size == sizeof(volume)) {
   5720             *left = volume[0];
   5721             *right = volume[1];
   5722         }
   5723     }
   5724     return status;
   5725 }
   5726 
   5727 status_t AudioFlinger::EffectModule::setDevice(uint32_t device)
   5728 {
   5729     Mutex::Autolock _l(mLock);
   5730     status_t status = NO_ERROR;
   5731     if ((mDescriptor.flags & EFFECT_FLAG_DEVICE_MASK) == EFFECT_FLAG_DEVICE_IND) {
   5732         // convert device bit field from AudioSystem to EffectApi format.
   5733         device = deviceAudioSystemToEffectApi(device);
   5734         if (device == 0) {
   5735             return BAD_VALUE;
   5736         }
   5737         status_t cmdStatus;
   5738         uint32_t size = sizeof(status_t);
   5739         status = (*mEffectInterface)->command(mEffectInterface,
   5740                                               EFFECT_CMD_SET_DEVICE,
   5741                                               sizeof(uint32_t),
   5742                                               &device,
   5743                                               &size,
   5744                                               &cmdStatus);
   5745         if (status == NO_ERROR) {
   5746             status = cmdStatus;
   5747         }
   5748     }
   5749     return status;
   5750 }
   5751 
   5752 status_t AudioFlinger::EffectModule::setMode(uint32_t mode)
   5753 {
   5754     Mutex::Autolock _l(mLock);
   5755     status_t status = NO_ERROR;
   5756     if ((mDescriptor.flags & EFFECT_FLAG_AUDIO_MODE_MASK) == EFFECT_FLAG_AUDIO_MODE_IND) {
   5757         // convert audio mode from AudioSystem to EffectApi format.
   5758         int effectMode = modeAudioSystemToEffectApi(mode);
   5759         if (effectMode < 0) {
   5760             return BAD_VALUE;
   5761         }
   5762         status_t cmdStatus;
   5763         uint32_t size = sizeof(status_t);
   5764         status = (*mEffectInterface)->command(mEffectInterface,
   5765                                               EFFECT_CMD_SET_AUDIO_MODE,
   5766                                               sizeof(int),
   5767                                               &effectMode,
   5768                                               &size,
   5769                                               &cmdStatus);
   5770         if (status == NO_ERROR) {
   5771             status = cmdStatus;
   5772         }
   5773     }
   5774     return status;
   5775 }
   5776 
   5777 // update this table when AudioSystem::audio_devices or audio_device_e (in EffectApi.h) are modified
   5778 const uint32_t AudioFlinger::EffectModule::sDeviceConvTable[] = {
   5779     DEVICE_EARPIECE, // AudioSystem::DEVICE_OUT_EARPIECE
   5780     DEVICE_SPEAKER, // AudioSystem::DEVICE_OUT_SPEAKER
   5781     DEVICE_WIRED_HEADSET, // case AudioSystem::DEVICE_OUT_WIRED_HEADSET
   5782     DEVICE_WIRED_HEADPHONE, // AudioSystem::DEVICE_OUT_WIRED_HEADPHONE
   5783     DEVICE_BLUETOOTH_SCO, // AudioSystem::DEVICE_OUT_BLUETOOTH_SCO
   5784     DEVICE_BLUETOOTH_SCO_HEADSET, // AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_HEADSET
   5785     DEVICE_BLUETOOTH_SCO_CARKIT, //  AudioSystem::DEVICE_OUT_BLUETOOTH_SCO_CARKIT
   5786     DEVICE_BLUETOOTH_A2DP, //  AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP
   5787     DEVICE_BLUETOOTH_A2DP_HEADPHONES, // AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES
   5788     DEVICE_BLUETOOTH_A2DP_SPEAKER, // AudioSystem::DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER
   5789     DEVICE_AUX_DIGITAL // AudioSystem::DEVICE_OUT_AUX_DIGITAL
   5790 };
   5791 
   5792 uint32_t AudioFlinger::EffectModule::deviceAudioSystemToEffectApi(uint32_t device)
   5793 {
   5794     uint32_t deviceOut = 0;
   5795     while (device) {
   5796         const uint32_t i = 31 - __builtin_clz(device);
   5797         device &= ~(1 << i);
   5798         if (i >= sizeof(sDeviceConvTable)/sizeof(uint32_t)) {
   5799             LOGE("device convertion error for AudioSystem device 0x%08x", device);
   5800             return 0;
   5801         }
   5802         deviceOut |= (uint32_t)sDeviceConvTable[i];
   5803     }
   5804     return deviceOut;
   5805 }
   5806 
   5807 // update this table when AudioSystem::audio_mode or audio_mode_e (in EffectApi.h) are modified
   5808 const uint32_t AudioFlinger::EffectModule::sModeConvTable[] = {
   5809     AUDIO_MODE_NORMAL,   // AudioSystem::MODE_NORMAL
   5810     AUDIO_MODE_RINGTONE, // AudioSystem::MODE_RINGTONE
   5811     AUDIO_MODE_IN_CALL   // AudioSystem::MODE_IN_CALL
   5812 };
   5813 
   5814 int AudioFlinger::EffectModule::modeAudioSystemToEffectApi(uint32_t mode)
   5815 {
   5816     int modeOut = -1;
   5817     if (mode < sizeof(sModeConvTable) / sizeof(uint32_t)) {
   5818         modeOut = (int)sModeConvTable[mode];
   5819     }
   5820     return modeOut;
   5821 }
   5822 
   5823 status_t AudioFlinger::EffectModule::dump(int fd, const Vector<String16>& args)
   5824 {
   5825     const size_t SIZE = 256;
   5826     char buffer[SIZE];
   5827     String8 result;
   5828 
   5829     snprintf(buffer, SIZE, "\tEffect ID %d:\n", mId);
   5830     result.append(buffer);
   5831 
   5832     bool locked = tryLock(mLock);
   5833     // failed to lock - AudioFlinger is probably deadlocked
   5834     if (!locked) {
   5835         result.append("\t\tCould not lock Fx mutex:\n");
   5836     }
   5837 
   5838     result.append("\t\tSession Status State Engine:\n");
   5839     snprintf(buffer, SIZE, "\t\t%05d   %03d    %03d   0x%08x\n",
   5840             mSessionId, mStatus, mState, (uint32_t)mEffectInterface);
   5841     result.append(buffer);
   5842 
   5843     result.append("\t\tDescriptor:\n");
   5844     snprintf(buffer, SIZE, "\t\t- UUID: %08X-%04X-%04X-%04X-%02X%02X%02X%02X%02X%02X\n",
   5845             mDescriptor.uuid.timeLow, mDescriptor.uuid.timeMid, mDescriptor.uuid.timeHiAndVersion,
   5846             mDescriptor.uuid.clockSeq, mDescriptor.uuid.node[0], mDescriptor.uuid.node[1],mDescriptor.uuid.node[2],
   5847             mDescriptor.uuid.node[3],mDescriptor.uuid.node[4],mDescriptor.uuid.node[5]);
   5848     result.append(buffer);
   5849     snprintf(buffer, SIZE, "\t\t- TYPE: %08X-%04X-%04X-%04X-%02X%02X%02X%02X%02X%02X\n",
   5850                 mDescriptor.type.timeLow, mDescriptor.type.timeMid, mDescriptor.type.timeHiAndVersion,
   5851                 mDescriptor.type.clockSeq, mDescriptor.type.node[0], mDescriptor.type.node[1],mDescriptor.type.node[2],
   5852                 mDescriptor.type.node[3],mDescriptor.type.node[4],mDescriptor.type.node[5]);
   5853     result.append(buffer);
   5854     snprintf(buffer, SIZE, "\t\t- apiVersion: %04X\n\t\t- flags: %08X\n",
   5855             mDescriptor.apiVersion,
   5856             mDescriptor.flags);
   5857     result.append(buffer);
   5858     snprintf(buffer, SIZE, "\t\t- name: %s\n",
   5859             mDescriptor.name);
   5860     result.append(buffer);
   5861     snprintf(buffer, SIZE, "\t\t- implementor: %s\n",
   5862             mDescriptor.implementor);
   5863     result.append(buffer);
   5864 
   5865     result.append("\t\t- Input configuration:\n");
   5866     result.append("\t\t\tBuffer     Frames  Smp rate Channels Format\n");
   5867     snprintf(buffer, SIZE, "\t\t\t0x%08x %05d   %05d    %08x %d\n",
   5868             (uint32_t)mConfig.inputCfg.buffer.raw,
   5869             mConfig.inputCfg.buffer.frameCount,
   5870             mConfig.inputCfg.samplingRate,
   5871             mConfig.inputCfg.channels,
   5872             mConfig.inputCfg.format);
   5873     result.append(buffer);
   5874 
   5875     result.append("\t\t- Output configuration:\n");
   5876     result.append("\t\t\tBuffer     Frames  Smp rate Channels Format\n");
   5877     snprintf(buffer, SIZE, "\t\t\t0x%08x %05d   %05d    %08x %d\n",
   5878             (uint32_t)mConfig.outputCfg.buffer.raw,
   5879             mConfig.outputCfg.buffer.frameCount,
   5880             mConfig.outputCfg.samplingRate,
   5881             mConfig.outputCfg.channels,
   5882             mConfig.outputCfg.format);
   5883     result.append(buffer);
   5884 
   5885     snprintf(buffer, SIZE, "\t\t%d Clients:\n", mHandles.size());
   5886     result.append(buffer);
   5887     result.append("\t\t\tPid   Priority Ctrl Locked client server\n");
   5888     for (size_t i = 0; i < mHandles.size(); ++i) {
   5889         sp<EffectHandle> handle = mHandles[i].promote();
   5890         if (handle != 0) {
   5891             handle->dump(buffer, SIZE);
   5892             result.append(buffer);
   5893         }
   5894     }
   5895 
   5896     result.append("\n");
   5897 
   5898     write(fd, result.string(), result.length());
   5899 
   5900     if (locked) {
   5901         mLock.unlock();
   5902     }
   5903 
   5904     return NO_ERROR;
   5905 }
   5906 
   5907 // ----------------------------------------------------------------------------
   5908 //  EffectHandle implementation
   5909 // ----------------------------------------------------------------------------
   5910 
   5911 #undef LOG_TAG
   5912 #define LOG_TAG "AudioFlinger::EffectHandle"
   5913 
   5914 AudioFlinger::EffectHandle::EffectHandle(const sp<EffectModule>& effect,
   5915                                         const sp<AudioFlinger::Client>& client,
   5916                                         const sp<IEffectClient>& effectClient,
   5917                                         int32_t priority)
   5918     : BnEffect(),
   5919     mEffect(effect), mEffectClient(effectClient), mClient(client), mPriority(priority), mHasControl(false)
   5920 {
   5921     LOGV("constructor %p", this);
   5922 
   5923     int bufOffset = ((sizeof(effect_param_cblk_t) - 1) / sizeof(int) + 1) * sizeof(int);
   5924     mCblkMemory = client->heap()->allocate(EFFECT_PARAM_BUFFER_SIZE + bufOffset);
   5925     if (mCblkMemory != 0) {
   5926         mCblk = static_cast<effect_param_cblk_t *>(mCblkMemory->pointer());
   5927 
   5928         if (mCblk) {
   5929             new(mCblk) effect_param_cblk_t();
   5930             mBuffer = (uint8_t *)mCblk + bufOffset;
   5931          }
   5932     } else {
   5933         LOGE("not enough memory for Effect size=%u", EFFECT_PARAM_BUFFER_SIZE + sizeof(effect_param_cblk_t));
   5934         return;
   5935     }
   5936 }
   5937 
   5938 AudioFlinger::EffectHandle::~EffectHandle()
   5939 {
   5940     LOGV("Destructor %p", this);
   5941     disconnect();
   5942 }
   5943 
   5944 status_t AudioFlinger::EffectHandle::enable()
   5945 {
   5946     if (!mHasControl) return INVALID_OPERATION;
   5947     if (mEffect == 0) return DEAD_OBJECT;
   5948 
   5949     return mEffect->setEnabled(true);
   5950 }
   5951 
   5952 status_t AudioFlinger::EffectHandle::disable()
   5953 {
   5954     if (!mHasControl) return INVALID_OPERATION;
   5955     if (mEffect == NULL) return DEAD_OBJECT;
   5956 
   5957     return mEffect->setEnabled(false);
   5958 }
   5959 
   5960 void AudioFlinger::EffectHandle::disconnect()
   5961 {
   5962     if (mEffect == 0) {
   5963         return;
   5964     }
   5965     mEffect->disconnect(this);
   5966     // release sp on module => module destructor can be called now
   5967     mEffect.clear();
   5968     if (mCblk) {
   5969         mCblk->~effect_param_cblk_t();   // destroy our shared-structure.
   5970     }
   5971     mCblkMemory.clear();            // and free the shared memory
   5972     if (mClient != 0) {
   5973         Mutex::Autolock _l(mClient->audioFlinger()->mLock);
   5974         mClient.clear();
   5975     }
   5976 }
   5977 
   5978 status_t AudioFlinger::EffectHandle::command(uint32_t cmdCode,
   5979                                              uint32_t cmdSize,
   5980                                              void *pCmdData,
   5981                                              uint32_t *replySize,
   5982                                              void *pReplyData)
   5983 {
   5984 //    LOGV("command(), cmdCode: %d, mHasControl: %d, mEffect: %p",
   5985 //              cmdCode, mHasControl, (mEffect == 0) ? 0 : mEffect.get());
   5986 
   5987     // only get parameter command is permitted for applications not controlling the effect
   5988     if (!mHasControl && cmdCode != EFFECT_CMD_GET_PARAM) {
   5989         return INVALID_OPERATION;
   5990     }
   5991     if (mEffect == 0) return DEAD_OBJECT;
   5992 
   5993     // handle commands that are not forwarded transparently to effect engine
   5994     if (cmdCode == EFFECT_CMD_SET_PARAM_COMMIT) {
   5995         // No need to trylock() here as this function is executed in the binder thread serving a particular client process:
   5996         // no risk to block the whole media server process or mixer threads is we are stuck here
   5997         Mutex::Autolock _l(mCblk->lock);
   5998         if (mCblk->clientIndex > EFFECT_PARAM_BUFFER_SIZE ||
   5999             mCblk->serverIndex > EFFECT_PARAM_BUFFER_SIZE) {
   6000             mCblk->serverIndex = 0;
   6001             mCblk->clientIndex = 0;
   6002             return BAD_VALUE;
   6003         }
   6004         status_t status = NO_ERROR;
   6005         while (mCblk->serverIndex < mCblk->clientIndex) {
   6006             int reply;
   6007             uint32_t rsize = sizeof(int);
   6008             int *p = (int *)(mBuffer + mCblk->serverIndex);
   6009             int size = *p++;
   6010             if (((uint8_t *)p + size) > mBuffer + mCblk->clientIndex) {
   6011                 LOGW("command(): invalid parameter block size");
   6012                 break;
   6013             }
   6014             effect_param_t *param = (effect_param_t *)p;
   6015             if (param->psize == 0 || param->vsize == 0) {
   6016                 LOGW("command(): null parameter or value size");
   6017                 mCblk->serverIndex += size;
   6018                 continue;
   6019             }
   6020             uint32_t psize = sizeof(effect_param_t) +
   6021                              ((param->psize - 1) / sizeof(int) + 1) * sizeof(int) +
   6022                              param->vsize;
   6023             status_t ret = mEffect->command(EFFECT_CMD_SET_PARAM,
   6024                                             psize,
   6025                                             p,
   6026                                             &rsize,
   6027                                             &reply);
   6028             // stop at first error encountered
   6029             if (ret != NO_ERROR) {
   6030                 status = ret;
   6031                 *(int *)pReplyData = reply;
   6032                 break;
   6033             } else if (reply != NO_ERROR) {
   6034                 *(int *)pReplyData = reply;
   6035                 break;
   6036             }
   6037             mCblk->serverIndex += size;
   6038         }
   6039         mCblk->serverIndex = 0;
   6040         mCblk->clientIndex = 0;
   6041         return status;
   6042     } else if (cmdCode == EFFECT_CMD_ENABLE) {
   6043         *(int *)pReplyData = NO_ERROR;
   6044         return enable();
   6045     } else if (cmdCode == EFFECT_CMD_DISABLE) {
   6046         *(int *)pReplyData = NO_ERROR;
   6047         return disable();
   6048     }
   6049 
   6050     return mEffect->command(cmdCode, cmdSize, pCmdData, replySize, pReplyData);
   6051 }
   6052 
   6053 sp<IMemory> AudioFlinger::EffectHandle::getCblk() const {
   6054     return mCblkMemory;
   6055 }
   6056 
   6057 void AudioFlinger::EffectHandle::setControl(bool hasControl, bool signal)
   6058 {
   6059     LOGV("setControl %p control %d", this, hasControl);
   6060 
   6061     mHasControl = hasControl;
   6062     if (signal && mEffectClient != 0) {
   6063         mEffectClient->controlStatusChanged(hasControl);
   6064     }
   6065 }
   6066 
   6067 void AudioFlinger::EffectHandle::commandExecuted(uint32_t cmdCode,
   6068                                                  uint32_t cmdSize,
   6069                                                  void *pCmdData,
   6070                                                  uint32_t replySize,
   6071                                                  void *pReplyData)
   6072 {
   6073     if (mEffectClient != 0) {
   6074         mEffectClient->commandExecuted(cmdCode, cmdSize, pCmdData, replySize, pReplyData);
   6075     }
   6076 }
   6077 
   6078 
   6079 
   6080 void AudioFlinger::EffectHandle::setEnabled(bool enabled)
   6081 {
   6082     if (mEffectClient != 0) {
   6083         mEffectClient->enableStatusChanged(enabled);
   6084     }
   6085 }
   6086 
   6087 status_t AudioFlinger::EffectHandle::onTransact(
   6088     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
   6089 {
   6090     return BnEffect::onTransact(code, data, reply, flags);
   6091 }
   6092 
   6093 
   6094 void AudioFlinger::EffectHandle::dump(char* buffer, size_t size)
   6095 {
   6096     bool locked = tryLock(mCblk->lock);
   6097 
   6098     snprintf(buffer, size, "\t\t\t%05d %05d    %01u    %01u      %05u  %05u\n",
   6099             (mClient == NULL) ? getpid() : mClient->pid(),
   6100             mPriority,
   6101             mHasControl,
   6102             !locked,
   6103             mCblk->clientIndex,
   6104             mCblk->serverIndex
   6105             );
   6106 
   6107     if (locked) {
   6108         mCblk->lock.unlock();
   6109     }
   6110 }
   6111 
   6112 #undef LOG_TAG
   6113 #define LOG_TAG "AudioFlinger::EffectChain"
   6114 
   6115 AudioFlinger::EffectChain::EffectChain(const wp<ThreadBase>& wThread,
   6116                                         int sessionId)
   6117     : mThread(wThread), mSessionId(sessionId), mActiveTrackCnt(0), mOwnInBuffer(false),
   6118             mVolumeCtrlIdx(-1), mLeftVolume(UINT_MAX), mRightVolume(UINT_MAX),
   6119             mNewLeftVolume(UINT_MAX), mNewRightVolume(UINT_MAX)
   6120 {
   6121     mStrategy = AudioSystem::getStrategyForStream(AudioSystem::MUSIC);
   6122 }
   6123 
   6124 AudioFlinger::EffectChain::~EffectChain()
   6125 {
   6126     if (mOwnInBuffer) {
   6127         delete mInBuffer;
   6128     }
   6129 
   6130 }
   6131 
   6132 // getEffectFromDesc_l() must be called with PlaybackThread::mLock held
   6133 sp<AudioFlinger::EffectModule> AudioFlinger::EffectChain::getEffectFromDesc_l(effect_descriptor_t *descriptor)
   6134 {
   6135     sp<EffectModule> effect;
   6136     size_t size = mEffects.size();
   6137 
   6138     for (size_t i = 0; i < size; i++) {
   6139         if (memcmp(&mEffects[i]->desc().uuid, &descriptor->uuid, sizeof(effect_uuid_t)) == 0) {
   6140             effect = mEffects[i];
   6141             break;
   6142         }
   6143     }
   6144     return effect;
   6145 }
   6146 
   6147 // getEffectFromId_l() must be called with PlaybackThread::mLock held
   6148 sp<AudioFlinger::EffectModule> AudioFlinger::EffectChain::getEffectFromId_l(int id)
   6149 {
   6150     sp<EffectModule> effect;
   6151     size_t size = mEffects.size();
   6152 
   6153     for (size_t i = 0; i < size; i++) {
   6154         // by convention, return first effect if id provided is 0 (0 is never a valid id)
   6155         if (id == 0 || mEffects[i]->id() == id) {
   6156             effect = mEffects[i];
   6157             break;
   6158         }
   6159     }
   6160     return effect;
   6161 }
   6162 
   6163 // Must be called with EffectChain::mLock locked
   6164 void AudioFlinger::EffectChain::process_l()
   6165 {
   6166     sp<ThreadBase> thread = mThread.promote();
   6167     if (thread == 0) {
   6168         LOGW("process_l(): cannot promote mixer thread");
   6169         return;
   6170     }
   6171     PlaybackThread *playbackThread = (PlaybackThread *)thread.get();
   6172     bool isGlobalSession = (mSessionId == AudioSystem::SESSION_OUTPUT_MIX) ||
   6173             (mSessionId == AudioSystem::SESSION_OUTPUT_STAGE);
   6174     bool tracksOnSession = false;
   6175     if (!isGlobalSession) {
   6176         tracksOnSession =
   6177                 playbackThread->hasAudioSession(mSessionId) & PlaybackThread::TRACK_SESSION;
   6178     }
   6179 
   6180     size_t size = mEffects.size();
   6181     // do not process effect if no track is present in same audio session
   6182     if (isGlobalSession || tracksOnSession) {
   6183         for (size_t i = 0; i < size; i++) {
   6184             mEffects[i]->process();
   6185         }
   6186     }
   6187     for (size_t i = 0; i < size; i++) {
   6188         mEffects[i]->updateState();
   6189     }
   6190     // if no track is active, input buffer must be cleared here as the mixer process
   6191     // will not do it
   6192     if (tracksOnSession &&
   6193         activeTracks() == 0) {
   6194         size_t numSamples = playbackThread->frameCount() * playbackThread->channelCount();
   6195         memset(mInBuffer, 0, numSamples * sizeof(int16_t));
   6196     }
   6197 }
   6198 
   6199 // addEffect_l() must be called with PlaybackThread::mLock held
   6200 status_t AudioFlinger::EffectChain::addEffect_l(const sp<EffectModule>& effect)
   6201 {
   6202     effect_descriptor_t desc = effect->desc();
   6203     uint32_t insertPref = desc.flags & EFFECT_FLAG_INSERT_MASK;
   6204 
   6205     Mutex::Autolock _l(mLock);
   6206     effect->setChain(this);
   6207     sp<ThreadBase> thread = mThread.promote();
   6208     if (thread == 0) {
   6209         return NO_INIT;
   6210     }
   6211     effect->setThread(thread);
   6212 
   6213     if ((desc.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) {
   6214         // Auxiliary effects are inserted at the beginning of mEffects vector as
   6215         // they are processed first and accumulated in chain input buffer
   6216         mEffects.insertAt(effect, 0);
   6217 
   6218         // the input buffer for auxiliary effect contains mono samples in
   6219         // 32 bit format. This is to avoid saturation in AudoMixer
   6220         // accumulation stage. Saturation is done in EffectModule::process() before
   6221         // calling the process in effect engine
   6222         size_t numSamples = thread->frameCount();
   6223         int32_t *buffer = new int32_t[numSamples];
   6224         memset(buffer, 0, numSamples * sizeof(int32_t));
   6225         effect->setInBuffer((int16_t *)buffer);
   6226         // auxiliary effects output samples to chain input buffer for further processing
   6227         // by insert effects
   6228         effect->setOutBuffer(mInBuffer);
   6229     } else {
   6230         // Insert effects are inserted at the end of mEffects vector as they are processed
   6231         //  after track and auxiliary effects.
   6232         // Insert effect order as a function of indicated preference:
   6233         //  if EFFECT_FLAG_INSERT_EXCLUSIVE, insert in first position or reject if
   6234         //  another effect is present
   6235         //  else if EFFECT_FLAG_INSERT_FIRST, insert in first position or after the
   6236         //  last effect claiming first position
   6237         //  else if EFFECT_FLAG_INSERT_LAST, insert in last position or before the
   6238         //  first effect claiming last position
   6239         //  else if EFFECT_FLAG_INSERT_ANY insert after first or before last
   6240         // Reject insertion if an effect with EFFECT_FLAG_INSERT_EXCLUSIVE is
   6241         // already present
   6242 
   6243         int size = (int)mEffects.size();
   6244         int idx_insert = size;
   6245         int idx_insert_first = -1;
   6246         int idx_insert_last = -1;
   6247 
   6248         for (int i = 0; i < size; i++) {
   6249             effect_descriptor_t d = mEffects[i]->desc();
   6250             uint32_t iMode = d.flags & EFFECT_FLAG_TYPE_MASK;
   6251             uint32_t iPref = d.flags & EFFECT_FLAG_INSERT_MASK;
   6252             if (iMode == EFFECT_FLAG_TYPE_INSERT) {
   6253                 // check invalid effect chaining combinations
   6254                 if (insertPref == EFFECT_FLAG_INSERT_EXCLUSIVE ||
   6255                     iPref == EFFECT_FLAG_INSERT_EXCLUSIVE) {
   6256                     LOGW("addEffect_l() could not insert effect %s: exclusive conflict with %s", desc.name, d.name);
   6257                     return INVALID_OPERATION;
   6258                 }
   6259                 // remember position of first insert effect and by default
   6260                 // select this as insert position for new effect
   6261                 if (idx_insert == size) {
   6262                     idx_insert = i;
   6263                 }
   6264                 // remember position of last insert effect claiming
   6265                 // first position
   6266                 if (iPref == EFFECT_FLAG_INSERT_FIRST) {
   6267                     idx_insert_first = i;
   6268                 }
   6269                 // remember position of first insert effect claiming
   6270                 // last position
   6271                 if (iPref == EFFECT_FLAG_INSERT_LAST &&
   6272                     idx_insert_last == -1) {
   6273                     idx_insert_last = i;
   6274                 }
   6275             }
   6276         }
   6277 
   6278         // modify idx_insert from first position if needed
   6279         if (insertPref == EFFECT_FLAG_INSERT_LAST) {
   6280             if (idx_insert_last != -1) {
   6281                 idx_insert = idx_insert_last;
   6282             } else {
   6283                 idx_insert = size;
   6284             }
   6285         } else {
   6286             if (idx_insert_first != -1) {
   6287                 idx_insert = idx_insert_first + 1;
   6288             }
   6289         }
   6290 
   6291         // always read samples from chain input buffer
   6292         effect->setInBuffer(mInBuffer);
   6293 
   6294         // if last effect in the chain, output samples to chain
   6295         // output buffer, otherwise to chain input buffer
   6296         if (idx_insert == size) {
   6297             if (idx_insert != 0) {
   6298                 mEffects[idx_insert-1]->setOutBuffer(mInBuffer);
   6299                 mEffects[idx_insert-1]->configure();
   6300             }
   6301             effect->setOutBuffer(mOutBuffer);
   6302         } else {
   6303             effect->setOutBuffer(mInBuffer);
   6304         }
   6305         mEffects.insertAt(effect, idx_insert);
   6306 
   6307         LOGV("addEffect_l() effect %p, added in chain %p at rank %d", effect.get(), this, idx_insert);
   6308     }
   6309     effect->configure();
   6310     return NO_ERROR;
   6311 }
   6312 
   6313 // removeEffect_l() must be called with PlaybackThread::mLock held
   6314 size_t AudioFlinger::EffectChain::removeEffect_l(const sp<EffectModule>& effect)
   6315 {
   6316     Mutex::Autolock _l(mLock);
   6317     int size = (int)mEffects.size();
   6318     int i;
   6319     uint32_t type = effect->desc().flags & EFFECT_FLAG_TYPE_MASK;
   6320 
   6321     for (i = 0; i < size; i++) {
   6322         if (effect == mEffects[i]) {
   6323             if (type == EFFECT_FLAG_TYPE_AUXILIARY) {
   6324                 delete[] effect->inBuffer();
   6325             } else {
   6326                 if (i == size - 1 && i != 0) {
   6327                     mEffects[i - 1]->setOutBuffer(mOutBuffer);
   6328                     mEffects[i - 1]->configure();
   6329                 }
   6330             }
   6331             mEffects.removeAt(i);
   6332             LOGV("removeEffect_l() effect %p, removed from chain %p at rank %d", effect.get(), this, i);
   6333             break;
   6334         }
   6335     }
   6336 
   6337     return mEffects.size();
   6338 }
   6339 
   6340 // setDevice_l() must be called with PlaybackThread::mLock held
   6341 void AudioFlinger::EffectChain::setDevice_l(uint32_t device)
   6342 {
   6343     size_t size = mEffects.size();
   6344     for (size_t i = 0; i < size; i++) {
   6345         mEffects[i]->setDevice(device);
   6346     }
   6347 }
   6348 
   6349 // setMode_l() must be called with PlaybackThread::mLock held
   6350 void AudioFlinger::EffectChain::setMode_l(uint32_t mode)
   6351 {
   6352     size_t size = mEffects.size();
   6353     for (size_t i = 0; i < size; i++) {
   6354         mEffects[i]->setMode(mode);
   6355     }
   6356 }
   6357 
   6358 // setVolume_l() must be called with PlaybackThread::mLock held
   6359 bool AudioFlinger::EffectChain::setVolume_l(uint32_t *left, uint32_t *right)
   6360 {
   6361     uint32_t newLeft = *left;
   6362     uint32_t newRight = *right;
   6363     bool hasControl = false;
   6364     int ctrlIdx = -1;
   6365     size_t size = mEffects.size();
   6366 
   6367     // first update volume controller
   6368     for (size_t i = size; i > 0; i--) {
   6369         if (mEffects[i - 1]->isProcessEnabled() &&
   6370             (mEffects[i - 1]->desc().flags & EFFECT_FLAG_VOLUME_MASK) == EFFECT_FLAG_VOLUME_CTRL) {
   6371             ctrlIdx = i - 1;
   6372             hasControl = true;
   6373             break;
   6374         }
   6375     }
   6376 
   6377     if (ctrlIdx == mVolumeCtrlIdx && *left == mLeftVolume && *right == mRightVolume) {
   6378         if (hasControl) {
   6379             *left = mNewLeftVolume;
   6380             *right = mNewRightVolume;
   6381         }
   6382         return hasControl;
   6383     }
   6384 
   6385     mVolumeCtrlIdx = ctrlIdx;
   6386     mLeftVolume = newLeft;
   6387     mRightVolume = newRight;
   6388 
   6389     // second get volume update from volume controller
   6390     if (ctrlIdx >= 0) {
   6391         mEffects[ctrlIdx]->setVolume(&newLeft, &newRight, true);
   6392         mNewLeftVolume = newLeft;
   6393         mNewRightVolume = newRight;
   6394     }
   6395     // then indicate volume to all other effects in chain.
   6396     // Pass altered volume to effects before volume controller
   6397     // and requested volume to effects after controller
   6398     uint32_t lVol = newLeft;
   6399     uint32_t rVol = newRight;
   6400 
   6401     for (size_t i = 0; i < size; i++) {
   6402         if ((int)i == ctrlIdx) continue;
   6403         // this also works for ctrlIdx == -1 when there is no volume controller
   6404         if ((int)i > ctrlIdx) {
   6405             lVol = *left;
   6406             rVol = *right;
   6407         }
   6408         mEffects[i]->setVolume(&lVol, &rVol, false);
   6409     }
   6410     *left = newLeft;
   6411     *right = newRight;
   6412 
   6413     return hasControl;
   6414 }
   6415 
   6416 status_t AudioFlinger::EffectChain::dump(int fd, const Vector<String16>& args)
   6417 {
   6418     const size_t SIZE = 256;
   6419     char buffer[SIZE];
   6420     String8 result;
   6421 
   6422     snprintf(buffer, SIZE, "Effects for session %d:\n", mSessionId);
   6423     result.append(buffer);
   6424 
   6425     bool locked = tryLock(mLock);
   6426     // failed to lock - AudioFlinger is probably deadlocked
   6427     if (!locked) {
   6428         result.append("\tCould not lock mutex:\n");
   6429     }
   6430 
   6431     result.append("\tNum fx In buffer   Out buffer   Active tracks:\n");
   6432     snprintf(buffer, SIZE, "\t%02d     0x%08x  0x%08x   %d\n",
   6433             mEffects.size(),
   6434             (uint32_t)mInBuffer,
   6435             (uint32_t)mOutBuffer,
   6436             mActiveTrackCnt);
   6437     result.append(buffer);
   6438     write(fd, result.string(), result.size());
   6439 
   6440     for (size_t i = 0; i < mEffects.size(); ++i) {
   6441         sp<EffectModule> effect = mEffects[i];
   6442         if (effect != 0) {
   6443             effect->dump(fd, args);
   6444         }
   6445     }
   6446 
   6447     if (locked) {
   6448         mLock.unlock();
   6449     }
   6450 
   6451     return NO_ERROR;
   6452 }
   6453 
   6454 #undef LOG_TAG
   6455 #define LOG_TAG "AudioFlinger"
   6456 
   6457 // ----------------------------------------------------------------------------
   6458 
   6459 status_t AudioFlinger::onTransact(
   6460         uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
   6461 {
   6462     return BnAudioFlinger::onTransact(code, data, reply, flags);
   6463 }
   6464 
   6465 }; // namespace android
   6466