TrackBase.h revision c263ca0ad8b6bdf5b0693996bc5f2f5916e0cd49
16a829a1b724ca0d960decee217d260b4de8a5463Adam Rak/* 26a829a1b724ca0d960decee217d260b4de8a5463Adam Rak** 36a829a1b724ca0d960decee217d260b4de8a5463Adam Rak** Copyright 2012, The Android Open Source Project 46a829a1b724ca0d960decee217d260b4de8a5463Adam Rak** 56a829a1b724ca0d960decee217d260b4de8a5463Adam Rak** Licensed under the Apache License, Version 2.0 (the "License"); 66a829a1b724ca0d960decee217d260b4de8a5463Adam Rak** you may not use this file except in compliance with the License. 76a829a1b724ca0d960decee217d260b4de8a5463Adam Rak** You may obtain a copy of the License at 86a829a1b724ca0d960decee217d260b4de8a5463Adam Rak** 96a829a1b724ca0d960decee217d260b4de8a5463Adam Rak** http://www.apache.org/licenses/LICENSE-2.0 106a829a1b724ca0d960decee217d260b4de8a5463Adam Rak** 116a829a1b724ca0d960decee217d260b4de8a5463Adam Rak** Unless required by applicable law or agreed to in writing, software 126a829a1b724ca0d960decee217d260b4de8a5463Adam Rak** distributed under the License is distributed on an "AS IS" BASIS, 136a829a1b724ca0d960decee217d260b4de8a5463Adam Rak** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 146a829a1b724ca0d960decee217d260b4de8a5463Adam Rak** See the License for the specific language governing permissions and 156a829a1b724ca0d960decee217d260b4de8a5463Adam Rak** limitations under the License. 166a829a1b724ca0d960decee217d260b4de8a5463Adam Rak*/ 176a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 186a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#ifndef INCLUDING_FROM_AUDIOFLINGER_H 196a829a1b724ca0d960decee217d260b4de8a5463Adam Rak #error This header file should only be included from AudioFlinger.h 206a829a1b724ca0d960decee217d260b4de8a5463Adam Rak#endif 216a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 226a829a1b724ca0d960decee217d260b4de8a5463Adam Rak// base for record and playback 236a829a1b724ca0d960decee217d260b4de8a5463Adam Rakclass TrackBase : public ExtendedAudioBufferProvider, public RefBase { 246a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 256a829a1b724ca0d960decee217d260b4de8a5463Adam Rakpublic: 266a829a1b724ca0d960decee217d260b4de8a5463Adam Rak enum track_state { 276a829a1b724ca0d960decee217d260b4de8a5463Adam Rak IDLE, 286a829a1b724ca0d960decee217d260b4de8a5463Adam Rak FLUSHED, 296a829a1b724ca0d960decee217d260b4de8a5463Adam Rak STOPPED, 306a829a1b724ca0d960decee217d260b4de8a5463Adam Rak // next 2 states are currently used for fast tracks 316a829a1b724ca0d960decee217d260b4de8a5463Adam Rak // and offloaded tracks only 326a829a1b724ca0d960decee217d260b4de8a5463Adam Rak STOPPING_1, // waiting for first underrun 336a829a1b724ca0d960decee217d260b4de8a5463Adam Rak STOPPING_2, // waiting for presentation complete 346a829a1b724ca0d960decee217d260b4de8a5463Adam Rak RESUMING, 356a829a1b724ca0d960decee217d260b4de8a5463Adam Rak ACTIVE, 366a829a1b724ca0d960decee217d260b4de8a5463Adam Rak PAUSING, 376a829a1b724ca0d960decee217d260b4de8a5463Adam Rak PAUSED, 386a829a1b724ca0d960decee217d260b4de8a5463Adam Rak STARTING_1, // for RecordTrack only 396a829a1b724ca0d960decee217d260b4de8a5463Adam Rak STARTING_2, // for RecordTrack only 406a829a1b724ca0d960decee217d260b4de8a5463Adam Rak }; 416a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 426a829a1b724ca0d960decee217d260b4de8a5463Adam Rak // where to allocate the data buffer 436a829a1b724ca0d960decee217d260b4de8a5463Adam Rak enum alloc_type { 44951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák ALLOC_CBLK, // allocate immediately after control block 45eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard ALLOC_READONLY, // allocate from a separate read-only heap per thread 46eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard ALLOC_PIPE, // do not allocate; use the pipe buffer 47eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard }; 48eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard 49951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák TrackBase(ThreadBase *thread, 50eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard const sp<Client>& client, 519b00edc79a49bd9fdef9102e3d74828d93ee185eTom Stellard uint32_t sampleRate, 529b00edc79a49bd9fdef9102e3d74828d93ee185eTom Stellard audio_format_t format, 539b00edc79a49bd9fdef9102e3d74828d93ee185eTom Stellard audio_channel_mask_t channelMask, 54eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard size_t frameCount, 55eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard const sp<IMemory>& sharedBuffer, 56da9c8a73ec6fcb0e92204a739c1a7c43f145efefTom Stellard int sessionId, 57eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard int uid, 58eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard IAudioFlinger::track_flags_t flags, 59eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard bool isOut, 60eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard alloc_type alloc = ALLOC_CBLK); 61eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard virtual ~TrackBase(); 62eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard virtual status_t initCheck() const { return getCblk() != 0 ? NO_ERROR : NO_MEMORY; } 63eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard 64eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard virtual status_t start(AudioSystem::sync_event_t event, 65951ac46a6a0a901b53a518c8dcde734578cbf228Marek Olšák int triggerSession) = 0; 66eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard virtual void stop() = 0; 67eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard sp<IMemory> getCblk() const { return mCblkMemory; } 68eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard audio_track_cblk_t* cblk() const { return mCblk; } 69eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard int sessionId() const { return mSessionId; } 70eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard int uid() const { return mUid; } 71eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard virtual status_t setSyncEvent(const sp<SyncEvent>& event); 72eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard 736a829a1b724ca0d960decee217d260b4de8a5463Adam Rak sp<IMemory> getBuffers() const { return mBufferMemory; } 746a829a1b724ca0d960decee217d260b4de8a5463Adam Rak bool isFastTrack() const { return (mFlags & IAudioFlinger::TRACK_FAST) != 0; } 756a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 766a829a1b724ca0d960decee217d260b4de8a5463Adam Rakprotected: 776a829a1b724ca0d960decee217d260b4de8a5463Adam Rak TrackBase(const TrackBase&); 786a829a1b724ca0d960decee217d260b4de8a5463Adam Rak TrackBase& operator = (const TrackBase&); 796a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 806a829a1b724ca0d960decee217d260b4de8a5463Adam Rak // AudioBufferProvider interface 816a829a1b724ca0d960decee217d260b4de8a5463Adam Rak virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer, int64_t pts) = 0; 82c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer); 83c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard 84c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard // ExtendedAudioBufferProvider interface is only needed for Track, 85c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard // but putting it in TrackBase avoids the complexity of virtual inheritance 86c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard virtual size_t framesReady() const { return SIZE_MAX; } 87c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard 88c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard audio_format_t format() const { return mFormat; } 89c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard 90c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard uint32_t channelCount() const { return mChannelCount; } 91c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard 92c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard audio_channel_mask_t channelMask() const { return mChannelMask; } 93d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard 94d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard virtual uint32_t sampleRate() const { return mSampleRate; } 95c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard 96c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard bool isStopped() const { 97c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard return (mState == STOPPED || mState == FLUSHED); 98c0f7fe7b79afa9b95b1af56dce9eb881575b1cdeTom Stellard } 996a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 1006a829a1b724ca0d960decee217d260b4de8a5463Adam Rak // for fast tracks and offloaded tracks only 101eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard bool isStopping() const { 102eb065f5d9d1159af3a88a64a7606c9b6d67dc3e3Tom Stellard return mState == STOPPING_1 || mState == STOPPING_2; 1036a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 1046a829a1b724ca0d960decee217d260b4de8a5463Adam Rak bool isStopping_1() const { 1056a829a1b724ca0d960decee217d260b4de8a5463Adam Rak return mState == STOPPING_1; 1066a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 1076a829a1b724ca0d960decee217d260b4de8a5463Adam Rak bool isStopping_2() const { 1086a829a1b724ca0d960decee217d260b4de8a5463Adam Rak return mState == STOPPING_2; 1096a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 110d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard 1116a829a1b724ca0d960decee217d260b4de8a5463Adam Rak bool isTerminated() const { 1129b00edc79a49bd9fdef9102e3d74828d93ee185eTom Stellard return mTerminated; 1139b00edc79a49bd9fdef9102e3d74828d93ee185eTom Stellard } 1146a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 1159b00edc79a49bd9fdef9102e3d74828d93ee185eTom Stellard void terminate() { 1166a829a1b724ca0d960decee217d260b4de8a5463Adam Rak mTerminated = true; 1176a829a1b724ca0d960decee217d260b4de8a5463Adam Rak } 1186a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 1196a829a1b724ca0d960decee217d260b4de8a5463Adam Rak bool isOut() const { return mIsOut; } 1206a829a1b724ca0d960decee217d260b4de8a5463Adam Rak // true for Track and TimedTrack, false for RecordTrack, 1216a829a1b724ca0d960decee217d260b4de8a5463Adam Rak // this could be a track type if needed later 1226a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 1236a829a1b724ca0d960decee217d260b4de8a5463Adam Rak const wp<ThreadBase> mThread; 1246a829a1b724ca0d960decee217d260b4de8a5463Adam Rak /*const*/ sp<Client> mClient; // see explanation at ~TrackBase() why not const 1256a829a1b724ca0d960decee217d260b4de8a5463Adam Rak sp<IMemory> mCblkMemory; 1266a829a1b724ca0d960decee217d260b4de8a5463Adam Rak audio_track_cblk_t* mCblk; 1276a829a1b724ca0d960decee217d260b4de8a5463Adam Rak sp<IMemory> mBufferMemory; // currently non-0 for fast RecordTrack only 1286a829a1b724ca0d960decee217d260b4de8a5463Adam Rak void* mBuffer; // start of track buffer, typically in shared memory 1296a829a1b724ca0d960decee217d260b4de8a5463Adam Rak // except for OutputTrack when it is in local memory 1306a829a1b724ca0d960decee217d260b4de8a5463Adam Rak // we don't really need a lock for these 1316a829a1b724ca0d960decee217d260b4de8a5463Adam Rak track_state mState; 1326a829a1b724ca0d960decee217d260b4de8a5463Adam Rak const uint32_t mSampleRate; // initial sample rate only; for tracks which 133d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard // support dynamic rates, the current value is in control block 134d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard const audio_format_t mFormat; 135d36499aa62f42192356fd9e34009905ae0e9e6c8Tom Stellard const audio_channel_mask_t mChannelMask; 1366a829a1b724ca0d960decee217d260b4de8a5463Adam Rak const uint32_t mChannelCount; 1376a829a1b724ca0d960decee217d260b4de8a5463Adam Rak const size_t mFrameSize; // AudioFlinger's view of frame size in shared memory, 1386a829a1b724ca0d960decee217d260b4de8a5463Adam Rak // where for AudioTrack (but not AudioRecord), 1396a829a1b724ca0d960decee217d260b4de8a5463Adam Rak // 8-bit PCM samples are stored as 16-bit 1406a829a1b724ca0d960decee217d260b4de8a5463Adam Rak const size_t mFrameCount;// size of track buffer given at createTrack() or 1416a829a1b724ca0d960decee217d260b4de8a5463Adam Rak // openRecord(), and then adjusted as needed 1426a829a1b724ca0d960decee217d260b4de8a5463Adam Rak 1436a829a1b724ca0d960decee217d260b4de8a5463Adam Rak const int mSessionId; 1446a829a1b724ca0d960decee217d260b4de8a5463Adam Rak int mUid; 1456a829a1b724ca0d960decee217d260b4de8a5463Adam Rak Vector < sp<SyncEvent> >mSyncEvents; 1466a829a1b724ca0d960decee217d260b4de8a5463Adam Rak const IAudioFlinger::track_flags_t mFlags; 1476a829a1b724ca0d960decee217d260b4de8a5463Adam Rak const bool mIsOut; 1486a829a1b724ca0d960decee217d260b4de8a5463Adam Rak ServerProxy* mServerProxy; 1496a829a1b724ca0d960decee217d260b4de8a5463Adam Rak const int mId; 1506a829a1b724ca0d960decee217d260b4de8a5463Adam Rak sp<NBAIO_Sink> mTeeSink; 1516a829a1b724ca0d960decee217d260b4de8a5463Adam Rak sp<NBAIO_Source> mTeeSource; 1526a829a1b724ca0d960decee217d260b4de8a5463Adam Rak bool mTerminated; 1536a829a1b724ca0d960decee217d260b4de8a5463Adam Rak}; 1546a829a1b724ca0d960decee217d260b4de8a5463Adam Rak