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,
3183b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent                                void *buffer,
32462fd2fa9eef642b0574aa7409de0bde3fec8d43Marco Nelissen                                int sessionId,
33d776ac63ce9c013c9626226e43f7db606e035838Glenn Kasten                                int uid,
3483b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent                                IAudioFlinger::track_flags_t flags,
3583b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent                                track_type type);
3681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    virtual             ~RecordTrack();
3781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
3881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    virtual status_t    start(AudioSystem::sync_event_t event, int triggerSession);
3981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    virtual void        stop();
4081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
4181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            void        destroy();
4281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
439a54bc27876acd5d8be5b1fc3dc46701fe76fbb3Eric Laurent            void        invalidate();
4481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // clear the buffer overflow flag
4581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            void        clearOverflow() { mOverflow = false; }
4681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            // set the buffer overflow flag and return previous value
4781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent            bool        setOverflow() { bool tmp = mOverflow; mOverflow = true;
4881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                                return tmp; }
4981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
5081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    static  void        appendDumpHeader(String8& result);
51b220884bf3129253cc5bc8d030bc475411ea4911Marco Nelissen            void        dump(char* buffer, size_t size, bool active);
5281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
5325f4aa83efaa9179e65a20583a6d441de2c3ff3fGlenn Kasten            void        handleSyncStartEvent(const sp<SyncEvent>& event);
5425f4aa83efaa9179e65a20583a6d441de2c3ff3fGlenn Kasten            void        clearSyncStartEvent();
5525f4aa83efaa9179e65a20583a6d441de2c3ff3fGlenn Kasten
5681784c37c61b09289654b979567a42bf73cd2b12Eric Laurentprivate:
5781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    friend class AudioFlinger;  // for mState
5881784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
5981784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        RecordTrack(const RecordTrack&);
6081784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                        RecordTrack& operator = (const RecordTrack&);
6181784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
6281784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // AudioBufferProvider interface
6381784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer,
6481784c37c61b09289654b979567a42bf73cd2b12Eric Laurent                                   int64_t pts = kInvalidPTS);
6581784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    // releaseBuffer() not overridden
6681784c37c61b09289654b979567a42bf73cd2b12Eric Laurent
6781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent    bool                mOverflow;  // overflow on most recent attempt to fill client buffer
686dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
69deca2ae0a7cf8bc54ff3f30b7dc39bbc78b94c0dGlenn Kasten           // updated by RecordThread::readInputParameters_l()
706dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            AudioResampler                      *mResampler;
716dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
7284a0c6e87c48f58a0d3be71961432c086a4d24ccAndy Hung            // interleaved stereo pairs of fixed-point Q4.27
736dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            int32_t                             *mRsmpOutBuffer;
746dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            // current allocated frame count for the above, which may be larger than needed
756dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            size_t                              mRsmpOutFrameCount;
766dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
776dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            size_t                              mRsmpInUnrel;   // unreleased frames remaining from
786dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                                                                // most recent getNextBuffer
796dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten                                                                // for debug only
806dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
816dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            // rolling counter that is never cleared
826dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            int32_t                             mRsmpInFront;   // next available frame
836dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
846dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            AudioBufferProvider::Buffer mSink;  // references client's buffer sink in shared memory
856dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
866dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            // sync event triggering actual audio capture. Frames read before this event will
876dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            // be dropped and therefore not read by the application.
886dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            sp<SyncEvent>                       mSyncStartEvent;
896dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
906dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            // number of captured frames to drop after the start sync event has been received.
916dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            // when < 0, maximum frames to drop before starting capture even if sync event is
926dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            // not received
936dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            ssize_t                             mFramesToDrop;
946dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten
956dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            // used by resampler to find source frames
966dd62fb91d82dedcfa3ab38c02eb0940b4ba932aGlenn Kasten            ResamplerBufferProvider *mResamplerBufferProvider;
9781784c37c61b09289654b979567a42bf73cd2b12Eric Laurent};
9883b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent
9983b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent// playback track, used by PatchPanel
10083b8808faad1e91690c64d7007348be8d9ebde73Eric Laurentclass PatchRecord : virtual public RecordTrack, public PatchProxyBufferProvider {
10183b8808faad1e91690c64d7007348be8d9ebde73Eric Laurentpublic:
10283b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent
10383b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent    PatchRecord(RecordThread *recordThread,
10483b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent                uint32_t sampleRate,
10583b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent                audio_channel_mask_t channelMask,
10683b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent                audio_format_t format,
10783b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent                size_t frameCount,
10883b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent                void *buffer,
10983b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent                IAudioFlinger::track_flags_t flags);
11083b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent    virtual             ~PatchRecord();
11183b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent
11283b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent    // AudioBufferProvider interface
11383b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent    virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer,
11483b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent                                   int64_t pts);
11583b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent    virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);
11683b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent
11783b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent    // PatchProxyBufferProvider interface
11883b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent    virtual status_t    obtainBuffer(Proxy::Buffer *buffer,
11983b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent                                     const struct timespec *timeOut = NULL);
12083b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent    virtual void        releaseBuffer(Proxy::Buffer *buffer);
12183b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent
12283b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent    void setPeerProxy(PatchProxyBufferProvider *proxy) { mPeerProxy = proxy; }
12383b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent
12483b8808faad1e91690c64d7007348be8d9ebde73Eric Laurentprivate:
12583b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent    sp<ClientProxy>             mProxy;
12683b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent    PatchProxyBufferProvider*   mPeerProxy;
12783b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent    struct timespec             mPeerTimeout;
12883b8808faad1e91690c64d7007348be8d9ebde73Eric Laurent};  // end of PatchRecord
129