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