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_CONTROLLER_BASE_H 18fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk#define FIFO_FIFO_CONTROLLER_BASE_H 19fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 20fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk#include <stdint.h> 21fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 22c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burknamespace android { 23c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 24fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burktypedef int64_t fifo_counter_t; 25fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burktypedef int32_t fifo_frames_t; 26fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 27fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk/** 28fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * Manage the read/write indices of a circular buffer. 29fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * 30fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * The caller is responsible for reading and writing the actual data. 31fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * Note that the span of available frames may not be contiguous. They 32fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * may wrap around from the end to the beginning of the buffer. In that 33fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * case the data must be read or written in at least two blocks of frames. 34fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * 35fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk */ 36fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burkclass FifoControllerBase { 37fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 38fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burkpublic: 39fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk /** 40fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * Constructor for FifoControllerBase 41fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * @param capacity Total size of the circular buffer in frames. 42fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * @param threshold Number of frames to fill. Must be less than capacity. 43fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk */ 44fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk FifoControllerBase(fifo_frames_t capacity, fifo_frames_t threshold); 45fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 46fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk virtual ~FifoControllerBase(); 47fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 48fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk // Abstract methods to be implemented in subclasses. 49fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk /** 50fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * @return Counter used by the reader of the FIFO. 51fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk */ 52fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk virtual fifo_counter_t getReadCounter() = 0; 53fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 54fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk /** 55fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * This is normally only used internally. 56fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * @param count Number of frames that have been read. 57fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk */ 58fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk virtual void setReadCounter(fifo_counter_t count) = 0; 59fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 60fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk /** 61fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * @return Counter used by the reader of the FIFO. 62fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk */ 63fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk virtual fifo_counter_t getWriteCounter() = 0; 64fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 65fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk /** 66fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * This is normally only used internally. 67fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * @param count Number of frames that have been read. 68fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk */ 69fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk virtual void setWriteCounter(fifo_counter_t count) = 0; 70fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 71fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk /** 72fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * This may be negative if an unthrottled reader has read beyond the available data. 73fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * @return number of valid frames available to read. Never read more than this. 74fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk */ 75fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk fifo_frames_t getFullFramesAvailable(); 76fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 77fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk /** 78fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * The index in a circular buffer of the next frame to read. 79fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk */ 80fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk fifo_frames_t getReadIndex(); 81fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 82fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk /** 83fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * @param numFrames number of frames to advance the read index 84fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk */ 85fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk void advanceReadIndex(fifo_frames_t numFrames); 86fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 87fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk /** 88fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * @return number of frames that can be written. Never write more than this. 89fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk */ 90fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk fifo_frames_t getEmptyFramesAvailable(); 91fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 92fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk /** 93fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * The index in a circular buffer of the next frame to write. 94fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk */ 95fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk fifo_frames_t getWriteIndex(); 96fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 97fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk /** 98fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * @param numFrames number of frames to advance the write index 99fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk */ 100fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk void advanceWriteIndex(fifo_frames_t numFrames); 101fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 102fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk /** 103fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * You can request that the buffer not be filled above a maximum 104fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * number of frames. 105fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk * @param threshold effective size of the buffer 106fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk */ 107fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk void setThreshold(fifo_frames_t threshold); 108fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 109fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk fifo_frames_t getThreshold() const { 110fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk return mThreshold; 111fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk } 112fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 113fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk fifo_frames_t getCapacity() const { 114fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk return mCapacity; 115fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk } 116fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 117fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 118fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burkprivate: 119fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk fifo_frames_t mCapacity; 120fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk fifo_frames_t mThreshold; 121fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk}; 122fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 123c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk} // android 124c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 125fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk#endif // FIFO_FIFO_CONTROLLER_BASE_H 126