1*05767d91SRobert Wu /* 2*05767d91SRobert Wu * Copyright (C) 2016 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_STREAM_BUFFERED_H 18*05767d91SRobert Wu #define OBOE_STREAM_BUFFERED_H 19*05767d91SRobert Wu 20*05767d91SRobert Wu #include <cstring> 21*05767d91SRobert Wu #include <cassert> 22*05767d91SRobert Wu #include "common/OboeDebug.h" 23*05767d91SRobert Wu #include "oboe/AudioStream.h" 24*05767d91SRobert Wu #include "oboe/AudioStreamCallback.h" 25*05767d91SRobert Wu #include "oboe/FifoBuffer.h" 26*05767d91SRobert Wu 27*05767d91SRobert Wu namespace oboe { 28*05767d91SRobert Wu 29*05767d91SRobert Wu // A stream that contains a FIFO buffer. 30*05767d91SRobert Wu // This is used to implement blocking reads and writes. 31*05767d91SRobert Wu class AudioStreamBuffered : public AudioStream { 32*05767d91SRobert Wu public: 33*05767d91SRobert Wu 34*05767d91SRobert Wu AudioStreamBuffered(); 35*05767d91SRobert Wu explicit AudioStreamBuffered(const AudioStreamBuilder &builder); 36*05767d91SRobert Wu 37*05767d91SRobert Wu void allocateFifo(); 38*05767d91SRobert Wu 39*05767d91SRobert Wu 40*05767d91SRobert Wu ResultWithValue<int32_t> write(const void *buffer, 41*05767d91SRobert Wu int32_t numFrames, 42*05767d91SRobert Wu int64_t timeoutNanoseconds) override; 43*05767d91SRobert Wu 44*05767d91SRobert Wu ResultWithValue<int32_t> read(void *buffer, 45*05767d91SRobert Wu int32_t numFrames, 46*05767d91SRobert Wu int64_t timeoutNanoseconds) override; 47*05767d91SRobert Wu 48*05767d91SRobert Wu ResultWithValue<int32_t> setBufferSizeInFrames(int32_t requestedFrames) override; 49*05767d91SRobert Wu 50*05767d91SRobert Wu int32_t getBufferCapacityInFrames() const override; 51*05767d91SRobert Wu getXRunCount()52*05767d91SRobert Wu ResultWithValue<int32_t> getXRunCount() override { 53*05767d91SRobert Wu return ResultWithValue<int32_t>(mXRunCount); 54*05767d91SRobert Wu } 55*05767d91SRobert Wu 56*05767d91SRobert Wu bool isXRunCountSupported() const override; 57*05767d91SRobert Wu 58*05767d91SRobert Wu protected: 59*05767d91SRobert Wu 60*05767d91SRobert Wu DataCallbackResult onDefaultCallback(void *audioData, int numFrames) override; 61*05767d91SRobert Wu 62*05767d91SRobert Wu // If there is no callback then we need a FIFO between the App and OpenSL ES. usingFIFO()63*05767d91SRobert Wu bool usingFIFO() const { return !isDataCallbackSpecified(); } 64*05767d91SRobert Wu 65*05767d91SRobert Wu virtual Result updateServiceFrameCounter() = 0; 66*05767d91SRobert Wu 67*05767d91SRobert Wu void updateFramesRead() override; 68*05767d91SRobert Wu void updateFramesWritten() override; 69*05767d91SRobert Wu 70*05767d91SRobert Wu private: 71*05767d91SRobert Wu 72*05767d91SRobert Wu int64_t predictNextCallbackTime(); 73*05767d91SRobert Wu 74*05767d91SRobert Wu void markCallbackTime(int32_t numFrames); 75*05767d91SRobert Wu 76*05767d91SRobert Wu // Read or write to the FIFO. 77*05767d91SRobert Wu // Only pass one pointer and set the other to nullptr. 78*05767d91SRobert Wu ResultWithValue<int32_t> transfer(void *readBuffer, 79*05767d91SRobert Wu const void *writeBuffer, 80*05767d91SRobert Wu int32_t numFrames, 81*05767d91SRobert Wu int64_t timeoutNanoseconds); 82*05767d91SRobert Wu incrementXRunCount()83*05767d91SRobert Wu void incrementXRunCount() { 84*05767d91SRobert Wu ++mXRunCount; 85*05767d91SRobert Wu } 86*05767d91SRobert Wu 87*05767d91SRobert Wu std::unique_ptr<FifoBuffer> mFifoBuffer{}; 88*05767d91SRobert Wu 89*05767d91SRobert Wu int64_t mBackgroundRanAtNanoseconds = 0; 90*05767d91SRobert Wu int32_t mLastBackgroundSize = 0; 91*05767d91SRobert Wu int32_t mXRunCount = 0; 92*05767d91SRobert Wu }; 93*05767d91SRobert Wu 94*05767d91SRobert Wu } // namespace oboe 95*05767d91SRobert Wu 96*05767d91SRobert Wu #endif //OBOE_STREAM_BUFFERED_H 97