AudioFlinger.h revision 022b9953153bdb1984f0abb17d21ef8c1826ad49
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#ifndef ANDROID_AUDIO_FLINGER_H
19#define ANDROID_AUDIO_FLINGER_H
20
21#include "Configuration.h"
22#include <deque>
23#include <map>
24#include <stdint.h>
25#include <sys/types.h>
26#include <limits.h>
27
28#include <cutils/compiler.h>
29#include <cutils/properties.h>
30
31#include <media/IAudioFlinger.h>
32#include <media/IAudioFlingerClient.h>
33#include <media/IAudioTrack.h>
34#include <media/IAudioRecord.h>
35#include <media/AudioSystem.h>
36#include <media/AudioTrack.h>
37
38#include <utils/Atomic.h>
39#include <utils/Errors.h>
40#include <utils/threads.h>
41#include <utils/SortedVector.h>
42#include <utils/TypeHelpers.h>
43#include <utils/Vector.h>
44
45#include <binder/BinderService.h>
46#include <binder/MemoryDealer.h>
47
48#include <system/audio.h>
49#include <system/audio_policy.h>
50
51#include <media/audiohal/EffectBufferHalInterface.h>
52#include <media/audiohal/StreamHalInterface.h>
53#include <media/AudioBufferProvider.h>
54#include <media/ExtendedAudioBufferProvider.h>
55
56#include "FastCapture.h"
57#include "FastMixer.h"
58#include <media/nbaio/NBAIO.h>
59#include "AudioWatchdog.h"
60#include "AudioMixer.h"
61#include "AudioStreamOut.h"
62#include "SpdifStreamOut.h"
63#include "AudioHwDevice.h"
64#include "LinearMap.h"
65
66#include <powermanager/IPowerManager.h>
67
68#include <media/nbaio/NBLog.h>
69#include <private/media/AudioTrackShared.h>
70
71namespace android {
72
73struct audio_track_cblk_t;
74struct effect_param_cblk_t;
75class AudioMixer;
76class AudioBuffer;
77class AudioResampler;
78class DeviceHalInterface;
79class DevicesFactoryHalInterface;
80class EffectsFactoryHalInterface;
81class FastMixer;
82class PassthruBufferProvider;
83class ServerProxy;
84
85// ----------------------------------------------------------------------------
86
87static const nsecs_t kDefaultStandbyTimeInNsecs = seconds(3);
88
89
90// Max shared memory size for audio tracks and audio records per client process
91static const size_t kClientSharedHeapSizeBytes = 1024*1024;
92// Shared memory size multiplier for non low ram devices
93static const size_t kClientSharedHeapSizeMultiplier = 4;
94
95#define INCLUDING_FROM_AUDIOFLINGER_H
96
97class AudioFlinger :
98    public BinderService<AudioFlinger>,
99    public BnAudioFlinger
100{
101    friend class BinderService<AudioFlinger>;   // for AudioFlinger()
102public:
103    static const char* getServiceName() ANDROID_API { return "media.audio_flinger"; }
104
105    virtual     status_t    dump(int fd, const Vector<String16>& args);
106
107    // IAudioFlinger interface, in binder opcode order
108    virtual sp<IAudioTrack> createTrack(
109                                audio_stream_type_t streamType,
110                                uint32_t sampleRate,
111                                audio_format_t format,
112                                audio_channel_mask_t channelMask,
113                                size_t *pFrameCount,
114                                audio_output_flags_t *flags,
115                                const sp<IMemory>& sharedBuffer,
116                                audio_io_handle_t output,
117                                pid_t pid,
118                                pid_t tid,
119                                audio_session_t *sessionId,
120                                int clientUid,
121                                status_t *status /*non-NULL*/,
122                                audio_port_handle_t portId);
123
124    virtual sp<IAudioRecord> openRecord(
125                                audio_io_handle_t input,
126                                uint32_t sampleRate,
127                                audio_format_t format,
128                                audio_channel_mask_t channelMask,
129                                const String16& opPackageName,
130                                size_t *pFrameCount,
131                                audio_input_flags_t *flags,
132                                pid_t pid,
133                                pid_t tid,
134                                int clientUid,
135                                audio_session_t *sessionId,
136                                size_t *notificationFrames,
137                                sp<IMemory>& cblk,
138                                sp<IMemory>& buffers,
139                                status_t *status /*non-NULL*/,
140                                audio_port_handle_t portId);
141
142    virtual     uint32_t    sampleRate(audio_io_handle_t ioHandle) const;
143    virtual     audio_format_t format(audio_io_handle_t output) const;
144    virtual     size_t      frameCount(audio_io_handle_t ioHandle) const;
145    virtual     size_t      frameCountHAL(audio_io_handle_t ioHandle) const;
146    virtual     uint32_t    latency(audio_io_handle_t output) const;
147
148    virtual     status_t    setMasterVolume(float value);
149    virtual     status_t    setMasterMute(bool muted);
150
151    virtual     float       masterVolume() const;
152    virtual     bool        masterMute() const;
153
154    virtual     status_t    setStreamVolume(audio_stream_type_t stream, float value,
155                                            audio_io_handle_t output);
156    virtual     status_t    setStreamMute(audio_stream_type_t stream, bool muted);
157
158    virtual     float       streamVolume(audio_stream_type_t stream,
159                                         audio_io_handle_t output) const;
160    virtual     bool        streamMute(audio_stream_type_t stream) const;
161
162    virtual     status_t    setMode(audio_mode_t mode);
163
164    virtual     status_t    setMicMute(bool state);
165    virtual     bool        getMicMute() const;
166
167    virtual     status_t    setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs);
168    virtual     String8     getParameters(audio_io_handle_t ioHandle, const String8& keys) const;
169
170    virtual     void        registerClient(const sp<IAudioFlingerClient>& client);
171
172    virtual     size_t      getInputBufferSize(uint32_t sampleRate, audio_format_t format,
173                                               audio_channel_mask_t channelMask) const;
174
175    virtual status_t openOutput(audio_module_handle_t module,
176                                audio_io_handle_t *output,
177                                audio_config_t *config,
178                                audio_devices_t *devices,
179                                const String8& address,
180                                uint32_t *latencyMs,
181                                audio_output_flags_t flags);
182
183    virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1,
184                                                  audio_io_handle_t output2);
185
186    virtual status_t closeOutput(audio_io_handle_t output);
187
188    virtual status_t suspendOutput(audio_io_handle_t output);
189
190    virtual status_t restoreOutput(audio_io_handle_t output);
191
192    virtual status_t openInput(audio_module_handle_t module,
193                               audio_io_handle_t *input,
194                               audio_config_t *config,
195                               audio_devices_t *device,
196                               const String8& address,
197                               audio_source_t source,
198                               audio_input_flags_t flags);
199
200    virtual status_t closeInput(audio_io_handle_t input);
201
202    virtual status_t invalidateStream(audio_stream_type_t stream);
203
204    virtual status_t setVoiceVolume(float volume);
205
206    virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames,
207                                       audio_io_handle_t output) const;
208
209    virtual uint32_t getInputFramesLost(audio_io_handle_t ioHandle) const;
210
211    // This is the binder API.  For the internal API see nextUniqueId().
212    virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use);
213
214    virtual void acquireAudioSessionId(audio_session_t audioSession, pid_t pid);
215
216    virtual void releaseAudioSessionId(audio_session_t audioSession, pid_t pid);
217
218    virtual status_t queryNumberEffects(uint32_t *numEffects) const;
219
220    virtual status_t queryEffect(uint32_t index, effect_descriptor_t *descriptor) const;
221
222    virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid,
223                                         effect_descriptor_t *descriptor) const;
224
225    virtual sp<IEffect> createEffect(
226                        effect_descriptor_t *pDesc,
227                        const sp<IEffectClient>& effectClient,
228                        int32_t priority,
229                        audio_io_handle_t io,
230                        audio_session_t sessionId,
231                        const String16& opPackageName,
232                        pid_t pid,
233                        status_t *status /*non-NULL*/,
234                        int *id,
235                        int *enabled);
236
237    virtual status_t moveEffects(audio_session_t sessionId, audio_io_handle_t srcOutput,
238                        audio_io_handle_t dstOutput);
239
240    virtual audio_module_handle_t loadHwModule(const char *name);
241
242    virtual uint32_t getPrimaryOutputSamplingRate();
243    virtual size_t getPrimaryOutputFrameCount();
244
245    virtual status_t setLowRamDevice(bool isLowRamDevice);
246
247    /* List available audio ports and their attributes */
248    virtual status_t listAudioPorts(unsigned int *num_ports,
249                                    struct audio_port *ports);
250
251    /* Get attributes for a given audio port */
252    virtual status_t getAudioPort(struct audio_port *port);
253
254    /* Create an audio patch between several source and sink ports */
255    virtual status_t createAudioPatch(const struct audio_patch *patch,
256                                       audio_patch_handle_t *handle);
257
258    /* Release an audio patch */
259    virtual status_t releaseAudioPatch(audio_patch_handle_t handle);
260
261    /* List existing audio patches */
262    virtual status_t listAudioPatches(unsigned int *num_patches,
263                                      struct audio_patch *patches);
264
265    /* Set audio port configuration */
266    virtual status_t setAudioPortConfig(const struct audio_port_config *config);
267
268    /* Get the HW synchronization source used for an audio session */
269    virtual audio_hw_sync_t getAudioHwSyncForSession(audio_session_t sessionId);
270
271    /* Indicate JAVA services are ready (scheduling, power management ...) */
272    virtual status_t systemReady();
273
274    virtual     status_t    onTransact(
275                                uint32_t code,
276                                const Parcel& data,
277                                Parcel* reply,
278                                uint32_t flags);
279
280    // end of IAudioFlinger interface
281
282    sp<NBLog::Writer>   newWriter_l(size_t size, const char *name);
283    void                unregisterWriter(const sp<NBLog::Writer>& writer);
284    sp<EffectsFactoryHalInterface> getEffectsFactory();
285private:
286    static const size_t kLogMemorySize = 40 * 1024;
287    sp<MemoryDealer>    mLogMemoryDealer;   // == 0 when NBLog is disabled
288    // When a log writer is unregistered, it is done lazily so that media.log can continue to see it
289    // for as long as possible.  The memory is only freed when it is needed for another log writer.
290    Vector< sp<NBLog::Writer> > mUnregisteredWriters;
291    Mutex               mUnregisteredWritersLock;
292public:
293
294    class SyncEvent;
295
296    typedef void (*sync_event_callback_t)(const wp<SyncEvent>& event) ;
297
298    class SyncEvent : public RefBase {
299    public:
300        SyncEvent(AudioSystem::sync_event_t type,
301                  audio_session_t triggerSession,
302                  audio_session_t listenerSession,
303                  sync_event_callback_t callBack,
304                  wp<RefBase> cookie)
305        : mType(type), mTriggerSession(triggerSession), mListenerSession(listenerSession),
306          mCallback(callBack), mCookie(cookie)
307        {}
308
309        virtual ~SyncEvent() {}
310
311        void trigger() { Mutex::Autolock _l(mLock); if (mCallback) mCallback(this); }
312        bool isCancelled() const { Mutex::Autolock _l(mLock); return (mCallback == NULL); }
313        void cancel() { Mutex::Autolock _l(mLock); mCallback = NULL; }
314        AudioSystem::sync_event_t type() const { return mType; }
315        audio_session_t triggerSession() const { return mTriggerSession; }
316        audio_session_t listenerSession() const { return mListenerSession; }
317        wp<RefBase> cookie() const { return mCookie; }
318
319    private:
320          const AudioSystem::sync_event_t mType;
321          const audio_session_t mTriggerSession;
322          const audio_session_t mListenerSession;
323          sync_event_callback_t mCallback;
324          const wp<RefBase> mCookie;
325          mutable Mutex mLock;
326    };
327
328    sp<SyncEvent> createSyncEvent(AudioSystem::sync_event_t type,
329                                        audio_session_t triggerSession,
330                                        audio_session_t listenerSession,
331                                        sync_event_callback_t callBack,
332                                        const wp<RefBase>& cookie);
333
334private:
335
336               audio_mode_t getMode() const { return mMode; }
337
338                bool        btNrecIsOff() const { return mBtNrecIsOff; }
339
340                            AudioFlinger() ANDROID_API;
341    virtual                 ~AudioFlinger();
342
343    // call in any IAudioFlinger method that accesses mPrimaryHardwareDev
344    status_t                initCheck() const { return mPrimaryHardwareDev == NULL ?
345                                                        NO_INIT : NO_ERROR; }
346
347    // RefBase
348    virtual     void        onFirstRef();
349
350    AudioHwDevice*          findSuitableHwDev_l(audio_module_handle_t module,
351                                                audio_devices_t devices);
352    void                    purgeStaleEffects_l();
353
354    // Set kEnableExtendedChannels to true to enable greater than stereo output
355    // for the MixerThread and device sink.  Number of channels allowed is
356    // FCC_2 <= channels <= AudioMixer::MAX_NUM_CHANNELS.
357    static const bool kEnableExtendedChannels = true;
358
359    // Returns true if channel mask is permitted for the PCM sink in the MixerThread
360    static inline bool isValidPcmSinkChannelMask(audio_channel_mask_t channelMask) {
361        switch (audio_channel_mask_get_representation(channelMask)) {
362        case AUDIO_CHANNEL_REPRESENTATION_POSITION: {
363            uint32_t channelCount = FCC_2; // stereo is default
364            if (kEnableExtendedChannels) {
365                channelCount = audio_channel_count_from_out_mask(channelMask);
366                if (channelCount < FCC_2 // mono is not supported at this time
367                        || channelCount > AudioMixer::MAX_NUM_CHANNELS) {
368                    return false;
369                }
370            }
371            // check that channelMask is the "canonical" one we expect for the channelCount.
372            return channelMask == audio_channel_out_mask_from_count(channelCount);
373            }
374        case AUDIO_CHANNEL_REPRESENTATION_INDEX:
375            if (kEnableExtendedChannels) {
376                const uint32_t channelCount = audio_channel_count_from_out_mask(channelMask);
377                if (channelCount >= FCC_2 // mono is not supported at this time
378                        && channelCount <= AudioMixer::MAX_NUM_CHANNELS) {
379                    return true;
380                }
381            }
382            return false;
383        default:
384            return false;
385        }
386    }
387
388    // Set kEnableExtendedPrecision to true to use extended precision in MixerThread
389    static const bool kEnableExtendedPrecision = true;
390
391    // Returns true if format is permitted for the PCM sink in the MixerThread
392    static inline bool isValidPcmSinkFormat(audio_format_t format) {
393        switch (format) {
394        case AUDIO_FORMAT_PCM_16_BIT:
395            return true;
396        case AUDIO_FORMAT_PCM_FLOAT:
397        case AUDIO_FORMAT_PCM_24_BIT_PACKED:
398        case AUDIO_FORMAT_PCM_32_BIT:
399        case AUDIO_FORMAT_PCM_8_24_BIT:
400            return kEnableExtendedPrecision;
401        default:
402            return false;
403        }
404    }
405
406    // standby delay for MIXER and DUPLICATING playback threads is read from property
407    // ro.audio.flinger_standbytime_ms or defaults to kDefaultStandbyTimeInNsecs
408    static nsecs_t          mStandbyTimeInNsecs;
409
410    // incremented by 2 when screen state changes, bit 0 == 1 means "off"
411    // AudioFlinger::setParameters() updates, other threads read w/o lock
412    static uint32_t         mScreenState;
413
414    // Internal dump utilities.
415    static const int kDumpLockRetries = 50;
416    static const int kDumpLockSleepUs = 20000;
417    static bool dumpTryLock(Mutex& mutex);
418    void dumpPermissionDenial(int fd, const Vector<String16>& args);
419    void dumpClients(int fd, const Vector<String16>& args);
420    void dumpInternals(int fd, const Vector<String16>& args);
421
422    // --- Client ---
423    class Client : public RefBase {
424    public:
425                            Client(const sp<AudioFlinger>& audioFlinger, pid_t pid);
426        virtual             ~Client();
427        sp<MemoryDealer>    heap() const;
428        pid_t               pid() const { return mPid; }
429        sp<AudioFlinger>    audioFlinger() const { return mAudioFlinger; }
430
431    private:
432                            Client(const Client&);
433                            Client& operator = (const Client&);
434        const sp<AudioFlinger> mAudioFlinger;
435              sp<MemoryDealer> mMemoryDealer;
436        const pid_t         mPid;
437    };
438
439    // --- Notification Client ---
440    class NotificationClient : public IBinder::DeathRecipient {
441    public:
442                            NotificationClient(const sp<AudioFlinger>& audioFlinger,
443                                                const sp<IAudioFlingerClient>& client,
444                                                pid_t pid);
445        virtual             ~NotificationClient();
446
447                sp<IAudioFlingerClient> audioFlingerClient() const { return mAudioFlingerClient; }
448
449                // IBinder::DeathRecipient
450                virtual     void        binderDied(const wp<IBinder>& who);
451
452    private:
453                            NotificationClient(const NotificationClient&);
454                            NotificationClient& operator = (const NotificationClient&);
455
456        const sp<AudioFlinger>  mAudioFlinger;
457        const pid_t             mPid;
458        const sp<IAudioFlingerClient> mAudioFlingerClient;
459    };
460
461    class TrackHandle;
462    class RecordHandle;
463    class RecordThread;
464    class PlaybackThread;
465    class MixerThread;
466    class DirectOutputThread;
467    class OffloadThread;
468    class DuplicatingThread;
469    class AsyncCallbackThread;
470    class Track;
471    class RecordTrack;
472    class EffectModule;
473    class EffectHandle;
474    class EffectChain;
475
476    struct AudioStreamIn;
477
478    struct  stream_type_t {
479        stream_type_t()
480            :   volume(1.0f),
481                mute(false)
482        {
483        }
484        float       volume;
485        bool        mute;
486    };
487
488    // --- PlaybackThread ---
489
490#include "Threads.h"
491
492#include "Effects.h"
493
494#include "PatchPanel.h"
495
496    // server side of the client's IAudioTrack
497    class TrackHandle : public android::BnAudioTrack {
498    public:
499        explicit            TrackHandle(const sp<PlaybackThread::Track>& track);
500        virtual             ~TrackHandle();
501        virtual sp<IMemory> getCblk() const;
502        virtual status_t    start();
503        virtual void        stop();
504        virtual void        flush();
505        virtual void        pause();
506        virtual status_t    attachAuxEffect(int effectId);
507        virtual status_t    setParameters(const String8& keyValuePairs);
508        virtual status_t    getTimestamp(AudioTimestamp& timestamp);
509        virtual void        signal(); // signal playback thread for a change in control block
510
511        virtual status_t onTransact(
512            uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
513
514    private:
515        const sp<PlaybackThread::Track> mTrack;
516    };
517
518    // server side of the client's IAudioRecord
519    class RecordHandle : public android::BnAudioRecord {
520    public:
521        explicit RecordHandle(const sp<RecordThread::RecordTrack>& recordTrack);
522        virtual             ~RecordHandle();
523        virtual status_t    start(int /*AudioSystem::sync_event_t*/ event,
524                audio_session_t triggerSession);
525        virtual void        stop();
526        virtual status_t onTransact(
527            uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
528    private:
529        const sp<RecordThread::RecordTrack> mRecordTrack;
530
531        // for use from destructor
532        void                stop_nonvirtual();
533    };
534
535
536              ThreadBase *checkThread_l(audio_io_handle_t ioHandle) const;
537              PlaybackThread *checkPlaybackThread_l(audio_io_handle_t output) const;
538              MixerThread *checkMixerThread_l(audio_io_handle_t output) const;
539              RecordThread *checkRecordThread_l(audio_io_handle_t input) const;
540              sp<RecordThread> openInput_l(audio_module_handle_t module,
541                                           audio_io_handle_t *input,
542                                           audio_config_t *config,
543                                           audio_devices_t device,
544                                           const String8& address,
545                                           audio_source_t source,
546                                           audio_input_flags_t flags);
547              sp<PlaybackThread> openOutput_l(audio_module_handle_t module,
548                                              audio_io_handle_t *output,
549                                              audio_config_t *config,
550                                              audio_devices_t devices,
551                                              const String8& address,
552                                              audio_output_flags_t flags);
553
554              void closeOutputFinish(const sp<PlaybackThread>& thread);
555              void closeInputFinish(const sp<RecordThread>& thread);
556
557              // no range check, AudioFlinger::mLock held
558              bool streamMute_l(audio_stream_type_t stream) const
559                                { return mStreamTypes[stream].mute; }
560              // no range check, doesn't check per-thread stream volume, AudioFlinger::mLock held
561              float streamVolume_l(audio_stream_type_t stream) const
562                                { return mStreamTypes[stream].volume; }
563              void ioConfigChanged(audio_io_config_event event,
564                                   const sp<AudioIoDescriptor>& ioDesc,
565                                   pid_t pid = 0);
566
567              // Allocate an audio_unique_id_t.
568              // Specific types are audio_io_handle_t, audio_session_t, effect ID (int),
569              // audio_module_handle_t, and audio_patch_handle_t.
570              // They all share the same ID space, but the namespaces are actually independent
571              // because there are separate KeyedVectors for each kind of ID.
572              // The return value is cast to the specific type depending on how the ID will be used.
573              // FIXME This API does not handle rollover to zero (for unsigned IDs),
574              //       or from positive to negative (for signed IDs).
575              //       Thus it may fail by returning an ID of the wrong sign,
576              //       or by returning a non-unique ID.
577              // This is the internal API.  For the binder API see newAudioUniqueId().
578              audio_unique_id_t nextUniqueId(audio_unique_id_use_t use);
579
580              status_t moveEffectChain_l(audio_session_t sessionId,
581                                     PlaybackThread *srcThread,
582                                     PlaybackThread *dstThread,
583                                     bool reRegister);
584
585              // return thread associated with primary hardware device, or NULL
586              PlaybackThread *primaryPlaybackThread_l() const;
587              audio_devices_t primaryOutputDevice_l() const;
588
589              // return the playback thread with smallest HAL buffer size, and prefer fast
590              PlaybackThread *fastPlaybackThread_l() const;
591
592              sp<PlaybackThread> getEffectThread_l(audio_session_t sessionId, int EffectId);
593
594
595                void        removeClient_l(pid_t pid);
596                void        removeNotificationClient(pid_t pid);
597                bool isNonOffloadableGlobalEffectEnabled_l();
598                void onNonOffloadableGlobalEffectEnable();
599                bool isSessionAcquired_l(audio_session_t audioSession);
600
601                // Store an effect chain to mOrphanEffectChains keyed vector.
602                // Called when a thread exits and effects are still attached to it.
603                // If effects are later created on the same session, they will reuse the same
604                // effect chain and same instances in the effect library.
605                // return ALREADY_EXISTS if a chain with the same session already exists in
606                // mOrphanEffectChains. Note that this should never happen as there is only one
607                // chain for a given session and it is attached to only one thread at a time.
608                status_t        putOrphanEffectChain_l(const sp<EffectChain>& chain);
609                // Get an effect chain for the specified session in mOrphanEffectChains and remove
610                // it if found. Returns 0 if not found (this is the most common case).
611                sp<EffectChain> getOrphanEffectChain_l(audio_session_t session);
612                // Called when the last effect handle on an effect instance is removed. If this
613                // effect belongs to an effect chain in mOrphanEffectChains, the chain is updated
614                // and removed from mOrphanEffectChains if it does not contain any effect.
615                // Return true if the effect was found in mOrphanEffectChains, false otherwise.
616                bool            updateOrphanEffectChains(const sp<EffectModule>& effect);
617
618                void broacastParametersToRecordThreads_l(const String8& keyValuePairs);
619
620    // AudioStreamIn is immutable, so their fields are const.
621    // For emphasis, we could also make all pointers to them be "const *",
622    // but that would clutter the code unnecessarily.
623
624    struct AudioStreamIn {
625        AudioHwDevice* const audioHwDev;
626        sp<StreamInHalInterface> stream;
627        audio_input_flags_t flags;
628
629        sp<DeviceHalInterface> hwDev() const { return audioHwDev->hwDevice(); }
630
631        AudioStreamIn(AudioHwDevice *dev, sp<StreamInHalInterface> in, audio_input_flags_t flags) :
632            audioHwDev(dev), stream(in), flags(flags) {}
633    };
634
635    // for mAudioSessionRefs only
636    struct AudioSessionRef {
637        AudioSessionRef(audio_session_t sessionid, pid_t pid) :
638            mSessionid(sessionid), mPid(pid), mCnt(1) {}
639        const audio_session_t mSessionid;
640        const pid_t mPid;
641        int         mCnt;
642    };
643
644    mutable     Mutex                               mLock;
645                // protects mClients and mNotificationClients.
646                // must be locked after mLock and ThreadBase::mLock if both must be locked
647                // avoids acquiring AudioFlinger::mLock from inside thread loop.
648    mutable     Mutex                               mClientLock;
649                // protected by mClientLock
650                DefaultKeyedVector< pid_t, wp<Client> >     mClients;   // see ~Client()
651
652                mutable     Mutex                   mHardwareLock;
653                // NOTE: If both mLock and mHardwareLock mutexes must be held,
654                // always take mLock before mHardwareLock
655
656                // These two fields are immutable after onFirstRef(), so no lock needed to access
657                AudioHwDevice*                      mPrimaryHardwareDev; // mAudioHwDevs[0] or NULL
658                DefaultKeyedVector<audio_module_handle_t, AudioHwDevice*>  mAudioHwDevs;
659
660                sp<DevicesFactoryHalInterface> mDevicesFactoryHal;
661
662    // for dump, indicates which hardware operation is currently in progress (but not stream ops)
663    enum hardware_call_state {
664        AUDIO_HW_IDLE = 0,              // no operation in progress
665        AUDIO_HW_INIT,                  // init_check
666        AUDIO_HW_OUTPUT_OPEN,           // open_output_stream
667        AUDIO_HW_OUTPUT_CLOSE,          // unused
668        AUDIO_HW_INPUT_OPEN,            // unused
669        AUDIO_HW_INPUT_CLOSE,           // unused
670        AUDIO_HW_STANDBY,               // unused
671        AUDIO_HW_SET_MASTER_VOLUME,     // set_master_volume
672        AUDIO_HW_GET_ROUTING,           // unused
673        AUDIO_HW_SET_ROUTING,           // unused
674        AUDIO_HW_GET_MODE,              // unused
675        AUDIO_HW_SET_MODE,              // set_mode
676        AUDIO_HW_GET_MIC_MUTE,          // get_mic_mute
677        AUDIO_HW_SET_MIC_MUTE,          // set_mic_mute
678        AUDIO_HW_SET_VOICE_VOLUME,      // set_voice_volume
679        AUDIO_HW_SET_PARAMETER,         // set_parameters
680        AUDIO_HW_GET_INPUT_BUFFER_SIZE, // get_input_buffer_size
681        AUDIO_HW_GET_MASTER_VOLUME,     // get_master_volume
682        AUDIO_HW_GET_PARAMETER,         // get_parameters
683        AUDIO_HW_SET_MASTER_MUTE,       // set_master_mute
684        AUDIO_HW_GET_MASTER_MUTE,       // get_master_mute
685    };
686
687    mutable     hardware_call_state                 mHardwareStatus;    // for dump only
688
689
690                DefaultKeyedVector< audio_io_handle_t, sp<PlaybackThread> >  mPlaybackThreads;
691                stream_type_t                       mStreamTypes[AUDIO_STREAM_CNT];
692
693                // member variables below are protected by mLock
694                float                               mMasterVolume;
695                bool                                mMasterMute;
696                // end of variables protected by mLock
697
698                DefaultKeyedVector< audio_io_handle_t, sp<RecordThread> >    mRecordThreads;
699
700                // protected by mClientLock
701                DefaultKeyedVector< pid_t, sp<NotificationClient> >    mNotificationClients;
702
703                // updated by atomic_fetch_add_explicit
704                volatile atomic_uint_fast32_t       mNextUniqueIds[AUDIO_UNIQUE_ID_USE_MAX];
705
706                audio_mode_t                        mMode;
707                bool                                mBtNrecIsOff;
708
709                // protected by mLock
710                Vector<AudioSessionRef*> mAudioSessionRefs;
711
712                float       masterVolume_l() const;
713                bool        masterMute_l() const;
714                audio_module_handle_t loadHwModule_l(const char *name);
715
716                Vector < sp<SyncEvent> > mPendingSyncEvents; // sync events awaiting for a session
717                                                             // to be created
718
719                // Effect chains without a valid thread
720                DefaultKeyedVector< audio_session_t , sp<EffectChain> > mOrphanEffectChains;
721
722                // list of sessions for which a valid HW A/V sync ID was retrieved from the HAL
723                DefaultKeyedVector< audio_session_t , audio_hw_sync_t >mHwAvSyncIds;
724private:
725    sp<Client>  registerPid(pid_t pid);    // always returns non-0
726
727    // for use from destructor
728    status_t    closeOutput_nonvirtual(audio_io_handle_t output);
729    void        closeOutputInternal_l(const sp<PlaybackThread>& thread);
730    status_t    closeInput_nonvirtual(audio_io_handle_t input);
731    void        closeInputInternal_l(const sp<RecordThread>& thread);
732    void        setAudioHwSyncForSession_l(PlaybackThread *thread, audio_session_t sessionId);
733
734    status_t    checkStreamType(audio_stream_type_t stream) const;
735
736#ifdef TEE_SINK
737    // all record threads serially share a common tee sink, which is re-created on format change
738    sp<NBAIO_Sink>   mRecordTeeSink;
739    sp<NBAIO_Source> mRecordTeeSource;
740#endif
741
742public:
743
744#ifdef TEE_SINK
745    // tee sink, if enabled by property, allows dumpsys to write most recent audio to .wav file
746    static void dumpTee(int fd, const sp<NBAIO_Source>& source, audio_io_handle_t id = 0);
747
748    // whether tee sink is enabled by property
749    static bool mTeeSinkInputEnabled;
750    static bool mTeeSinkOutputEnabled;
751    static bool mTeeSinkTrackEnabled;
752
753    // runtime configured size of each tee sink pipe, in frames
754    static size_t mTeeSinkInputFrames;
755    static size_t mTeeSinkOutputFrames;
756    static size_t mTeeSinkTrackFrames;
757
758    // compile-time default size of tee sink pipes, in frames
759    // 0x200000 stereo 16-bit PCM frames = 47.5 seconds at 44.1 kHz, 8 megabytes
760    static const size_t kTeeSinkInputFramesDefault = 0x200000;
761    static const size_t kTeeSinkOutputFramesDefault = 0x200000;
762    static const size_t kTeeSinkTrackFramesDefault = 0x200000;
763#endif
764
765    // This method reads from a variable without mLock, but the variable is updated under mLock.  So
766    // we might read a stale value, or a value that's inconsistent with respect to other variables.
767    // In this case, it's safe because the return value isn't used for making an important decision.
768    // The reason we don't want to take mLock is because it could block the caller for a long time.
769    bool    isLowRamDevice() const { return mIsLowRamDevice; }
770
771private:
772    bool    mIsLowRamDevice;
773    bool    mIsDeviceTypeKnown;
774    nsecs_t mGlobalEffectEnableTime;  // when a global effect was last enabled
775
776    sp<PatchPanel> mPatchPanel;
777    sp<EffectsFactoryHalInterface> mEffectsFactoryHal;
778
779    bool        mSystemReady;
780};
781
782#undef INCLUDING_FROM_AUDIOFLINGER_H
783
784std::string formatToString(audio_format_t format);
785std::string inputFlagsToString(audio_input_flags_t flags);
786std::string outputFlagsToString(audio_output_flags_t flags);
787std::string devicesToString(audio_devices_t devices);
788const char *sourceToString(audio_source_t source);
789
790// ----------------------------------------------------------------------------
791
792} // namespace android
793
794#endif // ANDROID_AUDIO_FLINGER_H
795