#pragma once #include #include #include "../codec/codec.h" #include "../mixer/mixer.h" #include "clock.h" #include "peak_buffer.h" #define CAMU_AUDIO_BUFFER_FADE struct camu_audio_buffer { struct camu_codec_stream *stream; struct camu_clock *clock; atomic(f64) pts; f64 latency; bool ignore_desync; atomic(bool) no_video; u8 pause; bool logged_delay; atomic(u32) unpause; struct camu_resampler_format fmt; struct camu_resampler *resampler; u8 *data; ptrdiff_t size; struct al_ring_buffer rb; struct { ptrdiff_t min, buffered; } mark; bool buffered; atomic(u32) flow; struct camu_peak_buffer peak; atomic(ptrdiff_t) uncork_at; struct { f32 user; atomic(u32) set; atomic(f32) queued; } volume; #ifdef CAMU_AUDIO_BUFFER_FADE struct { f32 volume; ptrdiff_t offset; u32 tail; } fade; #endif #ifdef CAMU_MIXER_THREADED atomic(bool) ref; #endif void (*callback)(void *, u8); void *userdata; }; bool camu_audio_buffer_init(struct camu_audio_buffer *buf, struct camu_clock *clock); bool camu_audio_buffer_configure(struct camu_audio_buffer *buf, struct camu_codec_stream *stream, struct camu_mixer *mixer); void camu_audio_buffer_set_volume(struct camu_audio_buffer *buf, f32 volume); void camu_audio_buffer_set_latency(struct camu_audio_buffer *buf, f64 latency); void camu_audio_buffer_set_ignore_desync(struct camu_audio_buffer *buf, bool ignore_desync); void camu_audio_buffer_set_no_video(struct camu_audio_buffer *buf, bool no_video); void camu_audio_buffer_push(struct camu_audio_buffer *buf, struct camu_codec_frame *frame); void camu_audio_buffer_flush(struct camu_audio_buffer *buf, bool error); void camu_audio_buffer_reset(struct camu_audio_buffer *buf); void camu_audio_buffer_resync(struct camu_audio_buffer *buf); ptrdiff_t camu_audio_buffer_read(struct camu_audio_buffer *buf, u8 *data, ptrdiff_t req); void camu_audio_buffer_free(struct camu_audio_buffer *buf);