AudioFlinger.h revision 8ac9f8d1c708dc8bb853f7697f10051031eb73c5
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 <binder/MemoryDealer.h>
35#include <utils/SortedVector.h>
36#include <utils/Vector.h>
37
38#include <hardware_legacy/AudioHardwareInterface.h>
39
40#include "AudioBufferProvider.h"
41
42namespace android {
43
44class audio_track_cblk_t;
45class AudioMixer;
46class AudioBuffer;
47class AudioResampler;
48
49
50// ----------------------------------------------------------------------------
51
52#define LIKELY( exp )       (__builtin_expect( (exp) != 0, true  ))
53#define UNLIKELY( exp )     (__builtin_expect( (exp) != 0, false ))
54
55
56// ----------------------------------------------------------------------------
57
58static const nsecs_t kStandbyTimeInNsecs = seconds(3);
59
60class AudioFlinger : public BnAudioFlinger, public IBinder::DeathRecipient
61{
62public:
63    static void instantiate();
64
65    virtual     status_t    dump(int fd, const Vector<String16>& args);
66
67    // IAudioFlinger interface
68    virtual sp<IAudioTrack> createTrack(
69                                pid_t pid,
70                                int streamType,
71                                uint32_t sampleRate,
72                                int format,
73                                int channelCount,
74                                int frameCount,
75                                uint32_t flags,
76                                const sp<IMemory>& sharedBuffer,
77                                int output,
78                                status_t *status);
79
80    virtual     uint32_t    sampleRate(int output) const;
81    virtual     int         channelCount(int output) const;
82    virtual     int         format(int output) const;
83    virtual     size_t      frameCount(int output) const;
84    virtual     uint32_t    latency(int output) const;
85
86    virtual     status_t    setMasterVolume(float value);
87    virtual     status_t    setMasterMute(bool muted);
88
89    virtual     float       masterVolume() const;
90    virtual     bool        masterMute() const;
91
92    virtual     status_t    setStreamVolume(int stream, float value, int output);
93    virtual     status_t    setStreamMute(int stream, bool muted);
94
95    virtual     float       streamVolume(int stream, int output) const;
96    virtual     bool        streamMute(int stream) const;
97
98    virtual     status_t    setMode(int mode);
99
100    virtual     status_t    setMicMute(bool state);
101    virtual     bool        getMicMute() const;
102
103    virtual     bool        isMusicActive() const;
104
105    virtual     status_t    setParameters(int ioHandle, const String8& keyValuePairs);
106    virtual     String8     getParameters(int ioHandle, const String8& keys);
107
108    virtual     void        registerClient(const sp<IAudioFlingerClient>& client);
109
110    virtual     size_t      getInputBufferSize(uint32_t sampleRate, int format, int channelCount);
111
112    virtual int openOutput(uint32_t *pDevices,
113                                    uint32_t *pSamplingRate,
114                                    uint32_t *pFormat,
115                                    uint32_t *pChannels,
116                                    uint32_t *pLatencyMs,
117                                    uint32_t flags);
118
119    virtual int openDuplicateOutput(int output1, int output2);
120
121    virtual status_t closeOutput(int output);
122
123    virtual status_t suspendOutput(int output);
124
125    virtual status_t restoreOutput(int output);
126
127    virtual int openInput(uint32_t *pDevices,
128                            uint32_t *pSamplingRate,
129                            uint32_t *pFormat,
130                            uint32_t *pChannels,
131                            uint32_t acoustics);
132
133    virtual status_t closeInput(int input);
134
135    virtual status_t setStreamOutput(uint32_t stream, int output);
136
137    virtual status_t setVoiceVolume(float volume);
138
139    // IBinder::DeathRecipient
140    virtual     void        binderDied(const wp<IBinder>& who);
141
142    enum hardware_call_state {
143        AUDIO_HW_IDLE = 0,
144        AUDIO_HW_INIT,
145        AUDIO_HW_OUTPUT_OPEN,
146        AUDIO_HW_OUTPUT_CLOSE,
147        AUDIO_HW_INPUT_OPEN,
148        AUDIO_HW_INPUT_CLOSE,
149        AUDIO_HW_STANDBY,
150        AUDIO_HW_SET_MASTER_VOLUME,
151        AUDIO_HW_GET_ROUTING,
152        AUDIO_HW_SET_ROUTING,
153        AUDIO_HW_GET_MODE,
154        AUDIO_HW_SET_MODE,
155        AUDIO_HW_GET_MIC_MUTE,
156        AUDIO_HW_SET_MIC_MUTE,
157        AUDIO_SET_VOICE_VOLUME,
158        AUDIO_SET_PARAMETER,
159    };
160
161    // record interface
162    virtual sp<IAudioRecord> openRecord(
163                                pid_t pid,
164                                int input,
165                                uint32_t sampleRate,
166                                int format,
167                                int channelCount,
168                                int frameCount,
169                                uint32_t flags,
170                                status_t *status);
171
172    virtual     status_t    onTransact(
173                                uint32_t code,
174                                const Parcel& data,
175                                Parcel* reply,
176                                uint32_t flags);
177
178private:
179                            AudioFlinger();
180    virtual                 ~AudioFlinger();
181
182
183    // Internal dump utilites.
184    status_t dumpPermissionDenial(int fd, const Vector<String16>& args);
185    status_t dumpClients(int fd, const Vector<String16>& args);
186    status_t dumpInternals(int fd, const Vector<String16>& args);
187
188    // --- Client ---
189    class Client : public RefBase {
190    public:
191                            Client(const sp<AudioFlinger>& audioFlinger, pid_t pid);
192        virtual             ~Client();
193        const sp<MemoryDealer>&     heap() const;
194        pid_t               pid() const { return mPid; }
195        sp<AudioFlinger>    audioFlinger() { return mAudioFlinger; }
196
197    private:
198                            Client(const Client&);
199                            Client& operator = (const Client&);
200        sp<AudioFlinger>    mAudioFlinger;
201        sp<MemoryDealer>    mMemoryDealer;
202        pid_t               mPid;
203    };
204
205
206    class TrackHandle;
207    class RecordHandle;
208    class RecordThread;
209    class PlaybackThread;
210    class MixerThread;
211    class DirectOutputThread;
212    class DuplicatingThread;
213    class Track;
214    class RecordTrack;
215
216    class ThreadBase : public Thread {
217    public:
218        ThreadBase (const sp<AudioFlinger>& audioFlinger, int id);
219        virtual             ~ThreadBase();
220
221        status_t dumpBase(int fd, const Vector<String16>& args);
222
223        // base for record and playback
224        class TrackBase : public AudioBufferProvider, public RefBase {
225
226        public:
227            enum track_state {
228                IDLE,
229                TERMINATED,
230                STOPPED,
231                RESUMING,
232                ACTIVE,
233                PAUSING,
234                PAUSED
235            };
236
237            enum track_flags {
238                STEPSERVER_FAILED = 0x01, //  StepServer could not acquire cblk->lock mutex
239                SYSTEM_FLAGS_MASK = 0x0000ffffUL,
240                // The upper 16 bits are used for track-specific flags.
241            };
242
243                                TrackBase(const wp<ThreadBase>& thread,
244                                        const sp<Client>& client,
245                                        uint32_t sampleRate,
246                                        int format,
247                                        int channelCount,
248                                        int frameCount,
249                                        uint32_t flags,
250                                        const sp<IMemory>& sharedBuffer);
251                                ~TrackBase();
252
253            virtual status_t    start() = 0;
254            virtual void        stop() = 0;
255                    sp<IMemory> getCblk() const;
256                    audio_track_cblk_t* cblk() const { return mCblk; }
257
258        protected:
259            friend class ThreadBase;
260            friend class RecordHandle;
261            friend class PlaybackThread;
262            friend class RecordThread;
263            friend class MixerThread;
264            friend class DirectOutputThread;
265
266                                TrackBase(const TrackBase&);
267                                TrackBase& operator = (const TrackBase&);
268
269            virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer) = 0;
270            virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);
271
272            int format() const {
273                return mFormat;
274            }
275
276            int channelCount() const ;
277
278            int sampleRate() const;
279
280            void* getBuffer(uint32_t offset, uint32_t frames) const;
281
282            bool isStopped() const {
283                return mState == STOPPED;
284            }
285
286            bool isTerminated() const {
287                return mState == TERMINATED;
288            }
289
290            bool step();
291            void reset();
292
293            wp<ThreadBase>      mThread;
294            sp<Client>          mClient;
295            sp<IMemory>         mCblkMemory;
296            audio_track_cblk_t* mCblk;
297            void*               mBuffer;
298            void*               mBufferEnd;
299            uint32_t            mFrameCount;
300            // we don't really need a lock for these
301            int                 mState;
302            int                 mClientTid;
303            uint8_t             mFormat;
304            uint32_t            mFlags;
305        };
306
307        class ConfigEvent {
308        public:
309            ConfigEvent() : mEvent(0), mParam(0) {}
310
311            int mEvent;
312            int mParam;
313        };
314
315                    uint32_t    sampleRate() const;
316                    int         channelCount() const;
317                    int         format() const;
318                    size_t      frameCount() const;
319                    void        wakeUp()    { mWaitWorkCV.broadcast(); }
320                    void        exit();
321        virtual     bool        checkForNewParameters_l() = 0;
322        virtual     status_t    setParameters(const String8& keyValuePairs);
323        virtual     String8     getParameters(const String8& keys) = 0;
324        virtual     void        audioConfigChanged(int event, int param = 0) = 0;
325                    void        sendConfigEvent(int event, int param = 0);
326                    void        sendConfigEvent_l(int event, int param = 0);
327                    void        processConfigEvents();
328                    int         id() const { return mId;}
329                    bool        standby() { return mStandby; }
330
331        mutable     Mutex                   mLock;
332
333    protected:
334
335        friend class Track;
336        friend class TrackBase;
337        friend class PlaybackThread;
338        friend class MixerThread;
339        friend class DirectOutputThread;
340        friend class DuplicatingThread;
341        friend class RecordThread;
342        friend class RecordTrack;
343
344                    Condition               mWaitWorkCV;
345                    sp<AudioFlinger>        mAudioFlinger;
346                    uint32_t                mSampleRate;
347                    size_t                  mFrameCount;
348                    int                     mChannelCount;
349                    int                     mFormat;
350                    uint32_t                mFrameSize;
351                    Condition               mParamCond;
352                    Vector<String8>         mNewParameters;
353                    status_t                mParamStatus;
354                    Vector<ConfigEvent *>   mConfigEvents;
355                    bool                    mStandby;
356                    int                     mId;
357                    bool                    mExiting;
358    };
359
360    // --- PlaybackThread ---
361    class PlaybackThread : public ThreadBase {
362    public:
363
364        enum type {
365            MIXER,
366            DIRECT,
367            DUPLICATING
368        };
369
370        enum mixer_state {
371            MIXER_IDLE,
372            MIXER_TRACKS_ENABLED,
373            MIXER_TRACKS_READY
374        };
375
376        // playback track
377        class Track : public TrackBase {
378        public:
379                                Track(  const wp<ThreadBase>& thread,
380                                        const sp<Client>& client,
381                                        int streamType,
382                                        uint32_t sampleRate,
383                                        int format,
384                                        int channelCount,
385                                        int frameCount,
386                                        const sp<IMemory>& sharedBuffer);
387                                ~Track();
388
389                    void        dump(char* buffer, size_t size);
390            virtual status_t    start();
391            virtual void        stop();
392                    void        pause();
393
394                    void        flush();
395                    void        destroy();
396                    void        mute(bool);
397                    void        setVolume(float left, float right);
398                    int name() const {
399                        return mName;
400                    }
401
402                    int type() const {
403                        return mStreamType;
404                    }
405
406
407        protected:
408            friend class ThreadBase;
409            friend class AudioFlinger;
410            friend class TrackHandle;
411            friend class PlaybackThread;
412            friend class MixerThread;
413            friend class DirectOutputThread;
414
415                                Track(const Track&);
416                                Track& operator = (const Track&);
417
418            virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
419            bool isMuted() { return mMute; }
420            bool isPausing() const {
421                return mState == PAUSING;
422            }
423            bool isPaused() const {
424                return mState == PAUSED;
425            }
426            bool isReady() const;
427            void setPaused() { mState = PAUSED; }
428            void reset();
429
430            bool isOutputTrack() const {
431                return (mStreamType == AudioSystem::NUM_STREAM_TYPES);
432            }
433
434            // we don't really need a lock for these
435            float               mVolume[2];
436            volatile bool       mMute;
437            // FILLED state is used for suppressing volume ramp at begin of playing
438            enum {FS_FILLING, FS_FILLED, FS_ACTIVE};
439            mutable uint8_t     mFillingUpStatus;
440            int8_t              mRetryCount;
441            sp<IMemory>         mSharedBuffer;
442            bool                mResetDone;
443            int                 mStreamType;
444            int                 mName;
445        };  // end of Track
446
447
448        // playback track
449        class OutputTrack : public Track {
450        public:
451
452            class Buffer: public AudioBufferProvider::Buffer {
453            public:
454                int16_t *mBuffer;
455            };
456
457                                OutputTrack(  const wp<ThreadBase>& thread,
458                                        DuplicatingThread *sourceThread,
459                                        uint32_t sampleRate,
460                                        int format,
461                                        int channelCount,
462                                        int frameCount);
463                                ~OutputTrack();
464
465            virtual status_t    start();
466            virtual void        stop();
467                    bool        write(int16_t* data, uint32_t frames);
468                    bool        bufferQueueEmpty() { return (mBufferQueue.size() == 0) ? true : false; }
469                    bool        isActive() { return mActive; }
470            wp<ThreadBase>&     thread()  { return mThread; }
471
472        private:
473
474            status_t            obtainBuffer(AudioBufferProvider::Buffer* buffer, uint32_t waitTimeMs);
475            void                clearBufferQueue();
476
477            // Maximum number of pending buffers allocated by OutputTrack::write()
478            static const uint8_t kMaxOverFlowBuffers = 10;
479
480            Vector < Buffer* >          mBufferQueue;
481            AudioBufferProvider::Buffer mOutBuffer;
482            bool                        mActive;
483            DuplicatingThread*          mSourceThread;
484        };  // end of OutputTrack
485
486        PlaybackThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id);
487        virtual             ~PlaybackThread();
488
489        virtual     status_t    dump(int fd, const Vector<String16>& args);
490
491        // Thread virtuals
492        virtual     status_t    readyToRun();
493        virtual     void        onFirstRef();
494
495        virtual     uint32_t    latency() const;
496
497        virtual     status_t    setMasterVolume(float value);
498        virtual     status_t    setMasterMute(bool muted);
499
500        virtual     float       masterVolume() const;
501        virtual     bool        masterMute() const;
502
503        virtual     status_t    setStreamVolume(int stream, float value);
504        virtual     status_t    setStreamMute(int stream, bool muted);
505
506        virtual     float       streamVolume(int stream) const;
507        virtual     bool        streamMute(int stream) const;
508
509                    bool        isMusicActive() const;
510
511                    sp<Track>   createTrack_l(
512                                    const sp<AudioFlinger::Client>& client,
513                                    int streamType,
514                                    uint32_t sampleRate,
515                                    int format,
516                                    int channelCount,
517                                    int frameCount,
518                                    const sp<IMemory>& sharedBuffer,
519                                    status_t *status);
520
521                    AudioStreamOut* getOutput() { return mOutput; }
522
523        virtual     int         type() const { return mType; }
524                    void        suspend() { mSuspended++; }
525                    void        restore() { if (mSuspended) mSuspended--; }
526                    bool        isSuspended() { return (mSuspended != 0); }
527        virtual     String8     getParameters(const String8& keys);
528        virtual     void        audioConfigChanged(int event, int param = 0);
529
530        struct  stream_type_t {
531            stream_type_t()
532                :   volume(1.0f),
533                    mute(false)
534            {
535            }
536            float       volume;
537            bool        mute;
538        };
539
540    protected:
541        int                             mType;
542        int16_t*                        mMixBuffer;
543        int                             mSuspended;
544        int                             mBytesWritten;
545        bool                            mMasterMute;
546        SortedVector< wp<Track> >       mActiveTracks;
547
548        virtual int             getTrackName_l() = 0;
549        virtual void            deleteTrackName_l(int name) = 0;
550        virtual uint32_t        activeSleepTimeUs() = 0;
551        virtual uint32_t        idleSleepTimeUs() = 0;
552
553    private:
554
555        friend class AudioFlinger;
556        friend class OutputTrack;
557        friend class Track;
558        friend class TrackBase;
559        friend class MixerThread;
560        friend class DirectOutputThread;
561        friend class DuplicatingThread;
562
563        PlaybackThread(const Client&);
564        PlaybackThread& operator = (const PlaybackThread&);
565
566        status_t    addTrack_l(const sp<Track>& track);
567        void        destroyTrack_l(const sp<Track>& track);
568
569        void        readOutputParameters();
570
571        virtual status_t    dumpInternals(int fd, const Vector<String16>& args);
572        status_t    dumpTracks(int fd, const Vector<String16>& args);
573
574        SortedVector< sp<Track> >       mTracks;
575        // mStreamTypes[] uses 1 additionnal stream type internally for the OutputTrack used by DuplicatingThread
576        stream_type_t                   mStreamTypes[AudioSystem::NUM_STREAM_TYPES + 1];
577        AudioStreamOut*                 mOutput;
578        float                           mMasterVolume;
579        nsecs_t                         mLastWriteTime;
580        int                             mNumWrites;
581        int                             mNumDelayedWrites;
582        bool                            mInWrite;
583    };
584
585    class MixerThread : public PlaybackThread {
586    public:
587        MixerThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id);
588        virtual             ~MixerThread();
589
590        // Thread virtuals
591        virtual     bool        threadLoop();
592
593                    void        getTracks(SortedVector < sp<Track> >& tracks,
594                                      SortedVector < wp<Track> >& activeTracks,
595                                      int streamType);
596                    void        putTracks(SortedVector < sp<Track> >& tracks,
597                                      SortedVector < wp<Track> >& activeTracks);
598        virtual     bool        checkForNewParameters_l();
599        virtual     status_t    dumpInternals(int fd, const Vector<String16>& args);
600
601    protected:
602                    uint32_t    prepareTracks_l(const SortedVector< wp<Track> >& activeTracks, Vector< sp<Track> > *tracksToRemove);
603        virtual     int         getTrackName_l();
604        virtual     void        deleteTrackName_l(int name);
605        virtual     uint32_t    activeSleepTimeUs();
606        virtual     uint32_t    idleSleepTimeUs();
607
608        AudioMixer*                     mAudioMixer;
609    };
610
611    class DirectOutputThread : public PlaybackThread {
612    public:
613
614        DirectOutputThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output, int id);
615        ~DirectOutputThread();
616
617        // Thread virtuals
618        virtual     bool        threadLoop();
619
620        virtual     bool        checkForNewParameters_l();
621
622    protected:
623        virtual     int         getTrackName_l();
624        virtual     void        deleteTrackName_l(int name);
625        virtual     uint32_t    activeSleepTimeUs();
626        virtual     uint32_t    idleSleepTimeUs();
627
628    private:
629        float mLeftVolume;
630        float mRightVolume;
631    };
632
633    class DuplicatingThread : public MixerThread {
634    public:
635        DuplicatingThread (const sp<AudioFlinger>& audioFlinger, MixerThread* mainThread, int id);
636        ~DuplicatingThread();
637
638        // Thread virtuals
639        virtual     bool        threadLoop();
640                    void        addOutputTrack(MixerThread* thread);
641                    void        removeOutputTrack(MixerThread* thread);
642                    uint32_t    waitTimeMs() { return mWaitTimeMs; }
643    protected:
644        virtual     uint32_t    activeSleepTimeUs();
645
646    private:
647                    bool        outputsReady(SortedVector< sp<OutputTrack> > &outputTracks);
648                    void        updateWaitTime();
649
650        SortedVector < sp<OutputTrack> >  mOutputTracks;
651                    uint32_t    mWaitTimeMs;
652    };
653
654              PlaybackThread *checkPlaybackThread_l(int output) const;
655              MixerThread *checkMixerThread_l(int output) const;
656              RecordThread *checkRecordThread_l(int input) const;
657              float streamVolumeInternal(int stream) const { return mStreamTypes[stream].volume; }
658              void audioConfigChanged_l(int event, int ioHandle, void *param2);
659
660    friend class AudioBuffer;
661
662    class TrackHandle : public android::BnAudioTrack {
663    public:
664                            TrackHandle(const sp<PlaybackThread::Track>& track);
665        virtual             ~TrackHandle();
666        virtual status_t    start();
667        virtual void        stop();
668        virtual void        flush();
669        virtual void        mute(bool);
670        virtual void        pause();
671        virtual void        setVolume(float left, float right);
672        virtual sp<IMemory> getCblk() const;
673        virtual status_t onTransact(
674            uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
675    private:
676        sp<PlaybackThread::Track> mTrack;
677    };
678
679    friend class Client;
680    friend class PlaybackThread::Track;
681
682
683                void        removeClient_l(pid_t pid);
684
685
686    // record thread
687    class RecordThread : public ThreadBase, public AudioBufferProvider
688    {
689    public:
690
691        // record track
692        class RecordTrack : public TrackBase {
693        public:
694                                RecordTrack(const wp<ThreadBase>& thread,
695                                        const sp<Client>& client,
696                                        uint32_t sampleRate,
697                                        int format,
698                                        int channelCount,
699                                        int frameCount,
700                                        uint32_t flags);
701                                ~RecordTrack();
702
703            virtual status_t    start();
704            virtual void        stop();
705
706                    bool        overflow() { bool tmp = mOverflow; mOverflow = false; return tmp; }
707                    bool        setOverflow() { bool tmp = mOverflow; mOverflow = true; return tmp; }
708
709                    void        dump(char* buffer, size_t size);
710        private:
711            friend class AudioFlinger;
712            friend class RecordThread;
713
714                                RecordTrack(const RecordTrack&);
715                                RecordTrack& operator = (const RecordTrack&);
716
717            virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
718
719            bool                mOverflow;
720        };
721
722
723                RecordThread(const sp<AudioFlinger>& audioFlinger,
724                        AudioStreamIn *input,
725                        uint32_t sampleRate,
726                        uint32_t channels,
727                        int id);
728                ~RecordThread();
729
730        virtual bool        threadLoop();
731        virtual status_t    readyToRun() { return NO_ERROR; }
732        virtual void        onFirstRef();
733
734                status_t    start(RecordTrack* recordTrack);
735                void        stop(RecordTrack* recordTrack);
736                status_t    dump(int fd, const Vector<String16>& args);
737                AudioStreamIn* getInput() { return mInput; }
738
739        virtual status_t    getNextBuffer(AudioBufferProvider::Buffer* buffer);
740        virtual void        releaseBuffer(AudioBufferProvider::Buffer* buffer);
741        virtual bool        checkForNewParameters_l();
742        virtual String8     getParameters(const String8& keys);
743        virtual void        audioConfigChanged(int event, int param = 0);
744                void        readInputParameters();
745
746    private:
747                RecordThread();
748                AudioStreamIn                       *mInput;
749                sp<RecordTrack>                     mActiveTrack;
750                Condition                           mStartStopCond;
751                AudioResampler                      *mResampler;
752                int32_t                             *mRsmpOutBuffer;
753                int16_t                             *mRsmpInBuffer;
754                size_t                              mRsmpInIndex;
755                size_t                              mInputBytes;
756                int                                 mReqChannelCount;
757                uint32_t                            mReqSampleRate;
758                ssize_t                             mBytesRead;
759    };
760
761    class RecordHandle : public android::BnAudioRecord {
762    public:
763        RecordHandle(const sp<RecordThread::RecordTrack>& recordTrack);
764        virtual             ~RecordHandle();
765        virtual status_t    start();
766        virtual void        stop();
767        virtual sp<IMemory> getCblk() const;
768        virtual status_t onTransact(
769            uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
770    private:
771        sp<RecordThread::RecordTrack> mRecordTrack;
772    };
773
774    friend class RecordThread;
775    friend class PlaybackThread;
776
777
778    mutable     Mutex                               mLock;
779
780                DefaultKeyedVector< pid_t, wp<Client> >     mClients;
781
782                mutable     Mutex                   mHardwareLock;
783                AudioHardwareInterface*             mAudioHardware;
784    mutable     int                                 mHardwareStatus;
785
786
787                DefaultKeyedVector< int, sp<PlaybackThread> >  mPlaybackThreads;
788                PlaybackThread::stream_type_t       mStreamTypes[AudioSystem::NUM_STREAM_TYPES];
789                float                               mMasterVolume;
790                bool                                mMasterMute;
791
792                DefaultKeyedVector< int, sp<RecordThread> >    mRecordThreads;
793
794                SortedVector< sp<IBinder> >         mNotificationClients;
795                int                                 mNextThreadId;
796};
797
798// ----------------------------------------------------------------------------
799
800}; // namespace android
801
802#endif // ANDROID_AUDIO_FLINGER_H
803