1fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk/* 2fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * Copyright 2015 The Android Open Source Project 3fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * 4fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * Licensed under the Apache License, Version 2.0 (the "License"); 5fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * you may not use this file except in compliance with the License. 6fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * You may obtain a copy of the License at 7fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * 8fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * http://www.apache.org/licenses/LICENSE-2.0 9fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * 10fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * Unless required by applicable law or agreed to in writing, software 11fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * distributed under the License is distributed on an "AS IS" BASIS, 12fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * See the License for the specific language governing permissions and 14fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * limitations under the License. 15fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk */ 16fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 17fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk#ifndef FIFO_FIFO_BUFFER_H 18fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk#define FIFO_FIFO_BUFFER_H 19fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 20fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk#include <stdint.h> 21fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 22fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk#include "FifoControllerBase.h" 23fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 24c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burknamespace android { 25c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 26c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk/** 27c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * Structure that represents a region in a circular buffer that might be at the 28c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * end of the array and split in two. 29c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk */ 30c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burkstruct WrappingBuffer { 31c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk enum { 32c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk SIZE = 2 33c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk }; 34c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk void *data[SIZE]; 35c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk int32_t numFrames[SIZE]; 36c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk}; 37c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 38fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burkclass FifoBuffer { 39fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burkpublic: 40fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk FifoBuffer(int32_t bytesPerFrame, fifo_frames_t capacityInFrames); 41fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 42c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk FifoBuffer(int32_t bytesPerFrame, 43c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk fifo_frames_t capacityInFrames, 44c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk fifo_counter_t *readCounterAddress, 45c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk fifo_counter_t *writeCounterAddress, 46c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk void *dataStorageAddress); 47fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 48fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk ~FifoBuffer(); 49fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 50fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk int32_t convertFramesToBytes(fifo_frames_t frames); 51fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 52fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk fifo_frames_t read(void *destination, fifo_frames_t framesToRead); 53fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 54fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk fifo_frames_t write(const void *source, fifo_frames_t framesToWrite); 55fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 56fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk fifo_frames_t getThreshold(); 57c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 58fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk void setThreshold(fifo_frames_t threshold); 59fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 60fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk fifo_frames_t getBufferCapacityInFrames(); 61fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 62c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk /** 63c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * Return pointer to available full frames in data1 and set size in numFrames1. 64c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * if the data is split across the end of the FIFO then set data2 and numFrames2. 65c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * Other wise set them to null 66c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * @param wrappingBuffer 67c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk */ 68c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk void getFullDataAvailable(WrappingBuffer *wrappingBuffer); 69c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 70c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk /** 71c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * Return pointer to available empty frames in data1 and set size in numFrames1. 72c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * if the room is split across the end of the FIFO then set data2 and numFrames2. 73c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * Other wise set them to null 74c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * @param wrappingBuffer 75c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk */ 76c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk void getEmptyRoomAvailable(WrappingBuffer *wrappingBuffer); 77c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 78c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk /** 79c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * Copy data from the FIFO into the buffer. 80c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * @param buffer 81c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * @param numFrames 82c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk * @return 83c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk */ 84fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk fifo_frames_t readNow(void *buffer, fifo_frames_t numFrames); 85fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 86fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk int64_t getNextReadTime(int32_t frameRate); 87fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 88fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk int32_t getUnderrunCount() const { return mUnderrunCount; } 89fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 90fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk FifoControllerBase *getFifoControllerBase() { return mFifo; } 91fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 92fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk int32_t getBytesPerFrame() { 93fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk return mBytesPerFrame; 94fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk } 95fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 96fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk fifo_counter_t getReadCounter() { 97fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk return mFifo->getReadCounter(); 98fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk } 99fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 100fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk void setReadCounter(fifo_counter_t n) { 101fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk mFifo->setReadCounter(n); 102fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk } 103fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 104fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk fifo_counter_t getWriteCounter() { 105fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk return mFifo->getWriteCounter(); 106fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk } 107fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 108fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk void setWriteCounter(fifo_counter_t n) { 109fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk mFifo->setWriteCounter(n); 110fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk } 111fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 112fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burkprivate: 113c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 114c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk void fillWrappingBuffer(WrappingBuffer *wrappingBuffer, 115c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk int32_t framesAvailable, int32_t startIndex); 116c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 117fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk const fifo_frames_t mFrameCapacity; 118c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk const int32_t mBytesPerFrame; 119c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk uint8_t *mStorage; 120c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk bool mStorageOwned; // did this object allocate the storage? 121fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk FifoControllerBase *mFifo; 122c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk fifo_counter_t mFramesReadCount; 123c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk fifo_counter_t mFramesUnderrunCount; 124c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk int32_t mUnderrunCount; // need? just use frames 125c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk int32_t mLastReadSize; 126fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk}; 127fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 128c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk} // android 129c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 130fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk#endif //FIFO_FIFO_BUFFER_H 131