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 ×tamp); 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