Lines Matching full:audio_vbuffer
64 typedef struct audio_vbuffer {
74 static int audio_vbuffer_init (audio_vbuffer_t * audio_vbuffer, size_t frame_count,
76 if (!audio_vbuffer) {
79 audio_vbuffer->frame_size = frame_size;
80 audio_vbuffer->frame_count = frame_count;
82 audio_vbuffer->data = calloc(bytes, 1);
83 if (!audio_vbuffer->data) {
86 audio_vbuffer->head = 0;
87 audio_vbuffer->tail = 0;
88 audio_vbuffer->live = 0;
89 pthread_mutex_init (&audio_vbuffer->lock, (const pthread_mutexattr_t *) NULL);
93 static int audio_vbuffer_destroy (audio_vbuffer_t * audio_vbuffer) {
94 if (!audio_vbuffer) {
97 free(audio_vbuffer->data);
98 pthread_mutex_destroy(&audio_vbuffer->lock);
102 static int audio_vbuffer_live (audio_vbuffer_t * audio_vbuffer) {
103 if (!audio_vbuffer) {
106 pthread_mutex_lock (&audio_vbuffer->lock);
107 int live = audio_vbuffer->live;
108 pthread_mutex_unlock (&audio_vbuffer->lock);
112 static int audio_vbuffer_dead (audio_vbuffer_t * audio_vbuffer) {
113 if (!audio_vbuffer) {
116 pthread_mutex_lock (&audio_vbuffer->lock);
117 int dead = audio_vbuffer->frame_count - audio_vbuffer->live;
118 pthread_mutex_unlock (&audio_vbuffer->lock);
123 static size_t audio_vbuffer_write (audio_vbuffer_t * audio_vbuffer, const void * buffer, size_t frame_count) {
125 pthread_mutex_lock (&audio_vbuffer->lock);
129 if (audio_vbuffer->live == 0 || audio_vbuffer->head > audio_vbuffer->tail) {
130 frames = MIN(frame_count, audio_vbuffer->frame_count - audio_vbuffer->head);
131 } else if (audio_vbuffer->head < audio_vbuffer->tail) {
132 frames = MIN(frame_count, audio_vbuffer->tail - (audio_vbuffer->head));
137 memcpy(&audio_vbuffer->data[audio_vbuffer->head*audio_vbuffer->frame_size],
138 &((uint8_t*)buffer)[frames_written*audio_vbuffer->frame_size],
139 frames*audio_vbuffer->frame_size);
140 audio_vbuffer->live += frames;
143 audio_vbuffer->head = (audio_vbuffer->head + frames) % audio_vbuffer->frame_count;
146 pthread_mutex_unlock (&audio_vbuffer->lock);
150 static size_t audio_vbuffer_read (audio_vbuffer_t * audio_vbuffer, void * buffer, size_t frame_count) {
152 pthread_mutex_lock (&audio_vbuffer->lock);
156 if (audio_vbuffer->live == audio_vbuffer->frame_count ||
157 audio_vbuffer->tail > audio_vbuffer->head) {
158 frames = MIN(frame_count, audio_vbuffer->frame_count - audio_vbuffer->tail);
159 } else if (audio_vbuffer->tail < audio_vbuffer->head) {
160 frames = MIN(frame_count, audio_vbuffer->head - audio_vbuffer->tail);
164 memcpy(&((uint8_t*)buffer)[frames_read*audio_vbuffer->frame_size],
165 &audio_vbuffer->data[audio_vbuffer->tail*audio_vbuffer->frame_size],
166 frames*audio_vbuffer->frame_size);
167 audio_vbuffer->live -= frames;
170 audio_vbuffer->tail = (audio_vbuffer->tail + frames) % audio_vbuffer->frame_count;
173 pthread_mutex_unlock (&audio_vbuffer->lock);