AudioFlinger.h revision 117cd9286424888c1c5bf202ebf1e08ae1e6affe
1/* //device/include/server/AudioFlinger/AudioFlinger.h
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 <stdint.h>
22#include <sys/types.h>
23#include <limits.h>
24
25#include <media/IAudioFlinger.h>
26#include <media/IAudioFlingerClient.h>
27#include <media/IAudioTrack.h>
28#include <media/IAudioRecord.h>
29#include <media/AudioTrack.h>
30
31#include <utils/Atomic.h>
32#include <utils/Errors.h>
33#include <utils/threads.h>
34#include <utils/SortedVector.h>
35#include <utils/Vector.h>
36
37#include <binder/BinderService.h>
38#include <binder/MemoryDealer.h>
39
40#include <hardware_legacy/AudioHardwareInterface.h>
41
42#include "AudioBufferProvider.h"
43
44namespace android {
45
46class audio_track_cblk_t;
47class effect_param_cblk_t;
48class AudioMixer;
49class AudioBuffer;
50class AudioResampler;
51
52
53// ----------------------------------------------------------------------------
54
55#define LIKELY( exp )       (__builtin_expect( (exp) != 0, true  ))
56#define UNLIKELY( exp )     (__builtin_expect( (exp) != 0, false ))
57
58
59// ----------------------------------------------------------------------------
60
61static const nsecs_t kStandbyTimeInNsecs = seconds(3);
62
63class AudioFlinger :
64    public BinderService<AudioFlinger>,
65    public BnAudioFlinger
66{
67    friend class BinderService<AudioFlinger>;
68public:
69    static char const* getServiceName() { return "media.audio_flinger"; }
70
71    virtual     status_t    dump(int fd, const Vector<String16>& args);
72
73    // IAudioFlinger interface
74    virtual sp<IAudioTrack> createTrack(
75                                pid_t pid,
76                                int streamType,
77                                uint32_t sampleRate,
78                                int format,
79                                int channelCount,
80                                int frameCount,
81                                uint32_t flags,
82                                const sp<IMemory>& sharedBuffer,
83                                int output,
84                                int *sessionId,
85                                status_t *status);
86
87    virtual     uint32_t    sampleRate(int output) const;
88    virtual     int         channelCount(int output) const;
89    virtual     int         format(int output) const;
90    virtual     size_t      frameCount(int output) const;
91    virtual     uint32_t    latency(int output) const;
92
93    virtual     status_t    setMasterVolume(float value);
94    virtual     status_t    setMasterMute(bool muted);
95
96    virtual     float       masterVolume() const;
97    virtual     bool        masterMute() const;
98
99    virtual     status_t    setStreamVolume(int stream, float value, int output);
100    virtual     status_t    setStreamMute(int stream, bool muted);
101
102    virtual     float       streamVolume(int stream, int output) const;
103    virtual     bool        streamMute(int stream) const;
104
105    virtual     status_t    setMode(int mode);
106
107    virtual     status_t    setMicMute(bool state);
108    virtual     bool        getMicMute() const;
109
110    virtual     status_t    setParameters(int ioHandle, const String8& keyValuePairs);
111    virtual     String8     getParameters(int ioHandle, const String8& keys);
112
113    virtual     void        registerClient(const sp<IAudioFlingerClient>& client);
114
115    virtual     size_t      getInputBufferSize(uint32_t sampleRate, int format, int channelCount);
116    virtual     unsigned int  getInputFramesLost(int ioHandle);
117
118    virtual int openOutput(uint32_t *pDevices,
119                                    uint32_t *pSamplingRate,
120                                    uint32_t *pFormat,
121                                    uint32_t *pChannels,
122                                    uint32_t *pLatencyMs,
123                                    uint32_t flags);
124
125    virtual int openDuplicateOutput(int output1, int output2);
126
127    virtual status_t closeOutput(int output);
128
129    virtual status_t suspendOutput(int output);
130
131    virtual status_t restoreOutput(int output);
132
133    virtual int openInput(uint32_t *pDevices,
134                            uint32_t *pSamplingRate,
135                            uint32_t *pFormat,
136                            uint32_t *pChannels,
137                            uint32_t acoustics);
138
139    virtual status_t closeInput(int input);
140
141    virtual status_t setStreamOutput(uint32_t stream, int output);
142
143    virtual status_t setVoiceVolume(float volume);
144
145    virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames, int output);
146
147    virtual int newAudioSessionId();
148
149    virtual status_t loadEffectLibrary(const char *libPath, int *handle);
150
151    virtual status_t unloadEffectLibrary(int handle);
152
153    virtual status_t queryNumberEffects(uint32_t *numEffects);
154
155    virtual status_t queryEffect(uint32_t index, effect_descriptor_t *descriptor);
156
157    virtual status_t getEffectDescriptor(effect_uuid_t *pUuid, effect_descriptor_t *descriptor);
158
159    virtual sp<IEffect> createEffect(pid_t pid,
160                        effect_descriptor_t *pDesc,
161                        const sp<IEffectClient>& effectClient,
162                        int32_t priority,
163                        int output,
164                        int sessionId,
165                        status_t *status,
166                        int *id,
167                        int *enabled);
168
169    virtual status_t moveEffects(int session, int srcOutput, int dstOutput);
170
171    enum hardware_call_state {
172        AUDIO_HW_IDLE = 0,
173        AUDIO_HW_INIT,
174        AUDIO_HW_OUTPUT_OPEN,
175        AUDIO_HW_OUTPUT_CLOSE,
176        AUDIO_HW_INPUT_OPEN,
177        AUDIO_HW_INPUT_CLOSE,
178        AUDIO_HW_STANDBY,
179        AUDIO_HW_SET_MASTER_VOLUME,
180        AUDIO_HW_GET_ROUTING,
181        AUDIO_HW_SET_ROUTING,
182        AUDIO_HW_GET_MODE,
183        AUDIO_HW_SET_MODE,
184        AUDIO_HW_GET_MIC_MUTE,
185        AUDIO_HW_SET_MIC_MUTE,
186        AUDIO_SET_VOICE_VOLUME,
187        AUDIO_SET_PARAMETER,
188    };
189
190    // record interface
191    virtual sp<IAudioRecord> openRecord(
192                                pid_t pid,
193                                int input,
194                                uint32_t sampleRate,
195                                int format,
196                                int channelCount,
197                                int frameCount,
198                                uint32_t flags,
199                                int *sessionId,
200                                status_t *status);
201
202    virtual     status_t    onTransact(
203                                uint32_t code,
204                                const Parcel& data,
205                                Parcel* reply,
206                                uint32_t flags);
207
208                uint32_t    getMode() { return mMode; }
209
210private:
211                            AudioFlinger();
212    virtual                 ~AudioFlinger();
213
214
215    // Internal dump utilites.
216    status_t dumpPermissionDenial(int fd, const Vector<String16>& args);
217    status_t dumpClients(int fd, const Vector<String16>& args);
218    status_t dumpInternals(int fd, const Vector<String16>& args);
219
220    // --- Client ---
221    class Client : public RefBase {
222    public:
223                            Client(const sp<AudioFlinger>& audioFlinger, pid_t pid);
224        virtual             ~Client();
225        const sp<MemoryDealer>&     heap() const;
226        pid_t               pid() const { return mPid; }
227        sp<AudioFlinger>    audioFlinger() { return mAudioFlinger; }
228
229    private:
230                            Client(const Client&);
231                            Client& operator = (const Client&);
232        sp<AudioFlinger>    mAudioFlinger;
233        sp<MemoryDealer>    mMemoryDealer;
234        pid_t               mPid;
235    };
236
237    // --- Notification Client ---
238    class NotificationClient : public IBinder::DeathRecipient {
239    public:
240                            NotificationClient(const sp<AudioFlinger>& audioFlinger,
241                                                const sp<IAudioFlingerClient>& client,
242                                                pid_t pid);
243        virtual             ~NotificationClient();
244
245                sp<IAudioFlingerClient>    client() { return mClient; }
246
247                // IBinder::DeathRecipient
248                virtual     void        binderDied(const wp<IBinder>& who);
249
250    private:
251                            NotificationClient(const NotificationClient&);
252                            NotificationClient& operator = (const NotificationClient&);
253
254        sp<AudioFlinger>        mAudioFlinger;
255        pid_t                   mPid;
256        sp<IAudioFlingerClient> mClient;
257    };
258
259    class TrackHandle;
260    class RecordHandle;
261    class RecordThread;
262    class PlaybackThread;
263    class MixerThread;
264    class DirectOutputThread;
265    class DuplicatingThread;
266    class Track;
267    class RecordTrack;
268    class EffectModule;
269    class EffectHandle;
270    class EffectChain;
271
272    class ThreadBase : public Thread {
273    public:
274        ThreadBase (const sp<AudioFlinger>& audioFlinger, int id);
275        virtual             ~ThreadBase();
276
277        status_t dumpBase(int fd, const Vector<String16>& args);
278
279        // base for record and playback
280        class TrackBase : public AudioBufferProvider, public RefBase {
281
282        public:
283            enum track_state {
284                IDLE,
285                TERMINATED,
286                STOPPED,
287                RESUMING,
288                ACTIVE,
289                PAUSING,
290                PAUSED
291            };
292
293            enum track_flags {
294                STEPSERVER_FAILED = 0x01, //  StepServer could not acquire cblk->lock mutex
295                SYSTEM_FLAGS_MASK = 0x0000ffffUL,
296                // The upper 16 bits are used for track-specific flags.
297            };
298
299                                TrackBase(const wp<ThreadBase>& thread,
300                                        const sp<Client>& client,
301                                        uint32_t sampleRate,
302                                        int format,
303                                        int channelCount,
304                                        int frameCount,
305                                        uint32_t flags,
306                                        const sp<IMemory>& sharedBuffer,
307                                        int sessionId);
308                                ~TrackBase();
309
310            virtual status_t    start() = 0;
311            virtual void        stop() = 0;
312                    sp<IMemory> getCblk() const;
313                    audio_track_cblk_t* cblk() const { return mCblk; }
314                    int         sessionId() { return mSessionId; }
315
316        protected:
317            friend class ThreadBase;
318            friend class RecordHandle;
319            friend class PlaybackThread;
320            friend class RecordThread;
321            friend class MixerThread;
322            friend class DirectOutputThread;
323
324                                TrackBase(const TrackBase&);
325                                TrackBase& operator = (const TrackBase&);
326
327            virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer) = 0;
328            virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);
329
330            int format() const {
331                return mFormat;
332            }
333
334            int channelCount() const ;
335
336            int sampleRate() const;
337
338            void* getBuffer(uint32_t offset, uint32_t frames) const;
339
340            bool isStopped() const {
341                return mState == STOPPED;
342            }
343
344            bool isTerminated() const {
345                return mState == TERMINATED;
346            }
347
348            bool step();
349            void reset();
350
351            wp<ThreadBase>      mThread;
352            sp<Client>          mClient;
353            sp<IMemory>         mCblkMemory;
354            audio_track_cblk_t* mCblk;
355            void*               mBuffer;
356            void*               mBufferEnd;
357            uint32_t            mFrameCount;
358            // we don't really need a lock for these
359            int                 mState;
360            int                 mClientTid;
361            uint8_t             mFormat;
362            uint32_t            mFlags;
363            int                 mSessionId;
364        };
365
366        class ConfigEvent {
367        public:
368            ConfigEvent() : mEvent(0), mParam(0) {}
369
370            int mEvent;
371            int mParam;
372        };
373
374                    uint32_t    sampleRate() const;
375                    int         channelCount() const;
376                    int         format() const;
377                    size_t      frameCount() const;
378                    void        wakeUp()    { mWaitWorkCV.broadcast(); }
379                    void        exit();
380        virtual     bool        checkForNewParameters_l() = 0;
381        virtual     status_t    setParameters(const String8& keyValuePairs);
382        virtual     String8     getParameters(const String8& keys) = 0;
383        virtual     void        audioConfigChanged_l(int event, int param = 0) = 0;
384                    void        sendConfigEvent(int event, int param = 0);
385                    void        sendConfigEvent_l(int event, int param = 0);
386                    void        processConfigEvents();
387                    int         id() const { return mId;}
388                    bool        standby() { return mStandby; }
389
390        mutable     Mutex                   mLock;
391
392    protected:
393
394        friend class Track;
395        friend class TrackBase;
396        friend class PlaybackThread;
397        friend class MixerThread;
398        friend class DirectOutputThread;
399        friend class DuplicatingThread;
400        friend class RecordThread;
401        friend class RecordTrack;
402
403                    Condition               mWaitWorkCV;
404                    sp<AudioFlinger>        mAudioFlinger;
405                    uint32_t                mSampleRate;
406                    size_t                  mFrameCount;
407                    uint32_t                mChannels;
408                    uint16_t                mChannelCount;
409                    uint16_t                mFrameSize;
410                    int                     mFormat;
411                    Condition               mParamCond;
412                    Vector<String8>         mNewParameters;
413                    status_t                mParamStatus;
414                    Vector<ConfigEvent *>   mConfigEvents;
415                    bool                    mStandby;
416                    int                     mId;
417                    bool                    mExiting;
418    };
419
420    // --- PlaybackThread ---
421    class PlaybackThread : public ThreadBase {
422    public:
423
424        enum type {
425            MIXER,
426            DIRECT,
427            DUPLICATING
428        };
429
430        enum mixer_state {
431            MIXER_IDLE,
432            MIXER_TRACKS_ENABLED,
433            MIXER_TRACKS_READY
434        };
435
436        // playback track
437        class Track : public TrackBase {
438        public:
439                                Track(  const wp<ThreadBase>& thread,
440                                        const sp<Client>& client,
441                                        int streamType,
442                                        uint32_t sampleRate,
443                                        int format,
444                                        int channelCount,
445                                        int frameCount,
446                                        const sp<IMemory>& sharedBuffer,
447                                        int sessionId);
448                                ~Track();
449
450                    void        dump(char* buffer, size_t size);
451            virtual status_t    start();
452            virtual void        stop();
453                    void        pause();
454
455                    void        flush();
456                    void        destroy();
457                    void        mute(bool);
458                    void        setVolume(float left, float right);
459                    int name() const {
460                        return mName;
461                    }
462
463                    int type() const {
464                        return mStreamType;
465                    }
466                    status_t    attachAuxEffect(int EffectId);
467                    void        setAuxBuffer(int EffectId, int32_t *buffer);
468                    int32_t     *auxBuffer() { return mAuxBuffer; }
469                    void        setMainBuffer(int16_t *buffer) { mMainBuffer = buffer; }
470                    int16_t     *mainBuffer() { return mMainBuffer; }
471                    int         auxEffectId() { return mAuxEffectId; }
472
473
474        protected:
475            friend class ThreadBase;
476            friend class AudioFlinger;
477            friend class TrackHandle;
478            friend class PlaybackThread;
479            friend class MixerThread;
480            friend class DirectOutputThread;
481
482                                Track(const Track&);
483                                Track& operator = (const Track&);
484
485            virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
486            bool isMuted() { return mMute; }
487            bool isPausing() const {
488                return mState == PAUSING;
489            }
490            bool isPaused() const {
491                return mState == PAUSED;
492            }
493            bool isReady() const;
494            void setPaused() { mState = PAUSED; }
495            void reset();
496
497            bool isOutputTrack() const {
498                return (mStreamType == AudioSystem::NUM_STREAM_TYPES);
499            }
500
501            // we don't really need a lock for these
502            float               mVolume[2];
503            volatile bool       mMute;
504            // FILLED state is used for suppressing volume ramp at begin of playing
505            enum {FS_FILLING, FS_FILLED, FS_ACTIVE};
506            mutable uint8_t     mFillingUpStatus;
507            int8_t              mRetryCount;
508            sp<IMemory>         mSharedBuffer;
509            bool                mResetDone;
510            int                 mStreamType;
511            int                 mName;
512            int16_t             *mMainBuffer;
513            int32_t             *mAuxBuffer;
514            int                 mAuxEffectId;
515            bool                mHasVolumeController;
516        };  // end of Track
517
518
519        // playback track
520        class OutputTrack : public Track {
521        public:
522
523            class Buffer: public AudioBufferProvider::Buffer {
524            public:
525                int16_t *mBuffer;
526            };
527
528                                OutputTrack(  const wp<ThreadBase>& thread,
529                                        DuplicatingThread *sourceThread,
530                                        uint32_t sampleRate,
531                                        int format,
532                                        int channelCount,
533                                        int frameCount);
534                                ~OutputTrack();
535
536            virtual status_t    start();
537            virtual void        stop();
538                    bool        write(int16_t* data, uint32_t frames);
539                    bool        bufferQueueEmpty() { return (mBufferQueue.size() == 0) ? true : false; }
540                    bool        isActive() { return mActive; }
541            wp<ThreadBase>&     thread()  { return mThread; }
542
543        private:
544
545            status_t            obtainBuffer(AudioBufferProvider::Buffer* buffer, uint32_t waitTimeMs);
546            void                clearBufferQueue();
547
548            // Maximum number of pending buffers allocated by OutputTrack::write()
549            static const uint8_t kMaxOverFlowBuffers = 10;
550
551            Vector < Buffer* >          mBufferQueue;
552            AudioBufferProvider::Buffer mOutBuffer;
553            bool                        mActive;
554            DuplicatingThread*          mSourceThread;
555        };  // end of OutputTrack
556
557        PlaybackThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id, uint32_t device);
558        virtual             ~PlaybackThread();
559
560        virtual     status_t    dump(int fd, const Vector<String16>& args);
561
562        // Thread virtuals
563        virtual     status_t    readyToRun();
564        virtual     void        onFirstRef();
565
566        virtual     uint32_t    latency() const;
567
568        virtual     status_t    setMasterVolume(float value);
569        virtual     status_t    setMasterMute(bool muted);
570
571        virtual     float       masterVolume() const;
572        virtual     bool        masterMute() const;
573
574        virtual     status_t    setStreamVolume(int stream, float value);
575        virtual     status_t    setStreamMute(int stream, bool muted);
576
577        virtual     float       streamVolume(int stream) const;
578        virtual     bool        streamMute(int stream) const;
579
580                    sp<Track>   createTrack_l(
581                                    const sp<AudioFlinger::Client>& client,
582                                    int streamType,
583                                    uint32_t sampleRate,
584                                    int format,
585                                    int channelCount,
586                                    int frameCount,
587                                    const sp<IMemory>& sharedBuffer,
588                                    int sessionId,
589                                    status_t *status);
590
591                    AudioStreamOut* getOutput() { return mOutput; }
592
593        virtual     int         type() const { return mType; }
594                    void        suspend() { mSuspended++; }
595                    void        restore() { if (mSuspended) mSuspended--; }
596                    bool        isSuspended() { return (mSuspended != 0); }
597        virtual     String8     getParameters(const String8& keys);
598        virtual     void        audioConfigChanged_l(int event, int param = 0);
599        virtual     status_t    getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames);
600                    int16_t     *mixBuffer() { return mMixBuffer; };
601
602                    sp<EffectHandle> createEffect_l(
603                                        const sp<AudioFlinger::Client>& client,
604                                        const sp<IEffectClient>& effectClient,
605                                        int32_t priority,
606                                        int sessionId,
607                                        effect_descriptor_t *desc,
608                                        int *enabled,
609                                        status_t *status);
610                    void disconnectEffect(const sp< EffectModule>& effect,
611                                          const wp<EffectHandle>& handle);
612
613                    // return values for hasAudioSession (bit field)
614                    enum effect_state {
615                        EFFECT_SESSION = 0x1,   // the audio session corresponds to at least one
616                                                // effect
617                        TRACK_SESSION = 0x2     // the audio session corresponds to at least one
618                                                // track
619                    };
620
621                    uint32_t hasAudioSession(int sessionId);
622                    sp<EffectChain> getEffectChain(int sessionId);
623                    sp<EffectChain> getEffectChain_l(int sessionId);
624                    status_t addEffectChain_l(const sp<EffectChain>& chain);
625                    size_t removeEffectChain_l(const sp<EffectChain>& chain);
626                    void lockEffectChains_l(Vector<sp <EffectChain> >& effectChains);
627                    void unlockEffectChains(Vector<sp <EffectChain> >& effectChains);
628
629                    sp<AudioFlinger::EffectModule> getEffect_l(int sessionId, int effectId);
630                    void detachAuxEffect_l(int effectId);
631                    status_t attachAuxEffect(const sp<AudioFlinger::PlaybackThread::Track> track,
632                            int EffectId);
633                    status_t attachAuxEffect_l(const sp<AudioFlinger::PlaybackThread::Track> track,
634                            int EffectId);
635                    void setMode(uint32_t mode);
636
637                    status_t addEffect_l(const sp< EffectModule>& effect);
638                    void removeEffect_l(const sp< EffectModule>& effect);
639
640                    uint32_t getStrategyForSession_l(int sessionId);
641
642        struct  stream_type_t {
643            stream_type_t()
644                :   volume(1.0f),
645                    mute(false)
646            {
647            }
648            float       volume;
649            bool        mute;
650        };
651
652    protected:
653        int                             mType;
654        int16_t*                        mMixBuffer;
655        int                             mSuspended;
656        int                             mBytesWritten;
657        bool                            mMasterMute;
658        SortedVector< wp<Track> >       mActiveTracks;
659
660        virtual int             getTrackName_l() = 0;
661        virtual void            deleteTrackName_l(int name) = 0;
662        virtual uint32_t        activeSleepTimeUs() = 0;
663        virtual uint32_t        idleSleepTimeUs() = 0;
664        virtual uint32_t        suspendSleepTimeUs() = 0;
665
666    private:
667
668        friend class AudioFlinger;
669        friend class OutputTrack;
670        friend class Track;
671        friend class TrackBase;
672        friend class MixerThread;
673        friend class DirectOutputThread;
674        friend class DuplicatingThread;
675
676        PlaybackThread(const Client&);
677        PlaybackThread& operator = (const PlaybackThread&);
678
679        status_t    addTrack_l(const sp<Track>& track);
680        void        destroyTrack_l(const sp<Track>& track);
681
682        void        readOutputParameters();
683
684        uint32_t    device() { return mDevice; }
685
686        virtual status_t    dumpInternals(int fd, const Vector<String16>& args);
687        status_t    dumpTracks(int fd, const Vector<String16>& args);
688        status_t    dumpEffectChains(int fd, const Vector<String16>& args);
689
690        SortedVector< sp<Track> >       mTracks;
691        // mStreamTypes[] uses 1 additionnal stream type internally for the OutputTrack used by DuplicatingThread
692        stream_type_t                   mStreamTypes[AudioSystem::NUM_STREAM_TYPES + 1];
693        AudioStreamOut*                 mOutput;
694        float                           mMasterVolume;
695        nsecs_t                         mLastWriteTime;
696        int                             mNumWrites;
697        int                             mNumDelayedWrites;
698        bool                            mInWrite;
699        Vector< sp<EffectChain> >       mEffectChains;
700        uint32_t                        mDevice;
701    };
702
703    class MixerThread : public PlaybackThread {
704    public:
705        MixerThread (const sp<AudioFlinger>& audioFlinger,
706                     AudioStreamOut* output,
707                     int id,
708                     uint32_t device);
709        virtual             ~MixerThread();
710
711        // Thread virtuals
712        virtual     bool        threadLoop();
713
714                    void        invalidateTracks(int streamType);
715        virtual     bool        checkForNewParameters_l();
716        virtual     status_t    dumpInternals(int fd, const Vector<String16>& args);
717
718    protected:
719                    uint32_t    prepareTracks_l(const SortedVector< wp<Track> >& activeTracks,
720                                                Vector< sp<Track> > *tracksToRemove);
721        virtual     int         getTrackName_l();
722        virtual     void        deleteTrackName_l(int name);
723        virtual     uint32_t    activeSleepTimeUs();
724        virtual     uint32_t    idleSleepTimeUs();
725        virtual     uint32_t    suspendSleepTimeUs();
726
727        AudioMixer*                     mAudioMixer;
728    };
729
730    class DirectOutputThread : public PlaybackThread {
731    public:
732
733        DirectOutputThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id, uint32_t device);
734        ~DirectOutputThread();
735
736        // Thread virtuals
737        virtual     bool        threadLoop();
738
739        virtual     bool        checkForNewParameters_l();
740
741    protected:
742        virtual     int         getTrackName_l();
743        virtual     void        deleteTrackName_l(int name);
744        virtual     uint32_t    activeSleepTimeUs();
745        virtual     uint32_t    idleSleepTimeUs();
746        virtual     uint32_t    suspendSleepTimeUs();
747
748    private:
749        void applyVolume(uint16_t leftVol, uint16_t rightVol, bool ramp);
750
751        float mLeftVolFloat;
752        float mRightVolFloat;
753        uint16_t mLeftVolShort;
754        uint16_t mRightVolShort;
755    };
756
757    class DuplicatingThread : public MixerThread {
758    public:
759        DuplicatingThread (const sp<AudioFlinger>& audioFlinger, MixerThread* mainThread, int id);
760        ~DuplicatingThread();
761
762        // Thread virtuals
763        virtual     bool        threadLoop();
764                    void        addOutputTrack(MixerThread* thread);
765                    void        removeOutputTrack(MixerThread* thread);
766                    uint32_t    waitTimeMs() { return mWaitTimeMs; }
767    protected:
768        virtual     uint32_t    activeSleepTimeUs();
769
770    private:
771                    bool        outputsReady(SortedVector< sp<OutputTrack> > &outputTracks);
772                    void        updateWaitTime();
773
774        SortedVector < sp<OutputTrack> >  mOutputTracks;
775                    uint32_t    mWaitTimeMs;
776    };
777
778              PlaybackThread *checkPlaybackThread_l(int output) const;
779              MixerThread *checkMixerThread_l(int output) const;
780              RecordThread *checkRecordThread_l(int input) const;
781              float streamVolumeInternal(int stream) const { return mStreamTypes[stream].volume; }
782              void audioConfigChanged_l(int event, int ioHandle, void *param2);
783
784              int  nextUniqueId_l();
785              status_t moveEffectChain_l(int session,
786                                     AudioFlinger::PlaybackThread *srcThread,
787                                     AudioFlinger::PlaybackThread *dstThread,
788                                     bool reRegister);
789
790    friend class AudioBuffer;
791
792    class TrackHandle : public android::BnAudioTrack {
793    public:
794                            TrackHandle(const sp<PlaybackThread::Track>& track);
795        virtual             ~TrackHandle();
796        virtual status_t    start();
797        virtual void        stop();
798        virtual void        flush();
799        virtual void        mute(bool);
800        virtual void        pause();
801        virtual void        setVolume(float left, float right);
802        virtual sp<IMemory> getCblk() const;
803        virtual status_t    attachAuxEffect(int effectId);
804        virtual status_t onTransact(
805            uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
806    private:
807        sp<PlaybackThread::Track> mTrack;
808    };
809
810    friend class Client;
811    friend class PlaybackThread::Track;
812
813
814                void        removeClient_l(pid_t pid);
815                void        removeNotificationClient(pid_t pid);
816
817
818    // record thread
819    class RecordThread : public ThreadBase, public AudioBufferProvider
820    {
821    public:
822
823        // record track
824        class RecordTrack : public TrackBase {
825        public:
826                                RecordTrack(const wp<ThreadBase>& thread,
827                                        const sp<Client>& client,
828                                        uint32_t sampleRate,
829                                        int format,
830                                        int channelCount,
831                                        int frameCount,
832                                        uint32_t flags,
833                                        int sessionId);
834                                ~RecordTrack();
835
836            virtual status_t    start();
837            virtual void        stop();
838
839                    bool        overflow() { bool tmp = mOverflow; mOverflow = false; return tmp; }
840                    bool        setOverflow() { bool tmp = mOverflow; mOverflow = true; return tmp; }
841
842                    void        dump(char* buffer, size_t size);
843        private:
844            friend class AudioFlinger;
845            friend class RecordThread;
846
847                                RecordTrack(const RecordTrack&);
848                                RecordTrack& operator = (const RecordTrack&);
849
850            virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
851
852            bool                mOverflow;
853        };
854
855
856                RecordThread(const sp<AudioFlinger>& audioFlinger,
857                        AudioStreamIn *input,
858                        uint32_t sampleRate,
859                        uint32_t channels,
860                        int id);
861                ~RecordThread();
862
863        virtual bool        threadLoop();
864        virtual status_t    readyToRun() { return NO_ERROR; }
865        virtual void        onFirstRef();
866
867                status_t    start(RecordTrack* recordTrack);
868                void        stop(RecordTrack* recordTrack);
869                status_t    dump(int fd, const Vector<String16>& args);
870                AudioStreamIn* getInput() { return mInput; }
871
872        virtual status_t    getNextBuffer(AudioBufferProvider::Buffer* buffer);
873        virtual void        releaseBuffer(AudioBufferProvider::Buffer* buffer);
874        virtual bool        checkForNewParameters_l();
875        virtual String8     getParameters(const String8& keys);
876        virtual void        audioConfigChanged_l(int event, int param = 0);
877                void        readInputParameters();
878        virtual unsigned int  getInputFramesLost();
879
880    private:
881                RecordThread();
882                AudioStreamIn                       *mInput;
883                sp<RecordTrack>                     mActiveTrack;
884                Condition                           mStartStopCond;
885                AudioResampler                      *mResampler;
886                int32_t                             *mRsmpOutBuffer;
887                int16_t                             *mRsmpInBuffer;
888                size_t                              mRsmpInIndex;
889                size_t                              mInputBytes;
890                int                                 mReqChannelCount;
891                uint32_t                            mReqSampleRate;
892                ssize_t                             mBytesRead;
893    };
894
895    class RecordHandle : public android::BnAudioRecord {
896    public:
897        RecordHandle(const sp<RecordThread::RecordTrack>& recordTrack);
898        virtual             ~RecordHandle();
899        virtual status_t    start();
900        virtual void        stop();
901        virtual sp<IMemory> getCblk() const;
902        virtual status_t onTransact(
903            uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
904    private:
905        sp<RecordThread::RecordTrack> mRecordTrack;
906    };
907
908    //--- Audio Effect Management
909
910    // EffectModule and EffectChain classes both have their own mutex to protect
911    // state changes or resource modifications. Always respect the following order
912    // if multiple mutexes must be acquired to avoid cross deadlock:
913    // AudioFlinger -> ThreadBase -> EffectChain -> EffectModule
914
915    // The EffectModule class is a wrapper object controlling the effect engine implementation
916    // in the effect library. It prevents concurrent calls to process() and command() functions
917    // from different client threads. It keeps a list of EffectHandle objects corresponding
918    // to all client applications using this effect and notifies applications of effect state,
919    // control or parameter changes. It manages the activation state machine to send appropriate
920    // reset, enable, disable commands to effect engine and provide volume
921    // ramping when effects are activated/deactivated.
922    // When controlling an auxiliary effect, the EffectModule also provides an input buffer used by
923    // the attached track(s) to accumulate their auxiliary channel.
924    class EffectModule: public RefBase {
925    public:
926        EffectModule(const wp<ThreadBase>& wThread,
927                        const wp<AudioFlinger::EffectChain>& chain,
928                        effect_descriptor_t *desc,
929                        int id,
930                        int sessionId);
931        ~EffectModule();
932
933        enum effect_state {
934            IDLE,
935            RESTART,
936            STARTING,
937            ACTIVE,
938            STOPPING,
939            STOPPED
940        };
941
942        int         id() { return mId; }
943        void process();
944        void updateState();
945        status_t command(uint32_t cmdCode,
946                         uint32_t cmdSize,
947                         void *pCmdData,
948                         uint32_t *replySize,
949                         void *pReplyData);
950
951        void reset_l();
952        status_t configure();
953        status_t init();
954        uint32_t state() {
955            return mState;
956        }
957        uint32_t status() {
958            return mStatus;
959        }
960        int sessionId() {
961            return mSessionId;
962        }
963        status_t    setEnabled(bool enabled);
964        bool isEnabled();
965        bool isProcessEnabled();
966
967        void        setInBuffer(int16_t *buffer) { mConfig.inputCfg.buffer.s16 = buffer; }
968        int16_t     *inBuffer() { return mConfig.inputCfg.buffer.s16; }
969        void        setOutBuffer(int16_t *buffer) { mConfig.outputCfg.buffer.s16 = buffer; }
970        int16_t     *outBuffer() { return mConfig.outputCfg.buffer.s16; }
971        void        setChain(const wp<EffectChain>& chain) { mChain = chain; }
972        void        setThread(const wp<ThreadBase>& thread) { mThread = thread; }
973
974        status_t addHandle(sp<EffectHandle>& handle);
975        void disconnect(const wp<EffectHandle>& handle);
976        size_t removeHandle (const wp<EffectHandle>& handle);
977
978        effect_descriptor_t& desc() { return mDescriptor; }
979        wp<EffectChain>&     chain() { return mChain; }
980
981        status_t         setDevice(uint32_t device);
982        status_t         setVolume(uint32_t *left, uint32_t *right, bool controller);
983        status_t         setMode(uint32_t mode);
984
985        status_t         dump(int fd, const Vector<String16>& args);
986
987    protected:
988
989        // Maximum time allocated to effect engines to complete the turn off sequence
990        static const uint32_t MAX_DISABLE_TIME_MS = 10000;
991
992        EffectModule(const EffectModule&);
993        EffectModule& operator = (const EffectModule&);
994
995        status_t start_l();
996        status_t stop_l();
997
998        // update this table when AudioSystem::audio_devices or audio_device_e (in EffectApi.h) are modified
999        static const uint32_t sDeviceConvTable[];
1000        static uint32_t deviceAudioSystemToEffectApi(uint32_t device);
1001
1002        // update this table when AudioSystem::audio_mode or audio_mode_e (in EffectApi.h) are modified
1003        static const uint32_t sModeConvTable[];
1004        static int modeAudioSystemToEffectApi(uint32_t mode);
1005
1006        Mutex               mLock;      // mutex for process, commands and handles list protection
1007        wp<ThreadBase>      mThread;    // parent thread
1008        wp<EffectChain>     mChain;     // parent effect chain
1009        int                 mId;        // this instance unique ID
1010        int                 mSessionId; // audio session ID
1011        effect_descriptor_t mDescriptor;// effect descriptor received from effect engine
1012        effect_config_t     mConfig;    // input and output audio configuration
1013        effect_interface_t  mEffectInterface; // Effect module C API
1014        status_t mStatus;               // initialization status
1015        uint32_t mState;                // current activation state (effect_state)
1016        Vector< wp<EffectHandle> > mHandles;    // list of client handles
1017        uint32_t mMaxDisableWaitCnt;    // maximum grace period before forcing an effect off after
1018                                        // sending disable command.
1019        uint32_t mDisableWaitCnt;       // current process() calls count during disable period.
1020    };
1021
1022    // The EffectHandle class implements the IEffect interface. It provides resources
1023    // to receive parameter updates, keeps track of effect control
1024    // ownership and state and has a pointer to the EffectModule object it is controlling.
1025    // There is one EffectHandle object for each application controlling (or using)
1026    // an effect module.
1027    // The EffectHandle is obtained by calling AudioFlinger::createEffect().
1028    class EffectHandle: public android::BnEffect {
1029    public:
1030
1031        EffectHandle(const sp<EffectModule>& effect,
1032                const sp<AudioFlinger::Client>& client,
1033                const sp<IEffectClient>& effectClient,
1034                int32_t priority);
1035        virtual ~EffectHandle();
1036
1037        // IEffect
1038        virtual status_t enable();
1039        virtual status_t disable();
1040        virtual status_t command(uint32_t cmdCode,
1041                                 uint32_t cmdSize,
1042                                 void *pCmdData,
1043                                 uint32_t *replySize,
1044                                 void *pReplyData);
1045        virtual void disconnect();
1046        virtual sp<IMemory> getCblk() const;
1047        virtual status_t onTransact(uint32_t code, const Parcel& data,
1048                Parcel* reply, uint32_t flags);
1049
1050
1051        // Give or take control of effect module
1052        void setControl(bool hasControl, bool signal);
1053        void commandExecuted(uint32_t cmdCode,
1054                             uint32_t cmdSize,
1055                             void *pCmdData,
1056                             uint32_t replySize,
1057                             void *pReplyData);
1058        void setEnabled(bool enabled);
1059
1060        // Getters
1061        int id() { return mEffect->id(); }
1062        int priority() { return mPriority; }
1063        bool hasControl() { return mHasControl; }
1064        sp<EffectModule> effect() { return mEffect; }
1065
1066        void dump(char* buffer, size_t size);
1067
1068    protected:
1069
1070        EffectHandle(const EffectHandle&);
1071        EffectHandle& operator =(const EffectHandle&);
1072
1073        sp<EffectModule> mEffect;           // pointer to controlled EffectModule
1074        sp<IEffectClient> mEffectClient;    // callback interface for client notifications
1075        sp<Client>          mClient;        // client for shared memory allocation
1076        sp<IMemory>         mCblkMemory;    // shared memory for control block
1077        effect_param_cblk_t* mCblk;         // control block for deferred parameter setting via shared memory
1078        uint8_t*            mBuffer;        // pointer to parameter area in shared memory
1079        int mPriority;                      // client application priority to control the effect
1080        bool mHasControl;                   // true if this handle is controlling the effect
1081    };
1082
1083    // the EffectChain class represents a group of effects associated to one audio session.
1084    // There can be any number of EffectChain objects per output mixer thread (PlaybackThread).
1085    // The EffecChain with session ID 0 contains global effects applied to the output mix.
1086    // Effects in this chain can be insert or auxiliary. Effects in other chains (attached to tracks)
1087    // are insert only. The EffectChain maintains an ordered list of effect module, the order corresponding
1088    // in the effect process order. When attached to a track (session ID != 0), it also provide it's own
1089    // input buffer used by the track as accumulation buffer.
1090    class EffectChain: public RefBase {
1091    public:
1092        EffectChain(const wp<ThreadBase>& wThread, int sessionId);
1093        ~EffectChain();
1094
1095        void process_l();
1096
1097        void lock() {
1098            mLock.lock();
1099        }
1100        void unlock() {
1101            mLock.unlock();
1102        }
1103
1104        status_t addEffect_l(const sp<EffectModule>& handle);
1105        size_t removeEffect_l(const sp<EffectModule>& handle);
1106
1107        int sessionId() {
1108            return mSessionId;
1109        }
1110
1111        sp<EffectModule> getEffectFromDesc_l(effect_descriptor_t *descriptor);
1112        sp<EffectModule> getEffectFromId_l(int id);
1113        bool setVolume_l(uint32_t *left, uint32_t *right);
1114        void setDevice_l(uint32_t device);
1115        void setMode_l(uint32_t mode);
1116
1117        void setInBuffer(int16_t *buffer, bool ownsBuffer = false) {
1118            mInBuffer = buffer;
1119            mOwnInBuffer = ownsBuffer;
1120        }
1121        int16_t *inBuffer() {
1122            return mInBuffer;
1123        }
1124        void setOutBuffer(int16_t *buffer) {
1125            mOutBuffer = buffer;
1126        }
1127        int16_t *outBuffer() {
1128            return mOutBuffer;
1129        }
1130
1131        void startTrack() {mActiveTrackCnt++;}
1132        void stopTrack() {mActiveTrackCnt--;}
1133        int activeTracks() { return mActiveTrackCnt;}
1134
1135        uint32_t strategy() { return mStrategy; }
1136        void setStrategy(uint32_t strategy)
1137                 { mStrategy = strategy; }
1138
1139        status_t dump(int fd, const Vector<String16>& args);
1140
1141    protected:
1142
1143        EffectChain(const EffectChain&);
1144        EffectChain& operator =(const EffectChain&);
1145
1146        wp<ThreadBase> mThread;     // parent mixer thread
1147        Mutex mLock;                // mutex protecting effect list
1148        Vector<sp<EffectModule> > mEffects; // list of effect modules
1149        int mSessionId;             // audio session ID
1150        int16_t *mInBuffer;         // chain input buffer
1151        int16_t *mOutBuffer;        // chain output buffer
1152        int mActiveTrackCnt;        // number of active tracks connected
1153        bool mOwnInBuffer;          // true if the chain owns its input buffer
1154        int mVolumeCtrlIdx;         // index of insert effect having control over volume
1155        uint32_t mLeftVolume;       // previous volume on left channel
1156        uint32_t mRightVolume;      // previous volume on right channel
1157        uint32_t mNewLeftVolume;       // new volume on left channel
1158        uint32_t mNewRightVolume;      // new volume on right channel
1159        uint32_t mStrategy; // strategy for this effect chain
1160    };
1161
1162    friend class RecordThread;
1163    friend class PlaybackThread;
1164
1165
1166    mutable     Mutex                               mLock;
1167
1168                DefaultKeyedVector< pid_t, wp<Client> >     mClients;
1169
1170                mutable     Mutex                   mHardwareLock;
1171                AudioHardwareInterface*             mAudioHardware;
1172    mutable     int                                 mHardwareStatus;
1173
1174
1175                DefaultKeyedVector< int, sp<PlaybackThread> >  mPlaybackThreads;
1176                PlaybackThread::stream_type_t       mStreamTypes[AudioSystem::NUM_STREAM_TYPES];
1177                float                               mMasterVolume;
1178                bool                                mMasterMute;
1179
1180                DefaultKeyedVector< int, sp<RecordThread> >    mRecordThreads;
1181
1182                DefaultKeyedVector< pid_t, sp<NotificationClient> >    mNotificationClients;
1183                volatile int32_t                    mNextUniqueId;
1184                uint32_t mMode;
1185
1186};
1187
1188// ----------------------------------------------------------------------------
1189
1190}; // namespace android
1191
1192#endif // ANDROID_AUDIO_FLINGER_H
1193