| /*---------------------------------------------------------------------------* |
| * CircularBuffer.h * |
| * * |
| * Copyright 2007, 2008 Nuance Communciations, Inc. * |
| * * |
| * Licensed under the Apache License, Version 2.0 (the 'License'); * |
| * you may not use this file except in compliance with the License. * |
| * * |
| * You may obtain a copy of the License at * |
| * http://www.apache.org/licenses/LICENSE-2.0 * |
| * * |
| * Unless required by applicable law or agreed to in writing, software * |
| * distributed under the License is distributed on an 'AS IS' BASIS, * |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * |
| * See the License for the specific language governing permissions and * |
| * limitations under the License. * |
| * * |
| *---------------------------------------------------------------------------*/ |
| |
| #ifndef CIRCULARBUFFER_H |
| #define CIRCULARBUFFER_H |
| |
| |
| |
| /* |
| * This is implemented as a set of macros rather than functions with proper |
| * checking. The reasons for doing so is that this is a non-public API that is |
| * used in the audio delivery component and we want it to be as fast as |
| * possible. |
| */ |
| |
| #include "ESR_SharedPrefix.h" |
| #include "ptypes.h" |
| |
| /** |
| * @addtogroup CircularBufferModule CircularBuffer API functions |
| * Generic Circular Buffer implementation. |
| * |
| * @{ |
| */ |
| |
| /** |
| * A circular buffer. |
| * |
| * @see list of functions used to operate on @ref CircularBufferModule "CircularBuffer" objects |
| */ |
| typedef struct CircularBuffer_t |
| { |
| /** |
| * Total buffer capacity. |
| */ |
| size_t capacity; |
| |
| /** |
| * Amount of data in buffer. |
| */ |
| size_t size; |
| |
| /** |
| * Write index. |
| */ |
| size_t writeIdx; |
| |
| /** |
| * Read index. |
| */ |
| size_t readIdx; |
| |
| } |
| CircularBuffer; |
| |
| /** |
| * Creates a circular buffer of the specified capacity. |
| * |
| * @param capacity the capacity in number of bytes of the data buffer. |
| * @param mtag MALLOC allocation tag |
| * @param buffer The circular buffer to initialize. |
| */ |
| ESR_SHARED_API ESR_ReturnCode CircularBufferCreate(size_t capacity, const LCHAR* mtag, CircularBuffer** buffer); |
| |
| /** |
| * Returns the capacity of the buffer. |
| */ |
| #define CircularBufferGetCapacity(buffer) ((buffer)->capacity + 0) |
| |
| /** |
| * Returns the current size (number of bytes) in the buffer. |
| */ |
| #define CircularBufferGetSize(buffer) ((buffer)->size + 0) |
| |
| /** |
| * Returns whether buffer is empty or not. |
| */ |
| #define CircularBufferIsEmpty(buffer) ((buffer)->size == 0) |
| |
| /** |
| * Returns whether buffer is full or not. |
| **/ |
| #define CircularBufferIsFull(buffer) ((buffer)->size == (buffer)->capacity) |
| |
| /** |
| * Resets the buffer to the empty state. |
| */ |
| #define CircularBufferReset(buffer) ((buffer)->size = \ |
| (buffer)->readIdx = \ |
| (buffer)->writeIdx = 0) |
| |
| /** |
| * Determines the residual capacity of the circular buffer. |
| */ |
| #define CircularBufferGetAvailable(buffer) ((buffer)->capacity - (buffer)->size) |
| |
| /** |
| * Reads requested number of bytes from the circular buffer. |
| * |
| * @param buffer The circular buffer to read from. |
| * @param data Pointer to where to store read bytes. |
| * @param bufSize The number of bytes to read from the circular buffer. |
| * |
| * @return the number of bytes that were read. A negative value indicates an |
| * error, while a value less than bufSize indicates that end-of-buffer is |
| * reached. |
| */ |
| ESR_SHARED_API int CircularBufferRead(CircularBuffer* buffer, void* data, size_t bufSize); |
| |
| /** |
| * Skips requested number of bytes from the circular buffer. |
| * |
| * @param buffer The circular buffer to skip from. |
| * @param bufSize The number of bytes to skip from the circular buffer. |
| * |
| * @return the number of bytes that were skipped. A negative value indicates an |
| * error, while a value less than bufSize indicates that end-of-buffer is |
| * reached. |
| **/ |
| ESR_SHARED_API int CircularBufferSkip(CircularBuffer* buffer, size_t bufSize); |
| |
| /** |
| * Writes requested number of bytes from the circular buffer. |
| * |
| * @param buffer The circular buffer to write to |
| * @param data Pointer to data to write. |
| * @param bufSize The number of bytes to write into the circular buffer. |
| * |
| * @return the number of bytes that were written. A negative value indicates |
| * an error, while a value less than bufSize indicates that buffer capacity is |
| * reached. |
| */ |
| ESR_SHARED_API int CircularBufferWrite(CircularBuffer* buffer, const void* data, size_t bufSize); |
| |
| /** |
| * Removes the requested number of bytes from the end of the circular buffer. |
| * |
| * @param buffer The circular buffer to write to |
| * @param amoun tThe number of bytes to remove from end of circular buffer. |
| * |
| * @return the number of bytes that were unwritten. A negative value indicates |
| * an error. |
| */ |
| ESR_SHARED_API int CircularBufferUnwrite(CircularBuffer* buffer, size_t amount); |
| |
| /** |
| * @} |
| */ |
| |
| |
| #endif |