1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2015 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_FIFOPROCESSOR_H 18cb93a386Sopenharmony_ci#define OBOE_FIFOPROCESSOR_H 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_ci#include <memory> 21cb93a386Sopenharmony_ci#include <stdint.h> 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_ci#include "oboe/Definitions.h" 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ci#include "FifoControllerBase.h" 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_cinamespace oboe { 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ciclass FifoBuffer { 30cb93a386Sopenharmony_cipublic: 31cb93a386Sopenharmony_ci FifoBuffer(uint32_t bytesPerFrame, uint32_t capacityInFrames); 32cb93a386Sopenharmony_ci 33cb93a386Sopenharmony_ci FifoBuffer(uint32_t bytesPerFrame, 34cb93a386Sopenharmony_ci uint32_t capacityInFrames, 35cb93a386Sopenharmony_ci std::atomic<uint64_t> *readCounterAddress, 36cb93a386Sopenharmony_ci std::atomic<uint64_t> *writeCounterAddress, 37cb93a386Sopenharmony_ci uint8_t *dataStorageAddress); 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ci ~FifoBuffer(); 40cb93a386Sopenharmony_ci 41cb93a386Sopenharmony_ci int32_t convertFramesToBytes(int32_t frames); 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ci /** 44cb93a386Sopenharmony_ci * Read framesToRead or, if not enough, then read as many as are available. 45cb93a386Sopenharmony_ci * @param destination 46cb93a386Sopenharmony_ci * @param framesToRead number of frames requested 47cb93a386Sopenharmony_ci * @return number of frames actually read 48cb93a386Sopenharmony_ci */ 49cb93a386Sopenharmony_ci int32_t read(void *destination, int32_t framesToRead); 50cb93a386Sopenharmony_ci 51cb93a386Sopenharmony_ci int32_t write(const void *source, int32_t framesToWrite); 52cb93a386Sopenharmony_ci 53cb93a386Sopenharmony_ci uint32_t getBufferCapacityInFrames() const; 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_ci /** 56cb93a386Sopenharmony_ci * Calls read(). If all of the frames cannot be read then the remainder of the buffer 57cb93a386Sopenharmony_ci * is set to zero. 58cb93a386Sopenharmony_ci * 59cb93a386Sopenharmony_ci * @param destination 60cb93a386Sopenharmony_ci * @param framesToRead number of frames requested 61cb93a386Sopenharmony_ci * @return number of frames actually read 62cb93a386Sopenharmony_ci */ 63cb93a386Sopenharmony_ci int32_t readNow(void *destination, int32_t numFrames); 64cb93a386Sopenharmony_ci 65cb93a386Sopenharmony_ci uint32_t getFullFramesAvailable() { 66cb93a386Sopenharmony_ci return mFifo->getFullFramesAvailable(); 67cb93a386Sopenharmony_ci } 68cb93a386Sopenharmony_ci 69cb93a386Sopenharmony_ci uint32_t getBytesPerFrame() const { 70cb93a386Sopenharmony_ci return mBytesPerFrame; 71cb93a386Sopenharmony_ci } 72cb93a386Sopenharmony_ci 73cb93a386Sopenharmony_ci uint64_t getReadCounter() const { 74cb93a386Sopenharmony_ci return mFifo->getReadCounter(); 75cb93a386Sopenharmony_ci } 76cb93a386Sopenharmony_ci 77cb93a386Sopenharmony_ci void setReadCounter(uint64_t n) { 78cb93a386Sopenharmony_ci mFifo->setReadCounter(n); 79cb93a386Sopenharmony_ci } 80cb93a386Sopenharmony_ci 81cb93a386Sopenharmony_ci uint64_t getWriteCounter() { 82cb93a386Sopenharmony_ci return mFifo->getWriteCounter(); 83cb93a386Sopenharmony_ci } 84cb93a386Sopenharmony_ci void setWriteCounter(uint64_t n) { 85cb93a386Sopenharmony_ci mFifo->setWriteCounter(n); 86cb93a386Sopenharmony_ci } 87cb93a386Sopenharmony_ci 88cb93a386Sopenharmony_ciprivate: 89cb93a386Sopenharmony_ci uint32_t mBytesPerFrame; 90cb93a386Sopenharmony_ci uint8_t* mStorage; 91cb93a386Sopenharmony_ci bool mStorageOwned; // did this object allocate the storage? 92cb93a386Sopenharmony_ci std::unique_ptr<FifoControllerBase> mFifo; 93cb93a386Sopenharmony_ci uint64_t mFramesReadCount; 94cb93a386Sopenharmony_ci uint64_t mFramesUnderrunCount; 95cb93a386Sopenharmony_ci}; 96cb93a386Sopenharmony_ci 97cb93a386Sopenharmony_ci} // namespace oboe 98cb93a386Sopenharmony_ci 99cb93a386Sopenharmony_ci#endif //OBOE_FIFOPROCESSOR_H 100