FifoBuffer.h revision fd911c1b48d05d0ea3791c988b18eaa4d20fecd4
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
24fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burkclass FifoBuffer {
25fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burkpublic:
26fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    FifoBuffer(int32_t bytesPerFrame, fifo_frames_t capacityInFrames);
27fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk
28fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    FifoBuffer(int32_t   bytesPerFrame,
29fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk               fifo_frames_t   capacityInFrames,
30fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk               fifo_counter_t * readCounterAddress,
31fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk               fifo_counter_t * writeCounterAddress,
32fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk               void * dataStorageAddress);
33fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk
34fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    ~FifoBuffer();
35fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk
36fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    int32_t convertFramesToBytes(fifo_frames_t frames);
37fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk
38fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    fifo_frames_t read(void *destination, fifo_frames_t framesToRead);
39fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk
40fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    fifo_frames_t write(const void *source, fifo_frames_t framesToWrite);
41fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk
42fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    fifo_frames_t getThreshold();
43fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    void setThreshold(fifo_frames_t threshold);
44fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk
45fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    fifo_frames_t getBufferCapacityInFrames();
46fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk
47fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    fifo_frames_t readNow(void *buffer, fifo_frames_t numFrames);
48fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk
49fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    int64_t getNextReadTime(int32_t frameRate);
50fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk
51fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    int32_t getUnderrunCount() const { return mUnderrunCount; }
52fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk
53fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    FifoControllerBase *getFifoControllerBase() { return mFifo; }
54fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk
55fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    int32_t getBytesPerFrame() {
56fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk        return mBytesPerFrame;
57fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    }
58fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk
59fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    fifo_counter_t getReadCounter() {
60fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk        return mFifo->getReadCounter();
61fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    }
62fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk
63fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    void setReadCounter(fifo_counter_t n) {
64fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk        mFifo->setReadCounter(n);
65fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    }
66fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk
67fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    fifo_counter_t getWriteCounter() {
68fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk        return mFifo->getWriteCounter();
69fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    }
70fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk
71fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    void setWriteCounter(fifo_counter_t n) {
72fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk        mFifo->setWriteCounter(n);
73fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    }
74fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk
75fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burkprivate:
76fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    const fifo_frames_t mFrameCapacity;
77fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    const int32_t       mBytesPerFrame;
78fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    uint8_t *           mStorage;
79fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    bool                mStorageOwned; // did this object allocate the storage?
80fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    FifoControllerBase *mFifo;
81fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    fifo_counter_t      mFramesReadCount;
82fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    fifo_counter_t      mFramesUnderrunCount;
83fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    int32_t             mUnderrunCount; // need? just use frames
84fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk    int32_t             mLastReadSize;
85fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk};
86fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk
87fd911c1b48d05d0ea3791c988b18eaa4d20fecd4Phil Burk#endif //FIFO_FIFO_BUFFER_H
88