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