1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2023 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker #pragma once 18*ec779b8eSAndroid Build Coastguard Worker 19*ec779b8eSAndroid Build Coastguard Worker namespace android { 20*ec779b8eSAndroid Build Coastguard Worker 21*ec779b8eSAndroid Build Coastguard Worker class IAfRecordTrack; 22*ec779b8eSAndroid Build Coastguard Worker 23*ec779b8eSAndroid Build Coastguard Worker /* The ResamplerBufferProvider is used to retrieve recorded input data from the 24*ec779b8eSAndroid Build Coastguard Worker * RecordThread. It maintains local state on the relative position of the read 25*ec779b8eSAndroid Build Coastguard Worker * position of the RecordTrack compared with the RecordThread. 26*ec779b8eSAndroid Build Coastguard Worker */ 27*ec779b8eSAndroid Build Coastguard Worker class ResamplerBufferProvider : public AudioBufferProvider 28*ec779b8eSAndroid Build Coastguard Worker { 29*ec779b8eSAndroid Build Coastguard Worker public: ResamplerBufferProvider(IAfRecordTrack * recordTrack)30*ec779b8eSAndroid Build Coastguard Worker explicit ResamplerBufferProvider(IAfRecordTrack* recordTrack) : 31*ec779b8eSAndroid Build Coastguard Worker mRecordTrack(recordTrack) {} 32*ec779b8eSAndroid Build Coastguard Worker 33*ec779b8eSAndroid Build Coastguard Worker // called to set the ResamplerBufferProvider to head of the RecordThread data buffer, 34*ec779b8eSAndroid Build Coastguard Worker // skipping any previous data read from the hal. 35*ec779b8eSAndroid Build Coastguard Worker void reset(); 36*ec779b8eSAndroid Build Coastguard Worker 37*ec779b8eSAndroid Build Coastguard Worker /* Synchronizes RecordTrack position with the RecordThread. 38*ec779b8eSAndroid Build Coastguard Worker * Calculates available frames and handle overruns if the RecordThread 39*ec779b8eSAndroid Build Coastguard Worker * has advanced faster than the ResamplerBufferProvider has retrieved data. 40*ec779b8eSAndroid Build Coastguard Worker * TODO: why not do this for every getNextBuffer? 41*ec779b8eSAndroid Build Coastguard Worker * 42*ec779b8eSAndroid Build Coastguard Worker * Parameters 43*ec779b8eSAndroid Build Coastguard Worker * framesAvailable: pointer to optional output size_t to store record track 44*ec779b8eSAndroid Build Coastguard Worker * frames available. 45*ec779b8eSAndroid Build Coastguard Worker * hasOverrun: pointer to optional boolean, returns true if track has overrun. 46*ec779b8eSAndroid Build Coastguard Worker */ 47*ec779b8eSAndroid Build Coastguard Worker 48*ec779b8eSAndroid Build Coastguard Worker void sync(size_t* framesAvailable = nullptr, bool* hasOverrun = nullptr); 49*ec779b8eSAndroid Build Coastguard Worker 50*ec779b8eSAndroid Build Coastguard Worker // AudioBufferProvider interface 51*ec779b8eSAndroid Build Coastguard Worker status_t getNextBuffer(AudioBufferProvider::Buffer* buffer) final; 52*ec779b8eSAndroid Build Coastguard Worker void releaseBuffer(AudioBufferProvider::Buffer* buffer) final; 53*ec779b8eSAndroid Build Coastguard Worker getFront()54*ec779b8eSAndroid Build Coastguard Worker int32_t getFront() const { return mRsmpInFront; } setFront(int32_t front)55*ec779b8eSAndroid Build Coastguard Worker void setFront(int32_t front) { mRsmpInFront = front; } 56*ec779b8eSAndroid Build Coastguard Worker 57*ec779b8eSAndroid Build Coastguard Worker private: 58*ec779b8eSAndroid Build Coastguard Worker IAfRecordTrack* const mRecordTrack; 59*ec779b8eSAndroid Build Coastguard Worker size_t mRsmpInUnrel = 0; // unreleased frames remaining from 60*ec779b8eSAndroid Build Coastguard Worker // most recent getNextBuffer 61*ec779b8eSAndroid Build Coastguard Worker // for debug only 62*ec779b8eSAndroid Build Coastguard Worker int32_t mRsmpInFront = 0; // next available frame 63*ec779b8eSAndroid Build Coastguard Worker // rolling counter that is never cleared 64*ec779b8eSAndroid Build Coastguard Worker }; 65*ec779b8eSAndroid Build Coastguard Worker 66*ec779b8eSAndroid Build Coastguard Worker } // namespace android