AudioFlinger.cpp revision 685ef09bcaf5de6abf2064d552296f70eaec6761
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 <math.h>
23#include <signal.h>
24#include <sys/time.h>
25#include <sys/resource.h>
26
27#include <binder/IPCThreadState.h>
28#include <binder/IServiceManager.h>
29#include <utils/Log.h>
30#include <utils/Trace.h>
31#include <binder/Parcel.h>
32#include <utils/String16.h>
33#include <utils/threads.h>
34#include <utils/Atomic.h>
35
36#include <cutils/bitops.h>
37#include <cutils/properties.h>
38#include <cutils/compiler.h>
39
40//#include <private/media/AudioTrackShared.h>
41//#include <private/media/AudioEffectShared.h>
42
43#include <system/audio.h>
44#include <hardware/audio.h>
45
46#include "AudioMixer.h"
47#include "AudioFlinger.h"
48#include "ServiceUtilities.h"
49
50#include <media/EffectsFactoryApi.h>
51#include <audio_effects/effect_visualizer.h>
52#include <audio_effects/effect_ns.h>
53#include <audio_effects/effect_aec.h>
54
55#include <audio_utils/primitives.h>
56
57#include <powermanager/PowerManager.h>
58
59#include <common_time/cc_helper.h>
60//#include <common_time/local_clock.h>
61
62#include <media/IMediaLogService.h>
63
64// ----------------------------------------------------------------------------
65
66// Note: the following macro is used for extremely verbose logging message.  In
67// order to run with ALOG_ASSERT turned on, we need to have LOG_NDEBUG set to
68// 0; but one side effect of this is to turn all LOGV's as well.  Some messages
69// are so verbose that we want to suppress them even when we have ALOG_ASSERT
70// turned on.  Do not uncomment the #def below unless you really know what you
71// are doing and want to see all of the extremely verbose messages.
72//#define VERY_VERY_VERBOSE_LOGGING
73#ifdef VERY_VERY_VERBOSE_LOGGING
74#define ALOGVV ALOGV
75#else
76#define ALOGVV(a...) do { } while(0)
77#endif
78
79namespace android {
80
81static const char kDeadlockedString[] = "AudioFlinger may be deadlocked\n";
82static const char kHardwareLockedString[] = "Hardware lock is taken\n";
83
84
85nsecs_t AudioFlinger::mStandbyTimeInNsecs = kDefaultStandbyTimeInNsecs;
86
87uint32_t AudioFlinger::mScreenState;
88
89// ----------------------------------------------------------------------------
90
91static int load_audio_interface(const char *if_name, audio_hw_device_t **dev)
92{
93    const hw_module_t *mod;
94    int rc;
95
96    rc = hw_get_module_by_class(AUDIO_HARDWARE_MODULE_ID, if_name, &mod);
97    ALOGE_IF(rc, "%s couldn't load audio hw module %s.%s (%s)", __func__,
98                 AUDIO_HARDWARE_MODULE_ID, if_name, strerror(-rc));
99    if (rc) {
100        goto out;
101    }
102    rc = audio_hw_device_open(mod, dev);
103    ALOGE_IF(rc, "%s couldn't open audio hw device in %s.%s (%s)", __func__,
104                 AUDIO_HARDWARE_MODULE_ID, if_name, strerror(-rc));
105    if (rc) {
106        goto out;
107    }
108    if ((*dev)->common.version != AUDIO_DEVICE_API_VERSION_CURRENT) {
109        ALOGE("%s wrong audio hw device version %04x", __func__, (*dev)->common.version);
110        rc = BAD_VALUE;
111        goto out;
112    }
113    return 0;
114
115out:
116    *dev = NULL;
117    return rc;
118}
119
120// ----------------------------------------------------------------------------
121
122AudioFlinger::AudioFlinger()
123    : BnAudioFlinger(),
124      mPrimaryHardwareDev(NULL),
125      mHardwareStatus(AUDIO_HW_IDLE),
126      mMasterVolume(1.0f),
127      mMasterMute(false),
128      mNextUniqueId(1),
129      mMode(AUDIO_MODE_INVALID),
130      mBtNrecIsOff(false)
131{
132    char value[PROPERTY_VALUE_MAX];
133    bool doLog = (property_get("ro.test_harness", value, "0") > 0) && (atoi(value) == 1);
134    if (doLog) {
135        mLogMemoryDealer = new MemoryDealer(kLogMemorySize, "LogWriters");
136    }
137}
138
139void AudioFlinger::onFirstRef()
140{
141    int rc = 0;
142
143    Mutex::Autolock _l(mLock);
144
145    /* TODO: move all this work into an Init() function */
146    char val_str[PROPERTY_VALUE_MAX] = { 0 };
147    if (property_get("ro.audio.flinger_standbytime_ms", val_str, NULL) >= 0) {
148        uint32_t int_val;
149        if (1 == sscanf(val_str, "%u", &int_val)) {
150            mStandbyTimeInNsecs = milliseconds(int_val);
151            ALOGI("Using %u mSec as standby time.", int_val);
152        } else {
153            mStandbyTimeInNsecs = kDefaultStandbyTimeInNsecs;
154            ALOGI("Using default %u mSec as standby time.",
155                    (uint32_t)(mStandbyTimeInNsecs / 1000000));
156        }
157    }
158
159    mMode = AUDIO_MODE_NORMAL;
160}
161
162AudioFlinger::~AudioFlinger()
163{
164    while (!mRecordThreads.isEmpty()) {
165        // closeInput_nonvirtual() will remove specified entry from mRecordThreads
166        closeInput_nonvirtual(mRecordThreads.keyAt(0));
167    }
168    while (!mPlaybackThreads.isEmpty()) {
169        // closeOutput_nonvirtual() will remove specified entry from mPlaybackThreads
170        closeOutput_nonvirtual(mPlaybackThreads.keyAt(0));
171    }
172
173    for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
174        // no mHardwareLock needed, as there are no other references to this
175        audio_hw_device_close(mAudioHwDevs.valueAt(i)->hwDevice());
176        delete mAudioHwDevs.valueAt(i);
177    }
178}
179
180static const char * const audio_interfaces[] = {
181    AUDIO_HARDWARE_MODULE_ID_PRIMARY,
182    AUDIO_HARDWARE_MODULE_ID_A2DP,
183    AUDIO_HARDWARE_MODULE_ID_USB,
184};
185#define ARRAY_SIZE(x) (sizeof((x))/sizeof(((x)[0])))
186
187AudioFlinger::AudioHwDevice* AudioFlinger::findSuitableHwDev_l(
188        audio_module_handle_t module,
189        audio_devices_t devices)
190{
191    // if module is 0, the request comes from an old policy manager and we should load
192    // well known modules
193    if (module == 0) {
194        ALOGW("findSuitableHwDev_l() loading well know audio hw modules");
195        for (size_t i = 0; i < ARRAY_SIZE(audio_interfaces); i++) {
196            loadHwModule_l(audio_interfaces[i]);
197        }
198        // then try to find a module supporting the requested device.
199        for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
200            AudioHwDevice *audioHwDevice = mAudioHwDevs.valueAt(i);
201            audio_hw_device_t *dev = audioHwDevice->hwDevice();
202            if ((dev->get_supported_devices != NULL) &&
203                    (dev->get_supported_devices(dev) & devices) == devices)
204                return audioHwDevice;
205        }
206    } else {
207        // check a match for the requested module handle
208        AudioHwDevice *audioHwDevice = mAudioHwDevs.valueFor(module);
209        if (audioHwDevice != NULL) {
210            return audioHwDevice;
211        }
212    }
213
214    return NULL;
215}
216
217void AudioFlinger::dumpClients(int fd, const Vector<String16>& args)
218{
219    const size_t SIZE = 256;
220    char buffer[SIZE];
221    String8 result;
222
223    result.append("Clients:\n");
224    for (size_t i = 0; i < mClients.size(); ++i) {
225        sp<Client> client = mClients.valueAt(i).promote();
226        if (client != 0) {
227            snprintf(buffer, SIZE, "  pid: %d\n", client->pid());
228            result.append(buffer);
229        }
230    }
231
232    result.append("Global session refs:\n");
233    result.append(" session pid count\n");
234    for (size_t i = 0; i < mAudioSessionRefs.size(); i++) {
235        AudioSessionRef *r = mAudioSessionRefs[i];
236        snprintf(buffer, SIZE, " %7d %3d %3d\n", r->mSessionid, r->mPid, r->mCnt);
237        result.append(buffer);
238    }
239    write(fd, result.string(), result.size());
240}
241
242
243void AudioFlinger::dumpInternals(int fd, const Vector<String16>& args)
244{
245    const size_t SIZE = 256;
246    char buffer[SIZE];
247    String8 result;
248    hardware_call_state hardwareStatus = mHardwareStatus;
249
250    snprintf(buffer, SIZE, "Hardware status: %d\n"
251                           "Standby Time mSec: %u\n",
252                            hardwareStatus,
253                            (uint32_t)(mStandbyTimeInNsecs / 1000000));
254    result.append(buffer);
255    write(fd, result.string(), result.size());
256}
257
258void AudioFlinger::dumpPermissionDenial(int fd, const Vector<String16>& args)
259{
260    const size_t SIZE = 256;
261    char buffer[SIZE];
262    String8 result;
263    snprintf(buffer, SIZE, "Permission Denial: "
264            "can't dump AudioFlinger from pid=%d, uid=%d\n",
265            IPCThreadState::self()->getCallingPid(),
266            IPCThreadState::self()->getCallingUid());
267    result.append(buffer);
268    write(fd, result.string(), result.size());
269}
270
271bool AudioFlinger::dumpTryLock(Mutex& mutex)
272{
273    bool locked = false;
274    for (int i = 0; i < kDumpLockRetries; ++i) {
275        if (mutex.tryLock() == NO_ERROR) {
276            locked = true;
277            break;
278        }
279        usleep(kDumpLockSleepUs);
280    }
281    return locked;
282}
283
284status_t AudioFlinger::dump(int fd, const Vector<String16>& args)
285{
286    if (!dumpAllowed()) {
287        dumpPermissionDenial(fd, args);
288    } else {
289        // get state of hardware lock
290        bool hardwareLocked = dumpTryLock(mHardwareLock);
291        if (!hardwareLocked) {
292            String8 result(kHardwareLockedString);
293            write(fd, result.string(), result.size());
294        } else {
295            mHardwareLock.unlock();
296        }
297
298        bool locked = dumpTryLock(mLock);
299
300        // failed to lock - AudioFlinger is probably deadlocked
301        if (!locked) {
302            String8 result(kDeadlockedString);
303            write(fd, result.string(), result.size());
304        }
305
306        dumpClients(fd, args);
307        dumpInternals(fd, args);
308
309        // dump playback threads
310        for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
311            mPlaybackThreads.valueAt(i)->dump(fd, args);
312        }
313
314        // dump record threads
315        for (size_t i = 0; i < mRecordThreads.size(); i++) {
316            mRecordThreads.valueAt(i)->dump(fd, args);
317        }
318
319        // dump all hardware devs
320        for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
321            audio_hw_device_t *dev = mAudioHwDevs.valueAt(i)->hwDevice();
322            dev->dump(dev, fd);
323        }
324
325        // dump the serially shared record tee sink
326        if (mRecordTeeSource != 0) {
327            dumpTee(fd, mRecordTeeSource);
328        }
329
330        if (locked) {
331            mLock.unlock();
332        }
333
334        // append a copy of media.log here by forwarding fd to it, but don't attempt
335        // to lookup the service if it's not running, as it will block for a second
336        if (mLogMemoryDealer != 0) {
337            sp<IBinder> binder = defaultServiceManager()->getService(String16("media.log"));
338            if (binder != 0) {
339                fdprintf(fd, "\nmedia.log:\n");
340                Vector<String16> args;
341                binder->dump(fd, args);
342            }
343        }
344    }
345    return NO_ERROR;
346}
347
348sp<AudioFlinger::Client> AudioFlinger::registerPid_l(pid_t pid)
349{
350    // If pid is already in the mClients wp<> map, then use that entry
351    // (for which promote() is always != 0), otherwise create a new entry and Client.
352    sp<Client> client = mClients.valueFor(pid).promote();
353    if (client == 0) {
354        client = new Client(this, pid);
355        mClients.add(pid, client);
356    }
357
358    return client;
359}
360
361sp<NBLog::Writer> AudioFlinger::newWriter_l(size_t size, const char *name)
362{
363    if (mLogMemoryDealer == 0) {
364        return new NBLog::Writer();
365    }
366    sp<IMemory> shared = mLogMemoryDealer->allocate(NBLog::Timeline::sharedSize(size));
367    sp<NBLog::Writer> writer = new NBLog::Writer(size, shared);
368    sp<IBinder> binder = defaultServiceManager()->getService(String16("media.log"));
369    if (binder != 0) {
370        interface_cast<IMediaLogService>(binder)->registerWriter(shared, size, name);
371    }
372    return writer;
373}
374
375void AudioFlinger::unregisterWriter(const sp<NBLog::Writer>& writer)
376{
377    if (writer == 0) {
378        return;
379    }
380    sp<IMemory> iMemory(writer->getIMemory());
381    if (iMemory == 0) {
382        return;
383    }
384    sp<IBinder> binder = defaultServiceManager()->getService(String16("media.log"));
385    if (binder != 0) {
386        interface_cast<IMediaLogService>(binder)->unregisterWriter(iMemory);
387        // Now the media.log remote reference to IMemory is gone.
388        // When our last local reference to IMemory also drops to zero,
389        // the IMemory destructor will deallocate the region from mMemoryDealer.
390    }
391}
392
393// IAudioFlinger interface
394
395
396sp<IAudioTrack> AudioFlinger::createTrack(
397        audio_stream_type_t streamType,
398        uint32_t sampleRate,
399        audio_format_t format,
400        audio_channel_mask_t channelMask,
401        size_t frameCount,
402        IAudioFlinger::track_flags_t *flags,
403        const sp<IMemory>& sharedBuffer,
404        audio_io_handle_t output,
405        pid_t tid,
406        int *sessionId,
407        status_t *status)
408{
409    sp<PlaybackThread::Track> track;
410    sp<TrackHandle> trackHandle;
411    sp<Client> client;
412    status_t lStatus;
413    int lSessionId;
414
415    // client AudioTrack::set already implements AUDIO_STREAM_DEFAULT => AUDIO_STREAM_MUSIC,
416    // but if someone uses binder directly they could bypass that and cause us to crash
417    if (uint32_t(streamType) >= AUDIO_STREAM_CNT) {
418        ALOGE("createTrack() invalid stream type %d", streamType);
419        lStatus = BAD_VALUE;
420        goto Exit;
421    }
422
423    // client is responsible for conversion of 8-bit PCM to 16-bit PCM,
424    // and we don't yet support 8.24 or 32-bit PCM
425    if (audio_is_linear_pcm(format) && format != AUDIO_FORMAT_PCM_16_BIT) {
426        ALOGE("createTrack() invalid format %d", format);
427        lStatus = BAD_VALUE;
428        goto Exit;
429    }
430
431    {
432        Mutex::Autolock _l(mLock);
433        PlaybackThread *thread = checkPlaybackThread_l(output);
434        PlaybackThread *effectThread = NULL;
435        if (thread == NULL) {
436            ALOGE("unknown output thread");
437            lStatus = BAD_VALUE;
438            goto Exit;
439        }
440
441        pid_t pid = IPCThreadState::self()->getCallingPid();
442        client = registerPid_l(pid);
443
444        ALOGV("createTrack() sessionId: %d", (sessionId == NULL) ? -2 : *sessionId);
445        if (sessionId != NULL && *sessionId != AUDIO_SESSION_OUTPUT_MIX) {
446            // check if an effect chain with the same session ID is present on another
447            // output thread and move it here.
448            for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
449                sp<PlaybackThread> t = mPlaybackThreads.valueAt(i);
450                if (mPlaybackThreads.keyAt(i) != output) {
451                    uint32_t sessions = t->hasAudioSession(*sessionId);
452                    if (sessions & PlaybackThread::EFFECT_SESSION) {
453                        effectThread = t.get();
454                        break;
455                    }
456                }
457            }
458            lSessionId = *sessionId;
459        } else {
460            // if no audio session id is provided, create one here
461            lSessionId = nextUniqueId();
462            if (sessionId != NULL) {
463                *sessionId = lSessionId;
464            }
465        }
466        ALOGV("createTrack() lSessionId: %d", lSessionId);
467
468        track = thread->createTrack_l(client, streamType, sampleRate, format,
469                channelMask, frameCount, sharedBuffer, lSessionId, flags, tid, &lStatus);
470
471        // move effect chain to this output thread if an effect on same session was waiting
472        // for a track to be created
473        if (lStatus == NO_ERROR && effectThread != NULL) {
474            Mutex::Autolock _dl(thread->mLock);
475            Mutex::Autolock _sl(effectThread->mLock);
476            moveEffectChain_l(lSessionId, effectThread, thread, true);
477        }
478
479        // Look for sync events awaiting for a session to be used.
480        for (int i = 0; i < (int)mPendingSyncEvents.size(); i++) {
481            if (mPendingSyncEvents[i]->triggerSession() == lSessionId) {
482                if (thread->isValidSyncEvent(mPendingSyncEvents[i])) {
483                    if (lStatus == NO_ERROR) {
484                        (void) track->setSyncEvent(mPendingSyncEvents[i]);
485                    } else {
486                        mPendingSyncEvents[i]->cancel();
487                    }
488                    mPendingSyncEvents.removeAt(i);
489                    i--;
490                }
491            }
492        }
493    }
494    if (lStatus == NO_ERROR) {
495        trackHandle = new TrackHandle(track);
496    } else {
497        // remove local strong reference to Client before deleting the Track so that the Client
498        // destructor is called by the TrackBase destructor with mLock held
499        client.clear();
500        track.clear();
501    }
502
503Exit:
504    if (status != NULL) {
505        *status = lStatus;
506    }
507    return trackHandle;
508}
509
510uint32_t AudioFlinger::sampleRate(audio_io_handle_t output) const
511{
512    Mutex::Autolock _l(mLock);
513    PlaybackThread *thread = checkPlaybackThread_l(output);
514    if (thread == NULL) {
515        ALOGW("sampleRate() unknown thread %d", output);
516        return 0;
517    }
518    return thread->sampleRate();
519}
520
521int AudioFlinger::channelCount(audio_io_handle_t output) const
522{
523    Mutex::Autolock _l(mLock);
524    PlaybackThread *thread = checkPlaybackThread_l(output);
525    if (thread == NULL) {
526        ALOGW("channelCount() unknown thread %d", output);
527        return 0;
528    }
529    return thread->channelCount();
530}
531
532audio_format_t AudioFlinger::format(audio_io_handle_t output) const
533{
534    Mutex::Autolock _l(mLock);
535    PlaybackThread *thread = checkPlaybackThread_l(output);
536    if (thread == NULL) {
537        ALOGW("format() unknown thread %d", output);
538        return AUDIO_FORMAT_INVALID;
539    }
540    return thread->format();
541}
542
543size_t AudioFlinger::frameCount(audio_io_handle_t output) const
544{
545    Mutex::Autolock _l(mLock);
546    PlaybackThread *thread = checkPlaybackThread_l(output);
547    if (thread == NULL) {
548        ALOGW("frameCount() unknown thread %d", output);
549        return 0;
550    }
551    // FIXME currently returns the normal mixer's frame count to avoid confusing legacy callers;
552    //       should examine all callers and fix them to handle smaller counts
553    return thread->frameCount();
554}
555
556uint32_t AudioFlinger::latency(audio_io_handle_t output) const
557{
558    Mutex::Autolock _l(mLock);
559    PlaybackThread *thread = checkPlaybackThread_l(output);
560    if (thread == NULL) {
561        ALOGW("latency() unknown thread %d", output);
562        return 0;
563    }
564    return thread->latency();
565}
566
567status_t AudioFlinger::setMasterVolume(float value)
568{
569    status_t ret = initCheck();
570    if (ret != NO_ERROR) {
571        return ret;
572    }
573
574    // check calling permissions
575    if (!settingsAllowed()) {
576        return PERMISSION_DENIED;
577    }
578
579    Mutex::Autolock _l(mLock);
580    mMasterVolume = value;
581
582    // Set master volume in the HALs which support it.
583    for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
584        AutoMutex lock(mHardwareLock);
585        AudioHwDevice *dev = mAudioHwDevs.valueAt(i);
586
587        mHardwareStatus = AUDIO_HW_SET_MASTER_VOLUME;
588        if (dev->canSetMasterVolume()) {
589            dev->hwDevice()->set_master_volume(dev->hwDevice(), value);
590        }
591        mHardwareStatus = AUDIO_HW_IDLE;
592    }
593
594    // Now set the master volume in each playback thread.  Playback threads
595    // assigned to HALs which do not have master volume support will apply
596    // master volume during the mix operation.  Threads with HALs which do
597    // support master volume will simply ignore the setting.
598    for (size_t i = 0; i < mPlaybackThreads.size(); i++)
599        mPlaybackThreads.valueAt(i)->setMasterVolume(value);
600
601    return NO_ERROR;
602}
603
604status_t AudioFlinger::setMode(audio_mode_t mode)
605{
606    status_t ret = initCheck();
607    if (ret != NO_ERROR) {
608        return ret;
609    }
610
611    // check calling permissions
612    if (!settingsAllowed()) {
613        return PERMISSION_DENIED;
614    }
615    if (uint32_t(mode) >= AUDIO_MODE_CNT) {
616        ALOGW("Illegal value: setMode(%d)", mode);
617        return BAD_VALUE;
618    }
619
620    { // scope for the lock
621        AutoMutex lock(mHardwareLock);
622        audio_hw_device_t *dev = mPrimaryHardwareDev->hwDevice();
623        mHardwareStatus = AUDIO_HW_SET_MODE;
624        ret = dev->set_mode(dev, mode);
625        mHardwareStatus = AUDIO_HW_IDLE;
626    }
627
628    if (NO_ERROR == ret) {
629        Mutex::Autolock _l(mLock);
630        mMode = mode;
631        for (size_t i = 0; i < mPlaybackThreads.size(); i++)
632            mPlaybackThreads.valueAt(i)->setMode(mode);
633    }
634
635    return ret;
636}
637
638status_t AudioFlinger::setMicMute(bool state)
639{
640    status_t ret = initCheck();
641    if (ret != NO_ERROR) {
642        return ret;
643    }
644
645    // check calling permissions
646    if (!settingsAllowed()) {
647        return PERMISSION_DENIED;
648    }
649
650    AutoMutex lock(mHardwareLock);
651    audio_hw_device_t *dev = mPrimaryHardwareDev->hwDevice();
652    mHardwareStatus = AUDIO_HW_SET_MIC_MUTE;
653    ret = dev->set_mic_mute(dev, state);
654    mHardwareStatus = AUDIO_HW_IDLE;
655    return ret;
656}
657
658bool AudioFlinger::getMicMute() const
659{
660    status_t ret = initCheck();
661    if (ret != NO_ERROR) {
662        return false;
663    }
664
665    bool state = AUDIO_MODE_INVALID;
666    AutoMutex lock(mHardwareLock);
667    audio_hw_device_t *dev = mPrimaryHardwareDev->hwDevice();
668    mHardwareStatus = AUDIO_HW_GET_MIC_MUTE;
669    dev->get_mic_mute(dev, &state);
670    mHardwareStatus = AUDIO_HW_IDLE;
671    return state;
672}
673
674status_t AudioFlinger::setMasterMute(bool muted)
675{
676    status_t ret = initCheck();
677    if (ret != NO_ERROR) {
678        return ret;
679    }
680
681    // check calling permissions
682    if (!settingsAllowed()) {
683        return PERMISSION_DENIED;
684    }
685
686    Mutex::Autolock _l(mLock);
687    mMasterMute = muted;
688
689    // Set master mute in the HALs which support it.
690    for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
691        AutoMutex lock(mHardwareLock);
692        AudioHwDevice *dev = mAudioHwDevs.valueAt(i);
693
694        mHardwareStatus = AUDIO_HW_SET_MASTER_MUTE;
695        if (dev->canSetMasterMute()) {
696            dev->hwDevice()->set_master_mute(dev->hwDevice(), muted);
697        }
698        mHardwareStatus = AUDIO_HW_IDLE;
699    }
700
701    // Now set the master mute in each playback thread.  Playback threads
702    // assigned to HALs which do not have master mute support will apply master
703    // mute during the mix operation.  Threads with HALs which do support master
704    // mute will simply ignore the setting.
705    for (size_t i = 0; i < mPlaybackThreads.size(); i++)
706        mPlaybackThreads.valueAt(i)->setMasterMute(muted);
707
708    return NO_ERROR;
709}
710
711float AudioFlinger::masterVolume() const
712{
713    Mutex::Autolock _l(mLock);
714    return masterVolume_l();
715}
716
717bool AudioFlinger::masterMute() const
718{
719    Mutex::Autolock _l(mLock);
720    return masterMute_l();
721}
722
723float AudioFlinger::masterVolume_l() const
724{
725    return mMasterVolume;
726}
727
728bool AudioFlinger::masterMute_l() const
729{
730    return mMasterMute;
731}
732
733status_t AudioFlinger::setStreamVolume(audio_stream_type_t stream, float value,
734        audio_io_handle_t output)
735{
736    // check calling permissions
737    if (!settingsAllowed()) {
738        return PERMISSION_DENIED;
739    }
740
741    if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
742        ALOGE("setStreamVolume() invalid stream %d", stream);
743        return BAD_VALUE;
744    }
745
746    AutoMutex lock(mLock);
747    PlaybackThread *thread = NULL;
748    if (output) {
749        thread = checkPlaybackThread_l(output);
750        if (thread == NULL) {
751            return BAD_VALUE;
752        }
753    }
754
755    mStreamTypes[stream].volume = value;
756
757    if (thread == NULL) {
758        for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
759            mPlaybackThreads.valueAt(i)->setStreamVolume(stream, value);
760        }
761    } else {
762        thread->setStreamVolume(stream, value);
763    }
764
765    return NO_ERROR;
766}
767
768status_t AudioFlinger::setStreamMute(audio_stream_type_t stream, bool muted)
769{
770    // check calling permissions
771    if (!settingsAllowed()) {
772        return PERMISSION_DENIED;
773    }
774
775    if (uint32_t(stream) >= AUDIO_STREAM_CNT ||
776        uint32_t(stream) == AUDIO_STREAM_ENFORCED_AUDIBLE) {
777        ALOGE("setStreamMute() invalid stream %d", stream);
778        return BAD_VALUE;
779    }
780
781    AutoMutex lock(mLock);
782    mStreamTypes[stream].mute = muted;
783    for (uint32_t i = 0; i < mPlaybackThreads.size(); i++)
784        mPlaybackThreads.valueAt(i)->setStreamMute(stream, muted);
785
786    return NO_ERROR;
787}
788
789float AudioFlinger::streamVolume(audio_stream_type_t stream, audio_io_handle_t output) const
790{
791    if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
792        return 0.0f;
793    }
794
795    AutoMutex lock(mLock);
796    float volume;
797    if (output) {
798        PlaybackThread *thread = checkPlaybackThread_l(output);
799        if (thread == NULL) {
800            return 0.0f;
801        }
802        volume = thread->streamVolume(stream);
803    } else {
804        volume = streamVolume_l(stream);
805    }
806
807    return volume;
808}
809
810bool AudioFlinger::streamMute(audio_stream_type_t stream) const
811{
812    if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
813        return true;
814    }
815
816    AutoMutex lock(mLock);
817    return streamMute_l(stream);
818}
819
820status_t AudioFlinger::setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs)
821{
822    ALOGV("setParameters(): io %d, keyvalue %s, calling pid %d",
823            ioHandle, keyValuePairs.string(), IPCThreadState::self()->getCallingPid());
824
825    // check calling permissions
826    if (!settingsAllowed()) {
827        return PERMISSION_DENIED;
828    }
829
830    // ioHandle == 0 means the parameters are global to the audio hardware interface
831    if (ioHandle == 0) {
832        Mutex::Autolock _l(mLock);
833        status_t final_result = NO_ERROR;
834        {
835            AutoMutex lock(mHardwareLock);
836            mHardwareStatus = AUDIO_HW_SET_PARAMETER;
837            for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
838                audio_hw_device_t *dev = mAudioHwDevs.valueAt(i)->hwDevice();
839                status_t result = dev->set_parameters(dev, keyValuePairs.string());
840                final_result = result ?: final_result;
841            }
842            mHardwareStatus = AUDIO_HW_IDLE;
843        }
844        // disable AEC and NS if the device is a BT SCO headset supporting those pre processings
845        AudioParameter param = AudioParameter(keyValuePairs);
846        String8 value;
847        if (param.get(String8(AUDIO_PARAMETER_KEY_BT_NREC), value) == NO_ERROR) {
848            bool btNrecIsOff = (value == AUDIO_PARAMETER_VALUE_OFF);
849            if (mBtNrecIsOff != btNrecIsOff) {
850                for (size_t i = 0; i < mRecordThreads.size(); i++) {
851                    sp<RecordThread> thread = mRecordThreads.valueAt(i);
852                    audio_devices_t device = thread->inDevice();
853                    bool suspend = audio_is_bluetooth_sco_device(device) && btNrecIsOff;
854                    // collect all of the thread's session IDs
855                    KeyedVector<int, bool> ids = thread->sessionIds();
856                    // suspend effects associated with those session IDs
857                    for (size_t j = 0; j < ids.size(); ++j) {
858                        int sessionId = ids.keyAt(j);
859                        thread->setEffectSuspended(FX_IID_AEC,
860                                                   suspend,
861                                                   sessionId);
862                        thread->setEffectSuspended(FX_IID_NS,
863                                                   suspend,
864                                                   sessionId);
865                    }
866                }
867                mBtNrecIsOff = btNrecIsOff;
868            }
869        }
870        String8 screenState;
871        if (param.get(String8(AudioParameter::keyScreenState), screenState) == NO_ERROR) {
872            bool isOff = screenState == "off";
873            if (isOff != (AudioFlinger::mScreenState & 1)) {
874                AudioFlinger::mScreenState = ((AudioFlinger::mScreenState & ~1) + 2) | isOff;
875            }
876        }
877        return final_result;
878    }
879
880    // hold a strong ref on thread in case closeOutput() or closeInput() is called
881    // and the thread is exited once the lock is released
882    sp<ThreadBase> thread;
883    {
884        Mutex::Autolock _l(mLock);
885        thread = checkPlaybackThread_l(ioHandle);
886        if (thread == 0) {
887            thread = checkRecordThread_l(ioHandle);
888        } else if (thread == primaryPlaybackThread_l()) {
889            // indicate output device change to all input threads for pre processing
890            AudioParameter param = AudioParameter(keyValuePairs);
891            int value;
892            if ((param.getInt(String8(AudioParameter::keyRouting), value) == NO_ERROR) &&
893                    (value != 0)) {
894                for (size_t i = 0; i < mRecordThreads.size(); i++) {
895                    mRecordThreads.valueAt(i)->setParameters(keyValuePairs);
896                }
897            }
898        }
899    }
900    if (thread != 0) {
901        return thread->setParameters(keyValuePairs);
902    }
903    return BAD_VALUE;
904}
905
906String8 AudioFlinger::getParameters(audio_io_handle_t ioHandle, const String8& keys) const
907{
908    ALOGVV("getParameters() io %d, keys %s, calling pid %d",
909            ioHandle, keys.string(), IPCThreadState::self()->getCallingPid());
910
911    Mutex::Autolock _l(mLock);
912
913    if (ioHandle == 0) {
914        String8 out_s8;
915
916        for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
917            char *s;
918            {
919            AutoMutex lock(mHardwareLock);
920            mHardwareStatus = AUDIO_HW_GET_PARAMETER;
921            audio_hw_device_t *dev = mAudioHwDevs.valueAt(i)->hwDevice();
922            s = dev->get_parameters(dev, keys.string());
923            mHardwareStatus = AUDIO_HW_IDLE;
924            }
925            out_s8 += String8(s ? s : "");
926            free(s);
927        }
928        return out_s8;
929    }
930
931    PlaybackThread *playbackThread = checkPlaybackThread_l(ioHandle);
932    if (playbackThread != NULL) {
933        return playbackThread->getParameters(keys);
934    }
935    RecordThread *recordThread = checkRecordThread_l(ioHandle);
936    if (recordThread != NULL) {
937        return recordThread->getParameters(keys);
938    }
939    return String8("");
940}
941
942size_t AudioFlinger::getInputBufferSize(uint32_t sampleRate, audio_format_t format,
943        audio_channel_mask_t channelMask) const
944{
945    status_t ret = initCheck();
946    if (ret != NO_ERROR) {
947        return 0;
948    }
949
950    AutoMutex lock(mHardwareLock);
951    mHardwareStatus = AUDIO_HW_GET_INPUT_BUFFER_SIZE;
952    struct audio_config config = {
953        sample_rate: sampleRate,
954        channel_mask: channelMask,
955        format: format,
956    };
957    audio_hw_device_t *dev = mPrimaryHardwareDev->hwDevice();
958    size_t size = dev->get_input_buffer_size(dev, &config);
959    mHardwareStatus = AUDIO_HW_IDLE;
960    return size;
961}
962
963unsigned int AudioFlinger::getInputFramesLost(audio_io_handle_t ioHandle) const
964{
965    Mutex::Autolock _l(mLock);
966
967    RecordThread *recordThread = checkRecordThread_l(ioHandle);
968    if (recordThread != NULL) {
969        return recordThread->getInputFramesLost();
970    }
971    return 0;
972}
973
974status_t AudioFlinger::setVoiceVolume(float value)
975{
976    status_t ret = initCheck();
977    if (ret != NO_ERROR) {
978        return ret;
979    }
980
981    // check calling permissions
982    if (!settingsAllowed()) {
983        return PERMISSION_DENIED;
984    }
985
986    AutoMutex lock(mHardwareLock);
987    audio_hw_device_t *dev = mPrimaryHardwareDev->hwDevice();
988    mHardwareStatus = AUDIO_HW_SET_VOICE_VOLUME;
989    ret = dev->set_voice_volume(dev, value);
990    mHardwareStatus = AUDIO_HW_IDLE;
991
992    return ret;
993}
994
995status_t AudioFlinger::getRenderPosition(size_t *halFrames, size_t *dspFrames,
996        audio_io_handle_t output) const
997{
998    status_t status;
999
1000    Mutex::Autolock _l(mLock);
1001
1002    PlaybackThread *playbackThread = checkPlaybackThread_l(output);
1003    if (playbackThread != NULL) {
1004        return playbackThread->getRenderPosition(halFrames, dspFrames);
1005    }
1006
1007    return BAD_VALUE;
1008}
1009
1010void AudioFlinger::registerClient(const sp<IAudioFlingerClient>& client)
1011{
1012
1013    Mutex::Autolock _l(mLock);
1014
1015    pid_t pid = IPCThreadState::self()->getCallingPid();
1016    if (mNotificationClients.indexOfKey(pid) < 0) {
1017        sp<NotificationClient> notificationClient = new NotificationClient(this,
1018                                                                            client,
1019                                                                            pid);
1020        ALOGV("registerClient() client %p, pid %d", notificationClient.get(), pid);
1021
1022        mNotificationClients.add(pid, notificationClient);
1023
1024        sp<IBinder> binder = client->asBinder();
1025        binder->linkToDeath(notificationClient);
1026
1027        // the config change is always sent from playback or record threads to avoid deadlock
1028        // with AudioSystem::gLock
1029        for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
1030            mPlaybackThreads.valueAt(i)->sendIoConfigEvent(AudioSystem::OUTPUT_OPENED);
1031        }
1032
1033        for (size_t i = 0; i < mRecordThreads.size(); i++) {
1034            mRecordThreads.valueAt(i)->sendIoConfigEvent(AudioSystem::INPUT_OPENED);
1035        }
1036    }
1037}
1038
1039void AudioFlinger::removeNotificationClient(pid_t pid)
1040{
1041    Mutex::Autolock _l(mLock);
1042
1043    mNotificationClients.removeItem(pid);
1044
1045    ALOGV("%d died, releasing its sessions", pid);
1046    size_t num = mAudioSessionRefs.size();
1047    bool removed = false;
1048    for (size_t i = 0; i< num; ) {
1049        AudioSessionRef *ref = mAudioSessionRefs.itemAt(i);
1050        ALOGV(" pid %d @ %d", ref->mPid, i);
1051        if (ref->mPid == pid) {
1052            ALOGV(" removing entry for pid %d session %d", pid, ref->mSessionid);
1053            mAudioSessionRefs.removeAt(i);
1054            delete ref;
1055            removed = true;
1056            num--;
1057        } else {
1058            i++;
1059        }
1060    }
1061    if (removed) {
1062        purgeStaleEffects_l();
1063    }
1064}
1065
1066// audioConfigChanged_l() must be called with AudioFlinger::mLock held
1067void AudioFlinger::audioConfigChanged_l(int event, audio_io_handle_t ioHandle, const void *param2)
1068{
1069    size_t size = mNotificationClients.size();
1070    for (size_t i = 0; i < size; i++) {
1071        mNotificationClients.valueAt(i)->audioFlingerClient()->ioConfigChanged(event, ioHandle,
1072                                                                               param2);
1073    }
1074}
1075
1076// removeClient_l() must be called with AudioFlinger::mLock held
1077void AudioFlinger::removeClient_l(pid_t pid)
1078{
1079    ALOGV("removeClient_l() pid %d, calling pid %d", pid,
1080            IPCThreadState::self()->getCallingPid());
1081    mClients.removeItem(pid);
1082}
1083
1084// getEffectThread_l() must be called with AudioFlinger::mLock held
1085sp<AudioFlinger::PlaybackThread> AudioFlinger::getEffectThread_l(int sessionId, int EffectId)
1086{
1087    sp<PlaybackThread> thread;
1088
1089    for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
1090        if (mPlaybackThreads.valueAt(i)->getEffect(sessionId, EffectId) != 0) {
1091            ALOG_ASSERT(thread == 0);
1092            thread = mPlaybackThreads.valueAt(i);
1093        }
1094    }
1095
1096    return thread;
1097}
1098
1099
1100
1101// ----------------------------------------------------------------------------
1102
1103AudioFlinger::Client::Client(const sp<AudioFlinger>& audioFlinger, pid_t pid)
1104    :   RefBase(),
1105        mAudioFlinger(audioFlinger),
1106        // FIXME should be a "k" constant not hard-coded, in .h or ro. property, see 4 lines below
1107        mMemoryDealer(new MemoryDealer(1024*1024, "AudioFlinger::Client")),
1108        mPid(pid),
1109        mTimedTrackCount(0)
1110{
1111    // 1 MB of address space is good for 32 tracks, 8 buffers each, 4 KB/buffer
1112}
1113
1114// Client destructor must be called with AudioFlinger::mLock held
1115AudioFlinger::Client::~Client()
1116{
1117    mAudioFlinger->removeClient_l(mPid);
1118}
1119
1120sp<MemoryDealer> AudioFlinger::Client::heap() const
1121{
1122    return mMemoryDealer;
1123}
1124
1125// Reserve one of the limited slots for a timed audio track associated
1126// with this client
1127bool AudioFlinger::Client::reserveTimedTrack()
1128{
1129    const int kMaxTimedTracksPerClient = 4;
1130
1131    Mutex::Autolock _l(mTimedTrackLock);
1132
1133    if (mTimedTrackCount >= kMaxTimedTracksPerClient) {
1134        ALOGW("can not create timed track - pid %d has exceeded the limit",
1135             mPid);
1136        return false;
1137    }
1138
1139    mTimedTrackCount++;
1140    return true;
1141}
1142
1143// Release a slot for a timed audio track
1144void AudioFlinger::Client::releaseTimedTrack()
1145{
1146    Mutex::Autolock _l(mTimedTrackLock);
1147    mTimedTrackCount--;
1148}
1149
1150// ----------------------------------------------------------------------------
1151
1152AudioFlinger::NotificationClient::NotificationClient(const sp<AudioFlinger>& audioFlinger,
1153                                                     const sp<IAudioFlingerClient>& client,
1154                                                     pid_t pid)
1155    : mAudioFlinger(audioFlinger), mPid(pid), mAudioFlingerClient(client)
1156{
1157}
1158
1159AudioFlinger::NotificationClient::~NotificationClient()
1160{
1161}
1162
1163void AudioFlinger::NotificationClient::binderDied(const wp<IBinder>& who)
1164{
1165    sp<NotificationClient> keep(this);
1166    mAudioFlinger->removeNotificationClient(mPid);
1167}
1168
1169
1170// ----------------------------------------------------------------------------
1171
1172sp<IAudioRecord> AudioFlinger::openRecord(
1173        audio_io_handle_t input,
1174        uint32_t sampleRate,
1175        audio_format_t format,
1176        audio_channel_mask_t channelMask,
1177        size_t frameCount,
1178        IAudioFlinger::track_flags_t flags,
1179        pid_t tid,
1180        int *sessionId,
1181        status_t *status)
1182{
1183    sp<RecordThread::RecordTrack> recordTrack;
1184    sp<RecordHandle> recordHandle;
1185    sp<Client> client;
1186    status_t lStatus;
1187    RecordThread *thread;
1188    size_t inFrameCount;
1189    int lSessionId;
1190
1191    // check calling permissions
1192    if (!recordingAllowed()) {
1193        lStatus = PERMISSION_DENIED;
1194        goto Exit;
1195    }
1196
1197    // add client to list
1198    { // scope for mLock
1199        Mutex::Autolock _l(mLock);
1200        thread = checkRecordThread_l(input);
1201        if (thread == NULL) {
1202            lStatus = BAD_VALUE;
1203            goto Exit;
1204        }
1205
1206        pid_t pid = IPCThreadState::self()->getCallingPid();
1207        client = registerPid_l(pid);
1208
1209        // If no audio session id is provided, create one here
1210        if (sessionId != NULL && *sessionId != AUDIO_SESSION_OUTPUT_MIX) {
1211            lSessionId = *sessionId;
1212        } else {
1213            lSessionId = nextUniqueId();
1214            if (sessionId != NULL) {
1215                *sessionId = lSessionId;
1216            }
1217        }
1218        // create new record track.
1219        // The record track uses one track in mHardwareMixerThread by convention.
1220        recordTrack = thread->createRecordTrack_l(client, sampleRate, format, channelMask,
1221                                                  frameCount, lSessionId, flags, tid, &lStatus);
1222    }
1223    if (lStatus != NO_ERROR) {
1224        // remove local strong reference to Client before deleting the RecordTrack so that the
1225        // Client destructor is called by the TrackBase destructor with mLock held
1226        client.clear();
1227        recordTrack.clear();
1228        goto Exit;
1229    }
1230
1231    // return to handle to client
1232    recordHandle = new RecordHandle(recordTrack);
1233    lStatus = NO_ERROR;
1234
1235Exit:
1236    if (status) {
1237        *status = lStatus;
1238    }
1239    return recordHandle;
1240}
1241
1242
1243
1244// ----------------------------------------------------------------------------
1245
1246audio_module_handle_t AudioFlinger::loadHwModule(const char *name)
1247{
1248    if (!settingsAllowed()) {
1249        return 0;
1250    }
1251    Mutex::Autolock _l(mLock);
1252    return loadHwModule_l(name);
1253}
1254
1255// loadHwModule_l() must be called with AudioFlinger::mLock held
1256audio_module_handle_t AudioFlinger::loadHwModule_l(const char *name)
1257{
1258    for (size_t i = 0; i < mAudioHwDevs.size(); i++) {
1259        if (strncmp(mAudioHwDevs.valueAt(i)->moduleName(), name, strlen(name)) == 0) {
1260            ALOGW("loadHwModule() module %s already loaded", name);
1261            return mAudioHwDevs.keyAt(i);
1262        }
1263    }
1264
1265    audio_hw_device_t *dev;
1266
1267    int rc = load_audio_interface(name, &dev);
1268    if (rc) {
1269        ALOGI("loadHwModule() error %d loading module %s ", rc, name);
1270        return 0;
1271    }
1272
1273    mHardwareStatus = AUDIO_HW_INIT;
1274    rc = dev->init_check(dev);
1275    mHardwareStatus = AUDIO_HW_IDLE;
1276    if (rc) {
1277        ALOGI("loadHwModule() init check error %d for module %s ", rc, name);
1278        return 0;
1279    }
1280
1281    // Check and cache this HAL's level of support for master mute and master
1282    // volume.  If this is the first HAL opened, and it supports the get
1283    // methods, use the initial values provided by the HAL as the current
1284    // master mute and volume settings.
1285
1286    AudioHwDevice::Flags flags = static_cast<AudioHwDevice::Flags>(0);
1287    {  // scope for auto-lock pattern
1288        AutoMutex lock(mHardwareLock);
1289
1290        if (0 == mAudioHwDevs.size()) {
1291            mHardwareStatus = AUDIO_HW_GET_MASTER_VOLUME;
1292            if (NULL != dev->get_master_volume) {
1293                float mv;
1294                if (OK == dev->get_master_volume(dev, &mv)) {
1295                    mMasterVolume = mv;
1296                }
1297            }
1298
1299            mHardwareStatus = AUDIO_HW_GET_MASTER_MUTE;
1300            if (NULL != dev->get_master_mute) {
1301                bool mm;
1302                if (OK == dev->get_master_mute(dev, &mm)) {
1303                    mMasterMute = mm;
1304                }
1305            }
1306        }
1307
1308        mHardwareStatus = AUDIO_HW_SET_MASTER_VOLUME;
1309        if ((NULL != dev->set_master_volume) &&
1310            (OK == dev->set_master_volume(dev, mMasterVolume))) {
1311            flags = static_cast<AudioHwDevice::Flags>(flags |
1312                    AudioHwDevice::AHWD_CAN_SET_MASTER_VOLUME);
1313        }
1314
1315        mHardwareStatus = AUDIO_HW_SET_MASTER_MUTE;
1316        if ((NULL != dev->set_master_mute) &&
1317            (OK == dev->set_master_mute(dev, mMasterMute))) {
1318            flags = static_cast<AudioHwDevice::Flags>(flags |
1319                    AudioHwDevice::AHWD_CAN_SET_MASTER_MUTE);
1320        }
1321
1322        mHardwareStatus = AUDIO_HW_IDLE;
1323    }
1324
1325    audio_module_handle_t handle = nextUniqueId();
1326    mAudioHwDevs.add(handle, new AudioHwDevice(name, dev, flags));
1327
1328    ALOGI("loadHwModule() Loaded %s audio interface from %s (%s) handle %d",
1329          name, dev->common.module->name, dev->common.module->id, handle);
1330
1331    return handle;
1332
1333}
1334
1335// ----------------------------------------------------------------------------
1336
1337uint32_t AudioFlinger::getPrimaryOutputSamplingRate()
1338{
1339    Mutex::Autolock _l(mLock);
1340    PlaybackThread *thread = primaryPlaybackThread_l();
1341    return thread != NULL ? thread->sampleRate() : 0;
1342}
1343
1344size_t AudioFlinger::getPrimaryOutputFrameCount()
1345{
1346    Mutex::Autolock _l(mLock);
1347    PlaybackThread *thread = primaryPlaybackThread_l();
1348    return thread != NULL ? thread->frameCountHAL() : 0;
1349}
1350
1351// ----------------------------------------------------------------------------
1352
1353audio_io_handle_t AudioFlinger::openOutput(audio_module_handle_t module,
1354                                           audio_devices_t *pDevices,
1355                                           uint32_t *pSamplingRate,
1356                                           audio_format_t *pFormat,
1357                                           audio_channel_mask_t *pChannelMask,
1358                                           uint32_t *pLatencyMs,
1359                                           audio_output_flags_t flags)
1360{
1361    status_t status;
1362    PlaybackThread *thread = NULL;
1363    struct audio_config config = {
1364        sample_rate: pSamplingRate ? *pSamplingRate : 0,
1365        channel_mask: pChannelMask ? *pChannelMask : 0,
1366        format: pFormat ? *pFormat : AUDIO_FORMAT_DEFAULT,
1367    };
1368    audio_stream_out_t *outStream = NULL;
1369    AudioHwDevice *outHwDev;
1370
1371    ALOGV("openOutput(), module %d Device %x, SamplingRate %d, Format %d, Channels %x, flags %x",
1372              module,
1373              (pDevices != NULL) ? *pDevices : 0,
1374              config.sample_rate,
1375              config.format,
1376              config.channel_mask,
1377              flags);
1378
1379    if (pDevices == NULL || *pDevices == 0) {
1380        return 0;
1381    }
1382
1383    Mutex::Autolock _l(mLock);
1384
1385    outHwDev = findSuitableHwDev_l(module, *pDevices);
1386    if (outHwDev == NULL)
1387        return 0;
1388
1389    audio_hw_device_t *hwDevHal = outHwDev->hwDevice();
1390    audio_io_handle_t id = nextUniqueId();
1391
1392    mHardwareStatus = AUDIO_HW_OUTPUT_OPEN;
1393
1394    status = hwDevHal->open_output_stream(hwDevHal,
1395                                          id,
1396                                          *pDevices,
1397                                          (audio_output_flags_t)flags,
1398                                          &config,
1399                                          &outStream);
1400
1401    mHardwareStatus = AUDIO_HW_IDLE;
1402    ALOGV("openOutput() openOutputStream returned output %p, SamplingRate %d, Format %d, "
1403            "Channels %x, status %d",
1404            outStream,
1405            config.sample_rate,
1406            config.format,
1407            config.channel_mask,
1408            status);
1409
1410    if (status == NO_ERROR && outStream != NULL) {
1411        AudioStreamOut *output = new AudioStreamOut(outHwDev, outStream);
1412
1413        if ((flags & AUDIO_OUTPUT_FLAG_DIRECT) ||
1414            (config.format != AUDIO_FORMAT_PCM_16_BIT) ||
1415            (config.channel_mask != AUDIO_CHANNEL_OUT_STEREO)) {
1416            thread = new DirectOutputThread(this, output, id, *pDevices);
1417            ALOGV("openOutput() created direct output: ID %d thread %p", id, thread);
1418        } else {
1419            thread = new MixerThread(this, output, id, *pDevices);
1420            ALOGV("openOutput() created mixer output: ID %d thread %p", id, thread);
1421        }
1422        mPlaybackThreads.add(id, thread);
1423
1424        if (pSamplingRate != NULL) *pSamplingRate = config.sample_rate;
1425        if (pFormat != NULL) *pFormat = config.format;
1426        if (pChannelMask != NULL) *pChannelMask = config.channel_mask;
1427        if (pLatencyMs != NULL) *pLatencyMs = thread->latency();
1428
1429        // notify client processes of the new output creation
1430        thread->audioConfigChanged_l(AudioSystem::OUTPUT_OPENED);
1431
1432        // the first primary output opened designates the primary hw device
1433        if ((mPrimaryHardwareDev == NULL) && (flags & AUDIO_OUTPUT_FLAG_PRIMARY)) {
1434            ALOGI("Using module %d has the primary audio interface", module);
1435            mPrimaryHardwareDev = outHwDev;
1436
1437            AutoMutex lock(mHardwareLock);
1438            mHardwareStatus = AUDIO_HW_SET_MODE;
1439            hwDevHal->set_mode(hwDevHal, mMode);
1440            mHardwareStatus = AUDIO_HW_IDLE;
1441        }
1442        return id;
1443    }
1444
1445    return 0;
1446}
1447
1448audio_io_handle_t AudioFlinger::openDuplicateOutput(audio_io_handle_t output1,
1449        audio_io_handle_t output2)
1450{
1451    Mutex::Autolock _l(mLock);
1452    MixerThread *thread1 = checkMixerThread_l(output1);
1453    MixerThread *thread2 = checkMixerThread_l(output2);
1454
1455    if (thread1 == NULL || thread2 == NULL) {
1456        ALOGW("openDuplicateOutput() wrong output mixer type for output %d or %d", output1,
1457                output2);
1458        return 0;
1459    }
1460
1461    audio_io_handle_t id = nextUniqueId();
1462    DuplicatingThread *thread = new DuplicatingThread(this, thread1, id);
1463    thread->addOutputTrack(thread2);
1464    mPlaybackThreads.add(id, thread);
1465    // notify client processes of the new output creation
1466    thread->audioConfigChanged_l(AudioSystem::OUTPUT_OPENED);
1467    return id;
1468}
1469
1470status_t AudioFlinger::closeOutput(audio_io_handle_t output)
1471{
1472    return closeOutput_nonvirtual(output);
1473}
1474
1475status_t AudioFlinger::closeOutput_nonvirtual(audio_io_handle_t output)
1476{
1477    // keep strong reference on the playback thread so that
1478    // it is not destroyed while exit() is executed
1479    sp<PlaybackThread> thread;
1480    {
1481        Mutex::Autolock _l(mLock);
1482        thread = checkPlaybackThread_l(output);
1483        if (thread == NULL) {
1484            return BAD_VALUE;
1485        }
1486
1487        ALOGV("closeOutput() %d", output);
1488
1489        if (thread->type() == ThreadBase::MIXER) {
1490            for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
1491                if (mPlaybackThreads.valueAt(i)->type() == ThreadBase::DUPLICATING) {
1492                    DuplicatingThread *dupThread =
1493                            (DuplicatingThread *)mPlaybackThreads.valueAt(i).get();
1494                    dupThread->removeOutputTrack((MixerThread *)thread.get());
1495                }
1496            }
1497        }
1498        audioConfigChanged_l(AudioSystem::OUTPUT_CLOSED, output, NULL);
1499        mPlaybackThreads.removeItem(output);
1500    }
1501    thread->exit();
1502    // The thread entity (active unit of execution) is no longer running here,
1503    // but the ThreadBase container still exists.
1504
1505    if (thread->type() != ThreadBase::DUPLICATING) {
1506        AudioStreamOut *out = thread->clearOutput();
1507        ALOG_ASSERT(out != NULL, "out shouldn't be NULL");
1508        // from now on thread->mOutput is NULL
1509        out->hwDev()->close_output_stream(out->hwDev(), out->stream);
1510        delete out;
1511    }
1512    return NO_ERROR;
1513}
1514
1515status_t AudioFlinger::suspendOutput(audio_io_handle_t output)
1516{
1517    Mutex::Autolock _l(mLock);
1518    PlaybackThread *thread = checkPlaybackThread_l(output);
1519
1520    if (thread == NULL) {
1521        return BAD_VALUE;
1522    }
1523
1524    ALOGV("suspendOutput() %d", output);
1525    thread->suspend();
1526
1527    return NO_ERROR;
1528}
1529
1530status_t AudioFlinger::restoreOutput(audio_io_handle_t output)
1531{
1532    Mutex::Autolock _l(mLock);
1533    PlaybackThread *thread = checkPlaybackThread_l(output);
1534
1535    if (thread == NULL) {
1536        return BAD_VALUE;
1537    }
1538
1539    ALOGV("restoreOutput() %d", output);
1540
1541    thread->restore();
1542
1543    return NO_ERROR;
1544}
1545
1546audio_io_handle_t AudioFlinger::openInput(audio_module_handle_t module,
1547                                          audio_devices_t *pDevices,
1548                                          uint32_t *pSamplingRate,
1549                                          audio_format_t *pFormat,
1550                                          audio_channel_mask_t *pChannelMask)
1551{
1552    status_t status;
1553    RecordThread *thread = NULL;
1554    struct audio_config config = {
1555        sample_rate: pSamplingRate ? *pSamplingRate : 0,
1556        channel_mask: pChannelMask ? *pChannelMask : 0,
1557        format: pFormat ? *pFormat : AUDIO_FORMAT_DEFAULT,
1558    };
1559    uint32_t reqSamplingRate = config.sample_rate;
1560    audio_format_t reqFormat = config.format;
1561    audio_channel_mask_t reqChannels = config.channel_mask;
1562    audio_stream_in_t *inStream = NULL;
1563    AudioHwDevice *inHwDev;
1564
1565    if (pDevices == NULL || *pDevices == 0) {
1566        return 0;
1567    }
1568
1569    Mutex::Autolock _l(mLock);
1570
1571    inHwDev = findSuitableHwDev_l(module, *pDevices);
1572    if (inHwDev == NULL)
1573        return 0;
1574
1575    audio_hw_device_t *inHwHal = inHwDev->hwDevice();
1576    audio_io_handle_t id = nextUniqueId();
1577
1578    status = inHwHal->open_input_stream(inHwHal, id, *pDevices, &config,
1579                                        &inStream);
1580    ALOGV("openInput() openInputStream returned input %p, SamplingRate %d, Format %d, Channels %x, "
1581            "status %d",
1582            inStream,
1583            config.sample_rate,
1584            config.format,
1585            config.channel_mask,
1586            status);
1587
1588    // If the input could not be opened with the requested parameters and we can handle the
1589    // conversion internally, try to open again with the proposed parameters. The AudioFlinger can
1590    // resample the input and do mono to stereo or stereo to mono conversions on 16 bit PCM inputs.
1591    if (status == BAD_VALUE &&
1592        reqFormat == config.format && config.format == AUDIO_FORMAT_PCM_16_BIT &&
1593        (config.sample_rate <= 2 * reqSamplingRate) &&
1594        (popcount(config.channel_mask) <= FCC_2) && (popcount(reqChannels) <= FCC_2)) {
1595        ALOGV("openInput() reopening with proposed sampling rate and channel mask");
1596        inStream = NULL;
1597        status = inHwHal->open_input_stream(inHwHal, id, *pDevices, &config, &inStream);
1598    }
1599
1600    if (status == NO_ERROR && inStream != NULL) {
1601
1602        // Try to re-use most recently used Pipe to archive a copy of input for dumpsys,
1603        // or (re-)create if current Pipe is idle and does not match the new format
1604        sp<NBAIO_Sink> teeSink;
1605#ifdef TEE_SINK_INPUT_FRAMES
1606        enum {
1607            TEE_SINK_NO,    // don't copy input
1608            TEE_SINK_NEW,   // copy input using a new pipe
1609            TEE_SINK_OLD,   // copy input using an existing pipe
1610        } kind;
1611        NBAIO_Format format = Format_from_SR_C(inStream->common.get_sample_rate(&inStream->common),
1612                                        popcount(inStream->common.get_channels(&inStream->common)));
1613        if (format == Format_Invalid) {
1614            kind = TEE_SINK_NO;
1615        } else if (mRecordTeeSink == 0) {
1616            kind = TEE_SINK_NEW;
1617        } else if (mRecordTeeSink->getStrongCount() != 1) {
1618            kind = TEE_SINK_NO;
1619        } else if (format == mRecordTeeSink->format()) {
1620            kind = TEE_SINK_OLD;
1621        } else {
1622            kind = TEE_SINK_NEW;
1623        }
1624        switch (kind) {
1625        case TEE_SINK_NEW: {
1626            Pipe *pipe = new Pipe(TEE_SINK_INPUT_FRAMES, format);
1627            size_t numCounterOffers = 0;
1628            const NBAIO_Format offers[1] = {format};
1629            ssize_t index = pipe->negotiate(offers, 1, NULL, numCounterOffers);
1630            ALOG_ASSERT(index == 0);
1631            PipeReader *pipeReader = new PipeReader(*pipe);
1632            numCounterOffers = 0;
1633            index = pipeReader->negotiate(offers, 1, NULL, numCounterOffers);
1634            ALOG_ASSERT(index == 0);
1635            mRecordTeeSink = pipe;
1636            mRecordTeeSource = pipeReader;
1637            teeSink = pipe;
1638            }
1639            break;
1640        case TEE_SINK_OLD:
1641            teeSink = mRecordTeeSink;
1642            break;
1643        case TEE_SINK_NO:
1644        default:
1645            break;
1646        }
1647#endif
1648        AudioStreamIn *input = new AudioStreamIn(inHwDev, inStream);
1649
1650        // Start record thread
1651        // RecorThread require both input and output device indication to forward to audio
1652        // pre processing modules
1653        audio_devices_t device = (*pDevices) | primaryOutputDevice_l();
1654
1655        thread = new RecordThread(this,
1656                                  input,
1657                                  reqSamplingRate,
1658                                  reqChannels,
1659                                  id,
1660                                  device, teeSink);
1661        mRecordThreads.add(id, thread);
1662        ALOGV("openInput() created record thread: ID %d thread %p", id, thread);
1663        if (pSamplingRate != NULL) *pSamplingRate = reqSamplingRate;
1664        if (pFormat != NULL) *pFormat = config.format;
1665        if (pChannelMask != NULL) *pChannelMask = reqChannels;
1666
1667        // notify client processes of the new input creation
1668        thread->audioConfigChanged_l(AudioSystem::INPUT_OPENED);
1669        return id;
1670    }
1671
1672    return 0;
1673}
1674
1675status_t AudioFlinger::closeInput(audio_io_handle_t input)
1676{
1677    return closeInput_nonvirtual(input);
1678}
1679
1680status_t AudioFlinger::closeInput_nonvirtual(audio_io_handle_t input)
1681{
1682    // keep strong reference on the record thread so that
1683    // it is not destroyed while exit() is executed
1684    sp<RecordThread> thread;
1685    {
1686        Mutex::Autolock _l(mLock);
1687        thread = checkRecordThread_l(input);
1688        if (thread == 0) {
1689            return BAD_VALUE;
1690        }
1691
1692        ALOGV("closeInput() %d", input);
1693        audioConfigChanged_l(AudioSystem::INPUT_CLOSED, input, NULL);
1694        mRecordThreads.removeItem(input);
1695    }
1696    thread->exit();
1697    // The thread entity (active unit of execution) is no longer running here,
1698    // but the ThreadBase container still exists.
1699
1700    AudioStreamIn *in = thread->clearInput();
1701    ALOG_ASSERT(in != NULL, "in shouldn't be NULL");
1702    // from now on thread->mInput is NULL
1703    in->hwDev()->close_input_stream(in->hwDev(), in->stream);
1704    delete in;
1705
1706    return NO_ERROR;
1707}
1708
1709status_t AudioFlinger::setStreamOutput(audio_stream_type_t stream, audio_io_handle_t output)
1710{
1711    Mutex::Autolock _l(mLock);
1712    ALOGV("setStreamOutput() stream %d to output %d", stream, output);
1713
1714    for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
1715        PlaybackThread *thread = mPlaybackThreads.valueAt(i).get();
1716        thread->invalidateTracks(stream);
1717    }
1718
1719    return NO_ERROR;
1720}
1721
1722
1723int AudioFlinger::newAudioSessionId()
1724{
1725    return nextUniqueId();
1726}
1727
1728void AudioFlinger::acquireAudioSessionId(int audioSession)
1729{
1730    Mutex::Autolock _l(mLock);
1731    pid_t caller = IPCThreadState::self()->getCallingPid();
1732    ALOGV("acquiring %d from %d", audioSession, caller);
1733    size_t num = mAudioSessionRefs.size();
1734    for (size_t i = 0; i< num; i++) {
1735        AudioSessionRef *ref = mAudioSessionRefs.editItemAt(i);
1736        if (ref->mSessionid == audioSession && ref->mPid == caller) {
1737            ref->mCnt++;
1738            ALOGV(" incremented refcount to %d", ref->mCnt);
1739            return;
1740        }
1741    }
1742    mAudioSessionRefs.push(new AudioSessionRef(audioSession, caller));
1743    ALOGV(" added new entry for %d", audioSession);
1744}
1745
1746void AudioFlinger::releaseAudioSessionId(int audioSession)
1747{
1748    Mutex::Autolock _l(mLock);
1749    pid_t caller = IPCThreadState::self()->getCallingPid();
1750    ALOGV("releasing %d from %d", audioSession, caller);
1751    size_t num = mAudioSessionRefs.size();
1752    for (size_t i = 0; i< num; i++) {
1753        AudioSessionRef *ref = mAudioSessionRefs.itemAt(i);
1754        if (ref->mSessionid == audioSession && ref->mPid == caller) {
1755            ref->mCnt--;
1756            ALOGV(" decremented refcount to %d", ref->mCnt);
1757            if (ref->mCnt == 0) {
1758                mAudioSessionRefs.removeAt(i);
1759                delete ref;
1760                purgeStaleEffects_l();
1761            }
1762            return;
1763        }
1764    }
1765    ALOGW("session id %d not found for pid %d", audioSession, caller);
1766}
1767
1768void AudioFlinger::purgeStaleEffects_l() {
1769
1770    ALOGV("purging stale effects");
1771
1772    Vector< sp<EffectChain> > chains;
1773
1774    for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
1775        sp<PlaybackThread> t = mPlaybackThreads.valueAt(i);
1776        for (size_t j = 0; j < t->mEffectChains.size(); j++) {
1777            sp<EffectChain> ec = t->mEffectChains[j];
1778            if (ec->sessionId() > AUDIO_SESSION_OUTPUT_MIX) {
1779                chains.push(ec);
1780            }
1781        }
1782    }
1783    for (size_t i = 0; i < mRecordThreads.size(); i++) {
1784        sp<RecordThread> t = mRecordThreads.valueAt(i);
1785        for (size_t j = 0; j < t->mEffectChains.size(); j++) {
1786            sp<EffectChain> ec = t->mEffectChains[j];
1787            chains.push(ec);
1788        }
1789    }
1790
1791    for (size_t i = 0; i < chains.size(); i++) {
1792        sp<EffectChain> ec = chains[i];
1793        int sessionid = ec->sessionId();
1794        sp<ThreadBase> t = ec->mThread.promote();
1795        if (t == 0) {
1796            continue;
1797        }
1798        size_t numsessionrefs = mAudioSessionRefs.size();
1799        bool found = false;
1800        for (size_t k = 0; k < numsessionrefs; k++) {
1801            AudioSessionRef *ref = mAudioSessionRefs.itemAt(k);
1802            if (ref->mSessionid == sessionid) {
1803                ALOGV(" session %d still exists for %d with %d refs",
1804                    sessionid, ref->mPid, ref->mCnt);
1805                found = true;
1806                break;
1807            }
1808        }
1809        if (!found) {
1810            Mutex::Autolock _l (t->mLock);
1811            // remove all effects from the chain
1812            while (ec->mEffects.size()) {
1813                sp<EffectModule> effect = ec->mEffects[0];
1814                effect->unPin();
1815                t->removeEffect_l(effect);
1816                if (effect->purgeHandles()) {
1817                    t->checkSuspendOnEffectEnabled_l(effect, false, effect->sessionId());
1818                }
1819                AudioSystem::unregisterEffect(effect->id());
1820            }
1821        }
1822    }
1823    return;
1824}
1825
1826// checkPlaybackThread_l() must be called with AudioFlinger::mLock held
1827AudioFlinger::PlaybackThread *AudioFlinger::checkPlaybackThread_l(audio_io_handle_t output) const
1828{
1829    return mPlaybackThreads.valueFor(output).get();
1830}
1831
1832// checkMixerThread_l() must be called with AudioFlinger::mLock held
1833AudioFlinger::MixerThread *AudioFlinger::checkMixerThread_l(audio_io_handle_t output) const
1834{
1835    PlaybackThread *thread = checkPlaybackThread_l(output);
1836    return thread != NULL && thread->type() != ThreadBase::DIRECT ? (MixerThread *) thread : NULL;
1837}
1838
1839// checkRecordThread_l() must be called with AudioFlinger::mLock held
1840AudioFlinger::RecordThread *AudioFlinger::checkRecordThread_l(audio_io_handle_t input) const
1841{
1842    return mRecordThreads.valueFor(input).get();
1843}
1844
1845uint32_t AudioFlinger::nextUniqueId()
1846{
1847    return android_atomic_inc(&mNextUniqueId);
1848}
1849
1850AudioFlinger::PlaybackThread *AudioFlinger::primaryPlaybackThread_l() const
1851{
1852    for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
1853        PlaybackThread *thread = mPlaybackThreads.valueAt(i).get();
1854        AudioStreamOut *output = thread->getOutput();
1855        if (output != NULL && output->audioHwDev == mPrimaryHardwareDev) {
1856            return thread;
1857        }
1858    }
1859    return NULL;
1860}
1861
1862audio_devices_t AudioFlinger::primaryOutputDevice_l() const
1863{
1864    PlaybackThread *thread = primaryPlaybackThread_l();
1865
1866    if (thread == NULL) {
1867        return 0;
1868    }
1869
1870    return thread->outDevice();
1871}
1872
1873sp<AudioFlinger::SyncEvent> AudioFlinger::createSyncEvent(AudioSystem::sync_event_t type,
1874                                    int triggerSession,
1875                                    int listenerSession,
1876                                    sync_event_callback_t callBack,
1877                                    void *cookie)
1878{
1879    Mutex::Autolock _l(mLock);
1880
1881    sp<SyncEvent> event = new SyncEvent(type, triggerSession, listenerSession, callBack, cookie);
1882    status_t playStatus = NAME_NOT_FOUND;
1883    status_t recStatus = NAME_NOT_FOUND;
1884    for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
1885        playStatus = mPlaybackThreads.valueAt(i)->setSyncEvent(event);
1886        if (playStatus == NO_ERROR) {
1887            return event;
1888        }
1889    }
1890    for (size_t i = 0; i < mRecordThreads.size(); i++) {
1891        recStatus = mRecordThreads.valueAt(i)->setSyncEvent(event);
1892        if (recStatus == NO_ERROR) {
1893            return event;
1894        }
1895    }
1896    if (playStatus == NAME_NOT_FOUND || recStatus == NAME_NOT_FOUND) {
1897        mPendingSyncEvents.add(event);
1898    } else {
1899        ALOGV("createSyncEvent() invalid event %d", event->type());
1900        event.clear();
1901    }
1902    return event;
1903}
1904
1905// ----------------------------------------------------------------------------
1906//  Effect management
1907// ----------------------------------------------------------------------------
1908
1909
1910status_t AudioFlinger::queryNumberEffects(uint32_t *numEffects) const
1911{
1912    Mutex::Autolock _l(mLock);
1913    return EffectQueryNumberEffects(numEffects);
1914}
1915
1916status_t AudioFlinger::queryEffect(uint32_t index, effect_descriptor_t *descriptor) const
1917{
1918    Mutex::Autolock _l(mLock);
1919    return EffectQueryEffect(index, descriptor);
1920}
1921
1922status_t AudioFlinger::getEffectDescriptor(const effect_uuid_t *pUuid,
1923        effect_descriptor_t *descriptor) const
1924{
1925    Mutex::Autolock _l(mLock);
1926    return EffectGetDescriptor(pUuid, descriptor);
1927}
1928
1929
1930sp<IEffect> AudioFlinger::createEffect(
1931        effect_descriptor_t *pDesc,
1932        const sp<IEffectClient>& effectClient,
1933        int32_t priority,
1934        audio_io_handle_t io,
1935        int sessionId,
1936        status_t *status,
1937        int *id,
1938        int *enabled)
1939{
1940    status_t lStatus = NO_ERROR;
1941    sp<EffectHandle> handle;
1942    effect_descriptor_t desc;
1943
1944    pid_t pid = IPCThreadState::self()->getCallingPid();
1945    ALOGV("createEffect pid %d, effectClient %p, priority %d, sessionId %d, io %d",
1946            pid, effectClient.get(), priority, sessionId, io);
1947
1948    if (pDesc == NULL) {
1949        lStatus = BAD_VALUE;
1950        goto Exit;
1951    }
1952
1953    // check audio settings permission for global effects
1954    if (sessionId == AUDIO_SESSION_OUTPUT_MIX && !settingsAllowed()) {
1955        lStatus = PERMISSION_DENIED;
1956        goto Exit;
1957    }
1958
1959    // Session AUDIO_SESSION_OUTPUT_STAGE is reserved for output stage effects
1960    // that can only be created by audio policy manager (running in same process)
1961    if (sessionId == AUDIO_SESSION_OUTPUT_STAGE && getpid_cached != pid) {
1962        lStatus = PERMISSION_DENIED;
1963        goto Exit;
1964    }
1965
1966    if (io == 0) {
1967        if (sessionId == AUDIO_SESSION_OUTPUT_STAGE) {
1968            // output must be specified by AudioPolicyManager when using session
1969            // AUDIO_SESSION_OUTPUT_STAGE
1970            lStatus = BAD_VALUE;
1971            goto Exit;
1972        } else if (sessionId == AUDIO_SESSION_OUTPUT_MIX) {
1973            // if the output returned by getOutputForEffect() is removed before we lock the
1974            // mutex below, the call to checkPlaybackThread_l(io) below will detect it
1975            // and we will exit safely
1976            io = AudioSystem::getOutputForEffect(&desc);
1977        }
1978    }
1979
1980    {
1981        Mutex::Autolock _l(mLock);
1982
1983
1984        if (!EffectIsNullUuid(&pDesc->uuid)) {
1985            // if uuid is specified, request effect descriptor
1986            lStatus = EffectGetDescriptor(&pDesc->uuid, &desc);
1987            if (lStatus < 0) {
1988                ALOGW("createEffect() error %d from EffectGetDescriptor", lStatus);
1989                goto Exit;
1990            }
1991        } else {
1992            // if uuid is not specified, look for an available implementation
1993            // of the required type in effect factory
1994            if (EffectIsNullUuid(&pDesc->type)) {
1995                ALOGW("createEffect() no effect type");
1996                lStatus = BAD_VALUE;
1997                goto Exit;
1998            }
1999            uint32_t numEffects = 0;
2000            effect_descriptor_t d;
2001            d.flags = 0; // prevent compiler warning
2002            bool found = false;
2003
2004            lStatus = EffectQueryNumberEffects(&numEffects);
2005            if (lStatus < 0) {
2006                ALOGW("createEffect() error %d from EffectQueryNumberEffects", lStatus);
2007                goto Exit;
2008            }
2009            for (uint32_t i = 0; i < numEffects; i++) {
2010                lStatus = EffectQueryEffect(i, &desc);
2011                if (lStatus < 0) {
2012                    ALOGW("createEffect() error %d from EffectQueryEffect", lStatus);
2013                    continue;
2014                }
2015                if (memcmp(&desc.type, &pDesc->type, sizeof(effect_uuid_t)) == 0) {
2016                    // If matching type found save effect descriptor. If the session is
2017                    // 0 and the effect is not auxiliary, continue enumeration in case
2018                    // an auxiliary version of this effect type is available
2019                    found = true;
2020                    d = desc;
2021                    if (sessionId != AUDIO_SESSION_OUTPUT_MIX ||
2022                            (desc.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) {
2023                        break;
2024                    }
2025                }
2026            }
2027            if (!found) {
2028                lStatus = BAD_VALUE;
2029                ALOGW("createEffect() effect not found");
2030                goto Exit;
2031            }
2032            // For same effect type, chose auxiliary version over insert version if
2033            // connect to output mix (Compliance to OpenSL ES)
2034            if (sessionId == AUDIO_SESSION_OUTPUT_MIX &&
2035                    (d.flags & EFFECT_FLAG_TYPE_MASK) != EFFECT_FLAG_TYPE_AUXILIARY) {
2036                desc = d;
2037            }
2038        }
2039
2040        // Do not allow auxiliary effects on a session different from 0 (output mix)
2041        if (sessionId != AUDIO_SESSION_OUTPUT_MIX &&
2042             (desc.flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) {
2043            lStatus = INVALID_OPERATION;
2044            goto Exit;
2045        }
2046
2047        // check recording permission for visualizer
2048        if ((memcmp(&desc.type, SL_IID_VISUALIZATION, sizeof(effect_uuid_t)) == 0) &&
2049            !recordingAllowed()) {
2050            lStatus = PERMISSION_DENIED;
2051            goto Exit;
2052        }
2053
2054        // return effect descriptor
2055        *pDesc = desc;
2056
2057        // If output is not specified try to find a matching audio session ID in one of the
2058        // output threads.
2059        // If output is 0 here, sessionId is neither SESSION_OUTPUT_STAGE nor SESSION_OUTPUT_MIX
2060        // because of code checking output when entering the function.
2061        // Note: io is never 0 when creating an effect on an input
2062        if (io == 0) {
2063            // look for the thread where the specified audio session is present
2064            for (size_t i = 0; i < mPlaybackThreads.size(); i++) {
2065                if (mPlaybackThreads.valueAt(i)->hasAudioSession(sessionId) != 0) {
2066                    io = mPlaybackThreads.keyAt(i);
2067                    break;
2068                }
2069            }
2070            if (io == 0) {
2071                for (size_t i = 0; i < mRecordThreads.size(); i++) {
2072                    if (mRecordThreads.valueAt(i)->hasAudioSession(sessionId) != 0) {
2073                        io = mRecordThreads.keyAt(i);
2074                        break;
2075                    }
2076                }
2077            }
2078            // If no output thread contains the requested session ID, default to
2079            // first output. The effect chain will be moved to the correct output
2080            // thread when a track with the same session ID is created
2081            if (io == 0 && mPlaybackThreads.size()) {
2082                io = mPlaybackThreads.keyAt(0);
2083            }
2084            ALOGV("createEffect() got io %d for effect %s", io, desc.name);
2085        }
2086        ThreadBase *thread = checkRecordThread_l(io);
2087        if (thread == NULL) {
2088            thread = checkPlaybackThread_l(io);
2089            if (thread == NULL) {
2090                ALOGE("createEffect() unknown output thread");
2091                lStatus = BAD_VALUE;
2092                goto Exit;
2093            }
2094        }
2095
2096        sp<Client> client = registerPid_l(pid);
2097
2098        // create effect on selected output thread
2099        handle = thread->createEffect_l(client, effectClient, priority, sessionId,
2100                &desc, enabled, &lStatus);
2101        if (handle != 0 && id != NULL) {
2102            *id = handle->id();
2103        }
2104    }
2105
2106Exit:
2107    if (status != NULL) {
2108        *status = lStatus;
2109    }
2110    return handle;
2111}
2112
2113status_t AudioFlinger::moveEffects(int sessionId, audio_io_handle_t srcOutput,
2114        audio_io_handle_t dstOutput)
2115{
2116    ALOGV("moveEffects() session %d, srcOutput %d, dstOutput %d",
2117            sessionId, srcOutput, dstOutput);
2118    Mutex::Autolock _l(mLock);
2119    if (srcOutput == dstOutput) {
2120        ALOGW("moveEffects() same dst and src outputs %d", dstOutput);
2121        return NO_ERROR;
2122    }
2123    PlaybackThread *srcThread = checkPlaybackThread_l(srcOutput);
2124    if (srcThread == NULL) {
2125        ALOGW("moveEffects() bad srcOutput %d", srcOutput);
2126        return BAD_VALUE;
2127    }
2128    PlaybackThread *dstThread = checkPlaybackThread_l(dstOutput);
2129    if (dstThread == NULL) {
2130        ALOGW("moveEffects() bad dstOutput %d", dstOutput);
2131        return BAD_VALUE;
2132    }
2133
2134    Mutex::Autolock _dl(dstThread->mLock);
2135    Mutex::Autolock _sl(srcThread->mLock);
2136    moveEffectChain_l(sessionId, srcThread, dstThread, false);
2137
2138    return NO_ERROR;
2139}
2140
2141// moveEffectChain_l must be called with both srcThread and dstThread mLocks held
2142status_t AudioFlinger::moveEffectChain_l(int sessionId,
2143                                   AudioFlinger::PlaybackThread *srcThread,
2144                                   AudioFlinger::PlaybackThread *dstThread,
2145                                   bool reRegister)
2146{
2147    ALOGV("moveEffectChain_l() session %d from thread %p to thread %p",
2148            sessionId, srcThread, dstThread);
2149
2150    sp<EffectChain> chain = srcThread->getEffectChain_l(sessionId);
2151    if (chain == 0) {
2152        ALOGW("moveEffectChain_l() effect chain for session %d not on source thread %p",
2153                sessionId, srcThread);
2154        return INVALID_OPERATION;
2155    }
2156
2157    // remove chain first. This is useful only if reconfiguring effect chain on same output thread,
2158    // so that a new chain is created with correct parameters when first effect is added. This is
2159    // otherwise unnecessary as removeEffect_l() will remove the chain when last effect is
2160    // removed.
2161    srcThread->removeEffectChain_l(chain);
2162
2163    // transfer all effects one by one so that new effect chain is created on new thread with
2164    // correct buffer sizes and audio parameters and effect engines reconfigured accordingly
2165    audio_io_handle_t dstOutput = dstThread->id();
2166    sp<EffectChain> dstChain;
2167    uint32_t strategy = 0; // prevent compiler warning
2168    sp<EffectModule> effect = chain->getEffectFromId_l(0);
2169    while (effect != 0) {
2170        srcThread->removeEffect_l(effect);
2171        dstThread->addEffect_l(effect);
2172        // removeEffect_l() has stopped the effect if it was active so it must be restarted
2173        if (effect->state() == EffectModule::ACTIVE ||
2174                effect->state() == EffectModule::STOPPING) {
2175            effect->start();
2176        }
2177        // if the move request is not received from audio policy manager, the effect must be
2178        // re-registered with the new strategy and output
2179        if (dstChain == 0) {
2180            dstChain = effect->chain().promote();
2181            if (dstChain == 0) {
2182                ALOGW("moveEffectChain_l() cannot get chain from effect %p", effect.get());
2183                srcThread->addEffect_l(effect);
2184                return NO_INIT;
2185            }
2186            strategy = dstChain->strategy();
2187        }
2188        if (reRegister) {
2189            AudioSystem::unregisterEffect(effect->id());
2190            AudioSystem::registerEffect(&effect->desc(),
2191                                        dstOutput,
2192                                        strategy,
2193                                        sessionId,
2194                                        effect->id());
2195        }
2196        effect = chain->getEffectFromId_l(0);
2197    }
2198
2199    return NO_ERROR;
2200}
2201
2202void AudioFlinger::dumpTee(int fd, const sp<NBAIO_Source>& source, audio_io_handle_t id)
2203{
2204    NBAIO_Source *teeSource = source.get();
2205    if (teeSource != NULL) {
2206        char teeTime[16];
2207        struct timeval tv;
2208        gettimeofday(&tv, NULL);
2209        struct tm tm;
2210        localtime_r(&tv.tv_sec, &tm);
2211        strftime(teeTime, sizeof(teeTime), "%T", &tm);
2212        char teePath[64];
2213        sprintf(teePath, "/data/misc/media/%s_%d.wav", teeTime, id);
2214        int teeFd = open(teePath, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);
2215        if (teeFd >= 0) {
2216            char wavHeader[44];
2217            memcpy(wavHeader,
2218                "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",
2219                sizeof(wavHeader));
2220            NBAIO_Format format = teeSource->format();
2221            unsigned channelCount = Format_channelCount(format);
2222            ALOG_ASSERT(channelCount <= FCC_2);
2223            uint32_t sampleRate = Format_sampleRate(format);
2224            wavHeader[22] = channelCount;       // number of channels
2225            wavHeader[24] = sampleRate;         // sample rate
2226            wavHeader[25] = sampleRate >> 8;
2227            wavHeader[32] = channelCount * 2;   // block alignment
2228            write(teeFd, wavHeader, sizeof(wavHeader));
2229            size_t total = 0;
2230            bool firstRead = true;
2231            for (;;) {
2232#define TEE_SINK_READ 1024
2233                short buffer[TEE_SINK_READ * FCC_2];
2234                size_t count = TEE_SINK_READ;
2235                ssize_t actual = teeSource->read(buffer, count,
2236                        AudioBufferProvider::kInvalidPTS);
2237                bool wasFirstRead = firstRead;
2238                firstRead = false;
2239                if (actual <= 0) {
2240                    if (actual == (ssize_t) OVERRUN && wasFirstRead) {
2241                        continue;
2242                    }
2243                    break;
2244                }
2245                ALOG_ASSERT(actual <= (ssize_t)count);
2246                write(teeFd, buffer, actual * channelCount * sizeof(short));
2247                total += actual;
2248            }
2249            lseek(teeFd, (off_t) 4, SEEK_SET);
2250            uint32_t temp = 44 + total * channelCount * sizeof(short) - 8;
2251            write(teeFd, &temp, sizeof(temp));
2252            lseek(teeFd, (off_t) 40, SEEK_SET);
2253            temp =  total * channelCount * sizeof(short);
2254            write(teeFd, &temp, sizeof(temp));
2255            close(teeFd);
2256            fdprintf(fd, "FastMixer tee copied to %s\n", teePath);
2257        } else {
2258            fdprintf(fd, "FastMixer unable to create tee %s: \n", strerror(errno));
2259        }
2260    }
2261}
2262
2263// ----------------------------------------------------------------------------
2264
2265status_t AudioFlinger::onTransact(
2266        uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
2267{
2268    return BnAudioFlinger::onTransact(code, data, reply, flags);
2269}
2270
2271}; // namespace android
2272