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