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); }
void audio_output_disconnect(audio_t *audio, size_t mix_idx, audio_output_callback_t callback, void *param) { if (!audio || mix_idx >= MAX_AUDIO_MIXES) return; pthread_mutex_lock(&audio->input_mutex); size_t idx = audio_get_input_idx(audio, mix_idx, callback, param); if (idx != DARRAY_INVALID) { struct audio_mix *mix = &audio->mixes[mix_idx]; audio_input_free(mix->inputs.array+idx); da_erase(mix->inputs, idx); } pthread_mutex_unlock(&audio->input_mutex); }
void audio_output_disconnect(audio_t audio, void (*callback)(void *param, struct audio_data *data), void *param) { if (!audio) return; pthread_mutex_lock(&audio->input_mutex); size_t idx = audio_get_input_idx(audio, callback, param); if (idx != DARRAY_INVALID) { audio_input_free(audio->inputs.array+idx); da_erase(audio->inputs, idx); } pthread_mutex_unlock(&audio->input_mutex); }
void audio_output_close(audio_t *audio) { void *thread_ret; if (!audio) return; if (audio->initialized) { os_event_signal(audio->stop_event); pthread_join(audio->thread, &thread_ret); } for (size_t mix_idx = 0; mix_idx < MAX_AUDIO_MIXES; mix_idx++) { struct audio_mix *mix = &audio->mixes[mix_idx]; for (size_t i = 0; i < mix->inputs.num; i++) audio_input_free(mix->inputs.array+i); da_free(mix->inputs); } os_event_destroy(audio->stop_event); bfree(audio); }