1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2015 The Android Open Source Project
3cb93a386Sopenharmony_ci *
4cb93a386Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
5cb93a386Sopenharmony_ci * you may not use this file except in compliance with the License.
6cb93a386Sopenharmony_ci * You may obtain a copy of the License at
7cb93a386Sopenharmony_ci *
8cb93a386Sopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
9cb93a386Sopenharmony_ci *
10cb93a386Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
11cb93a386Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
12cb93a386Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cb93a386Sopenharmony_ci * See the License for the specific language governing permissions and
14cb93a386Sopenharmony_ci * limitations under the License.
15cb93a386Sopenharmony_ci */
16cb93a386Sopenharmony_ci
17cb93a386Sopenharmony_ci#ifndef OBOE_FIFOPROCESSOR_H
18cb93a386Sopenharmony_ci#define OBOE_FIFOPROCESSOR_H
19cb93a386Sopenharmony_ci
20cb93a386Sopenharmony_ci#include <memory>
21cb93a386Sopenharmony_ci#include <stdint.h>
22cb93a386Sopenharmony_ci
23cb93a386Sopenharmony_ci#include "oboe/Definitions.h"
24cb93a386Sopenharmony_ci
25cb93a386Sopenharmony_ci#include "FifoControllerBase.h"
26cb93a386Sopenharmony_ci
27cb93a386Sopenharmony_cinamespace oboe {
28cb93a386Sopenharmony_ci
29cb93a386Sopenharmony_ciclass FifoBuffer {
30cb93a386Sopenharmony_cipublic:
31cb93a386Sopenharmony_ci    FifoBuffer(uint32_t bytesPerFrame, uint32_t capacityInFrames);
32cb93a386Sopenharmony_ci
33cb93a386Sopenharmony_ci    FifoBuffer(uint32_t   bytesPerFrame,
34cb93a386Sopenharmony_ci               uint32_t   capacityInFrames,
35cb93a386Sopenharmony_ci               std::atomic<uint64_t>   *readCounterAddress,
36cb93a386Sopenharmony_ci               std::atomic<uint64_t>   *writeCounterAddress,
37cb93a386Sopenharmony_ci               uint8_t   *dataStorageAddress);
38cb93a386Sopenharmony_ci
39cb93a386Sopenharmony_ci    ~FifoBuffer();
40cb93a386Sopenharmony_ci
41cb93a386Sopenharmony_ci    int32_t convertFramesToBytes(int32_t frames);
42cb93a386Sopenharmony_ci
43cb93a386Sopenharmony_ci    /**
44cb93a386Sopenharmony_ci     * Read framesToRead or, if not enough, then read as many as are available.
45cb93a386Sopenharmony_ci     * @param destination
46cb93a386Sopenharmony_ci     * @param framesToRead number of frames requested
47cb93a386Sopenharmony_ci     * @return number of frames actually read
48cb93a386Sopenharmony_ci     */
49cb93a386Sopenharmony_ci    int32_t read(void *destination, int32_t framesToRead);
50cb93a386Sopenharmony_ci
51cb93a386Sopenharmony_ci    int32_t write(const void *source, int32_t framesToWrite);
52cb93a386Sopenharmony_ci
53cb93a386Sopenharmony_ci    uint32_t getBufferCapacityInFrames() const;
54cb93a386Sopenharmony_ci
55cb93a386Sopenharmony_ci    /**
56cb93a386Sopenharmony_ci     * Calls read(). If all of the frames cannot be read then the remainder of the buffer
57cb93a386Sopenharmony_ci     * is set to zero.
58cb93a386Sopenharmony_ci     *
59cb93a386Sopenharmony_ci     * @param destination
60cb93a386Sopenharmony_ci     * @param framesToRead number of frames requested
61cb93a386Sopenharmony_ci     * @return number of frames actually read
62cb93a386Sopenharmony_ci     */
63cb93a386Sopenharmony_ci    int32_t readNow(void *destination, int32_t numFrames);
64cb93a386Sopenharmony_ci
65cb93a386Sopenharmony_ci    uint32_t getFullFramesAvailable() {
66cb93a386Sopenharmony_ci        return mFifo->getFullFramesAvailable();
67cb93a386Sopenharmony_ci    }
68cb93a386Sopenharmony_ci
69cb93a386Sopenharmony_ci    uint32_t getBytesPerFrame() const {
70cb93a386Sopenharmony_ci        return mBytesPerFrame;
71cb93a386Sopenharmony_ci    }
72cb93a386Sopenharmony_ci
73cb93a386Sopenharmony_ci    uint64_t getReadCounter() const {
74cb93a386Sopenharmony_ci        return mFifo->getReadCounter();
75cb93a386Sopenharmony_ci    }
76cb93a386Sopenharmony_ci
77cb93a386Sopenharmony_ci    void setReadCounter(uint64_t n) {
78cb93a386Sopenharmony_ci        mFifo->setReadCounter(n);
79cb93a386Sopenharmony_ci    }
80cb93a386Sopenharmony_ci
81cb93a386Sopenharmony_ci    uint64_t getWriteCounter() {
82cb93a386Sopenharmony_ci        return mFifo->getWriteCounter();
83cb93a386Sopenharmony_ci    }
84cb93a386Sopenharmony_ci    void setWriteCounter(uint64_t n) {
85cb93a386Sopenharmony_ci        mFifo->setWriteCounter(n);
86cb93a386Sopenharmony_ci    }
87cb93a386Sopenharmony_ci
88cb93a386Sopenharmony_ciprivate:
89cb93a386Sopenharmony_ci    uint32_t mBytesPerFrame;
90cb93a386Sopenharmony_ci    uint8_t* mStorage;
91cb93a386Sopenharmony_ci    bool     mStorageOwned; // did this object allocate the storage?
92cb93a386Sopenharmony_ci    std::unique_ptr<FifoControllerBase> mFifo;
93cb93a386Sopenharmony_ci    uint64_t mFramesReadCount;
94cb93a386Sopenharmony_ci    uint64_t mFramesUnderrunCount;
95cb93a386Sopenharmony_ci};
96cb93a386Sopenharmony_ci
97cb93a386Sopenharmony_ci} // namespace oboe
98cb93a386Sopenharmony_ci
99cb93a386Sopenharmony_ci#endif //OBOE_FIFOPROCESSOR_H
100