57#define CACHE_SECONDS 10
87 pthread_mutex_lock(&s->
lock);
97 pthread_mutex_unlock(&s->
lock);
101 char *data = malloc(size);
104 assert(res == (
size_t) size);
108 pthread_mutex_unlock(&s->
lock);
113 fprintf(stderr,
"[Audio export] Problem writing audio samples: %s\n",
ug_strerror(-rc));
126 fprintf(stderr,
"[Audio export] Error writting header!\n");
151 fprintf(stderr,
"[Audio export] Configuration failed.\n");
171 pthread_mutex_init(&s->
lock, NULL);
186 pthread_mutex_lock(&s->
lock);
192 pthread_mutex_unlock(&s->
lock);
196 if (s->
wav != NULL) {
199 if (s->
ring != NULL) {
203 pthread_mutex_destroy(&s->
lock);
211 pthread_mutex_lock(&s->
lock);
218 pthread_mutex_unlock(&s->
lock);
231 fprintf(stderr,
"[Audio export] Configuration failed.\n");
246 int bps,
int ch_count,
int size,
int start_sample)
249 int in_offset = start_sample*bps;
250 for(; written * bps * ch_count < size; written++){
251 for(
int ch = 0; ch < ch_count; ch++){
252 const char *in_ptr = ((
const char *)channels_data[ch]) + in_offset;
253 memcpy(out, in_ptr, bps);
263 const void **channels_data,
unsigned sample_count)
267 assert(ch_count != 0 &&
"Export not configured");
271 pthread_mutex_lock(&s->
lock);
278 assert((size1 % (bps * ch_count)) == 0);
279 assert(!ptr2 || (size2 % (bps * ch_count)) == 0);
281 int written =
write_samples(ptr1, channels_data, bps, ch_count, size1, 0);
283 write_samples(ptr2, channels_data, bps, ch_count, size2, written);
292 pthread_mutex_unlock(&s->
lock);
struct video_frame * frame
static int write_samples(char *out, const void **channels_data, int bps, int ch_count, int size, int start_sample)
void audio_export_raw(struct audio_export *s, void *data, unsigned len)
struct audio_export * audio_export_init(const char *filename)
static bool configure(struct audio_export *s, struct audio_desc fmt)
static void * audio_export_thread(void *arg)
void audio_export_destroy(struct audio_export *s)
void audio_export_raw_ch(struct audio_export *s, const void **channels_data, unsigned sample_count)
bool audio_export_configure_raw(struct audio_export *s, int bps, int sample_rate, int ch_count)
void audio_export(struct audio_export *s, const struct audio_frame *frame)
const char * ug_strerror(int errnum)
int ring_get_current_size(struct ring_buffer *ring)
void ring_buffer_destroy(struct ring_buffer *ring)
struct ring_buffer * ring_buffer_init(int size)
bool ring_advance_write_idx(struct ring_buffer *ring, int amount)
int ring_get_write_regions(struct ring_buffer *ring, int requested_len, void **ptr1, int *size1, void **ptr2, int *size2)
int ring_buffer_read(struct ring_buffer *ring, char *out, int max_len)
void ring_buffer_write(struct ring_buffer *ring, const char *in, int len)
struct wav_writer_file * wav
volatile bool should_exit_worker
volatile bool new_work_ready
struct audio_desc saved_format
volatile bool worker_waiting
struct used to comunicate with audio capture/playback device
struct audio_desc audio_desc_from_frame(const struct audio_frame *frame)
bool audio_desc_eq(struct audio_desc a1, struct audio_desc a2)
bool wav_writer_close(struct wav_writer_file *wav)
int wav_writer_write(struct wav_writer_file *wav, long long sample_count, const char *data)
struct wav_writer_file * wav_writer_create(const char *filename, struct audio_desc fmt)