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