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