181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent/*
281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent**
381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent** Copyright 2012, The Android Open Source Project
481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent**
581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent** Licensed under the Apache License, Version 2.0 (the "License");
681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent** you may not use this file except in compliance with the License.
781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent** You may obtain a copy of the License at
881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent**
981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent**     http://www.apache.org/licenses/LICENSE-2.0
1081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent**
1181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent** Unless required by applicable law or agreed to in writing, software
1281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent** distributed under the License is distributed on an "AS IS" BASIS,
1381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent** See the License for the specific language governing permissions and
1581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent** limitations under the License.
1681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent*/
1781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
1881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#ifndef INCLUDING_FROM_AUDIOFLINGER_H
1981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    #error This header file should only be included from AudioFlinger.h
2081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent#endif
2181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
2281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// playback track
2381784c37c61b09289654b979567a42bf73cd2b12Eric Laurentclass Track : public TrackBase, public VolumeProvider {
2481784c37c61b09289654b979567a42bf73cd2b12Eric Laurentpublic:
2581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        Track(  PlaybackThread *thread,
2681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                const sp<Client>& client,
2781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                audio_stream_type_t streamType,
2881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                uint32_t sampleRate,
2981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                audio_format_t format,
3081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                audio_channel_mask_t channelMask,
3181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                size_t frameCount,
3283b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent                                void *buffer,
3381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                const sp<IMemory>& sharedBuffer,
34d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten                                audio_session_t sessionId,
351f12a8ad958344c50733b948628ffa06db9c5bc6Andy Hung                                uid_t uid,
36050677873c10d4da308ac222f8533c96cca3207eEric Laurent                                audio_output_flags_t flags,
3720b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent                                track_type type,
3820b9ef0b55c9150ae11057ab997ae61be2d496efEric Laurent                                audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE);
3981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    virtual             ~Track();
40030033342a6ea17003e6af38a56c7edc6d2ead01Glenn Kasten    virtual status_t    initCheck() const;
4181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
4281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    static  void        appendDumpHeader(String8& result);
43b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen            void        dump(char* buffer, size_t size, bool active);
4481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    virtual status_t    start(AudioSystem::sync_event_t event =
4581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                    AudioSystem::SYNC_EVENT_NONE,
46d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten                             audio_session_t triggerSession = AUDIO_SESSION_NONE);
4781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    virtual void        stop();
4881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            void        pause();
4981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
5081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            void        flush();
5181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            void        destroy();
5281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            int         name() const { return mName; }
5381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
549f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten    virtual uint32_t    sampleRate() const;
559f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten
5681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            audio_stream_type_t streamType() const {
5781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                return mStreamType;
5881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            }
59050677873c10d4da308ac222f8533c96cca3207eEric Laurent            bool        isOffloaded() const
60050677873c10d4da308ac222f8533c96cca3207eEric Laurent                                { return (mFlags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) != 0; }
61050677873c10d4da308ac222f8533c96cca3207eEric Laurent            bool        isDirect() const { return (mFlags & AUDIO_OUTPUT_FLAG_DIRECT) != 0; }
6210cbff139360f3f642e0e3b3ccf2d463dbed22cfAndy Hung            bool        isOffloadedOrDirect() const { return (mFlags
6310cbff139360f3f642e0e3b3ccf2d463dbed22cfAndy Hung                            & (AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD
6410cbff139360f3f642e0e3b3ccf2d463dbed22cfAndy Hung                                    | AUDIO_OUTPUT_FLAG_DIRECT)) != 0; }
6510cbff139360f3f642e0e3b3ccf2d463dbed22cfAndy Hung
66bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent            status_t    setParameters(const String8& keyValuePairs);
6781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            status_t    attachAuxEffect(int EffectId);
6881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            void        setAuxBuffer(int EffectId, int32_t *buffer);
6981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            int32_t     *auxBuffer() const { return mAuxBuffer; }
7081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            void        setMainBuffer(int16_t *buffer) { mMainBuffer = buffer; }
7181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            int16_t     *mainBuffer() const { return mMainBuffer; }
7281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            int         auxEffectId() const { return mAuxEffectId; }
73573d80a8f463f648a515fc0975bf83951b272993Glenn Kasten    virtual status_t    getTimestamp(AudioTimestamp& timestamp);
7459fe010bcc072597852454a2ec53d7b0a2002a3bEric Laurent            void        signal();
7581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
7681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// implement FastMixerState::VolumeProvider interface
77c56f3426099a3cf2d07ccff8886050c7fbce140fGlenn Kasten    virtual gain_minifloat_packed_t getVolumeLR();
7881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
7981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    virtual status_t    setSyncEvent(const sp<SyncEvent>& event);
8081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
81050677873c10d4da308ac222f8533c96cca3207eEric Laurent    virtual bool        isFastTrack() const { return (mFlags & AUDIO_OUTPUT_FLAG_FAST) != 0; }
82050677873c10d4da308ac222f8533c96cca3207eEric Laurent
839fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung// implement volume handling.
849fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung   VolumeShaper::Status applyVolumeShaper(
859fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                                const sp<VolumeShaper::Configuration>& configuration,
869fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung                                const sp<VolumeShaper::Operation>& operation);
879fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hungsp<VolumeShaper::State> getVolumeShaperState(int id);
889fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung    sp<VolumeHandler>   getVolumeHandler() { return mVolumeHandler; }
899fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung
9081784c37c61b09289654b979567a42bf73cd2b12Eric Laurentprotected:
9181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // for numerous
9281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    friend class PlaybackThread;
9381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    friend class MixerThread;
9481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    friend class DirectOutputThread;
95bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    friend class OffloadThread;
9681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
9781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        Track(const Track&);
9881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        Track& operator = (const Track&);
9981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
10081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // AudioBufferProvider interface
101d79072e9dff59f767cce2cda1caab80ce5a0815bGlenn Kasten    virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
10281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // releaseBuffer() not overridden
10381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
1046466c9e6e6278c740aed77f695f679be9f5db478Glenn Kasten    // ExtendedAudioBufferProvider interface
10581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    virtual size_t framesReady() const;
106818e7a32ce3633980138aff2c2bfcc5158b3cfccAndy Hung    virtual int64_t framesReleased() const;
107818e7a32ce3633980138aff2c2bfcc5158b3cfccAndy Hung    virtual void onTimestamp(const ExtendedTimestamp &timestamp);
10881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
109c9b2e20f7c9a71e07ef398152709c76079decbcdGlenn Kasten    bool isPausing() const { return mState == PAUSING; }
110c9b2e20f7c9a71e07ef398152709c76079decbcdGlenn Kasten    bool isPaused() const { return mState == PAUSED; }
111c9b2e20f7c9a71e07ef398152709c76079decbcdGlenn Kasten    bool isResuming() const { return mState == RESUMING; }
11281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    bool isReady() const;
11381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    void setPaused() { mState = PAUSED; }
11481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    void reset();
1157844f679be8d94c5cdf017f53754cb68ee2f00daHaynes Mathew George    bool isFlushPending() const { return mFlushHwPending; }
1167844f679be8d94c5cdf017f53754cb68ee2f00daHaynes Mathew George    void flushAck();
1178d6c292a0bed3d63b5b7297d09a604af6327c663Krishnankutty Kolathappilly    bool isResumePending();
1188d6c292a0bed3d63b5b7297d09a604af6327c663Krishnankutty Kolathappilly    void resumeAck();
119818e7a32ce3633980138aff2c2bfcc5158b3cfccAndy Hung    void updateTrackFrameInfo(int64_t trackFramesReleased, int64_t sinkFramesWritten,
120818e7a32ce3633980138aff2c2bfcc5158b3cfccAndy Hung            const ExtendedTimestamp &timeStamp);
12181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
12281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    sp<IMemory> sharedBuffer() const { return mSharedBuffer; }
12381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
12481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // framesWritten is cumulative, never reset, and is shared all tracks
12581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // audioHalFrames is derived from output latency
12681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // FIXME parameters not needed, could get them from the thread
127818e7a32ce3633980138aff2c2bfcc5158b3cfccAndy Hung    bool presentationComplete(int64_t framesWritten, size_t audioHalFrames);
1284d231dc0ee34380956c71cbe18a750e487a69601Eric Laurent    void signalClientFlag(int32_t flag);
12981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
13081784c37c61b09289654b979567a42bf73cd2b12Eric Laurentpublic:
13181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    void triggerEvents(AudioSystem::sync_event_t type);
1326acd1d432f526ae9a055ddaece28bf93b474a776Eric Laurent    virtual void invalidate();
1334d231dc0ee34380956c71cbe18a750e487a69601Eric Laurent    void disable();
1344d231dc0ee34380956c71cbe18a750e487a69601Eric Laurent
135d054c32443a493513ab63529b0c8b1aca290278cGlenn Kasten    int fastIndex() const { return mFastIndex; }
13681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
13781784c37c61b09289654b979567a42bf73cd2b12Eric Laurentprotected:
13881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
13981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // FILLED state is used for suppressing volume ramp at begin of playing
14081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    enum {FS_INVALID, FS_FILLING, FS_FILLED, FS_ACTIVE};
14181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    mutable uint8_t     mFillingUpStatus;
14281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    int8_t              mRetryCount;
1430c72b24f91c68442eb374bd1b338c394105b8262Glenn Kasten
1440c72b24f91c68442eb374bd1b338c394105b8262Glenn Kasten    // see comment at AudioFlinger::PlaybackThread::Track::~Track for why this can't be const
1450c72b24f91c68442eb374bd1b338c394105b8262Glenn Kasten    sp<IMemory>         mSharedBuffer;
1460c72b24f91c68442eb374bd1b338c394105b8262Glenn Kasten
14781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    bool                mResetDone;
14881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    const audio_stream_type_t mStreamType;
14981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    int                 mName;      // track name on the normal mixer,
15081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                    // allocated statically at track creation time,
15181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                    // and is even allocated (though unused) for fast tracks
15281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                    // FIXME don't allocate track name for fast tracks
15381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    int16_t             *mMainBuffer;
15481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    int32_t             *mAuxBuffer;
15581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    int                 mAuxEffectId;
15681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    bool                mHasVolumeController;
15781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    size_t              mPresentationCompleteFrames; // number of frames written to the
15881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                    // audio HAL when this track will be fully rendered
15981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                    // zero means not monitoring
160e10393e72454bfd8298017dc193faf424f4e9a8fAndy Hung
161e10393e72454bfd8298017dc193faf424f4e9a8fAndy Hung    // access these three variables only when holding thread lock.
162818e7a32ce3633980138aff2c2bfcc5158b3cfccAndy Hung    LinearMap<int64_t> mFrameMap;           // track frame to server frame mapping
163818e7a32ce3633980138aff2c2bfcc5158b3cfccAndy Hung
164818e7a32ce3633980138aff2c2bfcc5158b3cfccAndy Hung    ExtendedTimestamp  mSinkTimestamp;
165e10393e72454bfd8298017dc193faf424f4e9a8fAndy Hung
1669fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung    sp<VolumeHandler>  mVolumeHandler; // handles multiple VolumeShaper configs and operations
1679fc8b5cd4a64ef07e84c69112461324d5c13a0b0Andy Hung
16881784c37c61b09289654b979567a42bf73cd2b12Eric Laurentprivate:
16981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // The following fields are only for fast tracks, and should be in a subclass
17081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    int                 mFastIndex; // index within FastMixerState::mFastTracks[];
17181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                    // either mFastIndex == -1 if not isFastTrack()
17281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                    // or 0 < mFastIndex < FastMixerState::kMaxFast because
17381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                    // index 0 is reserved for normal mixer's submix;
17481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                    // index is allocated statically at track creation time
17581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                    // but the slot is only used if track is active
17681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    FastTrackUnderruns  mObservedUnderruns; // Most recently observed value of
17781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                    // mFastMixerDumpState.mTracks[mFastIndex].mUnderruns
17881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    volatile float      mCachedVolume;  // combined master volume and stream type volume;
17981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                        // 'volatile' means accessed without lock or
18081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                        // barrier, but is read/written atomically
1815bba2f6916dbe00aea7c0521faa0c6ed42114a75Eric Laurent    sp<AudioTrackServerProxy>  mAudioTrackServerProxy;
182bfb1b832079bbb9426f72f3863199a54aefd02daEric Laurent    bool                mResumeToStopping; // track was paused in stopping state.
1837844f679be8d94c5cdf017f53754cb68ee2f00daHaynes Mathew George    bool                mFlushHwPending; // track requests for thread flush
184050677873c10d4da308ac222f8533c96cca3207eEric Laurent    audio_output_flags_t mFlags;
18581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent};  // end of Track
18681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
18781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
18881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent// playback track, used by DuplicatingThread
18981784c37c61b09289654b979567a42bf73cd2b12Eric Laurentclass OutputTrack : public Track {
19081784c37c61b09289654b979567a42bf73cd2b12Eric Laurentpublic:
19181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
19281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    class Buffer : public AudioBufferProvider::Buffer {
19381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    public:
194c25b84abdd7ff229d0af663fbf3a37bd9512939dAndy Hung        void *mBuffer;
19581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    };
19681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
19781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        OutputTrack(PlaybackThread *thread,
19881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                DuplicatingThread *sourceThread,
19981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                uint32_t sampleRate,
20081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                audio_format_t format,
20181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                audio_channel_mask_t channelMask,
202462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen                                size_t frameCount,
2031f12a8ad958344c50733b948628ffa06db9c5bc6Andy Hung                                uid_t uid);
20481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    virtual             ~OutputTrack();
20581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
20681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    virtual status_t    start(AudioSystem::sync_event_t event =
20781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                    AudioSystem::SYNC_EVENT_NONE,
208d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten                             audio_session_t triggerSession = AUDIO_SESSION_NONE);
20981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    virtual void        stop();
210c25b84abdd7ff229d0af663fbf3a37bd9512939dAndy Hung            bool        write(void* data, uint32_t frames);
21181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            bool        bufferQueueEmpty() const { return mBufferQueue.size() == 0; }
21281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            bool        isActive() const { return mActive; }
21381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    const wp<ThreadBase>& thread() const { return mThread; }
21481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
21581784c37c61b09289654b979567a42bf73cd2b12Eric Laurentprivate:
21681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
21781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    status_t            obtainBuffer(AudioBufferProvider::Buffer* buffer,
21881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                     uint32_t waitTimeMs);
21981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    void                clearBufferQueue();
22081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
2214d231dc0ee34380956c71cbe18a750e487a69601Eric Laurent    void                restartIfDisabled();
2224d231dc0ee34380956c71cbe18a750e487a69601Eric Laurent
22381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // Maximum number of pending buffers allocated by OutputTrack::write()
22481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    static const uint8_t kMaxOverFlowBuffers = 10;
22581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
22681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    Vector < Buffer* >          mBufferQueue;
22781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    AudioBufferProvider::Buffer mOutBuffer;
22881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    bool                        mActive;
2295bba2f6916dbe00aea7c0521faa0c6ed42114a75Eric Laurent    DuplicatingThread* const    mSourceThread; // for waitTimeMs() in write()
2305bba2f6916dbe00aea7c0521faa0c6ed42114a75Eric Laurent    sp<AudioTrackClientProxy>   mClientProxy;
23181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent};  // end of OutputTrack
23283b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent
23383b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent// playback track, used by PatchPanel
23483b8808faad1e91690c64d7007348be8d9ebde73Eric Laurentclass PatchTrack : public Track, public PatchProxyBufferProvider {
23583b8808faad1e91690c64d7007348be8d9ebde73Eric Laurentpublic:
23683b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent
23783b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent                        PatchTrack(PlaybackThread *playbackThread,
2383bcf8597189c592713675ec58326ecbef0ac4ae9Eric Laurent                                   audio_stream_type_t streamType,
23983b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent                                   uint32_t sampleRate,
24083b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent                                   audio_channel_mask_t channelMask,
24183b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent                                   audio_format_t format,
24283b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent                                   size_t frameCount,
24383b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent                                   void *buffer,
244050677873c10d4da308ac222f8533c96cca3207eEric Laurent                                   audio_output_flags_t flags);
24583b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent    virtual             ~PatchTrack();
24683b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent
2474d231dc0ee34380956c71cbe18a750e487a69601Eric Laurent    virtual status_t    start(AudioSystem::sync_event_t event =
2484d231dc0ee34380956c71cbe18a750e487a69601Eric Laurent                                    AudioSystem::SYNC_EVENT_NONE,
249d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten                             audio_session_t triggerSession = AUDIO_SESSION_NONE);
2504d231dc0ee34380956c71cbe18a750e487a69601Eric Laurent
25183b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent    // AudioBufferProvider interface
252d79072e9dff59f767cce2cda1caab80ce5a0815bGlenn Kasten    virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer);
25383b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent    virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);
25483b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent
25583b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent    // PatchProxyBufferProvider interface
25683b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent    virtual status_t    obtainBuffer(Proxy::Buffer* buffer,
25783b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent                                     const struct timespec *timeOut = NULL);
25883b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent    virtual void        releaseBuffer(Proxy::Buffer* buffer);
25983b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent
26083b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent            void setPeerProxy(PatchProxyBufferProvider *proxy) { mPeerProxy = proxy; }
26183b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent
26283b8808faad1e91690c64d7007348be8d9ebde73Eric Laurentprivate:
2634d231dc0ee34380956c71cbe18a750e487a69601Eric Laurent            void restartIfDisabled();
2644d231dc0ee34380956c71cbe18a750e487a69601Eric Laurent
26583b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent    sp<ClientProxy>             mProxy;
26683b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent    PatchProxyBufferProvider*   mPeerProxy;
26783b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent    struct timespec             mPeerTimeout;
26883b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent};  // end of PatchTrack
269