Home | History | Annotate | Download | only in audioflinger
      1 /*
      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 "Configuration.h"
     23 #include <dirent.h>
     24 #include <math.h>
     25 #include <signal.h>
     26 #include <sys/time.h>
     27 #include <sys/resource.h>
     28 
     29 #include <binder/IPCThreadState.h>
     30 #include <binder/IServiceManager.h>
     31 #include <utils/Log.h>
     32 #include <utils/Trace.h>
     33 #include <binder/Parcel.h>
     34 #include <memunreachable/memunreachable.h>
     35 #include <utils/String16.h>
     36 #include <utils/threads.h>
     37 #include <utils/Atomic.h>
     38 
     39 #include <cutils/bitops.h>
     40 #include <cutils/properties.h>
     41 
     42 #include <system/audio.h>
     43 #include <hardware/audio.h>
     44 
     45 #include "AudioMixer.h"
     46 #include "AudioFlinger.h"
     47 #include "ServiceUtilities.h"
     48 
     49 #include <media/AudioResamplerPublic.h>
     50 
     51 #include <media/EffectsFactoryApi.h>
     52 #include <audio_effects/effect_visualizer.h>
     53 #include <audio_effects/effect_ns.h>
     54 #include <audio_effects/effect_aec.h>
     55 
     56 #include <audio_utils/primitives.h>
     57 
     58 #include <powermanager/PowerManager.h>
     59 
     60 #include <media/IMediaLogService.h>
     61 #include <media/MemoryLeakTrackUtil.h>
     62 #include <media/nbaio/Pipe.h>
     63 #include <media/nbaio/PipeReader.h>
     64 #include <media/AudioParameter.h>
     65 #include <mediautils/BatteryNotifier.h>
     66 #include <private/android_filesystem_config.h>
     67 
     68 // ----------------------------------------------------------------------------
     69 
     70 // Note: the following macro is used for extremely verbose logging message.  In
     71 // order to run with ALOG_ASSERT turned on, we need to have LOG_NDEBUG set to
     72 // 0; but one side effect of this is to turn all LOGV's as well.  Some messages
     73 // are so verbose that we want to suppress them even when we have ALOG_ASSERT
     74 // turned on.  Do not uncomment the #def below unless you really know what you
     75 // are doing and want to see all of the extremely verbose messages.
     76 //#define VERY_VERY_VERBOSE_LOGGING
     77 #ifdef VERY_VERY_VERBOSE_LOGGING
     78 #define ALOGVV ALOGV
     79 #else
     80 #define ALOGVV(a...) do { } while(0)
     81 #endif
     82 
     83 namespace android {
     84 
     85 static const char kDeadlockedString[] = "AudioFlinger may be deadlocked\n";
     86 static const char kHardwareLockedString[] = "Hardware lock is taken\n";
     87 static const char kClientLockedString[] = "Client lock is taken\n";
     88 
     89 
     90 nsecs_t AudioFlinger::mStandbyTimeInNsecs = kDefaultStandbyTimeInNsecs;
     91 
     92 uint32_t AudioFlinger::mScreenState;
     93 
     94 #ifdef TEE_SINK
     95 bool AudioFlinger::mTeeSinkInputEnabled = false;
     96 bool AudioFlinger::mTeeSinkOutputEnabled = false;
     97 bool AudioFlinger::mTeeSinkTrackEnabled = false;
     98 
     99 size_t AudioFlinger::mTeeSinkInputFrames = kTeeSinkInputFramesDefault;
    100 size_t AudioFlinger::mTeeSinkOutputFrames = kTeeSinkOutputFramesDefault;
    101 size_t AudioFlinger::mTeeSinkTrackFrames = kTeeSinkTrackFramesDefault;
    102 #endif
    103 
    104 // In order to avoid invalidating offloaded tracks each time a Visualizer is turned on and off
    105 // we define a minimum time during which a global effect is considered enabled.
    106 static const nsecs_t kMinGlobalEffectEnabletimeNs = seconds(7200);
    107 
    108 // ----------------------------------------------------------------------------
    109 
    110 const char *formatToString(audio_format_t format) {
    111     switch (audio_get_main_format(format)) {
    112     case AUDIO_FORMAT_PCM:
    113         switch (format) {
    114         case AUDIO_FORMAT_PCM_16_BIT: return "pcm16";
    115         case AUDIO_FORMAT_PCM_8_BIT: return "pcm8";
    116         case AUDIO_FORMAT_PCM_32_BIT: return "pcm32";
    117         case AUDIO_FORMAT_PCM_8_24_BIT: return "pcm8.24";
    118         case AUDIO_FORMAT_PCM_FLOAT: return "pcmfloat";
    119         case AUDIO_FORMAT_PCM_24_BIT_PACKED: return "pcm24";
    120         default:
    121             break;
    122         }
    123         break;
    124     case AUDIO_FORMAT_MP3: return "mp3";
    125     case AUDIO_FORMAT_AMR_NB: return "amr-nb";
    126     case AUDIO_FORMAT_AMR_WB: return "amr-wb";
    127     case AUDIO_FORMAT_AAC: return "aac";
    128     case AUDIO_FORMAT_HE_AAC_V1: return "he-aac-v1";
    129     case AUDIO_FORMAT_HE_AAC_V2: return "he-aac-v2";
    130     case AUDIO_FORMAT_VORBIS: return "vorbis";
    131     case AUDIO_FORMAT_OPUS: return "opus";
    132     case AUDIO_FORMAT_AC3: return "ac-3";
    133     case AUDIO_FORMAT_E_AC3: return "e-ac-3";
    134     case AUDIO_FORMAT_IEC61937: return "iec61937";
    135     default:
    136         break;
    137     }
    138     return "unknown";
    139 }
    140 
    141 static int load_audio_interface(const char *if_name, audio_hw_device_t **dev)
    142 {
    143     const hw_module_t *mod;
    144     int rc;
    145 
    146     rc = hw_get_module_by_class(AUDIO_HARDWARE_MODULE_ID, if_name, &mod);
    147     ALOGE_IF(rc, "%s couldn't load audio hw module %s.%s (%s)", __func__,
    148                  AUDIO_HARDWARE_MODULE_ID, if_name, strerror(-rc));
    149     if (rc) {
    150         goto out;
    151     }
    152     rc = audio_hw_device_open(mod, dev);
    153     ALOGE_IF(rc, "%s couldn't open audio hw device in %s.%s (%s)", __func__,
    154                  AUDIO_HARDWARE_MODULE_ID, if_name, strerror(-rc));
    155     if (rc) {
    156         goto out;
    157     }
    158     if ((*dev)->common.version < AUDIO_DEVICE_API_VERSION_MIN) {
    159         ALOGE("%s wrong audio hw device version %04x", __func__, (*dev)->common.version);
    160         rc = BAD_VALUE;
    161         goto out;
    162     }
    163     return 0;
    164 
    165 out:
    166     *dev = NULL;
    167     return rc;
    168 }
    169 
    170 // ----------------------------------------------------------------------------
    171 
    172 AudioFlinger::AudioFlinger()
    173     : BnAudioFlinger(),
    174       mPrimaryHardwareDev(NULL),
    175       mAudioHwDevs(NULL),
    176       mHardwareStatus(AUDIO_HW_IDLE),
    177       mMasterVolume(1.0f),
    178       mMasterMute(false),
    179       // mNextUniqueId(AUDIO_UNIQUE_ID_USE_MAX),
    180       mMode(AUDIO_MODE_INVALID),
    181       mBtNrecIsOff(false),
    182       mIsLowRamDevice(true),
    183       mIsDeviceTypeKnown(false),
    184       mGlobalEffectEnableTime(0),
    185       mSystemReady(false)
    186 {
    187     // unsigned instead of audio_unique_id_use_t, because ++ operator is unavailable for enum
    188     for (unsigned use = AUDIO_UNIQUE_ID_USE_UNSPECIFIED; use < AUDIO_UNIQUE_ID_USE_MAX; use++) {
    189         // zero ID has a special meaning, so unavailable
    190         mNextUniqueIds[use] = AUDIO_UNIQUE_ID_USE_MAX;
    191     }
    192 
    193     getpid_cached = getpid();
    194     const bool doLog = property_get_bool("ro.test_harness", false);
    195     if (doLog) {
    196         mLogMemoryDealer = new MemoryDealer(kLogMemorySize, "LogWriters",
    197                 MemoryHeapBase::READ_ONLY);
    198     }
    199 
    200     // reset battery stats.
    201     // if the audio service has crashed, battery stats could be left
    202     // in bad state, reset the state upon service start.
    203     BatteryNotifier::getInstance().noteResetAudio();
    204 
    205 #ifdef TEE_SINK
    206     char value[PROPERTY_VALUE_MAX];
    207     (void) property_get("ro.debuggable", value, "0");
    208     int debuggable = atoi(value);
    209     int teeEnabled = 0;
    210     if (debuggable) {
    211         (void) property_get("af.tee", value, "0");
    212         teeEnabled = atoi(value);
    213     }
    214     // FIXME symbolic constants here
    215     if (teeEnabled & 1) {
    216         mTeeSinkInputEnabled = true;
    217     }
    218     if (teeEnabled & 2) {
    219         mTeeSinkOutputEnabled = true;
    220     }
    221     if (teeEnabled & 4) {
    222         mTeeSinkTrackEnabled = true;
    223     }
    224 #endif
    225 }
    226 
    227 void AudioFlinger::onFirstRef()
    228 {
    229     Mutex::Autolock _l(mLock);
    230 
    231     /* TODO: move all this work into an Init() function */
    232     char val_str[PROPERTY_VALUE_MAX] = { 0 };
    233     if (property_get("ro.audio.flinger_standbytime_ms", val_str, NULL) >= 0) {
    234         uint32_t int_val;
    235         if (1 == sscanf(val_str, "%u", &int_val)) {
    236             mStandbyTimeInNsecs = milliseconds(int_val);
    237             ALOGI("Using %u mSec as standby time.", int_val);
    238         } else {
    239             mStandbyTimeInNsecs = kDefaultStandbyTimeInNsecs;
    240             ALOGI("Using default %u mSec as standby time.",
    241                     (uint32_t)(mStandbyTimeInNsecs / 1000000));
    242         }
    243     }
    244 
    245     mPatchPanel = new PatchPanel(this);
    246 
    247     mMode = AUDIO_MODE_NORMAL;
    248 }
    249 
    250 AudioFlinger::~AudioFlinger()
    251 {
    252     while (!mRecordThreads.isEmpty()) {
    253         // closeInput_nonvirtual() will remove specified entry from mRecordThreads
    254         closeInput_nonvirtual(mRecordThreads.keyAt(0));
    255     }
    256     while (!mPlaybackThreads.isEmpty()) {
    257         // closeOutput_nonvirtual() will remove specified entry from mPlaybackThreads
    258         closeOutput_nonvirtual(mPlaybackThreads.keyAt(0));
    259     }
    260 
    261     for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
    262         // no mHardwareLock needed, as there are no other references to this
    263         audio_hw_device_close(mAudioHwDevs.valueAt(i)->hwDevice());
    264         delete mAudioHwDevs.valueAt(i);
    265     }
    266 
    267     // Tell media.log service about any old writers that still need to be unregistered
    268     if (mLogMemoryDealer != 0) {
    269         sp<IBinder> binder = defaultServiceManager()->getService(String16("media.log"));
    270         if (binder != 0) {
    271             sp<IMediaLogService> mediaLogService(interface_cast<IMediaLogService>(binder));
    272             for (size_t count = mUnregisteredWriters.size(); count > 0; count--) {
    273                 sp<IMemory> iMemory(mUnregisteredWriters.top()->getIMemory());
    274                 mUnregisteredWriters.pop();
    275                 mediaLogService->unregisterWriter(iMemory);
    276             }
    277         }
    278     }
    279 }
    280 
    281 static const char * const audio_interfaces[] = {
    282     AUDIO_HARDWARE_MODULE_ID_PRIMARY,
    283     AUDIO_HARDWARE_MODULE_ID_A2DP,
    284     AUDIO_HARDWARE_MODULE_ID_USB,
    285 };
    286 #define ARRAY_SIZE(x) (sizeof((x))/sizeof(((x)[0])))
    287 
    288 AudioHwDevice* AudioFlinger::findSuitableHwDev_l(
    289         audio_module_handle_t module,
    290         audio_devices_t devices)
    291 {
    292     // if module is 0, the request comes from an old policy manager and we should load
    293     // well known modules
    294     if (module == 0) {
    295         ALOGW("findSuitableHwDev_l() loading well know audio hw modules");
    296         for (size_t i = 0; i < ARRAY_SIZE(audio_interfaces); i++) {
    297             loadHwModule_l(audio_interfaces[i]);
    298         }
    299         // then try to find a module supporting the requested device.
    300         for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
    301             AudioHwDevice *audioHwDevice = mAudioHwDevs.valueAt(i);
    302             audio_hw_device_t *dev = audioHwDevice->hwDevice();
    303             if ((dev->get_supported_devices != NULL) &&
    304                     (dev->get_supported_devices(dev) & devices) == devices)
    305                 return audioHwDevice;
    306         }
    307     } else {
    308         // check a match for the requested module handle
    309         AudioHwDevice *audioHwDevice = mAudioHwDevs.valueFor(module);
    310         if (audioHwDevice != NULL) {
    311             return audioHwDevice;
    312         }
    313     }
    314 
    315     return NULL;
    316 }
    317 
    318 void AudioFlinger::dumpClients(int fd, const Vector<String16>& args __unused)
    319 {
    320     const size_t SIZE = 256;
    321     char buffer[SIZE];
    322     String8 result;
    323 
    324     result.append("Clients:\n");
    325     for (size_t i = 0; i < mClients.size(); ++i) {
    326         sp<Client> client = mClients.valueAt(i).promote();
    327         if (client != 0) {
    328             snprintf(buffer, SIZE, "  pid: %d\n", client->pid());
    329             result.append(buffer);
    330         }
    331     }
    332 
    333     result.append("Notification Clients:\n");
    334     for (size_t i = 0; i < mNotificationClients.size(); ++i) {
    335         snprintf(buffer, SIZE, "  pid: %d\n", mNotificationClients.keyAt(i));
    336         result.append(buffer);
    337     }
    338 
    339     result.append("Global session refs:\n");
    340     result.append("  session   pid count\n");
    341     for (size_t i = 0; i < mAudioSessionRefs.size(); i++) {
    342         AudioSessionRef *r = mAudioSessionRefs[i];
    343         snprintf(buffer, SIZE, "  %7d %5d %5d\n", r->mSessionid, r->mPid, r->mCnt);
    344         result.append(buffer);
    345     }
    346     write(fd, result.string(), result.size());
    347 }
    348 
    349 
    350 void AudioFlinger::dumpInternals(int fd, const Vector<String16>& args __unused)
    351 {
    352     const size_t SIZE = 256;
    353     char buffer[SIZE];
    354     String8 result;
    355     hardware_call_state hardwareStatus = mHardwareStatus;
    356 
    357     snprintf(buffer, SIZE, "Hardware status: %d\n"
    358                            "Standby Time mSec: %u\n",
    359                             hardwareStatus,
    360                             (uint32_t)(mStandbyTimeInNsecs / 1000000));
    361     result.append(buffer);
    362     write(fd, result.string(), result.size());
    363 }
    364 
    365 void AudioFlinger::dumpPermissionDenial(int fd, const Vector<String16>& args __unused)
    366 {
    367     const size_t SIZE = 256;
    368     char buffer[SIZE];
    369     String8 result;
    370     snprintf(buffer, SIZE, "Permission Denial: "
    371             "can't dump AudioFlinger from pid=%d, uid=%d\n",
    372             IPCThreadState::self()->getCallingPid(),
    373             IPCThreadState::self()->getCallingUid());
    374     result.append(buffer);
    375     write(fd, result.string(), result.size());
    376 }
    377 
    378 bool AudioFlinger::dumpTryLock(Mutex& mutex)
    379 {
    380     bool locked = false;
    381     for (int i = 0; i < kDumpLockRetries; ++i) {
    382         if (mutex.tryLock() == NO_ERROR) {
    383             locked = true;
    384             break;
    385         }
    386         usleep(kDumpLockSleepUs);
    387     }
    388     return locked;
    389 }
    390 
    391 status_t AudioFlinger::dump(int fd, const Vector<String16>& args)
    392 {
    393     if (!dumpAllowed()) {
    394         dumpPermissionDenial(fd, args);
    395     } else {
    396         // get state of hardware lock
    397         bool hardwareLocked = dumpTryLock(mHardwareLock);
    398         if (!hardwareLocked) {
    399             String8 result(kHardwareLockedString);
    400             write(fd, result.string(), result.size());
    401         } else {
    402             mHardwareLock.unlock();
    403         }
    404 
    405         bool locked = dumpTryLock(mLock);
    406 
    407         // failed to lock - AudioFlinger is probably deadlocked
    408         if (!locked) {
    409             String8 result(kDeadlockedString);
    410             write(fd, result.string(), result.size());
    411         }
    412 
    413         bool clientLocked = dumpTryLock(mClientLock);
    414         if (!clientLocked) {
    415             String8 result(kClientLockedString);
    416             write(fd, result.string(), result.size());
    417         }
    418 
    419         EffectDumpEffects(fd);
    420 
    421         dumpClients(fd, args);
    422         if (clientLocked) {
    423             mClientLock.unlock();
    424         }
    425 
    426         dumpInternals(fd, args);
    427 
    428         // dump playback threads
    429         for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
    430             mPlaybackThreads.valueAt(i)->dump(fd, args);
    431         }
    432 
    433         // dump record threads
    434         for (size_t i = 0; i < mRecordThreads.size(); i++) {
    435             mRecordThreads.valueAt(i)->dump(fd, args);
    436         }
    437 
    438         // dump orphan effect chains
    439         if (mOrphanEffectChains.size() != 0) {
    440             write(fd, "  Orphan Effect Chains\n", strlen("  Orphan Effect Chains\n"));
    441             for (size_t i = 0; i < mOrphanEffectChains.size(); i++) {
    442                 mOrphanEffectChains.valueAt(i)->dump(fd, args);
    443             }
    444         }
    445         // dump all hardware devs
    446         for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
    447             audio_hw_device_t *dev = mAudioHwDevs.valueAt(i)->hwDevice();
    448             dev->dump(dev, fd);
    449         }
    450 
    451 #ifdef TEE_SINK
    452         // dump the serially shared record tee sink
    453         if (mRecordTeeSource != 0) {
    454             dumpTee(fd, mRecordTeeSource);
    455         }
    456 #endif
    457 
    458         if (locked) {
    459             mLock.unlock();
    460         }
    461 
    462         // append a copy of media.log here by forwarding fd to it, but don't attempt
    463         // to lookup the service if it's not running, as it will block for a second
    464         if (mLogMemoryDealer != 0) {
    465             sp<IBinder> binder = defaultServiceManager()->getService(String16("media.log"));
    466             if (binder != 0) {
    467                 dprintf(fd, "\nmedia.log:\n");
    468                 Vector<String16> args;
    469                 binder->dump(fd, args);
    470             }
    471         }
    472 
    473         // check for optional arguments
    474         bool dumpMem = false;
    475         bool unreachableMemory = false;
    476         for (const auto &arg : args) {
    477             if (arg == String16("-m")) {
    478                 dumpMem = true;
    479             } else if (arg == String16("--unreachable")) {
    480                 unreachableMemory = true;
    481             }
    482         }
    483 
    484         if (dumpMem) {
    485             dprintf(fd, "\nDumping memory:\n");
    486             std::string s = dumpMemoryAddresses(100 /* limit */);
    487             write(fd, s.c_str(), s.size());
    488         }
    489         if (unreachableMemory) {
    490             dprintf(fd, "\nDumping unreachable memory:\n");
    491             // TODO - should limit be an argument parameter?
    492             std::string s = GetUnreachableMemoryString(true /* contents */, 100 /* limit */);
    493             write(fd, s.c_str(), s.size());
    494         }
    495     }
    496     return NO_ERROR;
    497 }
    498 
    499 sp<AudioFlinger::Client> AudioFlinger::registerPid(pid_t pid)
    500 {
    501     Mutex::Autolock _cl(mClientLock);
    502     // If pid is already in the mClients wp<> map, then use that entry
    503     // (for which promote() is always != 0), otherwise create a new entry and Client.
    504     sp<Client> client = mClients.valueFor(pid).promote();
    505     if (client == 0) {
    506         client = new Client(this, pid);
    507         mClients.add(pid, client);
    508     }
    509 
    510     return client;
    511 }
    512 
    513 sp<NBLog::Writer> AudioFlinger::newWriter_l(size_t size, const char *name)
    514 {
    515     // If there is no memory allocated for logs, return a dummy writer that does nothing
    516     if (mLogMemoryDealer == 0) {
    517         return new NBLog::Writer();
    518     }
    519     sp<IBinder> binder = defaultServiceManager()->getService(String16("media.log"));
    520     // Similarly if we can't contact the media.log service, also return a dummy writer
    521     if (binder == 0) {
    522         return new NBLog::Writer();
    523     }
    524     sp<IMediaLogService> mediaLogService(interface_cast<IMediaLogService>(binder));
    525     sp<IMemory> shared = mLogMemoryDealer->allocate(NBLog::Timeline::sharedSize(size));
    526     // If allocation fails, consult the vector of previously unregistered writers
    527     // and garbage-collect one or more them until an allocation succeeds
    528     if (shared == 0) {
    529         Mutex::Autolock _l(mUnregisteredWritersLock);
    530         for (size_t count = mUnregisteredWriters.size(); count > 0; count--) {
    531             {
    532                 // Pick the oldest stale writer to garbage-collect
    533                 sp<IMemory> iMemory(mUnregisteredWriters[0]->getIMemory());
    534                 mUnregisteredWriters.removeAt(0);
    535                 mediaLogService->unregisterWriter(iMemory);
    536                 // Now the media.log remote reference to IMemory is gone.  When our last local
    537                 // reference to IMemory also drops to zero at end of this block,
    538                 // the IMemory destructor will deallocate the region from mLogMemoryDealer.
    539             }
    540             // Re-attempt the allocation
    541             shared = mLogMemoryDealer->allocate(NBLog::Timeline::sharedSize(size));
    542             if (shared != 0) {
    543                 goto success;
    544             }
    545         }
    546         // Even after garbage-collecting all old writers, there is still not enough memory,
    547         // so return a dummy writer
    548         return new NBLog::Writer();
    549     }
    550 success:
    551     mediaLogService->registerWriter(shared, size, name);
    552     return new NBLog::Writer(size, shared);
    553 }
    554 
    555 void AudioFlinger::unregisterWriter(const sp<NBLog::Writer>& writer)
    556 {
    557     if (writer == 0) {
    558         return;
    559     }
    560     sp<IMemory> iMemory(writer->getIMemory());
    561     if (iMemory == 0) {
    562         return;
    563     }
    564     // Rather than removing the writer immediately, append it to a queue of old writers to
    565     // be garbage-collected later.  This allows us to continue to view old logs for a while.
    566     Mutex::Autolock _l(mUnregisteredWritersLock);
    567     mUnregisteredWriters.push(writer);
    568 }
    569 
    570 // IAudioFlinger interface
    571 
    572 
    573 sp<IAudioTrack> AudioFlinger::createTrack(
    574         audio_stream_type_t streamType,
    575         uint32_t sampleRate,
    576         audio_format_t format,
    577         audio_channel_mask_t channelMask,
    578         size_t *frameCount,
    579         IAudioFlinger::track_flags_t *flags,
    580         const sp<IMemory>& sharedBuffer,
    581         audio_io_handle_t output,
    582         pid_t pid,
    583         pid_t tid,
    584         audio_session_t *sessionId,
    585         int clientUid,
    586         status_t *status)
    587 {
    588     sp<PlaybackThread::Track> track;
    589     sp<TrackHandle> trackHandle;
    590     sp<Client> client;
    591     status_t lStatus;
    592     audio_session_t lSessionId;
    593 
    594     const uid_t callingUid = IPCThreadState::self()->getCallingUid();
    595     if (pid == -1 || !isTrustedCallingUid(callingUid)) {
    596         const pid_t callingPid = IPCThreadState::self()->getCallingPid();
    597         ALOGW_IF(pid != -1 && pid != callingPid,
    598                  "%s uid %d pid %d tried to pass itself off as pid %d",
    599                  __func__, callingUid, callingPid, pid);
    600         pid = callingPid;
    601     }
    602 
    603     // client AudioTrack::set already implements AUDIO_STREAM_DEFAULT => AUDIO_STREAM_MUSIC,
    604     // but if someone uses binder directly they could bypass that and cause us to crash
    605     if (uint32_t(streamType) >= AUDIO_STREAM_CNT) {
    606         ALOGE("createTrack() invalid stream type %d", streamType);
    607         lStatus = BAD_VALUE;
    608         goto Exit;
    609     }
    610 
    611     // further sample rate checks are performed by createTrack_l() depending on the thread type
    612     if (sampleRate == 0) {
    613         ALOGE("createTrack() invalid sample rate %u", sampleRate);
    614         lStatus = BAD_VALUE;
    615         goto Exit;
    616     }
    617 
    618     // further channel mask checks are performed by createTrack_l() depending on the thread type
    619     if (!audio_is_output_channel(channelMask)) {
    620         ALOGE("createTrack() invalid channel mask %#x", channelMask);
    621         lStatus = BAD_VALUE;
    622         goto Exit;
    623     }
    624 
    625     // further format checks are performed by createTrack_l() depending on the thread type
    626     if (!audio_is_valid_format(format)) {
    627         ALOGE("createTrack() invalid format %#x", format);
    628         lStatus = BAD_VALUE;
    629         goto Exit;
    630     }
    631 
    632     if (sharedBuffer != 0 && sharedBuffer->pointer() == NULL) {
    633         ALOGE("createTrack() sharedBuffer is non-0 but has NULL pointer()");
    634         lStatus = BAD_VALUE;
    635         goto Exit;
    636     }
    637 
    638     {
    639         Mutex::Autolock _l(mLock);
    640         PlaybackThread *thread = checkPlaybackThread_l(output);
    641         if (thread == NULL) {
    642             ALOGE("no playback thread found for output handle %d", output);
    643             lStatus = BAD_VALUE;
    644             goto Exit;
    645         }
    646 
    647         client = registerPid(pid);
    648 
    649         PlaybackThread *effectThread = NULL;
    650         if (sessionId != NULL && *sessionId != AUDIO_SESSION_ALLOCATE) {
    651             if (audio_unique_id_get_use(*sessionId) != AUDIO_UNIQUE_ID_USE_SESSION) {
    652                 ALOGE("createTrack() invalid session ID %d", *sessionId);
    653                 lStatus = BAD_VALUE;
    654                 goto Exit;
    655             }
    656             lSessionId = *sessionId;
    657             // check if an effect chain with the same session ID is present on another
    658             // output thread and move it here.
    659             for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
    660                 sp<PlaybackThread> t = mPlaybackThreads.valueAt(i);
    661                 if (mPlaybackThreads.keyAt(i) != output) {
    662                     uint32_t sessions = t->hasAudioSession(lSessionId);
    663                     if (sessions & PlaybackThread::EFFECT_SESSION) {
    664                         effectThread = t.get();
    665                         break;
    666                     }
    667                 }
    668             }
    669         } else {
    670             // if no audio session id is provided, create one here
    671             lSessionId = (audio_session_t) nextUniqueId(AUDIO_UNIQUE_ID_USE_SESSION);
    672             if (sessionId != NULL) {
    673                 *sessionId = lSessionId;
    674             }
    675         }
    676         ALOGV("createTrack() lSessionId: %d", lSessionId);
    677 
    678         track = thread->createTrack_l(client, streamType, sampleRate, format,
    679                 channelMask, frameCount, sharedBuffer, lSessionId, flags, tid, clientUid, &lStatus);
    680         LOG_ALWAYS_FATAL_IF((lStatus == NO_ERROR) && (track == 0));
    681         // we don't abort yet if lStatus != NO_ERROR; there is still work to be done regardless
    682 
    683         // move effect chain to this output thread if an effect on same session was waiting
    684         // for a track to be created
    685         if (lStatus == NO_ERROR && effectThread != NULL) {
    686             // no risk of deadlock because AudioFlinger::mLock is held
    687             Mutex::Autolock _dl(thread->mLock);
    688             Mutex::Autolock _sl(effectThread->mLock);
    689             moveEffectChain_l(lSessionId, effectThread, thread, true);
    690         }
    691 
    692         // Look for sync events awaiting for a session to be used.
    693         for (size_t i = 0; i < mPendingSyncEvents.size(); i++) {
    694             if (mPendingSyncEvents[i]->triggerSession() == lSessionId) {
    695                 if (thread->isValidSyncEvent(mPendingSyncEvents[i])) {
    696                     if (lStatus == NO_ERROR) {
    697                         (void) track->setSyncEvent(mPendingSyncEvents[i]);
    698                     } else {
    699                         mPendingSyncEvents[i]->cancel();
    700                     }
    701                     mPendingSyncEvents.removeAt(i);
    702                     i--;
    703                 }
    704             }
    705         }
    706 
    707         setAudioHwSyncForSession_l(thread, lSessionId);
    708     }
    709 
    710     if (lStatus != NO_ERROR) {
    711         // remove local strong reference to Client before deleting the Track so that the
    712         // Client destructor is called by the TrackBase destructor with mClientLock held
    713         // Don't hold mClientLock when releasing the reference on the track as the
    714         // destructor will acquire it.
    715         {
    716             Mutex::Autolock _cl(mClientLock);
    717             client.clear();
    718         }
    719         track.clear();
    720         goto Exit;
    721     }
    722 
    723     // return handle to client
    724     trackHandle = new TrackHandle(track);
    725 
    726 Exit:
    727     *status = lStatus;
    728     return trackHandle;
    729 }
    730 
    731 uint32_t AudioFlinger::sampleRate(audio_io_handle_t ioHandle) const
    732 {
    733     Mutex::Autolock _l(mLock);
    734     ThreadBase *thread = checkThread_l(ioHandle);
    735     if (thread == NULL) {
    736         ALOGW("sampleRate() unknown thread %d", ioHandle);
    737         return 0;
    738     }
    739     return thread->sampleRate();
    740 }
    741 
    742 audio_format_t AudioFlinger::format(audio_io_handle_t output) const
    743 {
    744     Mutex::Autolock _l(mLock);
    745     PlaybackThread *thread = checkPlaybackThread_l(output);
    746     if (thread == NULL) {
    747         ALOGW("format() unknown thread %d", output);
    748         return AUDIO_FORMAT_INVALID;
    749     }
    750     return thread->format();
    751 }
    752 
    753 size_t AudioFlinger::frameCount(audio_io_handle_t ioHandle) const
    754 {
    755     Mutex::Autolock _l(mLock);
    756     ThreadBase *thread = checkThread_l(ioHandle);
    757     if (thread == NULL) {
    758         ALOGW("frameCount() unknown thread %d", ioHandle);
    759         return 0;
    760     }
    761     // FIXME currently returns the normal mixer's frame count to avoid confusing legacy callers;
    762     //       should examine all callers and fix them to handle smaller counts
    763     return thread->frameCount();
    764 }
    765 
    766 size_t AudioFlinger::frameCountHAL(audio_io_handle_t ioHandle) const
    767 {
    768     Mutex::Autolock _l(mLock);
    769     ThreadBase *thread = checkThread_l(ioHandle);
    770     if (thread == NULL) {
    771         ALOGW("frameCountHAL() unknown thread %d", ioHandle);
    772         return 0;
    773     }
    774     return thread->frameCountHAL();
    775 }
    776 
    777 uint32_t AudioFlinger::latency(audio_io_handle_t output) const
    778 {
    779     Mutex::Autolock _l(mLock);
    780     PlaybackThread *thread = checkPlaybackThread_l(output);
    781     if (thread == NULL) {
    782         ALOGW("latency(): no playback thread found for output handle %d", output);
    783         return 0;
    784     }
    785     return thread->latency();
    786 }
    787 
    788 status_t AudioFlinger::setMasterVolume(float value)
    789 {
    790     status_t ret = initCheck();
    791     if (ret != NO_ERROR) {
    792         return ret;
    793     }
    794 
    795     // check calling permissions
    796     if (!settingsAllowed()) {
    797         return PERMISSION_DENIED;
    798     }
    799 
    800     Mutex::Autolock _l(mLock);
    801     mMasterVolume = value;
    802 
    803     // Set master volume in the HALs which support it.
    804     for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
    805         AutoMutex lock(mHardwareLock);
    806         AudioHwDevice *dev = mAudioHwDevs.valueAt(i);
    807 
    808         mHardwareStatus = AUDIO_HW_SET_MASTER_VOLUME;
    809         if (dev->canSetMasterVolume()) {
    810             dev->hwDevice()->set_master_volume(dev->hwDevice(), value);
    811         }
    812         mHardwareStatus = AUDIO_HW_IDLE;
    813     }
    814 
    815     // Now set the master volume in each playback thread.  Playback threads
    816     // assigned to HALs which do not have master volume support will apply
    817     // master volume during the mix operation.  Threads with HALs which do
    818     // support master volume will simply ignore the setting.
    819     for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
    820         if (mPlaybackThreads.valueAt(i)->isDuplicating()) {
    821             continue;
    822         }
    823         mPlaybackThreads.valueAt(i)->setMasterVolume(value);
    824     }
    825 
    826     return NO_ERROR;
    827 }
    828 
    829 status_t AudioFlinger::setMode(audio_mode_t mode)
    830 {
    831     status_t ret = initCheck();
    832     if (ret != NO_ERROR) {
    833         return ret;
    834     }
    835 
    836     // check calling permissions
    837     if (!settingsAllowed()) {
    838         return PERMISSION_DENIED;
    839     }
    840     if (uint32_t(mode) >= AUDIO_MODE_CNT) {
    841         ALOGW("Illegal value: setMode(%d)", mode);
    842         return BAD_VALUE;
    843     }
    844 
    845     { // scope for the lock
    846         AutoMutex lock(mHardwareLock);
    847         audio_hw_device_t *dev = mPrimaryHardwareDev->hwDevice();
    848         mHardwareStatus = AUDIO_HW_SET_MODE;
    849         ret = dev->set_mode(dev, mode);
    850         mHardwareStatus = AUDIO_HW_IDLE;
    851     }
    852 
    853     if (NO_ERROR == ret) {
    854         Mutex::Autolock _l(mLock);
    855         mMode = mode;
    856         for (size_t i = 0; i < mPlaybackThreads.size(); i++)
    857             mPlaybackThreads.valueAt(i)->setMode(mode);
    858     }
    859 
    860     return ret;
    861 }
    862 
    863 status_t AudioFlinger::setMicMute(bool state)
    864 {
    865     status_t ret = initCheck();
    866     if (ret != NO_ERROR) {
    867         return ret;
    868     }
    869 
    870     // check calling permissions
    871     if (!settingsAllowed()) {
    872         return PERMISSION_DENIED;
    873     }
    874 
    875     AutoMutex lock(mHardwareLock);
    876     mHardwareStatus = AUDIO_HW_SET_MIC_MUTE;
    877     for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
    878         audio_hw_device_t *dev = mAudioHwDevs.valueAt(i)->hwDevice();
    879         status_t result = dev->set_mic_mute(dev, state);
    880         if (result != NO_ERROR) {
    881             ret = result;
    882         }
    883     }
    884     mHardwareStatus = AUDIO_HW_IDLE;
    885     return ret;
    886 }
    887 
    888 bool AudioFlinger::getMicMute() const
    889 {
    890     status_t ret = initCheck();
    891     if (ret != NO_ERROR) {
    892         return false;
    893     }
    894     bool mute = true;
    895     bool state = AUDIO_MODE_INVALID;
    896     AutoMutex lock(mHardwareLock);
    897     mHardwareStatus = AUDIO_HW_GET_MIC_MUTE;
    898     for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
    899         audio_hw_device_t *dev = mAudioHwDevs.valueAt(i)->hwDevice();
    900         status_t result = dev->get_mic_mute(dev, &state);
    901         if (result == NO_ERROR) {
    902             mute = mute && state;
    903         }
    904     }
    905     mHardwareStatus = AUDIO_HW_IDLE;
    906 
    907     return mute;
    908 }
    909 
    910 status_t AudioFlinger::setMasterMute(bool muted)
    911 {
    912     status_t ret = initCheck();
    913     if (ret != NO_ERROR) {
    914         return ret;
    915     }
    916 
    917     // check calling permissions
    918     if (!settingsAllowed()) {
    919         return PERMISSION_DENIED;
    920     }
    921 
    922     Mutex::Autolock _l(mLock);
    923     mMasterMute = muted;
    924 
    925     // Set master mute in the HALs which support it.
    926     for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
    927         AutoMutex lock(mHardwareLock);
    928         AudioHwDevice *dev = mAudioHwDevs.valueAt(i);
    929 
    930         mHardwareStatus = AUDIO_HW_SET_MASTER_MUTE;
    931         if (dev->canSetMasterMute()) {
    932             dev->hwDevice()->set_master_mute(dev->hwDevice(), muted);
    933         }
    934         mHardwareStatus = AUDIO_HW_IDLE;
    935     }
    936 
    937     // Now set the master mute in each playback thread.  Playback threads
    938     // assigned to HALs which do not have master mute support will apply master
    939     // mute during the mix operation.  Threads with HALs which do support master
    940     // mute will simply ignore the setting.
    941     for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
    942         if (mPlaybackThreads.valueAt(i)->isDuplicating()) {
    943             continue;
    944         }
    945         mPlaybackThreads.valueAt(i)->setMasterMute(muted);
    946     }
    947 
    948     return NO_ERROR;
    949 }
    950 
    951 float AudioFlinger::masterVolume() const
    952 {
    953     Mutex::Autolock _l(mLock);
    954     return masterVolume_l();
    955 }
    956 
    957 bool AudioFlinger::masterMute() const
    958 {
    959     Mutex::Autolock _l(mLock);
    960     return masterMute_l();
    961 }
    962 
    963 float AudioFlinger::masterVolume_l() const
    964 {
    965     return mMasterVolume;
    966 }
    967 
    968 bool AudioFlinger::masterMute_l() const
    969 {
    970     return mMasterMute;
    971 }
    972 
    973 status_t AudioFlinger::checkStreamType(audio_stream_type_t stream) const
    974 {
    975     if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
    976         ALOGW("setStreamVolume() invalid stream %d", stream);
    977         return BAD_VALUE;
    978     }
    979     pid_t caller = IPCThreadState::self()->getCallingPid();
    980     if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT && caller != getpid_cached) {
    981         ALOGW("setStreamVolume() pid %d cannot use internal stream type %d", caller, stream);
    982         return PERMISSION_DENIED;
    983     }
    984 
    985     return NO_ERROR;
    986 }
    987 
    988 status_t AudioFlinger::setStreamVolume(audio_stream_type_t stream, float value,
    989         audio_io_handle_t output)
    990 {
    991     // check calling permissions
    992     if (!settingsAllowed()) {
    993         return PERMISSION_DENIED;
    994     }
    995 
    996     status_t status = checkStreamType(stream);
    997     if (status != NO_ERROR) {
    998         return status;
    999     }
   1000     ALOG_ASSERT(stream != AUDIO_STREAM_PATCH, "attempt to change AUDIO_STREAM_PATCH volume");
   1001 
   1002     AutoMutex lock(mLock);
   1003     PlaybackThread *thread = NULL;
   1004     if (output != AUDIO_IO_HANDLE_NONE) {
   1005         thread = checkPlaybackThread_l(output);
   1006         if (thread == NULL) {
   1007             return BAD_VALUE;
   1008         }
   1009     }
   1010 
   1011     mStreamTypes[stream].volume = value;
   1012 
   1013     if (thread == NULL) {
   1014         for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
   1015             mPlaybackThreads.valueAt(i)->setStreamVolume(stream, value);
   1016         }
   1017     } else {
   1018         thread->setStreamVolume(stream, value);
   1019     }
   1020 
   1021     return NO_ERROR;
   1022 }
   1023 
   1024 status_t AudioFlinger::setStreamMute(audio_stream_type_t stream, bool muted)
   1025 {
   1026     // check calling permissions
   1027     if (!settingsAllowed()) {
   1028         return PERMISSION_DENIED;
   1029     }
   1030 
   1031     status_t status = checkStreamType(stream);
   1032     if (status != NO_ERROR) {
   1033         return status;
   1034     }
   1035     ALOG_ASSERT(stream != AUDIO_STREAM_PATCH, "attempt to mute AUDIO_STREAM_PATCH");
   1036 
   1037     if (uint32_t(stream) == AUDIO_STREAM_ENFORCED_AUDIBLE) {
   1038         ALOGE("setStreamMute() invalid stream %d", stream);
   1039         return BAD_VALUE;
   1040     }
   1041 
   1042     AutoMutex lock(mLock);
   1043     mStreamTypes[stream].mute = muted;
   1044     for (size_t i = 0; i < mPlaybackThreads.size(); i++)
   1045         mPlaybackThreads.valueAt(i)->setStreamMute(stream, muted);
   1046 
   1047     return NO_ERROR;
   1048 }
   1049 
   1050 float AudioFlinger::streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const
   1051 {
   1052     status_t status = checkStreamType(stream);
   1053     if (status != NO_ERROR) {
   1054         return 0.0f;
   1055     }
   1056 
   1057     AutoMutex lock(mLock);
   1058     float volume;
   1059     if (output != AUDIO_IO_HANDLE_NONE) {
   1060         PlaybackThread *thread = checkPlaybackThread_l(output);
   1061         if (thread == NULL) {
   1062             return 0.0f;
   1063         }
   1064         volume = thread->streamVolume(stream);
   1065     } else {
   1066         volume = streamVolume_l(stream);
   1067     }
   1068 
   1069     return volume;
   1070 }
   1071 
   1072 bool AudioFlinger::streamMute(audio_stream_type_t stream) const
   1073 {
   1074     status_t status = checkStreamType(stream);
   1075     if (status != NO_ERROR) {
   1076         return true;
   1077     }
   1078 
   1079     AutoMutex lock(mLock);
   1080     return streamMute_l(stream);
   1081 }
   1082 
   1083 
   1084 void AudioFlinger::broacastParametersToRecordThreads_l(const String8& keyValuePairs)
   1085 {
   1086     for (size_t i = 0; i < mRecordThreads.size(); i++) {
   1087         mRecordThreads.valueAt(i)->setParameters(keyValuePairs);
   1088     }
   1089 }
   1090 
   1091 status_t AudioFlinger::setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs)
   1092 {
   1093     ALOGV("setParameters(): io %d, keyvalue %s, calling pid %d",
   1094             ioHandle, keyValuePairs.string(), IPCThreadState::self()->getCallingPid());
   1095 
   1096     // check calling permissions
   1097     if (!settingsAllowed()) {
   1098         return PERMISSION_DENIED;
   1099     }
   1100 
   1101     // AUDIO_IO_HANDLE_NONE means the parameters are global to the audio hardware interface
   1102     if (ioHandle == AUDIO_IO_HANDLE_NONE) {
   1103         Mutex::Autolock _l(mLock);
   1104         status_t final_result = NO_ERROR;
   1105         {
   1106             AutoMutex lock(mHardwareLock);
   1107             mHardwareStatus = AUDIO_HW_SET_PARAMETER;
   1108             for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
   1109                 audio_hw_device_t *dev = mAudioHwDevs.valueAt(i)->hwDevice();
   1110                 status_t result = dev->set_parameters(dev, keyValuePairs.string());
   1111                 final_result = result ?: final_result;
   1112             }
   1113             mHardwareStatus = AUDIO_HW_IDLE;
   1114         }
   1115         // disable AEC and NS if the device is a BT SCO headset supporting those pre processings
   1116         AudioParameter param = AudioParameter(keyValuePairs);
   1117         String8 value;
   1118         if (param.get(String8(AUDIO_PARAMETER_KEY_BT_NREC), value) == NO_ERROR) {
   1119             bool btNrecIsOff = (value == AUDIO_PARAMETER_VALUE_OFF);
   1120             if (mBtNrecIsOff != btNrecIsOff) {
   1121                 for (size_t i = 0; i < mRecordThreads.size(); i++) {
   1122                     sp<RecordThread> thread = mRecordThreads.valueAt(i);
   1123                     audio_devices_t device = thread->inDevice();
   1124                     bool suspend = audio_is_bluetooth_sco_device(device) && btNrecIsOff;
   1125                     // collect all of the thread's session IDs
   1126                     KeyedVector<audio_session_t, bool> ids = thread->sessionIds();
   1127                     // suspend effects associated with those session IDs
   1128                     for (size_t j = 0; j < ids.size(); ++j) {
   1129                         audio_session_t sessionId = ids.keyAt(j);
   1130                         thread->setEffectSuspended(FX_IID_AEC,
   1131                                                    suspend,
   1132                                                    sessionId);
   1133                         thread->setEffectSuspended(FX_IID_NS,
   1134                                                    suspend,
   1135                                                    sessionId);
   1136                     }
   1137                 }
   1138                 mBtNrecIsOff = btNrecIsOff;
   1139             }
   1140         }
   1141         String8 screenState;
   1142         if (param.get(String8(AudioParameter::keyScreenState), screenState) == NO_ERROR) {
   1143             bool isOff = screenState == "off";
   1144             if (isOff != (AudioFlinger::mScreenState & 1)) {
   1145                 AudioFlinger::mScreenState = ((AudioFlinger::mScreenState & ~1) + 2) | isOff;
   1146             }
   1147         }
   1148         return final_result;
   1149     }
   1150 
   1151     // hold a strong ref on thread in case closeOutput() or closeInput() is called
   1152     // and the thread is exited once the lock is released
   1153     sp<ThreadBase> thread;
   1154     {
   1155         Mutex::Autolock _l(mLock);
   1156         thread = checkPlaybackThread_l(ioHandle);
   1157         if (thread == 0) {
   1158             thread = checkRecordThread_l(ioHandle);
   1159         } else if (thread == primaryPlaybackThread_l()) {
   1160             // indicate output device change to all input threads for pre processing
   1161             AudioParameter param = AudioParameter(keyValuePairs);
   1162             int value;
   1163             if ((param.getInt(String8(AudioParameter::keyRouting), value) == NO_ERROR) &&
   1164                     (value != 0)) {
   1165                 broacastParametersToRecordThreads_l(keyValuePairs);
   1166             }
   1167         }
   1168     }
   1169     if (thread != 0) {
   1170         return thread->setParameters(keyValuePairs);
   1171     }
   1172     return BAD_VALUE;
   1173 }
   1174 
   1175 String8 AudioFlinger::getParameters(audio_io_handle_t ioHandle, const String8& keys) const
   1176 {
   1177     ALOGVV("getParameters() io %d, keys %s, calling pid %d",
   1178             ioHandle, keys.string(), IPCThreadState::self()->getCallingPid());
   1179 
   1180     Mutex::Autolock _l(mLock);
   1181 
   1182     if (ioHandle == AUDIO_IO_HANDLE_NONE) {
   1183         String8 out_s8;
   1184 
   1185         for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
   1186             char *s;
   1187             {
   1188             AutoMutex lock(mHardwareLock);
   1189             mHardwareStatus = AUDIO_HW_GET_PARAMETER;
   1190             audio_hw_device_t *dev = mAudioHwDevs.valueAt(i)->hwDevice();
   1191             s = dev->get_parameters(dev, keys.string());
   1192             mHardwareStatus = AUDIO_HW_IDLE;
   1193             }
   1194             out_s8 += String8(s ? s : "");
   1195             free(s);
   1196         }
   1197         return out_s8;
   1198     }
   1199 
   1200     PlaybackThread *playbackThread = checkPlaybackThread_l(ioHandle);
   1201     if (playbackThread != NULL) {
   1202         return playbackThread->getParameters(keys);
   1203     }
   1204     RecordThread *recordThread = checkRecordThread_l(ioHandle);
   1205     if (recordThread != NULL) {
   1206         return recordThread->getParameters(keys);
   1207     }
   1208     return String8("");
   1209 }
   1210 
   1211 size_t AudioFlinger::getInputBufferSize(uint32_t sampleRate, audio_format_t format,
   1212         audio_channel_mask_t channelMask) const
   1213 {
   1214     status_t ret = initCheck();
   1215     if (ret != NO_ERROR) {
   1216         return 0;
   1217     }
   1218     if ((sampleRate == 0) ||
   1219             !audio_is_valid_format(format) || !audio_has_proportional_frames(format) ||
   1220             !audio_is_input_channel(channelMask)) {
   1221         return 0;
   1222     }
   1223 
   1224     AutoMutex lock(mHardwareLock);
   1225     mHardwareStatus = AUDIO_HW_GET_INPUT_BUFFER_SIZE;
   1226     audio_config_t config, proposed;
   1227     memset(&proposed, 0, sizeof(proposed));
   1228     proposed.sample_rate = sampleRate;
   1229     proposed.channel_mask = channelMask;
   1230     proposed.format = format;
   1231 
   1232     audio_hw_device_t *dev = mPrimaryHardwareDev->hwDevice();
   1233     size_t frames;
   1234     for (;;) {
   1235         // Note: config is currently a const parameter for get_input_buffer_size()
   1236         // but we use a copy from proposed in case config changes from the call.
   1237         config = proposed;
   1238         frames = dev->get_input_buffer_size(dev, &config);
   1239         if (frames != 0) {
   1240             break; // hal success, config is the result
   1241         }
   1242         // change one parameter of the configuration each iteration to a more "common" value
   1243         // to see if the device will support it.
   1244         if (proposed.format != AUDIO_FORMAT_PCM_16_BIT) {
   1245             proposed.format = AUDIO_FORMAT_PCM_16_BIT;
   1246         } else if (proposed.sample_rate != 44100) { // 44.1 is claimed as must in CDD as well as
   1247             proposed.sample_rate = 44100;           // legacy AudioRecord.java. TODO: Query hw?
   1248         } else {
   1249             ALOGW("getInputBufferSize failed with minimum buffer size sampleRate %u, "
   1250                     "format %#x, channelMask 0x%X",
   1251                     sampleRate, format, channelMask);
   1252             break; // retries failed, break out of loop with frames == 0.
   1253         }
   1254     }
   1255     mHardwareStatus = AUDIO_HW_IDLE;
   1256     if (frames > 0 && config.sample_rate != sampleRate) {
   1257         frames = destinationFramesPossible(frames, sampleRate, config.sample_rate);
   1258     }
   1259     return frames; // may be converted to bytes at the Java level.
   1260 }
   1261 
   1262 uint32_t AudioFlinger::getInputFramesLost(audio_io_handle_t ioHandle) const
   1263 {
   1264     Mutex::Autolock _l(mLock);
   1265 
   1266     RecordThread *recordThread = checkRecordThread_l(ioHandle);
   1267     if (recordThread != NULL) {
   1268         return recordThread->getInputFramesLost();
   1269     }
   1270     return 0;
   1271 }
   1272 
   1273 status_t AudioFlinger::setVoiceVolume(float value)
   1274 {
   1275     status_t ret = initCheck();
   1276     if (ret != NO_ERROR) {
   1277         return ret;
   1278     }
   1279 
   1280     // check calling permissions
   1281     if (!settingsAllowed()) {
   1282         return PERMISSION_DENIED;
   1283     }
   1284 
   1285     AutoMutex lock(mHardwareLock);
   1286     audio_hw_device_t *dev = mPrimaryHardwareDev->hwDevice();
   1287     mHardwareStatus = AUDIO_HW_SET_VOICE_VOLUME;
   1288     ret = dev->set_voice_volume(dev, value);
   1289     mHardwareStatus = AUDIO_HW_IDLE;
   1290 
   1291     return ret;
   1292 }
   1293 
   1294 status_t AudioFlinger::getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames,
   1295         audio_io_handle_t output) const
   1296 {
   1297     Mutex::Autolock _l(mLock);
   1298 
   1299     PlaybackThread *playbackThread = checkPlaybackThread_l(output);
   1300     if (playbackThread != NULL) {
   1301         return playbackThread->getRenderPosition(halFrames, dspFrames);
   1302     }
   1303 
   1304     return BAD_VALUE;
   1305 }
   1306 
   1307 void AudioFlinger::registerClient(const sp<IAudioFlingerClient>& client)
   1308 {
   1309     Mutex::Autolock _l(mLock);
   1310     if (client == 0) {
   1311         return;
   1312     }
   1313     pid_t pid = IPCThreadState::self()->getCallingPid();
   1314     {
   1315         Mutex::Autolock _cl(mClientLock);
   1316         if (mNotificationClients.indexOfKey(pid) < 0) {
   1317             sp<NotificationClient> notificationClient = new NotificationClient(this,
   1318                                                                                 client,
   1319                                                                                 pid);
   1320             ALOGV("registerClient() client %p, pid %d", notificationClient.get(), pid);
   1321 
   1322             mNotificationClients.add(pid, notificationClient);
   1323 
   1324             sp<IBinder> binder = IInterface::asBinder(client);
   1325             binder->linkToDeath(notificationClient);
   1326         }
   1327     }
   1328 
   1329     // mClientLock should not be held here because ThreadBase::sendIoConfigEvent() will lock the
   1330     // ThreadBase mutex and the locking order is ThreadBase::mLock then AudioFlinger::mClientLock.
   1331     // the config change is always sent from playback or record threads to avoid deadlock
   1332     // with AudioSystem::gLock
   1333     for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
   1334         mPlaybackThreads.valueAt(i)->sendIoConfigEvent(AUDIO_OUTPUT_OPENED, pid);
   1335     }
   1336 
   1337     for (size_t i = 0; i < mRecordThreads.size(); i++) {
   1338         mRecordThreads.valueAt(i)->sendIoConfigEvent(AUDIO_INPUT_OPENED, pid);
   1339     }
   1340 }
   1341 
   1342 void AudioFlinger::removeNotificationClient(pid_t pid)
   1343 {
   1344     Mutex::Autolock _l(mLock);
   1345     {
   1346         Mutex::Autolock _cl(mClientLock);
   1347         mNotificationClients.removeItem(pid);
   1348     }
   1349 
   1350     ALOGV("%d died, releasing its sessions", pid);
   1351     size_t num = mAudioSessionRefs.size();
   1352     bool removed = false;
   1353     for (size_t i = 0; i< num; ) {
   1354         AudioSessionRef *ref = mAudioSessionRefs.itemAt(i);
   1355         ALOGV(" pid %d @ %zu", ref->mPid, i);
   1356         if (ref->mPid == pid) {
   1357             ALOGV(" removing entry for pid %d session %d", pid, ref->mSessionid);
   1358             mAudioSessionRefs.removeAt(i);
   1359             delete ref;
   1360             removed = true;
   1361             num--;
   1362         } else {
   1363             i++;
   1364         }
   1365     }
   1366     if (removed) {
   1367         purgeStaleEffects_l();
   1368     }
   1369 }
   1370 
   1371 void AudioFlinger::ioConfigChanged(audio_io_config_event event,
   1372                                    const sp<AudioIoDescriptor>& ioDesc,
   1373                                    pid_t pid)
   1374 {
   1375     Mutex::Autolock _l(mClientLock);
   1376     size_t size = mNotificationClients.size();
   1377     for (size_t i = 0; i < size; i++) {
   1378         if ((pid == 0) || (mNotificationClients.keyAt(i) == pid)) {
   1379             mNotificationClients.valueAt(i)->audioFlingerClient()->ioConfigChanged(event, ioDesc);
   1380         }
   1381     }
   1382 }
   1383 
   1384 // removeClient_l() must be called with AudioFlinger::mClientLock held
   1385 void AudioFlinger::removeClient_l(pid_t pid)
   1386 {
   1387     ALOGV("removeClient_l() pid %d, calling pid %d", pid,
   1388             IPCThreadState::self()->getCallingPid());
   1389     mClients.removeItem(pid);
   1390 }
   1391 
   1392 // getEffectThread_l() must be called with AudioFlinger::mLock held
   1393 sp<AudioFlinger::PlaybackThread> AudioFlinger::getEffectThread_l(audio_session_t sessionId,
   1394         int EffectId)
   1395 {
   1396     sp<PlaybackThread> thread;
   1397 
   1398     for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
   1399         if (mPlaybackThreads.valueAt(i)->getEffect(sessionId, EffectId) != 0) {
   1400             ALOG_ASSERT(thread == 0);
   1401             thread = mPlaybackThreads.valueAt(i);
   1402         }
   1403     }
   1404 
   1405     return thread;
   1406 }
   1407 
   1408 
   1409 
   1410 // ----------------------------------------------------------------------------
   1411 
   1412 AudioFlinger::Client::Client(const sp<AudioFlinger>& audioFlinger, pid_t pid)
   1413     :   RefBase(),
   1414         mAudioFlinger(audioFlinger),
   1415         mPid(pid)
   1416 {
   1417     size_t heapSize = kClientSharedHeapSizeBytes;
   1418     // Increase heap size on non low ram devices to limit risk of reconnection failure for
   1419     // invalidated tracks
   1420     if (!audioFlinger->isLowRamDevice()) {
   1421         heapSize *= kClientSharedHeapSizeMultiplier;
   1422     }
   1423     mMemoryDealer = new MemoryDealer(heapSize, "AudioFlinger::Client");
   1424 }
   1425 
   1426 // Client destructor must be called with AudioFlinger::mClientLock held
   1427 AudioFlinger::Client::~Client()
   1428 {
   1429     mAudioFlinger->removeClient_l(mPid);
   1430 }
   1431 
   1432 sp<MemoryDealer> AudioFlinger::Client::heap() const
   1433 {
   1434     return mMemoryDealer;
   1435 }
   1436 
   1437 // ----------------------------------------------------------------------------
   1438 
   1439 AudioFlinger::NotificationClient::NotificationClient(const sp<AudioFlinger>& audioFlinger,
   1440                                                      const sp<IAudioFlingerClient>& client,
   1441                                                      pid_t pid)
   1442     : mAudioFlinger(audioFlinger), mPid(pid), mAudioFlingerClient(client)
   1443 {
   1444 }
   1445 
   1446 AudioFlinger::NotificationClient::~NotificationClient()
   1447 {
   1448 }
   1449 
   1450 void AudioFlinger::NotificationClient::binderDied(const wp<IBinder>& who __unused)
   1451 {
   1452     sp<NotificationClient> keep(this);
   1453     mAudioFlinger->removeNotificationClient(mPid);
   1454 }
   1455 
   1456 
   1457 // ----------------------------------------------------------------------------
   1458 
   1459 sp<IAudioRecord> AudioFlinger::openRecord(
   1460         audio_io_handle_t input,
   1461         uint32_t sampleRate,
   1462         audio_format_t format,
   1463         audio_channel_mask_t channelMask,
   1464         const String16& opPackageName,
   1465         size_t *frameCount,
   1466         IAudioFlinger::track_flags_t *flags,
   1467         pid_t pid,
   1468         pid_t tid,
   1469         int clientUid,
   1470         audio_session_t *sessionId,
   1471         size_t *notificationFrames,
   1472         sp<IMemory>& cblk,
   1473         sp<IMemory>& buffers,
   1474         status_t *status)
   1475 {
   1476     sp<RecordThread::RecordTrack> recordTrack;
   1477     sp<RecordHandle> recordHandle;
   1478     sp<Client> client;
   1479     status_t lStatus;
   1480     audio_session_t lSessionId;
   1481 
   1482     cblk.clear();
   1483     buffers.clear();
   1484 
   1485     bool updatePid = (pid == -1);
   1486     const uid_t callingUid = IPCThreadState::self()->getCallingUid();
   1487     if (!isTrustedCallingUid(callingUid)) {
   1488         ALOGW_IF((uid_t)clientUid != callingUid,
   1489                 "%s uid %d tried to pass itself off as %d", __FUNCTION__, callingUid, clientUid);
   1490         clientUid = callingUid;
   1491         updatePid = true;
   1492     }
   1493 
   1494     if (updatePid) {
   1495         const pid_t callingPid = IPCThreadState::self()->getCallingPid();
   1496         ALOGW_IF(pid != -1 && pid != callingPid,
   1497                  "%s uid %d pid %d tried to pass itself off as pid %d",
   1498                  __func__, callingUid, callingPid, pid);
   1499         pid = callingPid;
   1500     }
   1501 
   1502     // check calling permissions
   1503     if (!recordingAllowed(opPackageName, tid, clientUid)) {
   1504         ALOGE("openRecord() permission denied: recording not allowed");
   1505         lStatus = PERMISSION_DENIED;
   1506         goto Exit;
   1507     }
   1508 
   1509     // further sample rate checks are performed by createRecordTrack_l()
   1510     if (sampleRate == 0) {
   1511         ALOGE("openRecord() invalid sample rate %u", sampleRate);
   1512         lStatus = BAD_VALUE;
   1513         goto Exit;
   1514     }
   1515 
   1516     // we don't yet support anything other than linear PCM
   1517     if (!audio_is_valid_format(format) || !audio_is_linear_pcm(format)) {
   1518         ALOGE("openRecord() invalid format %#x", format);
   1519         lStatus = BAD_VALUE;
   1520         goto Exit;
   1521     }
   1522 
   1523     // further channel mask checks are performed by createRecordTrack_l()
   1524     if (!audio_is_input_channel(channelMask)) {
   1525         ALOGE("openRecord() invalid channel mask %#x", channelMask);
   1526         lStatus = BAD_VALUE;
   1527         goto Exit;
   1528     }
   1529 
   1530     {
   1531         Mutex::Autolock _l(mLock);
   1532         RecordThread *thread = checkRecordThread_l(input);
   1533         if (thread == NULL) {
   1534             ALOGE("openRecord() checkRecordThread_l failed");
   1535             lStatus = BAD_VALUE;
   1536             goto Exit;
   1537         }
   1538 
   1539         client = registerPid(pid);
   1540 
   1541         if (sessionId != NULL && *sessionId != AUDIO_SESSION_ALLOCATE) {
   1542             if (audio_unique_id_get_use(*sessionId) != AUDIO_UNIQUE_ID_USE_SESSION) {
   1543                 lStatus = BAD_VALUE;
   1544                 goto Exit;
   1545             }
   1546             lSessionId = *sessionId;
   1547         } else {
   1548             // if no audio session id is provided, create one here
   1549             lSessionId = (audio_session_t) nextUniqueId(AUDIO_UNIQUE_ID_USE_SESSION);
   1550             if (sessionId != NULL) {
   1551                 *sessionId = lSessionId;
   1552             }
   1553         }
   1554         ALOGV("openRecord() lSessionId: %d input %d", lSessionId, input);
   1555 
   1556         recordTrack = thread->createRecordTrack_l(client, sampleRate, format, channelMask,
   1557                                                   frameCount, lSessionId, notificationFrames,
   1558                                                   clientUid, flags, tid, &lStatus);
   1559         LOG_ALWAYS_FATAL_IF((lStatus == NO_ERROR) && (recordTrack == 0));
   1560 
   1561         if (lStatus == NO_ERROR) {
   1562             // Check if one effect chain was awaiting for an AudioRecord to be created on this
   1563             // session and move it to this thread.
   1564             sp<EffectChain> chain = getOrphanEffectChain_l(lSessionId);
   1565             if (chain != 0) {
   1566                 Mutex::Autolock _l(thread->mLock);
   1567                 thread->addEffectChain_l(chain);
   1568             }
   1569         }
   1570     }
   1571 
   1572     if (lStatus != NO_ERROR) {
   1573         // remove local strong reference to Client before deleting the RecordTrack so that the
   1574         // Client destructor is called by the TrackBase destructor with mClientLock held
   1575         // Don't hold mClientLock when releasing the reference on the track as the
   1576         // destructor will acquire it.
   1577         {
   1578             Mutex::Autolock _cl(mClientLock);
   1579             client.clear();
   1580         }
   1581         recordTrack.clear();
   1582         goto Exit;
   1583     }
   1584 
   1585     cblk = recordTrack->getCblk();
   1586     buffers = recordTrack->getBuffers();
   1587 
   1588     // return handle to client
   1589     recordHandle = new RecordHandle(recordTrack);
   1590 
   1591 Exit:
   1592     *status = lStatus;
   1593     return recordHandle;
   1594 }
   1595 
   1596 
   1597 
   1598 // ----------------------------------------------------------------------------
   1599 
   1600 audio_module_handle_t AudioFlinger::loadHwModule(const char *name)
   1601 {
   1602     if (name == NULL) {
   1603         return AUDIO_MODULE_HANDLE_NONE;
   1604     }
   1605     if (!settingsAllowed()) {
   1606         return AUDIO_MODULE_HANDLE_NONE;
   1607     }
   1608     Mutex::Autolock _l(mLock);
   1609     return loadHwModule_l(name);
   1610 }
   1611 
   1612 // loadHwModule_l() must be called with AudioFlinger::mLock held
   1613 audio_module_handle_t AudioFlinger::loadHwModule_l(const char *name)
   1614 {
   1615     for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
   1616         if (strncmp(mAudioHwDevs.valueAt(i)->moduleName(), name, strlen(name)) == 0) {
   1617             ALOGW("loadHwModule() module %s already loaded", name);
   1618             return mAudioHwDevs.keyAt(i);
   1619         }
   1620     }
   1621 
   1622     audio_hw_device_t *dev;
   1623 
   1624     int rc = load_audio_interface(name, &dev);
   1625     if (rc) {
   1626         ALOGE("loadHwModule() error %d loading module %s", rc, name);
   1627         return AUDIO_MODULE_HANDLE_NONE;
   1628     }
   1629 
   1630     mHardwareStatus = AUDIO_HW_INIT;
   1631     rc = dev->init_check(dev);
   1632     mHardwareStatus = AUDIO_HW_IDLE;
   1633     if (rc) {
   1634         ALOGE("loadHwModule() init check error %d for module %s", rc, name);
   1635         return AUDIO_MODULE_HANDLE_NONE;
   1636     }
   1637 
   1638     // Check and cache this HAL's level of support for master mute and master
   1639     // volume.  If this is the first HAL opened, and it supports the get
   1640     // methods, use the initial values provided by the HAL as the current
   1641     // master mute and volume settings.
   1642 
   1643     AudioHwDevice::Flags flags = static_cast<AudioHwDevice::Flags>(0);
   1644     {  // scope for auto-lock pattern
   1645         AutoMutex lock(mHardwareLock);
   1646 
   1647         if (0 == mAudioHwDevs.size()) {
   1648             mHardwareStatus = AUDIO_HW_GET_MASTER_VOLUME;
   1649             if (NULL != dev->get_master_volume) {
   1650                 float mv;
   1651                 if (OK == dev->get_master_volume(dev, &mv)) {
   1652                     mMasterVolume = mv;
   1653                 }
   1654             }
   1655 
   1656             mHardwareStatus = AUDIO_HW_GET_MASTER_MUTE;
   1657             if (NULL != dev->get_master_mute) {
   1658                 bool mm;
   1659                 if (OK == dev->get_master_mute(dev, &mm)) {
   1660                     mMasterMute = mm;
   1661                 }
   1662             }
   1663         }
   1664 
   1665         mHardwareStatus = AUDIO_HW_SET_MASTER_VOLUME;
   1666         if ((NULL != dev->set_master_volume) &&
   1667             (OK == dev->set_master_volume(dev, mMasterVolume))) {
   1668             flags = static_cast<AudioHwDevice::Flags>(flags |
   1669                     AudioHwDevice::AHWD_CAN_SET_MASTER_VOLUME);
   1670         }
   1671 
   1672         mHardwareStatus = AUDIO_HW_SET_MASTER_MUTE;
   1673         if ((NULL != dev->set_master_mute) &&
   1674             (OK == dev->set_master_mute(dev, mMasterMute))) {
   1675             flags = static_cast<AudioHwDevice::Flags>(flags |
   1676                     AudioHwDevice::AHWD_CAN_SET_MASTER_MUTE);
   1677         }
   1678 
   1679         mHardwareStatus = AUDIO_HW_IDLE;
   1680     }
   1681 
   1682     audio_module_handle_t handle = (audio_module_handle_t) nextUniqueId(AUDIO_UNIQUE_ID_USE_MODULE);
   1683     mAudioHwDevs.add(handle, new AudioHwDevice(handle, name, dev, flags));
   1684 
   1685     ALOGI("loadHwModule() Loaded %s audio interface from %s (%s) handle %d",
   1686           name, dev->common.module->name, dev->common.module->id, handle);
   1687 
   1688     return handle;
   1689 
   1690 }
   1691 
   1692 // ----------------------------------------------------------------------------
   1693 
   1694 uint32_t AudioFlinger::getPrimaryOutputSamplingRate()
   1695 {
   1696     Mutex::Autolock _l(mLock);
   1697     PlaybackThread *thread = primaryPlaybackThread_l();
   1698     return thread != NULL ? thread->sampleRate() : 0;
   1699 }
   1700 
   1701 size_t AudioFlinger::getPrimaryOutputFrameCount()
   1702 {
   1703     Mutex::Autolock _l(mLock);
   1704     PlaybackThread *thread = primaryPlaybackThread_l();
   1705     return thread != NULL ? thread->frameCountHAL() : 0;
   1706 }
   1707 
   1708 // ----------------------------------------------------------------------------
   1709 
   1710 status_t AudioFlinger::setLowRamDevice(bool isLowRamDevice)
   1711 {
   1712     uid_t uid = IPCThreadState::self()->getCallingUid();
   1713     if (uid != AID_SYSTEM) {
   1714         return PERMISSION_DENIED;
   1715     }
   1716     Mutex::Autolock _l(mLock);
   1717     if (mIsDeviceTypeKnown) {
   1718         return INVALID_OPERATION;
   1719     }
   1720     mIsLowRamDevice = isLowRamDevice;
   1721     mIsDeviceTypeKnown = true;
   1722     return NO_ERROR;
   1723 }
   1724 
   1725 audio_hw_sync_t AudioFlinger::getAudioHwSyncForSession(audio_session_t sessionId)
   1726 {
   1727     Mutex::Autolock _l(mLock);
   1728 
   1729     ssize_t index = mHwAvSyncIds.indexOfKey(sessionId);
   1730     if (index >= 0) {
   1731         ALOGV("getAudioHwSyncForSession found ID %d for session %d",
   1732               mHwAvSyncIds.valueAt(index), sessionId);
   1733         return mHwAvSyncIds.valueAt(index);
   1734     }
   1735 
   1736     audio_hw_device_t *dev = mPrimaryHardwareDev->hwDevice();
   1737     if (dev == NULL) {
   1738         return AUDIO_HW_SYNC_INVALID;
   1739     }
   1740     char *reply = dev->get_parameters(dev, AUDIO_PARAMETER_HW_AV_SYNC);
   1741     AudioParameter param = AudioParameter(String8(reply));
   1742     free(reply);
   1743 
   1744     int value;
   1745     if (param.getInt(String8(AUDIO_PARAMETER_HW_AV_SYNC), value) != NO_ERROR) {
   1746         ALOGW("getAudioHwSyncForSession error getting sync for session %d", sessionId);
   1747         return AUDIO_HW_SYNC_INVALID;
   1748     }
   1749 
   1750     // allow only one session for a given HW A/V sync ID.
   1751     for (size_t i = 0; i < mHwAvSyncIds.size(); i++) {
   1752         if (mHwAvSyncIds.valueAt(i) == (audio_hw_sync_t)value) {
   1753             ALOGV("getAudioHwSyncForSession removing ID %d for session %d",
   1754                   value, mHwAvSyncIds.keyAt(i));
   1755             mHwAvSyncIds.removeItemsAt(i);
   1756             break;
   1757         }
   1758     }
   1759 
   1760     mHwAvSyncIds.add(sessionId, value);
   1761 
   1762     for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
   1763         sp<PlaybackThread> thread = mPlaybackThreads.valueAt(i);
   1764         uint32_t sessions = thread->hasAudioSession(sessionId);
   1765         if (sessions & PlaybackThread::TRACK_SESSION) {
   1766             AudioParameter param = AudioParameter();
   1767             param.addInt(String8(AUDIO_PARAMETER_STREAM_HW_AV_SYNC), value);
   1768             thread->setParameters(param.toString());
   1769             break;
   1770         }
   1771     }
   1772 
   1773     ALOGV("getAudioHwSyncForSession adding ID %d for session %d", value, sessionId);
   1774     return (audio_hw_sync_t)value;
   1775 }
   1776 
   1777 status_t AudioFlinger::systemReady()
   1778 {
   1779     Mutex::Autolock _l(mLock);
   1780     ALOGI("%s", __FUNCTION__);
   1781     if (mSystemReady) {
   1782         ALOGW("%s called twice", __FUNCTION__);
   1783         return NO_ERROR;
   1784     }
   1785     mSystemReady = true;
   1786     for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
   1787         ThreadBase *thread = (ThreadBase *)mPlaybackThreads.valueAt(i).get();
   1788         thread->systemReady();
   1789     }
   1790     for (size_t i = 0; i < mRecordThreads.size(); i++) {
   1791         ThreadBase *thread = (ThreadBase *)mRecordThreads.valueAt(i).get();
   1792         thread->systemReady();
   1793     }
   1794     return NO_ERROR;
   1795 }
   1796 
   1797 // setAudioHwSyncForSession_l() must be called with AudioFlinger::mLock held
   1798 void AudioFlinger::setAudioHwSyncForSession_l(PlaybackThread *thread, audio_session_t sessionId)
   1799 {
   1800     ssize_t index = mHwAvSyncIds.indexOfKey(sessionId);
   1801     if (index >= 0) {
   1802         audio_hw_sync_t syncId = mHwAvSyncIds.valueAt(index);
   1803         ALOGV("setAudioHwSyncForSession_l found ID %d for session %d", syncId, sessionId);
   1804         AudioParameter param = AudioParameter();
   1805         param.addInt(String8(AUDIO_PARAMETER_STREAM_HW_AV_SYNC), syncId);
   1806         thread->setParameters(param.toString());
   1807     }
   1808 }
   1809 
   1810 
   1811 // ----------------------------------------------------------------------------
   1812 
   1813 
   1814 sp<AudioFlinger::PlaybackThread> AudioFlinger::openOutput_l(audio_module_handle_t module,
   1815                                                             audio_io_handle_t *output,
   1816                                                             audio_config_t *config,
   1817                                                             audio_devices_t devices,
   1818                                                             const String8& address,
   1819                                                             audio_output_flags_t flags)
   1820 {
   1821     AudioHwDevice *outHwDev = findSuitableHwDev_l(module, devices);
   1822     if (outHwDev == NULL) {
   1823         return 0;
   1824     }
   1825 
   1826     if (*output == AUDIO_IO_HANDLE_NONE) {
   1827         *output = nextUniqueId(AUDIO_UNIQUE_ID_USE_OUTPUT);
   1828     } else {
   1829         // Audio Policy does not currently request a specific output handle.
   1830         // If this is ever needed, see openInput_l() for example code.
   1831         ALOGE("openOutput_l requested output handle %d is not AUDIO_IO_HANDLE_NONE", *output);
   1832         return 0;
   1833     }
   1834 
   1835     mHardwareStatus = AUDIO_HW_OUTPUT_OPEN;
   1836 
   1837     // FOR TESTING ONLY:
   1838     // This if statement allows overriding the audio policy settings
   1839     // and forcing a specific format or channel mask to the HAL/Sink device for testing.
   1840     if (!(flags & (AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD | AUDIO_OUTPUT_FLAG_DIRECT))) {
   1841         // Check only for Normal Mixing mode
   1842         if (kEnableExtendedPrecision) {
   1843             // Specify format (uncomment one below to choose)
   1844             //config->format = AUDIO_FORMAT_PCM_FLOAT;
   1845             //config->format = AUDIO_FORMAT_PCM_24_BIT_PACKED;
   1846             //config->format = AUDIO_FORMAT_PCM_32_BIT;
   1847             //config->format = AUDIO_FORMAT_PCM_8_24_BIT;
   1848             // ALOGV("openOutput_l() upgrading format to %#08x", config->format);
   1849         }
   1850         if (kEnableExtendedChannels) {
   1851             // Specify channel mask (uncomment one below to choose)
   1852             //config->channel_mask = audio_channel_out_mask_from_count(4);  // for USB 4ch
   1853             //config->channel_mask = audio_channel_mask_from_representation_and_bits(
   1854             //        AUDIO_CHANNEL_REPRESENTATION_INDEX, (1 << 4) - 1);  // another 4ch example
   1855         }
   1856     }
   1857 
   1858     AudioStreamOut *outputStream = NULL;
   1859     status_t status = outHwDev->openOutputStream(
   1860             &outputStream,
   1861             *output,
   1862             devices,
   1863             flags,
   1864             config,
   1865             address.string());
   1866 
   1867     mHardwareStatus = AUDIO_HW_IDLE;
   1868 
   1869     if (status == NO_ERROR) {
   1870 
   1871         PlaybackThread *thread;
   1872         if (flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) {
   1873             thread = new OffloadThread(this, outputStream, *output, devices, mSystemReady);
   1874             ALOGV("openOutput_l() created offload output: ID %d thread %p", *output, thread);
   1875         } else if ((flags & AUDIO_OUTPUT_FLAG_DIRECT)
   1876                 || !isValidPcmSinkFormat(config->format)
   1877                 || !isValidPcmSinkChannelMask(config->channel_mask)) {
   1878             thread = new DirectOutputThread(this, outputStream, *output, devices, mSystemReady);
   1879             ALOGV("openOutput_l() created direct output: ID %d thread %p", *output, thread);
   1880         } else {
   1881             thread = new MixerThread(this, outputStream, *output, devices, mSystemReady);
   1882             ALOGV("openOutput_l() created mixer output: ID %d thread %p", *output, thread);
   1883         }
   1884         mPlaybackThreads.add(*output, thread);
   1885         return thread;
   1886     }
   1887 
   1888     return 0;
   1889 }
   1890 
   1891 status_t AudioFlinger::openOutput(audio_module_handle_t module,
   1892                                   audio_io_handle_t *output,
   1893                                   audio_config_t *config,
   1894                                   audio_devices_t *devices,
   1895                                   const String8& address,
   1896                                   uint32_t *latencyMs,
   1897                                   audio_output_flags_t flags)
   1898 {
   1899     ALOGI("openOutput(), module %d Device %x, SamplingRate %d, Format %#08x, Channels %x, flags %x",
   1900               module,
   1901               (devices != NULL) ? *devices : 0,
   1902               config->sample_rate,
   1903               config->format,
   1904               config->channel_mask,
   1905               flags);
   1906 
   1907     if (*devices == AUDIO_DEVICE_NONE) {
   1908         return BAD_VALUE;
   1909     }
   1910 
   1911     Mutex::Autolock _l(mLock);
   1912 
   1913     sp<PlaybackThread> thread = openOutput_l(module, output, config, *devices, address, flags);
   1914     if (thread != 0) {
   1915         *latencyMs = thread->latency();
   1916 
   1917         // notify client processes of the new output creation
   1918         thread->ioConfigChanged(AUDIO_OUTPUT_OPENED);
   1919 
   1920         // the first primary output opened designates the primary hw device
   1921         if ((mPrimaryHardwareDev == NULL) && (flags & AUDIO_OUTPUT_FLAG_PRIMARY)) {
   1922             ALOGI("Using module %d has the primary audio interface", module);
   1923             mPrimaryHardwareDev = thread->getOutput()->audioHwDev;
   1924 
   1925             AutoMutex lock(mHardwareLock);
   1926             mHardwareStatus = AUDIO_HW_SET_MODE;
   1927             mPrimaryHardwareDev->hwDevice()->set_mode(mPrimaryHardwareDev->hwDevice(), mMode);
   1928             mHardwareStatus = AUDIO_HW_IDLE;
   1929         }
   1930         return NO_ERROR;
   1931     }
   1932 
   1933     return NO_INIT;
   1934 }
   1935 
   1936 audio_io_handle_t AudioFlinger::openDuplicateOutput(audio_io_handle_t output1,
   1937         audio_io_handle_t output2)
   1938 {
   1939     Mutex::Autolock _l(mLock);
   1940     MixerThread *thread1 = checkMixerThread_l(output1);
   1941     MixerThread *thread2 = checkMixerThread_l(output2);
   1942 
   1943     if (thread1 == NULL || thread2 == NULL) {
   1944         ALOGW("openDuplicateOutput() wrong output mixer type for output %d or %d", output1,
   1945                 output2);
   1946         return AUDIO_IO_HANDLE_NONE;
   1947     }
   1948 
   1949     audio_io_handle_t id = nextUniqueId(AUDIO_UNIQUE_ID_USE_OUTPUT);
   1950     DuplicatingThread *thread = new DuplicatingThread(this, thread1, id, mSystemReady);
   1951     thread->addOutputTrack(thread2);
   1952     mPlaybackThreads.add(id, thread);
   1953     // notify client processes of the new output creation
   1954     thread->ioConfigChanged(AUDIO_OUTPUT_OPENED);
   1955     return id;
   1956 }
   1957 
   1958 status_t AudioFlinger::closeOutput(audio_io_handle_t output)
   1959 {
   1960     return closeOutput_nonvirtual(output);
   1961 }
   1962 
   1963 status_t AudioFlinger::closeOutput_nonvirtual(audio_io_handle_t output)
   1964 {
   1965     // keep strong reference on the playback thread so that
   1966     // it is not destroyed while exit() is executed
   1967     sp<PlaybackThread> thread;
   1968     {
   1969         Mutex::Autolock _l(mLock);
   1970         thread = checkPlaybackThread_l(output);
   1971         if (thread == NULL) {
   1972             return BAD_VALUE;
   1973         }
   1974 
   1975         ALOGV("closeOutput() %d", output);
   1976 
   1977         if (thread->type() == ThreadBase::MIXER) {
   1978             for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
   1979                 if (mPlaybackThreads.valueAt(i)->isDuplicating()) {
   1980                     DuplicatingThread *dupThread =
   1981                             (DuplicatingThread *)mPlaybackThreads.valueAt(i).get();
   1982                     dupThread->removeOutputTrack((MixerThread *)thread.get());
   1983                 }
   1984             }
   1985         }
   1986 
   1987 
   1988         mPlaybackThreads.removeItem(output);
   1989         // save all effects to the default thread
   1990         if (mPlaybackThreads.size()) {
   1991             PlaybackThread *dstThread = checkPlaybackThread_l(mPlaybackThreads.keyAt(0));
   1992             if (dstThread != NULL) {
   1993                 // audioflinger lock is held here so the acquisition order of thread locks does not
   1994                 // matter
   1995                 Mutex::Autolock _dl(dstThread->mLock);
   1996                 Mutex::Autolock _sl(thread->mLock);
   1997                 Vector< sp<EffectChain> > effectChains = thread->getEffectChains_l();
   1998                 for (size_t i = 0; i < effectChains.size(); i ++) {
   1999                     moveEffectChain_l(effectChains[i]->sessionId(), thread.get(), dstThread, true);
   2000                 }
   2001             }
   2002         }
   2003         const sp<AudioIoDescriptor> ioDesc = new AudioIoDescriptor();
   2004         ioDesc->mIoHandle = output;
   2005         ioConfigChanged(AUDIO_OUTPUT_CLOSED, ioDesc);
   2006     }
   2007     thread->exit();
   2008     // The thread entity (active unit of execution) is no longer running here,
   2009     // but the ThreadBase container still exists.
   2010 
   2011     if (!thread->isDuplicating()) {
   2012         closeOutputFinish(thread);
   2013     }
   2014 
   2015     return NO_ERROR;
   2016 }
   2017 
   2018 void AudioFlinger::closeOutputFinish(sp<PlaybackThread> thread)
   2019 {
   2020     AudioStreamOut *out = thread->clearOutput();
   2021     ALOG_ASSERT(out != NULL, "out shouldn't be NULL");
   2022     // from now on thread->mOutput is NULL
   2023     out->hwDev()->close_output_stream(out->hwDev(), out->stream);
   2024     delete out;
   2025 }
   2026 
   2027 void AudioFlinger::closeOutputInternal_l(sp<PlaybackThread> thread)
   2028 {
   2029     mPlaybackThreads.removeItem(thread->mId);
   2030     thread->exit();
   2031     closeOutputFinish(thread);
   2032 }
   2033 
   2034 status_t AudioFlinger::suspendOutput(audio_io_handle_t output)
   2035 {
   2036     Mutex::Autolock _l(mLock);
   2037     PlaybackThread *thread = checkPlaybackThread_l(output);
   2038 
   2039     if (thread == NULL) {
   2040         return BAD_VALUE;
   2041     }
   2042 
   2043     ALOGV("suspendOutput() %d", output);
   2044     thread->suspend();
   2045 
   2046     return NO_ERROR;
   2047 }
   2048 
   2049 status_t AudioFlinger::restoreOutput(audio_io_handle_t output)
   2050 {
   2051     Mutex::Autolock _l(mLock);
   2052     PlaybackThread *thread = checkPlaybackThread_l(output);
   2053 
   2054     if (thread == NULL) {
   2055         return BAD_VALUE;
   2056     }
   2057 
   2058     ALOGV("restoreOutput() %d", output);
   2059 
   2060     thread->restore();
   2061 
   2062     return NO_ERROR;
   2063 }
   2064 
   2065 status_t AudioFlinger::openInput(audio_module_handle_t module,
   2066                                           audio_io_handle_t *input,
   2067                                           audio_config_t *config,
   2068                                           audio_devices_t *devices,
   2069                                           const String8& address,
   2070                                           audio_source_t source,
   2071                                           audio_input_flags_t flags)
   2072 {
   2073     Mutex::Autolock _l(mLock);
   2074 
   2075     if (*devices == AUDIO_DEVICE_NONE) {
   2076         return BAD_VALUE;
   2077     }
   2078 
   2079     sp<RecordThread> thread = openInput_l(module, input, config, *devices, address, source, flags);
   2080 
   2081     if (thread != 0) {
   2082         // notify client processes of the new input creation
   2083         thread->ioConfigChanged(AUDIO_INPUT_OPENED);
   2084         return NO_ERROR;
   2085     }
   2086     return NO_INIT;
   2087 }
   2088 
   2089 sp<AudioFlinger::RecordThread> AudioFlinger::openInput_l(audio_module_handle_t module,
   2090                                                          audio_io_handle_t *input,
   2091                                                          audio_config_t *config,
   2092                                                          audio_devices_t devices,
   2093                                                          const String8& address,
   2094                                                          audio_source_t source,
   2095                                                          audio_input_flags_t flags)
   2096 {
   2097     AudioHwDevice *inHwDev = findSuitableHwDev_l(module, devices);
   2098     if (inHwDev == NULL) {
   2099         *input = AUDIO_IO_HANDLE_NONE;
   2100         return 0;
   2101     }
   2102 
   2103     // Audio Policy can request a specific handle for hardware hotword.
   2104     // The goal here is not to re-open an already opened input.
   2105     // It is to use a pre-assigned I/O handle.
   2106     if (*input == AUDIO_IO_HANDLE_NONE) {
   2107         *input = nextUniqueId(AUDIO_UNIQUE_ID_USE_INPUT);
   2108     } else if (audio_unique_id_get_use(*input) != AUDIO_UNIQUE_ID_USE_INPUT) {
   2109         ALOGE("openInput_l() requested input handle %d is invalid", *input);
   2110         return 0;
   2111     } else if (mRecordThreads.indexOfKey(*input) >= 0) {
   2112         // This should not happen in a transient state with current design.
   2113         ALOGE("openInput_l() requested input handle %d is already assigned", *input);
   2114         return 0;
   2115     }
   2116 
   2117     audio_config_t halconfig = *config;
   2118     audio_hw_device_t *inHwHal = inHwDev->hwDevice();
   2119     audio_stream_in_t *inStream = NULL;
   2120     status_t status = inHwHal->open_input_stream(inHwHal, *input, devices, &halconfig,
   2121                                         &inStream, flags, address.string(), source);
   2122     ALOGV("openInput_l() openInputStream returned input %p, SamplingRate %d"
   2123            ", Format %#x, Channels %x, flags %#x, status %d addr %s",
   2124             inStream,
   2125             halconfig.sample_rate,
   2126             halconfig.format,
   2127             halconfig.channel_mask,
   2128             flags,
   2129             status, address.string());
   2130 
   2131     // If the input could not be opened with the requested parameters and we can handle the
   2132     // conversion internally, try to open again with the proposed parameters.
   2133     if (status == BAD_VALUE &&
   2134         audio_is_linear_pcm(config->format) &&
   2135         audio_is_linear_pcm(halconfig.format) &&
   2136         (halconfig.sample_rate <= AUDIO_RESAMPLER_DOWN_RATIO_MAX * config->sample_rate) &&
   2137         (audio_channel_count_from_in_mask(halconfig.channel_mask) <= FCC_8) &&
   2138         (audio_channel_count_from_in_mask(config->channel_mask) <= FCC_8)) {
   2139         // FIXME describe the change proposed by HAL (save old values so we can log them here)
   2140         ALOGV("openInput_l() reopening with proposed sampling rate and channel mask");
   2141         inStream = NULL;
   2142         status = inHwHal->open_input_stream(inHwHal, *input, devices, &halconfig,
   2143                                             &inStream, flags, address.string(), source);
   2144         // FIXME log this new status; HAL should not propose any further changes
   2145     }
   2146 
   2147     if (status == NO_ERROR && inStream != NULL) {
   2148 
   2149 #ifdef TEE_SINK
   2150         // Try to re-use most recently used Pipe to archive a copy of input for dumpsys,
   2151         // or (re-)create if current Pipe is idle and does not match the new format
   2152         sp<NBAIO_Sink> teeSink;
   2153         enum {
   2154             TEE_SINK_NO,    // don't copy input
   2155             TEE_SINK_NEW,   // copy input using a new pipe
   2156             TEE_SINK_OLD,   // copy input using an existing pipe
   2157         } kind;
   2158         NBAIO_Format format = Format_from_SR_C(halconfig.sample_rate,
   2159                 audio_channel_count_from_in_mask(halconfig.channel_mask), halconfig.format);
   2160         if (!mTeeSinkInputEnabled) {
   2161             kind = TEE_SINK_NO;
   2162         } else if (!Format_isValid(format)) {
   2163             kind = TEE_SINK_NO;
   2164         } else if (mRecordTeeSink == 0) {
   2165             kind = TEE_SINK_NEW;
   2166         } else if (mRecordTeeSink->getStrongCount() != 1) {
   2167             kind = TEE_SINK_NO;
   2168         } else if (Format_isEqual(format, mRecordTeeSink->format())) {
   2169             kind = TEE_SINK_OLD;
   2170         } else {
   2171             kind = TEE_SINK_NEW;
   2172         }
   2173         switch (kind) {
   2174         case TEE_SINK_NEW: {
   2175             Pipe *pipe = new Pipe(mTeeSinkInputFrames, format);
   2176             size_t numCounterOffers = 0;
   2177             const NBAIO_Format offers[1] = {format};
   2178             ssize_t index = pipe->negotiate(offers, 1, NULL, numCounterOffers);
   2179             ALOG_ASSERT(index == 0);
   2180             PipeReader *pipeReader = new PipeReader(*pipe);
   2181             numCounterOffers = 0;
   2182             index = pipeReader->negotiate(offers, 1, NULL, numCounterOffers);
   2183             ALOG_ASSERT(index == 0);
   2184             mRecordTeeSink = pipe;
   2185             mRecordTeeSource = pipeReader;
   2186             teeSink = pipe;
   2187             }
   2188             break;
   2189         case TEE_SINK_OLD:
   2190             teeSink = mRecordTeeSink;
   2191             break;
   2192         case TEE_SINK_NO:
   2193         default:
   2194             break;
   2195         }
   2196 #endif
   2197 
   2198         AudioStreamIn *inputStream = new AudioStreamIn(inHwDev, inStream);
   2199 
   2200         // Start record thread
   2201         // RecordThread requires both input and output device indication to forward to audio
   2202         // pre processing modules
   2203         sp<RecordThread> thread = new RecordThread(this,
   2204                                   inputStream,
   2205                                   *input,
   2206                                   primaryOutputDevice_l(),
   2207                                   devices,
   2208                                   mSystemReady
   2209 #ifdef TEE_SINK
   2210                                   , teeSink
   2211 #endif
   2212                                   );
   2213         mRecordThreads.add(*input, thread);
   2214         ALOGV("openInput_l() created record thread: ID %d thread %p", *input, thread.get());
   2215         return thread;
   2216     }
   2217 
   2218     *input = AUDIO_IO_HANDLE_NONE;
   2219     return 0;
   2220 }
   2221 
   2222 status_t AudioFlinger::closeInput(audio_io_handle_t input)
   2223 {
   2224     return closeInput_nonvirtual(input);
   2225 }
   2226 
   2227 status_t AudioFlinger::closeInput_nonvirtual(audio_io_handle_t input)
   2228 {
   2229     // keep strong reference on the record thread so that
   2230     // it is not destroyed while exit() is executed
   2231     sp<RecordThread> thread;
   2232     {
   2233         Mutex::Autolock _l(mLock);
   2234         thread = checkRecordThread_l(input);
   2235         if (thread == 0) {
   2236             return BAD_VALUE;
   2237         }
   2238 
   2239         ALOGV("closeInput() %d", input);
   2240 
   2241         // If we still have effect chains, it means that a client still holds a handle
   2242         // on at least one effect. We must either move the chain to an existing thread with the
   2243         // same session ID or put it aside in case a new record thread is opened for a
   2244         // new capture on the same session
   2245         sp<EffectChain> chain;
   2246         {
   2247             Mutex::Autolock _sl(thread->mLock);
   2248             Vector< sp<EffectChain> > effectChains = thread->getEffectChains_l();
   2249             // Note: maximum one chain per record thread
   2250             if (effectChains.size() != 0) {
   2251                 chain = effectChains[0];
   2252             }
   2253         }
   2254         if (chain != 0) {
   2255             // first check if a record thread is already opened with a client on the same session.
   2256             // This should only happen in case of overlap between one thread tear down and the
   2257             // creation of its replacement
   2258             size_t i;
   2259             for (i = 0; i < mRecordThreads.size(); i++) {
   2260                 sp<RecordThread> t = mRecordThreads.valueAt(i);
   2261                 if (t == thread) {
   2262                     continue;
   2263                 }
   2264                 if (t->hasAudioSession(chain->sessionId()) != 0) {
   2265                     Mutex::Autolock _l(t->mLock);
   2266                     ALOGV("closeInput() found thread %d for effect session %d",
   2267                           t->id(), chain->sessionId());
   2268                     t->addEffectChain_l(chain);
   2269                     break;
   2270                 }
   2271             }
   2272             // put the chain aside if we could not find a record thread with the same session id.
   2273             if (i == mRecordThreads.size()) {
   2274                 putOrphanEffectChain_l(chain);
   2275             }
   2276         }
   2277         const sp<AudioIoDescriptor> ioDesc = new AudioIoDescriptor();
   2278         ioDesc->mIoHandle = input;
   2279         ioConfigChanged(AUDIO_INPUT_CLOSED, ioDesc);
   2280         mRecordThreads.removeItem(input);
   2281     }
   2282     // FIXME: calling thread->exit() without mLock held should not be needed anymore now that
   2283     // we have a different lock for notification client
   2284     closeInputFinish(thread);
   2285     return NO_ERROR;
   2286 }
   2287 
   2288 void AudioFlinger::closeInputFinish(sp<RecordThread> thread)
   2289 {
   2290     thread->exit();
   2291     AudioStreamIn *in = thread->clearInput();
   2292     ALOG_ASSERT(in != NULL, "in shouldn't be NULL");
   2293     // from now on thread->mInput is NULL
   2294     in->hwDev()->close_input_stream(in->hwDev(), in->stream);
   2295     delete in;
   2296 }
   2297 
   2298 void AudioFlinger::closeInputInternal_l(sp<RecordThread> thread)
   2299 {
   2300     mRecordThreads.removeItem(thread->mId);
   2301     closeInputFinish(thread);
   2302 }
   2303 
   2304 status_t AudioFlinger::invalidateStream(audio_stream_type_t stream)
   2305 {
   2306     Mutex::Autolock _l(mLock);
   2307     ALOGV("invalidateStream() stream %d", stream);
   2308 
   2309     for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
   2310         PlaybackThread *thread = mPlaybackThreads.valueAt(i).get();
   2311         thread->invalidateTracks(stream);
   2312     }
   2313 
   2314     return NO_ERROR;
   2315 }
   2316 
   2317 
   2318 audio_unique_id_t AudioFlinger::newAudioUniqueId(audio_unique_id_use_t use)
   2319 {
   2320     // This is a binder API, so a malicious client could pass in a bad parameter.
   2321     // Check for that before calling the internal API nextUniqueId().
   2322     if ((unsigned) use >= (unsigned) AUDIO_UNIQUE_ID_USE_MAX) {
   2323         ALOGE("newAudioUniqueId invalid use %d", use);
   2324         return AUDIO_UNIQUE_ID_ALLOCATE;
   2325     }
   2326     return nextUniqueId(use);
   2327 }
   2328 
   2329 void AudioFlinger::acquireAudioSessionId(audio_session_t audioSession, pid_t pid)
   2330 {
   2331     Mutex::Autolock _l(mLock);
   2332     pid_t caller = IPCThreadState::self()->getCallingPid();
   2333     ALOGV("acquiring %d from %d, for %d", audioSession, caller, pid);
   2334     if (pid != -1 && (caller == getpid_cached)) {
   2335         caller = pid;
   2336     }
   2337 
   2338     {
   2339         Mutex::Autolock _cl(mClientLock);
   2340         // Ignore requests received from processes not known as notification client. The request
   2341         // is likely proxied by mediaserver (e.g CameraService) and releaseAudioSessionId() can be
   2342         // called from a different pid leaving a stale session reference.  Also we don't know how
   2343         // to clear this reference if the client process dies.
   2344         if (mNotificationClients.indexOfKey(caller) < 0) {
   2345             ALOGW("acquireAudioSessionId() unknown client %d for session %d", caller, audioSession);
   2346             return;
   2347         }
   2348     }
   2349 
   2350     size_t num = mAudioSessionRefs.size();
   2351     for (size_t i = 0; i< num; i++) {
   2352         AudioSessionRef *ref = mAudioSessionRefs.editItemAt(i);
   2353         if (ref->mSessionid == audioSession && ref->mPid == caller) {
   2354             ref->mCnt++;
   2355             ALOGV(" incremented refcount to %d", ref->mCnt);
   2356             return;
   2357         }
   2358     }
   2359     mAudioSessionRefs.push(new AudioSessionRef(audioSession, caller));
   2360     ALOGV(" added new entry for %d", audioSession);
   2361 }
   2362 
   2363 void AudioFlinger::releaseAudioSessionId(audio_session_t audioSession, pid_t pid)
   2364 {
   2365     Mutex::Autolock _l(mLock);
   2366     pid_t caller = IPCThreadState::self()->getCallingPid();
   2367     ALOGV("releasing %d from %d for %d", audioSession, caller, pid);
   2368     if (pid != -1 && (caller == getpid_cached)) {
   2369         caller = pid;
   2370     }
   2371     size_t num = mAudioSessionRefs.size();
   2372     for (size_t i = 0; i< num; i++) {
   2373         AudioSessionRef *ref = mAudioSessionRefs.itemAt(i);
   2374         if (ref->mSessionid == audioSession && ref->mPid == caller) {
   2375             ref->mCnt--;
   2376             ALOGV(" decremented refcount to %d", ref->mCnt);
   2377             if (ref->mCnt == 0) {
   2378                 mAudioSessionRefs.removeAt(i);
   2379                 delete ref;
   2380                 purgeStaleEffects_l();
   2381             }
   2382             return;
   2383         }
   2384     }
   2385     // If the caller is mediaserver it is likely that the session being released was acquired
   2386     // on behalf of a process not in notification clients and we ignore the warning.
   2387     ALOGW_IF(caller != getpid_cached, "session id %d not found for pid %d", audioSession, caller);
   2388 }
   2389 
   2390 void AudioFlinger::purgeStaleEffects_l() {
   2391 
   2392     ALOGV("purging stale effects");
   2393 
   2394     Vector< sp<EffectChain> > chains;
   2395 
   2396     for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
   2397         sp<PlaybackThread> t = mPlaybackThreads.valueAt(i);
   2398         for (size_t j = 0; j < t->mEffectChains.size(); j++) {
   2399             sp<EffectChain> ec = t->mEffectChains[j];
   2400             if (ec->sessionId() > AUDIO_SESSION_OUTPUT_MIX) {
   2401                 chains.push(ec);
   2402             }
   2403         }
   2404     }
   2405     for (size_t i = 0; i < mRecordThreads.size(); i++) {
   2406         sp<RecordThread> t = mRecordThreads.valueAt(i);
   2407         for (size_t j = 0; j < t->mEffectChains.size(); j++) {
   2408             sp<EffectChain> ec = t->mEffectChains[j];
   2409             chains.push(ec);
   2410         }
   2411     }
   2412 
   2413     for (size_t i = 0; i < chains.size(); i++) {
   2414         sp<EffectChain> ec = chains[i];
   2415         int sessionid = ec->sessionId();
   2416         sp<ThreadBase> t = ec->mThread.promote();
   2417         if (t == 0) {
   2418             continue;
   2419         }
   2420         size_t numsessionrefs = mAudioSessionRefs.size();
   2421         bool found = false;
   2422         for (size_t k = 0; k < numsessionrefs; k++) {
   2423             AudioSessionRef *ref = mAudioSessionRefs.itemAt(k);
   2424             if (ref->mSessionid == sessionid) {
   2425                 ALOGV(" session %d still exists for %d with %d refs",
   2426                     sessionid, ref->mPid, ref->mCnt);
   2427                 found = true;
   2428                 break;
   2429             }
   2430         }
   2431         if (!found) {
   2432             Mutex::Autolock _l(t->mLock);
   2433             // remove all effects from the chain
   2434             while (ec->mEffects.size()) {
   2435                 sp<EffectModule> effect = ec->mEffects[0];
   2436                 effect->unPin();
   2437                 t->removeEffect_l(effect);
   2438                 if (effect->purgeHandles()) {
   2439                     t->checkSuspendOnEffectEnabled_l(effect, false, effect->sessionId());
   2440                 }
   2441                 AudioSystem::unregisterEffect(effect->id());
   2442             }
   2443         }
   2444     }
   2445     return;
   2446 }
   2447 
   2448 // checkThread_l() must be called with AudioFlinger::mLock held
   2449 AudioFlinger::ThreadBase *AudioFlinger::checkThread_l(audio_io_handle_t ioHandle) const
   2450 {
   2451     ThreadBase *thread = NULL;
   2452     switch (audio_unique_id_get_use(ioHandle)) {
   2453     case AUDIO_UNIQUE_ID_USE_OUTPUT:
   2454         thread = checkPlaybackThread_l(ioHandle);
   2455         break;
   2456     case AUDIO_UNIQUE_ID_USE_INPUT:
   2457         thread = checkRecordThread_l(ioHandle);
   2458         break;
   2459     default:
   2460         break;
   2461     }
   2462     return thread;
   2463 }
   2464 
   2465 // checkPlaybackThread_l() must be called with AudioFlinger::mLock held
   2466 AudioFlinger::PlaybackThread *AudioFlinger::checkPlaybackThread_l(audio_io_handle_t output) const
   2467 {
   2468     return mPlaybackThreads.valueFor(output).get();
   2469 }
   2470 
   2471 // checkMixerThread_l() must be called with AudioFlinger::mLock held
   2472 AudioFlinger::MixerThread *AudioFlinger::checkMixerThread_l(audio_io_handle_t output) const
   2473 {
   2474     PlaybackThread *thread = checkPlaybackThread_l(output);
   2475     return thread != NULL && thread->type() != ThreadBase::DIRECT ? (MixerThread *) thread : NULL;
   2476 }
   2477 
   2478 // checkRecordThread_l() must be called with AudioFlinger::mLock held
   2479 AudioFlinger::RecordThread *AudioFlinger::checkRecordThread_l(audio_io_handle_t input) const
   2480 {
   2481     return mRecordThreads.valueFor(input).get();
   2482 }
   2483 
   2484 audio_unique_id_t AudioFlinger::nextUniqueId(audio_unique_id_use_t use)
   2485 {
   2486     // This is the internal API, so it is OK to assert on bad parameter.
   2487     LOG_ALWAYS_FATAL_IF((unsigned) use >= (unsigned) AUDIO_UNIQUE_ID_USE_MAX);
   2488     const int maxRetries = use == AUDIO_UNIQUE_ID_USE_SESSION ? 3 : 1;
   2489     for (int retry = 0; retry < maxRetries; retry++) {
   2490         // The cast allows wraparound from max positive to min negative instead of abort
   2491         uint32_t base = (uint32_t) atomic_fetch_add_explicit(&mNextUniqueIds[use],
   2492                 (uint_fast32_t) AUDIO_UNIQUE_ID_USE_MAX, memory_order_acq_rel);
   2493         ALOG_ASSERT(audio_unique_id_get_use(base) == AUDIO_UNIQUE_ID_USE_UNSPECIFIED);
   2494         // allow wrap by skipping 0 and -1 for session ids
   2495         if (!(base == 0 || base == (~0u & ~AUDIO_UNIQUE_ID_USE_MASK))) {
   2496             ALOGW_IF(retry != 0, "unique ID overflow for use %d", use);
   2497             return (audio_unique_id_t) (base | use);
   2498         }
   2499     }
   2500     // We have no way of recovering from wraparound
   2501     LOG_ALWAYS_FATAL("unique ID overflow for use %d", use);
   2502     // TODO Use a floor after wraparound.  This may need a mutex.
   2503 }
   2504 
   2505 AudioFlinger::PlaybackThread *AudioFlinger::primaryPlaybackThread_l() const
   2506 {
   2507     for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
   2508         PlaybackThread *thread = mPlaybackThreads.valueAt(i).get();
   2509         if(thread->isDuplicating()) {
   2510             continue;
   2511         }
   2512         AudioStreamOut *output = thread->getOutput();
   2513         if (output != NULL && output->audioHwDev == mPrimaryHardwareDev) {
   2514             return thread;
   2515         }
   2516     }
   2517     return NULL;
   2518 }
   2519 
   2520 audio_devices_t AudioFlinger::primaryOutputDevice_l() const
   2521 {
   2522     PlaybackThread *thread = primaryPlaybackThread_l();
   2523 
   2524     if (thread == NULL) {
   2525         return 0;
   2526     }
   2527 
   2528     return thread->outDevice();
   2529 }
   2530 
   2531 sp<AudioFlinger::SyncEvent> AudioFlinger::createSyncEvent(AudioSystem::sync_event_t type,
   2532                                     audio_session_t triggerSession,
   2533                                     audio_session_t listenerSession,
   2534                                     sync_event_callback_t callBack,
   2535                                     wp<RefBase> cookie)
   2536 {
   2537     Mutex::Autolock _l(mLock);
   2538 
   2539     sp<SyncEvent> event = new SyncEvent(type, triggerSession, listenerSession, callBack, cookie);
   2540     status_t playStatus = NAME_NOT_FOUND;
   2541     status_t recStatus = NAME_NOT_FOUND;
   2542     for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
   2543         playStatus = mPlaybackThreads.valueAt(i)->setSyncEvent(event);
   2544         if (playStatus == NO_ERROR) {
   2545             return event;
   2546         }
   2547     }
   2548     for (size_t i = 0; i < mRecordThreads.size(); i++) {
   2549         recStatus = mRecordThreads.valueAt(i)->setSyncEvent(event);
   2550         if (recStatus == NO_ERROR) {
   2551             return event;
   2552         }
   2553     }
   2554     if (playStatus == NAME_NOT_FOUND || recStatus == NAME_NOT_FOUND) {
   2555         mPendingSyncEvents.add(event);
   2556     } else {
   2557         ALOGV("createSyncEvent() invalid event %d", event->type());
   2558         event.clear();
   2559     }
   2560     return event;
   2561 }
   2562 
   2563 // ----------------------------------------------------------------------------
   2564 //  Effect management
   2565 // ----------------------------------------------------------------------------
   2566 
   2567 
   2568 status_t AudioFlinger::queryNumberEffects(uint32_t *numEffects) const
   2569 {
   2570     Mutex::Autolock _l(mLock);
   2571     return EffectQueryNumberEffects(numEffects);
   2572 }
   2573 
   2574 status_t AudioFlinger::queryEffect(uint32_t index, effect_descriptor_t *descriptor) const
   2575 {
   2576     Mutex::Autolock _l(mLock);
   2577     return EffectQueryEffect(index, descriptor);
   2578 }
   2579 
   2580 status_t AudioFlinger::getEffectDescriptor(const effect_uuid_t *pUuid,
   2581         effect_descriptor_t *descriptor) const
   2582 {
   2583     Mutex::Autolock _l(mLock);
   2584     return EffectGetDescriptor(pUuid, descriptor);
   2585 }
   2586 
   2587 
   2588 sp<IEffect> AudioFlinger::createEffect(
   2589         effect_descriptor_t *pDesc,
   2590         const sp<IEffectClient>& effectClient,
   2591         int32_t priority,
   2592         audio_io_handle_t io,
   2593         audio_session_t sessionId,
   2594         const String16& opPackageName,
   2595         status_t *status,
   2596         int *id,
   2597         int *enabled)
   2598 {
   2599     status_t lStatus = NO_ERROR;
   2600     sp<EffectHandle> handle;
   2601     effect_descriptor_t desc;
   2602 
   2603     pid_t pid = IPCThreadState::self()->getCallingPid();
   2604     ALOGV("createEffect pid %d, effectClient %p, priority %d, sessionId %d, io %d",
   2605             pid, effectClient.get(), priority, sessionId, io);
   2606 
   2607     if (pDesc == NULL) {
   2608         lStatus = BAD_VALUE;
   2609         goto Exit;
   2610     }
   2611 
   2612     // check audio settings permission for global effects
   2613     if (sessionId == AUDIO_SESSION_OUTPUT_MIX && !settingsAllowed()) {
   2614         lStatus = PERMISSION_DENIED;
   2615         goto Exit;
   2616     }
   2617 
   2618     // Session AUDIO_SESSION_OUTPUT_STAGE is reserved for output stage effects
   2619     // that can only be created by audio policy manager (running in same process)
   2620     if (sessionId == AUDIO_SESSION_OUTPUT_STAGE && getpid_cached != pid) {
   2621         lStatus = PERMISSION_DENIED;
   2622         goto Exit;
   2623     }
   2624 
   2625     {
   2626         if (!EffectIsNullUuid(&pDesc->uuid)) {
   2627             // if uuid is specified, request effect descriptor
   2628             lStatus = EffectGetDescriptor(&pDesc->uuid, &desc);
   2629             if (lStatus < 0) {
   2630                 ALOGW("createEffect() error %d from EffectGetDescriptor", lStatus);
   2631                 goto Exit;
   2632             }
   2633         } else {
   2634             // if uuid is not specified, look for an available implementation
   2635             // of the required type in effect factory
   2636             if (EffectIsNullUuid(&pDesc->type)) {
   2637                 ALOGW("createEffect() no effect type");
   2638                 lStatus = BAD_VALUE;
   2639                 goto Exit;
   2640             }
   2641             uint32_t numEffects = 0;
   2642             effect_descriptor_t d;
   2643             d.flags = 0; // prevent compiler warning
   2644             bool found = false;
   2645 
   2646             lStatus = EffectQueryNumberEffects(&numEffects);
   2647             if (lStatus < 0) {
   2648                 ALOGW("createEffect() error %d from EffectQueryNumberEffects", lStatus);
   2649                 goto Exit;
   2650             }
   2651             for (uint32_t i = 0; i < numEffects; i++) {
   2652                 lStatus = EffectQueryEffect(i, &desc);
   2653                 if (lStatus < 0) {
   2654                     ALOGW("createEffect() error %d from EffectQueryEffect", lStatus);
   2655                     continue;
   2656                 }
   2657                 if (memcmp(&desc.type, &pDesc->type, sizeof(effect_uuid_t)) == 0) {
   2658                     // If matching type found save effect descriptor. If the session is
   2659                     // 0 and the effect is not auxiliary, continue enumeration in case
   2660                     // an auxiliary version of this effect type is available
   2661                     found = true;
   2662                     d = desc;
   2663                     if (sessionId != AUDIO_SESSION_OUTPUT_MIX ||
   2664                             (desc.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) {
   2665                         break;
   2666                     }
   2667                 }
   2668             }
   2669             if (!found) {
   2670                 lStatus = BAD_VALUE;
   2671                 ALOGW("createEffect() effect not found");
   2672                 goto Exit;
   2673             }
   2674             // For same effect type, chose auxiliary version over insert version if
   2675             // connect to output mix (Compliance to OpenSL ES)
   2676             if (sessionId == AUDIO_SESSION_OUTPUT_MIX &&
   2677                     (d.flags & EFFECT_FLAG_TYPE_MASK) != EFFECT_FLAG_TYPE_AUXILIARY) {
   2678                 desc = d;
   2679             }
   2680         }
   2681 
   2682         // Do not allow auxiliary effects on a session different from 0 (output mix)
   2683         if (sessionId != AUDIO_SESSION_OUTPUT_MIX &&
   2684              (desc.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) {
   2685             lStatus = INVALID_OPERATION;
   2686             goto Exit;
   2687         }
   2688 
   2689         // check recording permission for visualizer
   2690         if ((memcmp(&desc.type, SL_IID_VISUALIZATION, sizeof(effect_uuid_t)) == 0) &&
   2691             !recordingAllowed(opPackageName, pid, IPCThreadState::self()->getCallingUid())) {
   2692             lStatus = PERMISSION_DENIED;
   2693             goto Exit;
   2694         }
   2695 
   2696         // return effect descriptor
   2697         *pDesc = desc;
   2698         if (io == AUDIO_IO_HANDLE_NONE && sessionId == AUDIO_SESSION_OUTPUT_MIX) {
   2699             // if the output returned by getOutputForEffect() is removed before we lock the
   2700             // mutex below, the call to checkPlaybackThread_l(io) below will detect it
   2701             // and we will exit safely
   2702             io = AudioSystem::getOutputForEffect(&desc);
   2703             ALOGV("createEffect got output %d", io);
   2704         }
   2705 
   2706         Mutex::Autolock _l(mLock);
   2707 
   2708         // If output is not specified try to find a matching audio session ID in one of the
   2709         // output threads.
   2710         // If output is 0 here, sessionId is neither SESSION_OUTPUT_STAGE nor SESSION_OUTPUT_MIX
   2711         // because of code checking output when entering the function.
   2712         // Note: io is never 0 when creating an effect on an input
   2713         if (io == AUDIO_IO_HANDLE_NONE) {
   2714             if (sessionId == AUDIO_SESSION_OUTPUT_STAGE) {
   2715                 // output must be specified by AudioPolicyManager when using session
   2716                 // AUDIO_SESSION_OUTPUT_STAGE
   2717                 lStatus = BAD_VALUE;
   2718                 goto Exit;
   2719             }
   2720             // look for the thread where the specified audio session is present
   2721             for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
   2722                 if (mPlaybackThreads.valueAt(i)->hasAudioSession(sessionId) != 0) {
   2723                     io = mPlaybackThreads.keyAt(i);
   2724                     break;
   2725                 }
   2726             }
   2727             if (io == 0) {
   2728                 for (size_t i = 0; i < mRecordThreads.size(); i++) {
   2729                     if (mRecordThreads.valueAt(i)->hasAudioSession(sessionId) != 0) {
   2730                         io = mRecordThreads.keyAt(i);
   2731                         break;
   2732                     }
   2733                 }
   2734             }
   2735             // If no output thread contains the requested session ID, default to
   2736             // first output. The effect chain will be moved to the correct output
   2737             // thread when a track with the same session ID is created
   2738             if (io == AUDIO_IO_HANDLE_NONE && mPlaybackThreads.size() > 0) {
   2739                 io = mPlaybackThreads.keyAt(0);
   2740             }
   2741             ALOGV("createEffect() got io %d for effect %s", io, desc.name);
   2742         }
   2743         ThreadBase *thread = checkRecordThread_l(io);
   2744         if (thread == NULL) {
   2745             thread = checkPlaybackThread_l(io);
   2746             if (thread == NULL) {
   2747                 ALOGE("createEffect() unknown output thread");
   2748                 lStatus = BAD_VALUE;
   2749                 goto Exit;
   2750             }
   2751         } else {
   2752             // Check if one effect chain was awaiting for an effect to be created on this
   2753             // session and used it instead of creating a new one.
   2754             sp<EffectChain> chain = getOrphanEffectChain_l(sessionId);
   2755             if (chain != 0) {
   2756                 Mutex::Autolock _l(thread->mLock);
   2757                 thread->addEffectChain_l(chain);
   2758             }
   2759         }
   2760 
   2761         sp<Client> client = registerPid(pid);
   2762 
   2763         // create effect on selected output thread
   2764         handle = thread->createEffect_l(client, effectClient, priority, sessionId,
   2765                 &desc, enabled, &lStatus);
   2766         if (handle != 0 && id != NULL) {
   2767             *id = handle->id();
   2768         }
   2769         if (handle == 0) {
   2770             // remove local strong reference to Client with mClientLock held
   2771             Mutex::Autolock _cl(mClientLock);
   2772             client.clear();
   2773         }
   2774     }
   2775 
   2776 Exit:
   2777     *status = lStatus;
   2778     return handle;
   2779 }
   2780 
   2781 status_t AudioFlinger::moveEffects(audio_session_t sessionId, audio_io_handle_t srcOutput,
   2782         audio_io_handle_t dstOutput)
   2783 {
   2784     ALOGV("moveEffects() session %d, srcOutput %d, dstOutput %d",
   2785             sessionId, srcOutput, dstOutput);
   2786     Mutex::Autolock _l(mLock);
   2787     if (srcOutput == dstOutput) {
   2788         ALOGW("moveEffects() same dst and src outputs %d", dstOutput);
   2789         return NO_ERROR;
   2790     }
   2791     PlaybackThread *srcThread = checkPlaybackThread_l(srcOutput);
   2792     if (srcThread == NULL) {
   2793         ALOGW("moveEffects() bad srcOutput %d", srcOutput);
   2794         return BAD_VALUE;
   2795     }
   2796     PlaybackThread *dstThread = checkPlaybackThread_l(dstOutput);
   2797     if (dstThread == NULL) {
   2798         ALOGW("moveEffects() bad dstOutput %d", dstOutput);
   2799         return BAD_VALUE;
   2800     }
   2801 
   2802     Mutex::Autolock _dl(dstThread->mLock);
   2803     Mutex::Autolock _sl(srcThread->mLock);
   2804     return moveEffectChain_l(sessionId, srcThread, dstThread, false);
   2805 }
   2806 
   2807 // moveEffectChain_l must be called with both srcThread and dstThread mLocks held
   2808 status_t AudioFlinger::moveEffectChain_l(audio_session_t sessionId,
   2809                                    AudioFlinger::PlaybackThread *srcThread,
   2810                                    AudioFlinger::PlaybackThread *dstThread,
   2811                                    bool reRegister)
   2812 {
   2813     ALOGV("moveEffectChain_l() session %d from thread %p to thread %p",
   2814             sessionId, srcThread, dstThread);
   2815 
   2816     sp<EffectChain> chain = srcThread->getEffectChain_l(sessionId);
   2817     if (chain == 0) {
   2818         ALOGW("moveEffectChain_l() effect chain for session %d not on source thread %p",
   2819                 sessionId, srcThread);
   2820         return INVALID_OPERATION;
   2821     }
   2822 
   2823     // Check whether the destination thread has a channel count of FCC_2, which is
   2824     // currently required for (most) effects. Prevent moving the effect chain here rather
   2825     // than disabling the addEffect_l() call in dstThread below.
   2826     if ((dstThread->type() == ThreadBase::MIXER || dstThread->isDuplicating()) &&
   2827             dstThread->mChannelCount != FCC_2) {
   2828         ALOGW("moveEffectChain_l() effect chain failed because"
   2829                 " destination thread %p channel count(%u) != %u",
   2830                 dstThread, dstThread->mChannelCount, FCC_2);
   2831         return INVALID_OPERATION;
   2832     }
   2833 
   2834     // remove chain first. This is useful only if reconfiguring effect chain on same output thread,
   2835     // so that a new chain is created with correct parameters when first effect is added. This is
   2836     // otherwise unnecessary as removeEffect_l() will remove the chain when last effect is
   2837     // removed.
   2838     srcThread->removeEffectChain_l(chain);
   2839 
   2840     // transfer all effects one by one so that new effect chain is created on new thread with
   2841     // correct buffer sizes and audio parameters and effect engines reconfigured accordingly
   2842     sp<EffectChain> dstChain;
   2843     uint32_t strategy = 0; // prevent compiler warning
   2844     sp<EffectModule> effect = chain->getEffectFromId_l(0);
   2845     Vector< sp<EffectModule> > removed;
   2846     status_t status = NO_ERROR;
   2847     while (effect != 0) {
   2848         srcThread->removeEffect_l(effect);
   2849         removed.add(effect);
   2850         status = dstThread->addEffect_l(effect);
   2851         if (status != NO_ERROR) {
   2852             break;
   2853         }
   2854         // removeEffect_l() has stopped the effect if it was active so it must be restarted
   2855         if (effect->state() == EffectModule::ACTIVE ||
   2856                 effect->state() == EffectModule::STOPPING) {
   2857             effect->start();
   2858         }
   2859         // if the move request is not received from audio policy manager, the effect must be
   2860         // re-registered with the new strategy and output
   2861         if (dstChain == 0) {
   2862             dstChain = effect->chain().promote();
   2863             if (dstChain == 0) {
   2864                 ALOGW("moveEffectChain_l() cannot get chain from effect %p", effect.get());
   2865                 status = NO_INIT;
   2866                 break;
   2867             }
   2868             strategy = dstChain->strategy();
   2869         }
   2870         if (reRegister) {
   2871             AudioSystem::unregisterEffect(effect->id());
   2872             AudioSystem::registerEffect(&effect->desc(),
   2873                                         dstThread->id(),
   2874                                         strategy,
   2875                                         sessionId,
   2876                                         effect->id());
   2877             AudioSystem::setEffectEnabled(effect->id(), effect->isEnabled());
   2878         }
   2879         effect = chain->getEffectFromId_l(0);
   2880     }
   2881 
   2882     if (status != NO_ERROR) {
   2883         for (size_t i = 0; i < removed.size(); i++) {
   2884             srcThread->addEffect_l(removed[i]);
   2885             if (dstChain != 0 && reRegister) {
   2886                 AudioSystem::unregisterEffect(removed[i]->id());
   2887                 AudioSystem::registerEffect(&removed[i]->desc(),
   2888                                             srcThread->id(),
   2889                                             strategy,
   2890                                             sessionId,
   2891                                             removed[i]->id());
   2892                 AudioSystem::setEffectEnabled(effect->id(), effect->isEnabled());
   2893             }
   2894         }
   2895     }
   2896 
   2897     return status;
   2898 }
   2899 
   2900 bool AudioFlinger::isNonOffloadableGlobalEffectEnabled_l()
   2901 {
   2902     if (mGlobalEffectEnableTime != 0 &&
   2903             ((systemTime() - mGlobalEffectEnableTime) < kMinGlobalEffectEnabletimeNs)) {
   2904         return true;
   2905     }
   2906 
   2907     for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
   2908         sp<EffectChain> ec =
   2909                 mPlaybackThreads.valueAt(i)->getEffectChain_l(AUDIO_SESSION_OUTPUT_MIX);
   2910         if (ec != 0 && ec->isNonOffloadableEnabled()) {
   2911             return true;
   2912         }
   2913     }
   2914     return false;
   2915 }
   2916 
   2917 void AudioFlinger::onNonOffloadableGlobalEffectEnable()
   2918 {
   2919     Mutex::Autolock _l(mLock);
   2920 
   2921     mGlobalEffectEnableTime = systemTime();
   2922 
   2923     for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
   2924         sp<PlaybackThread> t = mPlaybackThreads.valueAt(i);
   2925         if (t->mType == ThreadBase::OFFLOAD) {
   2926             t->invalidateTracks(AUDIO_STREAM_MUSIC);
   2927         }
   2928     }
   2929 
   2930 }
   2931 
   2932 status_t AudioFlinger::putOrphanEffectChain_l(const sp<AudioFlinger::EffectChain>& chain)
   2933 {
   2934     audio_session_t session = chain->sessionId();
   2935     ssize_t index = mOrphanEffectChains.indexOfKey(session);
   2936     ALOGV("putOrphanEffectChain_l session %d index %zd", session, index);
   2937     if (index >= 0) {
   2938         ALOGW("putOrphanEffectChain_l chain for session %d already present", session);
   2939         return ALREADY_EXISTS;
   2940     }
   2941     mOrphanEffectChains.add(session, chain);
   2942     return NO_ERROR;
   2943 }
   2944 
   2945 sp<AudioFlinger::EffectChain> AudioFlinger::getOrphanEffectChain_l(audio_session_t session)
   2946 {
   2947     sp<EffectChain> chain;
   2948     ssize_t index = mOrphanEffectChains.indexOfKey(session);
   2949     ALOGV("getOrphanEffectChain_l session %d index %zd", session, index);
   2950     if (index >= 0) {
   2951         chain = mOrphanEffectChains.valueAt(index);
   2952         mOrphanEffectChains.removeItemsAt(index);
   2953     }
   2954     return chain;
   2955 }
   2956 
   2957 bool AudioFlinger::updateOrphanEffectChains(const sp<AudioFlinger::EffectModule>& effect)
   2958 {
   2959     Mutex::Autolock _l(mLock);
   2960     audio_session_t session = effect->sessionId();
   2961     ssize_t index = mOrphanEffectChains.indexOfKey(session);
   2962     ALOGV("updateOrphanEffectChains session %d index %zd", session, index);
   2963     if (index >= 0) {
   2964         sp<EffectChain> chain = mOrphanEffectChains.valueAt(index);
   2965         if (chain->removeEffect_l(effect) == 0) {
   2966             ALOGV("updateOrphanEffectChains removing effect chain at index %zd", index);
   2967             mOrphanEffectChains.removeItemsAt(index);
   2968         }
   2969         return true;
   2970     }
   2971     return false;
   2972 }
   2973 
   2974 
   2975 struct Entry {
   2976 #define TEE_MAX_FILENAME 32 // %Y%m%d%H%M%S_%d.wav = 4+2+2+2+2+2+1+1+4+1 = 21
   2977     char mFileName[TEE_MAX_FILENAME];
   2978 };
   2979 
   2980 int comparEntry(const void *p1, const void *p2)
   2981 {
   2982     return strcmp(((const Entry *) p1)->mFileName, ((const Entry *) p2)->mFileName);
   2983 }
   2984 
   2985 #ifdef TEE_SINK
   2986 void AudioFlinger::dumpTee(int fd, const sp<NBAIO_Source>& source, audio_io_handle_t id)
   2987 {
   2988     NBAIO_Source *teeSource = source.get();
   2989     if (teeSource != NULL) {
   2990         // .wav rotation
   2991         // There is a benign race condition if 2 threads call this simultaneously.
   2992         // They would both traverse the directory, but the result would simply be
   2993         // failures at unlink() which are ignored.  It's also unlikely since
   2994         // normally dumpsys is only done by bugreport or from the command line.
   2995         char teePath[32+256];
   2996         strcpy(teePath, "/data/misc/audioserver");
   2997         size_t teePathLen = strlen(teePath);
   2998         DIR *dir = opendir(teePath);
   2999         teePath[teePathLen++] = '/';
   3000         if (dir != NULL) {
   3001 #define TEE_MAX_SORT 20 // number of entries to sort
   3002 #define TEE_MAX_KEEP 10 // number of entries to keep
   3003             struct Entry entries[TEE_MAX_SORT];
   3004             size_t entryCount = 0;
   3005             while (entryCount < TEE_MAX_SORT) {
   3006                 struct dirent de;
   3007                 struct dirent *result = NULL;
   3008                 int rc = readdir_r(dir, &de, &result);
   3009                 if (rc != 0) {
   3010                     ALOGW("readdir_r failed %d", rc);
   3011                     break;
   3012                 }
   3013                 if (result == NULL) {
   3014                     break;
   3015                 }
   3016                 if (result != &de) {
   3017                     ALOGW("readdir_r returned unexpected result %p != %p", result, &de);
   3018                     break;
   3019                 }
   3020                 // ignore non .wav file entries
   3021                 size_t nameLen = strlen(de.d_name);
   3022                 if (nameLen <= 4 || nameLen >= TEE_MAX_FILENAME ||
   3023                         strcmp(&de.d_name[nameLen - 4], ".wav")) {
   3024                     continue;
   3025                 }
   3026                 strcpy(entries[entryCount++].mFileName, de.d_name);
   3027             }
   3028             (void) closedir(dir);
   3029             if (entryCount > TEE_MAX_KEEP) {
   3030                 qsort(entries, entryCount, sizeof(Entry), comparEntry);
   3031                 for (size_t i = 0; i < entryCount - TEE_MAX_KEEP; ++i) {
   3032                     strcpy(&teePath[teePathLen], entries[i].mFileName);
   3033                     (void) unlink(teePath);
   3034                 }
   3035             }
   3036         } else {
   3037             if (fd >= 0) {
   3038                 dprintf(fd, "unable to rotate tees in %.*s: %s\n", teePathLen, teePath,
   3039                         strerror(errno));
   3040             }
   3041         }
   3042         char teeTime[16];
   3043         struct timeval tv;
   3044         gettimeofday(&tv, NULL);
   3045         struct tm tm;
   3046         localtime_r(&tv.tv_sec, &tm);
   3047         strftime(teeTime, sizeof(teeTime), "%Y%m%d%H%M%S", &tm);
   3048         snprintf(&teePath[teePathLen], sizeof(teePath) - teePathLen, "%s_%d.wav", teeTime, id);
   3049         // if 2 dumpsys are done within 1 second, and rotation didn't work, then discard 2nd
   3050         int teeFd = open(teePath, O_WRONLY | O_CREAT | O_EXCL | O_NOFOLLOW, S_IRUSR | S_IWUSR);
   3051         if (teeFd >= 0) {
   3052             // FIXME use libsndfile
   3053             char wavHeader[44];
   3054             memcpy(wavHeader,
   3055                 "RIFF\0\0\0\0WAVEfmt \20\0\0\0\1\0\2\0\104\254\0\0\0\0\0\0\4\0\20\0data\0\0\0\0",
   3056                 sizeof(wavHeader));
   3057             NBAIO_Format format = teeSource->format();
   3058             unsigned channelCount = Format_channelCount(format);
   3059             uint32_t sampleRate = Format_sampleRate(format);
   3060             size_t frameSize = Format_frameSize(format);
   3061             wavHeader[22] = channelCount;       // number of channels
   3062             wavHeader[24] = sampleRate;         // sample rate
   3063             wavHeader[25] = sampleRate >> 8;
   3064             wavHeader[32] = frameSize;          // block alignment
   3065             wavHeader[33] = frameSize >> 8;
   3066             write(teeFd, wavHeader, sizeof(wavHeader));
   3067             size_t total = 0;
   3068             bool firstRead = true;
   3069 #define TEE_SINK_READ 1024                      // frames per I/O operation
   3070             void *buffer = malloc(TEE_SINK_READ * frameSize);
   3071             for (;;) {
   3072                 size_t count = TEE_SINK_READ;
   3073                 ssize_t actual = teeSource->read(buffer, count);
   3074                 bool wasFirstRead = firstRead;
   3075                 firstRead = false;
   3076                 if (actual <= 0) {
   3077                     if (actual == (ssize_t) OVERRUN && wasFirstRead) {
   3078                         continue;
   3079                     }
   3080                     break;
   3081                 }
   3082                 ALOG_ASSERT(actual <= (ssize_t)count);
   3083                 write(teeFd, buffer, actual * frameSize);
   3084                 total += actual;
   3085             }
   3086             free(buffer);
   3087             lseek(teeFd, (off_t) 4, SEEK_SET);
   3088             uint32_t temp = 44 + total * frameSize - 8;
   3089             // FIXME not big-endian safe
   3090             write(teeFd, &temp, sizeof(temp));
   3091             lseek(teeFd, (off_t) 40, SEEK_SET);
   3092             temp =  total * frameSize;
   3093             // FIXME not big-endian safe
   3094             write(teeFd, &temp, sizeof(temp));
   3095             close(teeFd);
   3096             if (fd >= 0) {
   3097                 dprintf(fd, "tee copied to %s\n", teePath);
   3098             }
   3099         } else {
   3100             if (fd >= 0) {
   3101                 dprintf(fd, "unable to create tee %s: %s\n", teePath, strerror(errno));
   3102             }
   3103         }
   3104     }
   3105 }
   3106 #endif
   3107 
   3108 // ----------------------------------------------------------------------------
   3109 
   3110 status_t AudioFlinger::onTransact(
   3111         uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
   3112 {
   3113     return BnAudioFlinger::onTransact(code, data, reply, flags);
   3114 }
   3115 
   3116 } // namespace android
   3117