#ifndef _XAS_AUDIO_H #define _XAS_AUDIO_H #include #include #define XAS_AUDIO_PCM_8_BIT 1 #define XAS_AUDIO_PCM_16_BIT 2 #define XAS_AUDIO_MONO 1 #define XAS_AUDIO_STEREO 2 #define XAS_AUDIO_STEREO_LEFT 0 #define XAS_AUDIO_STEREO_RIGHT 1 enum xas_audio_stream_type { XAS_AUDIO_STREAM_SINK, XAS_AUDIO_STREAM_SOURCE }; typedef struct _xas_audio_stream xas_audio_stream; typedef ssize_t (*xas_audio_drain)(void *ctx, void *samples, size_t count, xas_audio_stream *sink); typedef ssize_t (*xas_audio_fill)(void *ctx, void *samples, size_t count, xas_audio_stream *source); typedef void (*xas_audio_cleanup)(void *ctx, xas_audio_stream *stream); typedef struct _xas_audio_format { size_t channels, sample_size, sample_rate; } xas_audio_format; struct _xas_audio_stream { enum xas_audio_stream_type type; xas_audio_format format; size_t buffer_size, buffer_count; union { void *callback; xas_audio_drain drain; xas_audio_fill fill; }; xas_audio_cleanup cleanup; void *ctx; }; int xas_audio_format_eq(xas_audio_format a, xas_audio_format b); void xas_audio_zero(xas_audio_format format, void *dest, size_t index, size_t count); void xas_audio_copy(xas_audio_format format, void *dest, void *src, size_t index_dest, size_t index_src, size_t count); void xas_audio_apply_gain(xas_audio_format format, void *dest, float gain, size_t index, size_t count); xas_audio_stream *xas_audio_stream_new_sink(xas_audio_drain drain, xas_audio_cleanup cleanup, xas_audio_format format, size_t buffer_size, void *ctx); xas_audio_stream *xas_audio_stream_new_source(xas_audio_fill fill, xas_audio_cleanup cleanup, xas_audio_format format, size_t buffer_size, void *ctx); void xas_audio_stream_destroy(xas_audio_stream *stream); void *xas_audio_stream_buffer(xas_audio_stream *stream); ssize_t xas_audio_stream_write(xas_audio_stream *sink, void *samples, size_t count); int xas_audio_stream_flush(xas_audio_stream *stream); ssize_t xas_audio_stream_read(xas_audio_stream *source, void **samples, size_t count); #endif /* _XAS_AUDIO_H */