RecordTracks.h revision 25f4aa83efaa9179e65a20583a6d441de2c3ff3f
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// record track
2381784c37c61b09289654b979567a42bf73cd2b12Eric Laurentclass RecordTrack : public TrackBase {
2481784c37c61b09289654b979567a42bf73cd2b12Eric Laurentpublic:
2581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        RecordTrack(RecordThread *thread,
2681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                const sp<Client>& client,
2781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                uint32_t sampleRate,
2881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                audio_format_t format,
2981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                audio_channel_mask_t channelMask,
3081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                size_t frameCount,
31462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen                                int sessionId,
32462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen                                int uid);
3381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    virtual             ~RecordTrack();
3481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
3581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    virtual status_t    start(AudioSystem::sync_event_t event, int triggerSession);
3681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    virtual void        stop();
3781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
3881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            void        destroy();
3981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
409a54bc27876acd5d8be5b1fc3dc46701fe76fbb3Eric Laurent            void        invalidate();
4181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // clear the buffer overflow flag
4281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            void        clearOverflow() { mOverflow = false; }
4381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // set the buffer overflow flag and return previous value
4481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            bool        setOverflow() { bool tmp = mOverflow; mOverflow = true;
4581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                                return tmp; }
4681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
4781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    static  void        appendDumpHeader(String8& result);
48b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen            void        dump(char* buffer, size_t size, bool active);
4981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
5025f4aa83efaa9179e65a20583a6d441de2c3ff3fGlenn Kasten            void        handleSyncStartEvent(const sp<SyncEvent>& event);
5125f4aa83efaa9179e65a20583a6d441de2c3ff3fGlenn Kasten            void        clearSyncStartEvent();
5225f4aa83efaa9179e65a20583a6d441de2c3ff3fGlenn Kasten
5381784c37c61b09289654b979567a42bf73cd2b12Eric Laurentprivate:
5481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    friend class AudioFlinger;  // for mState
5581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
5681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        RecordTrack(const RecordTrack&);
5781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        RecordTrack& operator = (const RecordTrack&);
5881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
5981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // AudioBufferProvider interface
6081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer,
6181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                   int64_t pts = kInvalidPTS);
6281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // releaseBuffer() not overridden
6381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
6481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    bool                mOverflow;  // overflow on most recent attempt to fill client buffer
656dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
66deca2ae0a7cf8bc54ff3f30b7dc39bbc78b94c0dGlenn Kasten           // updated by RecordThread::readInputParameters_l()
676dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            AudioResampler                      *mResampler;
686dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
696dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            // interleaved stereo pairs of fixed-point signed Q19.12
706dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            int32_t                             *mRsmpOutBuffer;
716dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            // current allocated frame count for the above, which may be larger than needed
726dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            size_t                              mRsmpOutFrameCount;
736dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
746dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            size_t                              mRsmpInUnrel;   // unreleased frames remaining from
756dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                                                                // most recent getNextBuffer
766dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                                                                // for debug only
776dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
786dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            // rolling counter that is never cleared
796dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            int32_t                             mRsmpInFront;   // next available frame
806dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
816dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            AudioBufferProvider::Buffer mSink;  // references client's buffer sink in shared memory
826dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
836dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            // sync event triggering actual audio capture. Frames read before this event will
846dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            // be dropped and therefore not read by the application.
856dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            sp<SyncEvent>                       mSyncStartEvent;
866dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
876dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            // number of captured frames to drop after the start sync event has been received.
886dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            // when < 0, maximum frames to drop before starting capture even if sync event is
896dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            // not received
906dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            ssize_t                             mFramesToDrop;
916dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
926dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            // used by resampler to find source frames
936dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            ResamplerBufferProvider *mResamplerBufferProvider;
9481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent};
95