xref: /aosp_15_r20/external/oboe/src/common/AudioSourceCaller.h (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 #ifndef OBOE_AUDIO_SOURCE_CALLER_H
18*05767d91SRobert Wu #define OBOE_AUDIO_SOURCE_CALLER_H
19*05767d91SRobert Wu 
20*05767d91SRobert Wu #include "OboeDebug.h"
21*05767d91SRobert Wu #include "oboe/Oboe.h"
22*05767d91SRobert Wu 
23*05767d91SRobert Wu #include "flowgraph/FlowGraphNode.h"
24*05767d91SRobert Wu #include "FixedBlockReader.h"
25*05767d91SRobert Wu 
26*05767d91SRobert Wu namespace oboe {
27*05767d91SRobert Wu 
28*05767d91SRobert Wu class AudioStreamCallback;
29*05767d91SRobert Wu class AudioStream;
30*05767d91SRobert Wu 
31*05767d91SRobert Wu /**
32*05767d91SRobert Wu  * For output streams that use a callback, call the application for more data.
33*05767d91SRobert Wu  * For input streams that do not use a callback, read from the stream.
34*05767d91SRobert Wu  */
35*05767d91SRobert Wu class AudioSourceCaller : public flowgraph::FlowGraphSource, public FixedBlockProcessor {
36*05767d91SRobert Wu public:
AudioSourceCaller(int32_t channelCount,int32_t framesPerCallback,int32_t bytesPerSample)37*05767d91SRobert Wu     AudioSourceCaller(int32_t channelCount, int32_t framesPerCallback, int32_t bytesPerSample)
38*05767d91SRobert Wu             : FlowGraphSource(channelCount)
39*05767d91SRobert Wu             , mBlockReader(*this) {
40*05767d91SRobert Wu         mBlockReader.open(channelCount * framesPerCallback * bytesPerSample);
41*05767d91SRobert Wu     }
42*05767d91SRobert Wu 
43*05767d91SRobert Wu     /**
44*05767d91SRobert Wu      * Set the stream to use as a source of data.
45*05767d91SRobert Wu      * @param stream
46*05767d91SRobert Wu      */
setStream(oboe::AudioStream * stream)47*05767d91SRobert Wu     void setStream(oboe::AudioStream *stream) {
48*05767d91SRobert Wu         mStream = stream;
49*05767d91SRobert Wu     }
50*05767d91SRobert Wu 
getStream()51*05767d91SRobert Wu     oboe::AudioStream *getStream() {
52*05767d91SRobert Wu         return mStream;
53*05767d91SRobert Wu     }
54*05767d91SRobert Wu 
55*05767d91SRobert Wu     /**
56*05767d91SRobert Wu      * Timeout value to use when calling audioStream->read().
57*05767d91SRobert Wu      * @param timeoutNanos Zero for no timeout or time in nanoseconds.
58*05767d91SRobert Wu      */
setTimeoutNanos(int64_t timeoutNanos)59*05767d91SRobert Wu     void setTimeoutNanos(int64_t timeoutNanos) {
60*05767d91SRobert Wu         mTimeoutNanos = timeoutNanos;
61*05767d91SRobert Wu     }
62*05767d91SRobert Wu 
getTimeoutNanos()63*05767d91SRobert Wu     int64_t getTimeoutNanos() const {
64*05767d91SRobert Wu         return mTimeoutNanos;
65*05767d91SRobert Wu     }
66*05767d91SRobert Wu 
67*05767d91SRobert Wu     /**
68*05767d91SRobert Wu      * Called internally for block size adaptation.
69*05767d91SRobert Wu      * @param buffer
70*05767d91SRobert Wu      * @param numBytes
71*05767d91SRobert Wu      * @return
72*05767d91SRobert Wu      */
73*05767d91SRobert Wu     int32_t onProcessFixedBlock(uint8_t *buffer, int32_t numBytes) override;
74*05767d91SRobert Wu 
75*05767d91SRobert Wu protected:
76*05767d91SRobert Wu     oboe::AudioStream         *mStream = nullptr;
77*05767d91SRobert Wu     int64_t                    mTimeoutNanos = 0;
78*05767d91SRobert Wu 
79*05767d91SRobert Wu     FixedBlockReader           mBlockReader;
80*05767d91SRobert Wu };
81*05767d91SRobert Wu 
82*05767d91SRobert Wu }
83*05767d91SRobert Wu #endif //OBOE_AUDIO_SOURCE_CALLER_H
84