diff options
Diffstat (limited to 'LoopbackApp/app/src/main/cpp/audio_utils/fifo.h')
-rw-r--r-- | LoopbackApp/app/src/main/cpp/audio_utils/fifo.h | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/LoopbackApp/app/src/main/cpp/audio_utils/fifo.h b/LoopbackApp/app/src/main/cpp/audio_utils/fifo.h new file mode 100644 index 0000000..37a9df8 --- /dev/null +++ b/LoopbackApp/app/src/main/cpp/audio_utils/fifo.h @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * 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 ANDROID_AUDIO_FIFO_H +#define ANDROID_AUDIO_FIFO_H + +#include <stdlib.h> + +// FIXME use atomic_int_least32_t and new atomic operations instead of legacy Android ones +// #include <stdatomic.h> + +#ifdef __cplusplus +extern "C" { +#endif + +// Single writer, single reader non-blocking FIFO. +// Writer and reader must be in same process. + +// No user-serviceable parts within. +struct audio_utils_fifo { + // These fields are const after initialization + size_t mFrameCount; // max number of significant frames to be stored in the FIFO > 0 + size_t mFrameCountP2; // roundup(mFrameCount) + size_t mFudgeFactor; // mFrameCountP2 - mFrameCount, the number of "wasted" frames after + // the end of mBuffer. Only the indices are wasted, not any memory. + size_t mFrameSize; // size of each frame in bytes + void *mBuffer; // pointer to caller-allocated buffer of size mFrameCount frames + + volatile int32_t mFront; // frame index of first frame slot available to read, or read index + volatile int32_t mRear; // frame index of next frame slot available to write, or write index +}; + +// Initialize a FIFO object. +// Input parameters: +// fifo Pointer to the FIFO object. +// frameCount Max number of significant frames to be stored in the FIFO > 0. +// If writes and reads always use the same count, and that count is a divisor of +// frameCount, then the writes and reads will never do a partial transfer. +// frameSize Size of each frame in bytes. +// buffer Pointer to a caller-allocated buffer of frameCount frames. +void audio_utils_fifo_init(struct audio_utils_fifo *fifo, size_t frameCount, size_t frameSize, + void *buffer); + +// De-initialize a FIFO object. +// Input parameters: +// fifo Pointer to the FIFO object. +void audio_utils_fifo_deinit(struct audio_utils_fifo *fifo); + +// Write to FIFO. +// Input parameters: +// fifo Pointer to the FIFO object. +// buffer Pointer to source buffer containing 'count' frames of data. +// Returns actual number of frames written <= count. +// The actual transfer count may be zero if the FIFO is full, +// or partial if the FIFO was almost full. +// A negative return value indicates an error. Currently there are no errors defined. +ssize_t audio_utils_fifo_write(struct audio_utils_fifo *fifo, const void *buffer, size_t count); + +// Read from FIFO. +// Input parameters: +// fifo Pointer to the FIFO object. +// buffer Pointer to destination buffer to be filled with up to 'count' frames of data. +// Returns actual number of frames read <= count. +// The actual transfer count may be zero if the FIFO is empty, +// or partial if the FIFO was almost empty. +// A negative return value indicates an error. Currently there are no errors defined. +ssize_t audio_utils_fifo_read(struct audio_utils_fifo *fifo, void *buffer, size_t count); + +size_t audio_utils_fifo_availToRead(struct audio_utils_fifo *fifo); + +#ifdef __cplusplus +} +#endif + +#endif // !ANDROID_AUDIO_FIFO_H |