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