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