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