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