void audio_output_close(audio_t audio) { void *thread_ret; struct audio_line *line; if (!audio) return; if (audio->initialized) { os_event_signal(audio->stop_event); pthread_join(audio->thread, &thread_ret); } line = audio->first_line; while (line) { struct audio_line *next = line->next; audio_line_destroy_data(line); line = next; } for (size_t i = 0; i < audio->inputs.num; i++) audio_input_free(audio->inputs.array+i); for (size_t i = 0; i < MAX_AV_PLANES; i++) da_free(audio->mix_buffers[i]); da_free(audio->inputs); os_event_destroy(audio->stop_event); pthread_mutex_destroy(&audio->line_mutex); bfree(audio); }
static inline void audio_output_removeline(struct audio_output *audio, struct audio_line *line) { pthread_mutex_lock(&audio->line_mutex); da_erase_item(audio->lines, &line); pthread_mutex_unlock(&audio->line_mutex); audio_line_destroy_data(line); }
static inline void audio_output_removeline(struct audio_output *audio, struct audio_line *line) { pthread_mutex_lock(&audio->line_mutex); *line->prev_next = line->next; if (line->next) line->next->prev_next = line->prev_next; pthread_mutex_unlock(&audio->line_mutex); audio_line_destroy_data(line); }
void audio_output_close(audio_t audio) { void *thread_ret; size_t i; if (!audio) return; if (audio->initialized) { event_signal(&audio->stop_event); pthread_join(audio->thread, &thread_ret); } for (i = 0; i < audio->lines.num; i++) audio_line_destroy_data(audio->lines.array[i]); da_free(audio->lines); media_remove_output(audio->media, audio->output); event_destroy(&audio->stop_event); pthread_mutex_destroy(&audio->line_mutex); bfree(audio); }