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