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