xref: /aosp_15_r20/external/oboe/src/flowgraph/SampleRateConverter.cpp (revision 05767d913155b055644481607e6fa1e35e2fe72c)
1*05767d91SRobert Wu /*
2*05767d91SRobert Wu  * Copyright 2019 The Android Open Source Project
3*05767d91SRobert Wu  *
4*05767d91SRobert Wu  * Licensed under the Apache License, Version 2.0 (the "License");
5*05767d91SRobert Wu  * you may not use this file except in compliance with the License.
6*05767d91SRobert Wu  * You may obtain a copy of the License at
7*05767d91SRobert Wu  *
8*05767d91SRobert Wu  *      http://www.apache.org/licenses/LICENSE-2.0
9*05767d91SRobert Wu  *
10*05767d91SRobert Wu  * Unless required by applicable law or agreed to in writing, software
11*05767d91SRobert Wu  * distributed under the License is distributed on an "AS IS" BASIS,
12*05767d91SRobert Wu  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*05767d91SRobert Wu  * See the License for the specific language governing permissions and
14*05767d91SRobert Wu  * limitations under the License.
15*05767d91SRobert Wu  */
16*05767d91SRobert Wu 
17*05767d91SRobert Wu #include "SampleRateConverter.h"
18*05767d91SRobert Wu 
19*05767d91SRobert Wu using namespace FLOWGRAPH_OUTER_NAMESPACE::flowgraph;
20*05767d91SRobert Wu using namespace RESAMPLER_OUTER_NAMESPACE::resampler;
21*05767d91SRobert Wu 
SampleRateConverter(int32_t channelCount,MultiChannelResampler & resampler)22*05767d91SRobert Wu SampleRateConverter::SampleRateConverter(int32_t channelCount,
23*05767d91SRobert Wu                                          MultiChannelResampler &resampler)
24*05767d91SRobert Wu         : FlowGraphFilter(channelCount)
25*05767d91SRobert Wu         , mResampler(resampler) {
26*05767d91SRobert Wu     setDataPulledAutomatically(false);
27*05767d91SRobert Wu }
28*05767d91SRobert Wu 
reset()29*05767d91SRobert Wu void SampleRateConverter::reset() {
30*05767d91SRobert Wu     FlowGraphNode::reset();
31*05767d91SRobert Wu     mInputCursor = kInitialCallCount;
32*05767d91SRobert Wu }
33*05767d91SRobert Wu 
34*05767d91SRobert Wu // Return true if there is a sample available.
isInputAvailable()35*05767d91SRobert Wu bool SampleRateConverter::isInputAvailable() {
36*05767d91SRobert Wu     // If we have consumed all of the input data then go out and get some more.
37*05767d91SRobert Wu     if (mInputCursor >= mNumValidInputFrames) {
38*05767d91SRobert Wu         mInputCallCount++;
39*05767d91SRobert Wu         mNumValidInputFrames = input.pullData(mInputCallCount, input.getFramesPerBuffer());
40*05767d91SRobert Wu         mInputCursor = 0;
41*05767d91SRobert Wu     }
42*05767d91SRobert Wu     return (mInputCursor < mNumValidInputFrames);
43*05767d91SRobert Wu }
44*05767d91SRobert Wu 
getNextInputFrame()45*05767d91SRobert Wu const float *SampleRateConverter::getNextInputFrame() {
46*05767d91SRobert Wu     const float *inputBuffer = input.getBuffer();
47*05767d91SRobert Wu     return &inputBuffer[mInputCursor++ * input.getSamplesPerFrame()];
48*05767d91SRobert Wu }
49*05767d91SRobert Wu 
onProcess(int32_t numFrames)50*05767d91SRobert Wu int32_t SampleRateConverter::onProcess(int32_t numFrames) {
51*05767d91SRobert Wu     float *outputBuffer = output.getBuffer();
52*05767d91SRobert Wu     int32_t channelCount = output.getSamplesPerFrame();
53*05767d91SRobert Wu     int framesLeft = numFrames;
54*05767d91SRobert Wu     while (framesLeft > 0) {
55*05767d91SRobert Wu         // Gather input samples as needed.
56*05767d91SRobert Wu         if(mResampler.isWriteNeeded()) {
57*05767d91SRobert Wu             if (isInputAvailable()) {
58*05767d91SRobert Wu                 const float *frame = getNextInputFrame();
59*05767d91SRobert Wu                 mResampler.writeNextFrame(frame);
60*05767d91SRobert Wu             } else {
61*05767d91SRobert Wu                 break;
62*05767d91SRobert Wu             }
63*05767d91SRobert Wu         } else {
64*05767d91SRobert Wu             // Output frame is interpolated from input samples.
65*05767d91SRobert Wu             mResampler.readNextFrame(outputBuffer);
66*05767d91SRobert Wu             outputBuffer += channelCount;
67*05767d91SRobert Wu             framesLeft--;
68*05767d91SRobert Wu         }
69*05767d91SRobert Wu     }
70*05767d91SRobert Wu     return numFrames - framesLeft;
71*05767d91SRobert Wu }
72