audiolib/audio/audio.h
2024-03-06 21:55:32 +01:00

108 lines
4.1 KiB
C

#ifndef AUDIOPIPELINE_AUDIO_H__INCLUDED
#define AUDIOPIPELINE_AUDIO_H__INCLUDED
#include <stdarg.h>
#include <stdint.h>
/**
* Audio buffer that is passed from one pipeline element to the next, contents
* in data are undefined, they could be compressed data or interleaved sample
* data.
*/
typedef struct _AudioBuffer {
uint32_t buf_size;
uint8_t *data;
// FIXME: Data type
} AudioBuffer;
/**
* Type of pipeline element
*/
typedef enum _AudioPipelineElementType {
AudioElementSource, /** Audio source, has to be the first item in a pipeline */
AudioElementDemuxer, /** Format demuxer, yields sample data from a stream */
AudioElementDecoder, /** Audio decoder, decodes sample data from a compressed input buffer */
AudioElementEncoder, /** Audio encoder, takes sample data and compresses them */
AudioElementFilter, /** Audio filter, takes sample data, transforms the samples and yields sample data */
AudioElementMuxer, /** Takes compressed buffers and muxes them to an output format which can be saved*/
AudioElementSink /** Audio sink, takes a buffer and outputs it somewhere, probably a file or soundcard */
} AudioPipelineElementType;
/**
* Status of the audio pipeline
*/
typedef enum _AudioPipelineStatus {
PipelineStopped, /** Pipeline in stopped state, no processing is happening yet */
PipelineRunning, /** Pipeline in running state, samples will be produced, transformed and consumed*/
PipelinePaused, /** Pipeline in paused mode, everything is initialized but no processing is happening */
PipelineBuffering, /** Pipeline is pre-loading data */
PipelineError, /** Pipeline is in error state, something happened that prevents other states */
PipelineFinished /** Pipeline has finished processing data */
} AudioPipelineStatus;
/** A audio pipeline element, data contained in this is opaque to the user */
typedef struct _AudioPipelineElement AudioPipelineElement;
/**
* The audio pipeline, created by calling `audio_pipeline_assemble` and can be used by calling
* the function pointers provided.
*/
typedef struct _AudioPipeline {
/** Start processing audio */
AudioPipelineStatus (*start)(struct _AudioPipeline *pipeline);
/** Stop processing audio and reset internal state */
AudioPipelineStatus (*reset)(struct _AudioPipeline *pipeline);
/** Stop processing audio, does not reset internal state, you can call start on the pipeline
to continue processing */
AudioPipelineStatus (*stop)(struct _AudioPipeline *pipeline);
/** Status callback will be called if the state of the pipeline changes */
void (*statusCallback)(struct _AudioPipeline *self, AudioPipelineStatus status);
/** The source element of the pipeline, some sources may allow changing parameters */
struct _AudioPipelineElement *source;
/** The sink element of the pipeline */
struct _AudioPipelineElement *sink;
/** Pipeline status (same as is provided via status callback) */
AudioPipelineStatus status;
} AudioPipeline;
/**
* Assemble a pipeline from components, end the List with a sink and a NULL element!
*
* @param source The source element
* @param ... other elements to add to the pipeline, end with NULL element!
*
* @returns Initialized `AudioPipeline` or `NULL` on Error.
*/
AudioPipeline *audio_pipeline_assemble(AudioPipelineElement *source, ...);
/**
* Destroy the pipeline given, this will release all associated memory, do not use pipeline afterwards!
*
* @param pipeline The pipeline to deallocate
*/
void audio_pipeline_destroy(AudioPipeline *pipeline);
/**
* Safely allocate an audio buffer, returns NULL on out of memory conditions.
*
* @param size Size in bytes of the buffer data, iIf set to 0, the data pointer will not be allocated and stays at `NULL`
*
* @returns Initialized `AudioBuffer`
*/
AudioBuffer *alloc_audio_buffer(uint32_t size);
/**
* Free an audio buffer and all it's contents if any has been allocated.
*
* @param buffer The audio buffer to deallocate
*/
void free_audio_buffer(AudioBuffer *buffer);
#endif /* AUDIOPIPELINE_AUDIO_H__INCLUDED */