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#define LOG_TAG "FifoControllerBase" 18fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk//#define LOG_NDEBUG 0 19fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk#include <utils/Log.h> 20fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 21fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk#include <stdint.h> 22fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk#include "FifoControllerBase.h" 23fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 24c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burkusing namespace android; // TODO just import names needed 25c0c70e3c7dd10bc2c0caffcab1f3f5fb406b35fbPhil Burk 26fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil BurkFifoControllerBase::FifoControllerBase(fifo_frames_t capacity, fifo_frames_t threshold) 27fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk : mCapacity(capacity) 28fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk , mThreshold(threshold) 29fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk{ 30fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk} 31fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 32fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil BurkFifoControllerBase::~FifoControllerBase() { 33fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk} 34fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 35fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burkfifo_frames_t FifoControllerBase::getFullFramesAvailable() { 36fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk return (fifo_frames_t) (getWriteCounter() - getReadCounter()); 37fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk} 38fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 39fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burkfifo_frames_t FifoControllerBase::getReadIndex() { 40fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk // % works with non-power of two sizes 41fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk return (fifo_frames_t) (getReadCounter() % mCapacity); 42fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk} 43fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 44fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burkvoid FifoControllerBase::advanceReadIndex(fifo_frames_t numFrames) { 45fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk setReadCounter(getReadCounter() + numFrames); 46fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk} 47fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 48fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burkfifo_frames_t FifoControllerBase::getEmptyFramesAvailable() { 49fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk return (int32_t)(mThreshold - getFullFramesAvailable()); 50fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk} 51fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 52fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burkfifo_frames_t FifoControllerBase::getWriteIndex() { 53fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk // % works with non-power of two sizes 54fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk return (fifo_frames_t) (getWriteCounter() % mCapacity); 55fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk} 56fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 57fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burkvoid FifoControllerBase::advanceWriteIndex(fifo_frames_t numFrames) { 58fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk setWriteCounter(getWriteCounter() + numFrames); 59fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk} 60fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk 61fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burkvoid FifoControllerBase::setThreshold(fifo_frames_t threshold) { 62fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk mThreshold = threshold; 63fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk} 64