PlaybackTracks.h revision 7844f679be8d94c5cdf017f53754cb68ee2f00da
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/*
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer**
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer** Copyright 2012, The Android Open Source Project
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer**
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner** Licensed under the Apache License, Version 2.0 (the "License");
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner** you may not use this file except in compliance with the License.
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer** You may obtain a copy of the License at
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer**
95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer**     http://www.apache.org/licenses/LICENSE-2.0
105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer**
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer** Unless required by applicable law or agreed to in writing, software
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer** distributed under the License is distributed on an "AS IS" BASIS,
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer** See the License for the specific language governing permissions and
1555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth** limitations under the License.
162fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer*/
172fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer
18bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck#ifndef INCLUDING_FROM_AUDIOFLINGER_H
192fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer    #error This header file should only be included from AudioFlinger.h
20aa58081902ad31927df02e8537d972eabe29d6dfDmitri Gribenko#endif
2149aa7ff1245abd03e6e998e01302df31e4c6f8f6Argyrios Kyrtzidis
22980e508ca70d6de75d2abfd96b4681fc98bb2698Steve Naroff// playback track
23aaba5e346dffdbad5d1c42765a89e4a7afb0da67Douglas Gregorclass Track : public TrackBase, public VolumeProvider {
24e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbarpublic:
25ea1471e0e967548c596a71469702f8846dbaf3c0John McCall                        Track(  PlaybackThread *thread,
262cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                                const sp<Client>& client,
2714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                audio_stream_type_t streamType,
28942f9fe11d3a9583eef6bc4ca2549b1f0d1694daReid Kleckner                                uint32_t sampleRate,
292fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer                                audio_format_t format,
30cff15128c6c089bd6fae841b80680e6f5afbf0bfReid Kleckner                                audio_channel_mask_t channelMask,
312fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer                                size_t frameCount,
321b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner                                const sp<IMemory>& sharedBuffer,
33a9376d470ccb0eac74fe09a6b2a18a890f1d17c4Chris Lattner                                int sessionId,
345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                                int uid,
35f5942a44880be26878592eb052b737579349411eBenjamin Kramer                                IAudioFlinger::track_flags_t flags);
3685f9bceab1542aafff012d4d28e998f4ba16e362Anders Carlsson    virtual             ~Track();
372fa67efeaf66a9332c30a026dc1c21bef6c33a6cBenjamin Kramer    virtual status_t    initCheck() const;
386fe7c8aa8c7546743ecd0ac0138c2cf5d8155386Nate Begeman
39f5942a44880be26878592eb052b737579349411eBenjamin Kramer    static  void        appendDumpHeader(String8& result);
402636197098e02fd7c90f9496056b8ab886dcbff0Argyrios Kyrtzidis            void        dump(char* buffer, size_t size);
4129445a0542d128cd7ee587ee52229670b9b54a12Anders Carlsson    virtual status_t    start(AudioSystem::sync_event_t event =
425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                                    AudioSystem::SYNC_EVENT_NONE,
435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                             int triggerSession = 0);
441827403a7138946305c0058f262e02b595cf882fDouglas Gregor    virtual void        stop();
451827403a7138946305c0058f262e02b595cf882fDouglas Gregor            void        pause();
46225843186e3972ce798d3de00f86da9008b15a0eDouglas Gregor
47225843186e3972ce798d3de00f86da9008b15a0eDouglas Gregor            void        flush();
48ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt            void        destroy();
49ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt            int         name() const { return mName; }
50a376d10acfacf19d6dfa41069f7929739a18dd7aDouglas Gregor
51a376d10acfacf19d6dfa41069f7929739a18dd7aDouglas Gregor    virtual uint32_t    sampleRate() const;
52ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt
53ffe37fdda5b4b4f162a45155c30d9f60ce110c12Sean Hunt            audio_stream_type_t streamType() const {
544923aa25eb39d64106a5817c02d560a3aecf8b2cDouglas Gregor                return mStreamType;
554923aa25eb39d64106a5817c02d560a3aecf8b2cDouglas Gregor            }
564923aa25eb39d64106a5817c02d560a3aecf8b2cDouglas Gregor            bool        isOffloaded() const { return (mFlags & IAudioFlinger::TRACK_OFFLOAD) != 0; }
575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer            status_t    setParameters(const String8& keyValuePairs);
58aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov            status_t    attachAuxEffect(int EffectId);
595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer            void        setAuxBuffer(int EffectId, int32_t *buffer);
605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer            int32_t     *auxBuffer() const { return mAuxBuffer; }
61a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko            void        setMainBuffer(int16_t *buffer) { mMainBuffer = buffer; }
62aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko            int16_t     *mainBuffer() const { return mMainBuffer; }
63aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko            int         auxEffectId() const { return mAuxEffectId; }
64aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    virtual status_t    getTimestamp(AudioTimestamp& timestamp);
65aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko            void        signal();
66aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
67aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko// implement FastMixerState::VolumeProvider interface
68aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    virtual uint32_t    getVolumeLR();
69c3fee3539fd00a6ce21dc1f574baf76686640072Dmitri Gribenko
70c3fee3539fd00a6ce21dc1f574baf76686640072Dmitri Gribenko    virtual status_t    setSyncEvent(const sp<SyncEvent>& event);
71c3fee3539fd00a6ce21dc1f574baf76686640072Dmitri Gribenko
72c3fee3539fd00a6ce21dc1f574baf76686640072Dmitri Gribenkoprotected:
73c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko    // for numerous
74c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko    friend class PlaybackThread;
75c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko    friend class MixerThread;
76c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko    friend class DirectOutputThread;
77c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko    friend class OffloadThread;
78c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko
79dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko                        Track(const Track&);
80dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko                        Track& operator = (const Track&);
81dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko
82dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko    // AudioBufferProvider interface
83dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko    virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer,
84dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko                                   int64_t pts = kInvalidPTS);
85dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko    // releaseBuffer() not overridden
86dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko
87dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko    // ExtendedAudioBufferProvider interface
88dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko    virtual size_t framesReady() const;
89dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko    virtual size_t framesReleased() const;
90d1e5c0df2acb01192eedda14534fe990e1e26c46Dmitri Gribenko
91d1e5c0df2acb01192eedda14534fe990e1e26c46Dmitri Gribenko    bool isPausing() const { return mState == PAUSING; }
92d1e5c0df2acb01192eedda14534fe990e1e26c46Dmitri Gribenko    bool isPaused() const { return mState == PAUSED; }
93d1e5c0df2acb01192eedda14534fe990e1e26c46Dmitri Gribenko    bool isResuming() const { return mState == RESUMING; }
94d1e5c0df2acb01192eedda14534fe990e1e26c46Dmitri Gribenko    bool isReady() const;
95d1e5c0df2acb01192eedda14534fe990e1e26c46Dmitri Gribenko    void setPaused() { mState = PAUSED; }
96d1e5c0df2acb01192eedda14534fe990e1e26c46Dmitri Gribenko    void reset();
97d1e5c0df2acb01192eedda14534fe990e1e26c46Dmitri Gribenko    bool isFlushPending() const { return mFlushHwPending; }
98dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko    void flushAck();
99dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko
100dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko    bool isOutputTrack() const {
101dce750b15eb5eb797ac9bbea118333d7d1896831Dmitri Gribenko        return (mStreamType == AUDIO_STREAM_CNT);
102099ecfb0ed137665a3394187030d8fd7183fd9d4Fariborz Jahanian    }
103099ecfb0ed137665a3394187030d8fd7183fd9d4Fariborz Jahanian
104099ecfb0ed137665a3394187030d8fd7183fd9d4Fariborz Jahanian    sp<IMemory> sharedBuffer() const { return mSharedBuffer; }
105099ecfb0ed137665a3394187030d8fd7183fd9d4Fariborz Jahanian
106099ecfb0ed137665a3394187030d8fd7183fd9d4Fariborz Jahanian    // framesWritten is cumulative, never reset, and is shared all tracks
107099ecfb0ed137665a3394187030d8fd7183fd9d4Fariborz Jahanian    // audioHalFrames is derived from output latency
108aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    // FIXME parameters not needed, could get them from the thread
109aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    bool presentationComplete(size_t framesWritten, size_t audioHalFrames);
110aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
111aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenkopublic:
11296b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko    void triggerEvents(AudioSystem::sync_event_t type);
11396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko    void invalidate();
11496b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko    bool isInvalid() const { return mIsInvalid; }
11596b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko    virtual bool isTimedTrack() const { return false; }
11696b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko    bool isFastTrack() const { return (mFlags & IAudioFlinger::TRACK_FAST) != 0; }
11796b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko    int fastIndex() const { return mFastIndex; }
11896b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko
119811c820257746b1799b790b6adc7804f44154011Dmitri Gribenkoprotected:
120aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
121aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    // FILLED state is used for suppressing volume ramp at begin of playing
122aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    enum {FS_INVALID, FS_FILLING, FS_FILLED, FS_ACTIVE};
123aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    mutable uint8_t     mFillingUpStatus;
124aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    int8_t              mRetryCount;
125abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko
126abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko    // see comment at AudioFlinger::PlaybackThread::Track::~Track for why this can't be const
127abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko    sp<IMemory>         mSharedBuffer;
128abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko
129abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko    bool                mResetDone;
130abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko    const audio_stream_type_t mStreamType;
131abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko    int                 mName;      // track name on the normal mixer,
132abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko                                    // allocated statically at track creation time,
13396b098674908eaa59a9128f3305cda6fbbdad563Dmitri Gribenko                                    // and is even allocated (though unused) for fast tracks
134c27bc80a98b9558513b50956c930eedc9e461ae0Dmitri Gribenko                                    // FIXME don't allocate track name for fast tracks
135c27bc80a98b9558513b50956c930eedc9e461ae0Dmitri Gribenko    int16_t             *mMainBuffer;
136abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko    int32_t             *mAuxBuffer;
137ceaa1ecfa3a8c2cd851bda94b135318e83ba560aFariborz Jahanian    int                 mAuxEffectId;
138abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko    bool                mHasVolumeController;
139ceaa1ecfa3a8c2cd851bda94b135318e83ba560aFariborz Jahanian    size_t              mPresentationCompleteFrames; // number of frames written to the
140ceaa1ecfa3a8c2cd851bda94b135318e83ba560aFariborz Jahanian                                    // audio HAL when this track will be fully rendered
141ceaa1ecfa3a8c2cd851bda94b135318e83ba560aFariborz Jahanian                                    // zero means not monitoring
142ceaa1ecfa3a8c2cd851bda94b135318e83ba560aFariborz Jahanianprivate:
143ceaa1ecfa3a8c2cd851bda94b135318e83ba560aFariborz Jahanian    IAudioFlinger::track_flags_t mFlags;
144ceaa1ecfa3a8c2cd851bda94b135318e83ba560aFariborz Jahanian
145abd56c816e9164b17bb3e7154a511b0c9896ffdbDmitri Gribenko    // The following fields are only for fast tracks, and should be in a subclass
146aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    int                 mFastIndex; // index within FastMixerState::mFastTracks[];
147aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko                                    // either mFastIndex == -1 if not isFastTrack()
148aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko                                    // or 0 < mFastIndex < FastMixerState::kMaxFast because
149aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko                                    // index 0 is reserved for normal mixer's submix;
150aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko                                    // index is allocated statically at track creation time
151aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko                                    // but the slot is only used if track is active
152a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    FastTrackUnderruns  mObservedUnderruns; // Most recently observed value of
153a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko                                    // mFastMixerDumpState.mTracks[mFastIndex].mUnderruns
154a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    volatile float      mCachedVolume;  // combined master volume and stream type volume;
155a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko                                        // 'volatile' means accessed without lock or
156a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko                                        // barrier, but is read/written atomically
1576fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko    bool                mIsInvalid; // non-resettable latch, set by invalidate()
1586fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko    AudioTrackServerProxy*  mAudioTrackServerProxy;
1596fd7d3067dd06584ef3940e88e31fea1a0e83588Dmitri Gribenko    bool                mResumeToStopping; // track was paused in stopping state.
160a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    bool                mFlushHwPending; // track requests for thread flush
161a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko};  // end of Track
162a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko
163a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenkoclass TimedTrack : public Track {
164a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko  public:
165a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    static sp<TimedTrack> create(PlaybackThread *thread,
166a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko                                 const sp<Client>& client,
167a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko                                 audio_stream_type_t streamType,
168a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko                                 uint32_t sampleRate,
169a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko                                 audio_format_t format,
170a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko                                 audio_channel_mask_t channelMask,
171a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko                                 size_t frameCount,
172a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko                                 const sp<IMemory>& sharedBuffer,
173a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko                                 int sessionId,
174a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko                                 int uid);
175a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    virtual ~TimedTrack();
176a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko
177a444f1856459130bd3a1bb8995331c9e367db04fDmitri Gribenko    class TimedBuffer {
178aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko      public:
179aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko        TimedBuffer();
180aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko        TimedBuffer(const sp<IMemory>& buffer, int64_t pts);
181aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko        const sp<IMemory>& buffer() const { return mBuffer; }
182aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko        int64_t pts() const { return mPTS; }
183aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko        uint32_t position() const { return mPosition; }
184aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko        void setPosition(uint32_t pos) { mPosition = pos; }
185811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko      private:
1868c238be45e2ae6fa00fb5a2bc27a46d3c16d47eeFariborz Jahanian        sp<IMemory> mBuffer;
18715c8e56e44a5fb6d298ae5bad791f9ea5bb883f6Fariborz Jahanian        int64_t     mPTS;
188aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko        uint32_t    mPosition;
189811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko    };
190aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
191aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    // Mixer facing methods.
192aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    virtual bool isTimedTrack() const { return true; }
193aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    virtual size_t framesReady() const;
194aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
195aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    // AudioBufferProvider interface
196811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko    virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer,
197aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko                                   int64_t pts);
198aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);
199aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
200aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    // Client/App facing methods.
201aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    status_t    allocateTimedBuffer(size_t size,
202aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko                                    sp<IMemory>* buffer);
203aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    status_t    queueTimedBuffer(const sp<IMemory>& buffer,
204aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko                                 int64_t pts);
205aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    status_t    setMediaTimeTransform(const LinearTransform& xform,
206aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko                                      TimedAudioTrack::TargetTimeline target);
207811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko
208aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko  private:
209aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    TimedTrack(PlaybackThread *thread,
210aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko               const sp<Client>& client,
211aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko               audio_stream_type_t streamType,
212811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko               uint32_t sampleRate,
213aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko               audio_format_t format,
214aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko               audio_channel_mask_t channelMask,
215aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko               size_t frameCount,
216aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko               const sp<IMemory>& sharedBuffer,
217aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko               int sessionId,
218aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko               int uid);
219aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
220aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    void timedYieldSamples_l(AudioBufferProvider::Buffer* buffer);
221aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    void timedYieldSilence_l(uint32_t numFrames,
222aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko                             AudioBufferProvider::Buffer* buffer);
223aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    void trimTimedBufferQueue_l();
224aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    void trimTimedBufferQueueHead_l(const char* logTag);
225aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    void updateFramesPendingAfterTrim_l(const TimedBuffer& buf,
226aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko                                        const char* logTag);
227aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
228aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    uint64_t            mLocalTimeFreq;
229aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    LinearTransform     mLocalTimeToSampleTransform;
2308bdb58a7835a9a90dd9b9791fccf269cbc1dcef3Dmitri Gribenko    LinearTransform     mMediaTimeToSampleTransform;
2318bdb58a7835a9a90dd9b9791fccf269cbc1dcef3Dmitri Gribenko    sp<MemoryDealer>    mTimedMemoryDealer;
232dc663264c56e587ce9210a7c3b049645e92526b9Argyrios Kyrtzidis
233aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    Vector<TimedBuffer> mTimedBufferQueue;
234aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    bool                mQueueHeadInFlight;
235811c820257746b1799b790b6adc7804f44154011Dmitri Gribenko    bool                mTrimQueueHeadOnRelease;
236aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    uint32_t            mFramesPendingInQueue;
237aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko
238c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko    uint8_t*            mTimedSilenceBuffer;
239c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko    uint32_t            mTimedSilenceBufferSize;
240c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko    mutable Mutex       mTimedBufferQueueLock;
2412125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    bool                mTimedAudioOutputOnTime;
242c41ace950dcf2254c9aa48e73647b89c35109f80Dmitri Gribenko    CCHelper            mCCHelper;
243cd81df2dcff4e13eea6edfbfd52a4458d978d174Douglas Gregor
2442125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    Mutex               mMediaTimeTransformLock;
245cd81df2dcff4e13eea6edfbfd52a4458d978d174Douglas Gregor    LinearTransform     mMediaTimeTransform;
2462125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    bool                mMediaTimeTransformValid;
2472125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    TimedAudioTrack::TargetTimeline mMediaTimeTransformTarget;
2482125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko};
2492125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2502125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2512125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko// playback track, used by DuplicatingThread
2522125c9010e259548a8c476fa998a561889555c95Dmitri Gribenkoclass OutputTrack : public Track {
2532125c9010e259548a8c476fa998a561889555c95Dmitri Gribenkopublic:
2542125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2552125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    class Buffer : public AudioBufferProvider::Buffer {
2562125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    public:
2572125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko        int16_t *mBuffer;
2582125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    };
2592125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2602125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko                        OutputTrack(PlaybackThread *thread,
2612125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko                                DuplicatingThread *sourceThread,
2622125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko                                uint32_t sampleRate,
2632125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko                                audio_format_t format,
2642125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko                                audio_channel_mask_t channelMask,
2652125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko                                size_t frameCount,
2662125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko                                int uid);
2672125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    virtual             ~OutputTrack();
2682125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2692125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    virtual status_t    start(AudioSystem::sync_event_t event =
2702125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko                                    AudioSystem::SYNC_EVENT_NONE,
2712125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko                             int triggerSession = 0);
2722125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    virtual void        stop();
2732125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko            bool        write(int16_t* data, uint32_t frames);
2742125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko            bool        bufferQueueEmpty() const { return mBufferQueue.size() == 0; }
2752125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko            bool        isActive() const { return mActive; }
2762125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    const wp<ThreadBase>& thread() const { return mThread; }
2772125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2782125c9010e259548a8c476fa998a561889555c95Dmitri Gribenkoprivate:
2792125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2802125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    status_t            obtainBuffer(AudioBufferProvider::Buffer* buffer,
2812125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko                                     uint32_t waitTimeMs);
2822125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    void                clearBufferQueue();
2832125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2842125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    // Maximum number of pending buffers allocated by OutputTrack::write()
2852125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    static const uint8_t kMaxOverFlowBuffers = 10;
2862125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko
2872125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    Vector < Buffer* >          mBufferQueue;
2882125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    AudioBufferProvider::Buffer mOutBuffer;
2892125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    bool                        mActive;
2902125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    DuplicatingThread* const mSourceThread; // for waitTimeMs() in write()
2912125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko    AudioTrackClientProxy*      mClientProxy;
2922125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko};  // end of OutputTrack
2932125c9010e259548a8c476fa998a561889555c95Dmitri Gribenko