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