1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright (C) 2016 The Android Open Source Project 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 5cb93a386Sopenharmony_ci * you may not use this file except in compliance with the License. 6cb93a386Sopenharmony_ci * You may obtain a copy of the License at 7cb93a386Sopenharmony_ci * 8cb93a386Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 9cb93a386Sopenharmony_ci * 10cb93a386Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 11cb93a386Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 12cb93a386Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cb93a386Sopenharmony_ci * See the License for the specific language governing permissions and 14cb93a386Sopenharmony_ci * limitations under the License. 15cb93a386Sopenharmony_ci */ 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_ci#ifndef OBOE_STREAM_BUFFERED_H 18cb93a386Sopenharmony_ci#define OBOE_STREAM_BUFFERED_H 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_ci#include <cstring> 21cb93a386Sopenharmony_ci#include <cassert> 22cb93a386Sopenharmony_ci#include "common/OboeDebug.h" 23cb93a386Sopenharmony_ci#include "oboe/AudioStream.h" 24cb93a386Sopenharmony_ci#include "oboe/AudioStreamCallback.h" 25cb93a386Sopenharmony_ci#include "fifo/FifoBuffer.h" 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_cinamespace oboe { 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ci// A stream that contains a FIFO buffer. 30cb93a386Sopenharmony_ci// This is used to implement blocking reads and writes. 31cb93a386Sopenharmony_ciclass AudioStreamBuffered : public AudioStream { 32cb93a386Sopenharmony_cipublic: 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_ci AudioStreamBuffered(); 35cb93a386Sopenharmony_ci explicit AudioStreamBuffered(const AudioStreamBuilder &builder); 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_ci void allocateFifo(); 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ci ResultWithValue<int32_t> write(const void *buffer, 41cb93a386Sopenharmony_ci int32_t numFrames, 42cb93a386Sopenharmony_ci int64_t timeoutNanoseconds) override; 43cb93a386Sopenharmony_ci 44cb93a386Sopenharmony_ci ResultWithValue<int32_t> read(void *buffer, 45cb93a386Sopenharmony_ci int32_t numFrames, 46cb93a386Sopenharmony_ci int64_t timeoutNanoseconds) override; 47cb93a386Sopenharmony_ci 48cb93a386Sopenharmony_ci ResultWithValue<int32_t> setBufferSizeInFrames(int32_t requestedFrames) override; 49cb93a386Sopenharmony_ci 50cb93a386Sopenharmony_ci int32_t getBufferCapacityInFrames() const override; 51cb93a386Sopenharmony_ci 52cb93a386Sopenharmony_ci ResultWithValue<int32_t> getXRunCount() const override { 53cb93a386Sopenharmony_ci return ResultWithValue<int32_t>(mXRunCount); 54cb93a386Sopenharmony_ci } 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ci bool isXRunCountSupported() const override; 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ciprotected: 59cb93a386Sopenharmony_ci 60cb93a386Sopenharmony_ci DataCallbackResult onDefaultCallback(void *audioData, int numFrames) override; 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ci // If there is no callback then we need a FIFO between the App and OpenSL ES. 63cb93a386Sopenharmony_ci bool usingFIFO() const { return getCallback() == nullptr; } 64cb93a386Sopenharmony_ci 65cb93a386Sopenharmony_ci virtual Result updateServiceFrameCounter() = 0; 66cb93a386Sopenharmony_ci 67cb93a386Sopenharmony_ci void updateFramesRead() override; 68cb93a386Sopenharmony_ci void updateFramesWritten() override; 69cb93a386Sopenharmony_ci 70cb93a386Sopenharmony_ciprivate: 71cb93a386Sopenharmony_ci 72cb93a386Sopenharmony_ci int64_t predictNextCallbackTime(); 73cb93a386Sopenharmony_ci 74cb93a386Sopenharmony_ci void markCallbackTime(int32_t numFrames); 75cb93a386Sopenharmony_ci 76cb93a386Sopenharmony_ci // Read or write to the FIFO. 77cb93a386Sopenharmony_ci ResultWithValue<int32_t> transfer(void *buffer, int32_t numFrames, int64_t timeoutNanoseconds); 78cb93a386Sopenharmony_ci 79cb93a386Sopenharmony_ci void incrementXRunCount() { 80cb93a386Sopenharmony_ci ++mXRunCount; 81cb93a386Sopenharmony_ci } 82cb93a386Sopenharmony_ci 83cb93a386Sopenharmony_ci std::unique_ptr<FifoBuffer> mFifoBuffer{}; 84cb93a386Sopenharmony_ci 85cb93a386Sopenharmony_ci int64_t mBackgroundRanAtNanoseconds = 0; 86cb93a386Sopenharmony_ci int32_t mLastBackgroundSize = 0; 87cb93a386Sopenharmony_ci int32_t mXRunCount = 0; 88cb93a386Sopenharmony_ci}; 89cb93a386Sopenharmony_ci 90cb93a386Sopenharmony_ci} // namespace oboe 91cb93a386Sopenharmony_ci 92cb93a386Sopenharmony_ci#endif //OBOE_STREAM_BUFFERED_H 93