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