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_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); }
static inline bool audio_input_init(struct audio_input *input, struct audio_output *audio) { if (input->conversion.format != audio->info.format || input->conversion.samples_per_sec != audio->info.samples_per_sec || input->conversion.speakers != audio->info.speakers) { struct resample_info from = { .format = audio->info.format, .samples_per_sec = audio->info.samples_per_sec, .speakers = audio->info.speakers }; struct resample_info to = { .format = input->conversion.format, .samples_per_sec = input->conversion.samples_per_sec, .speakers = input->conversion.speakers }; input->resampler = audio_resampler_create(&to, &from); if (!input->resampler) { blog(LOG_ERROR, "audio_input_init: Failed to " "create resampler"); return false; } } else { input->resampler = NULL; } return true; } bool audio_output_connect(audio_t audio, const struct audio_convert_info *conversion, void (*callback)(void *param, struct audio_data *data), void *param) { bool success = false; if (!audio) return false; pthread_mutex_lock(&audio->input_mutex); if (audio_get_input_idx(audio, callback, param) == DARRAY_INVALID) { struct audio_input input; input.callback = callback; input.param = param; if (conversion) { input.conversion = *conversion; } else { input.conversion.format = audio->info.format; input.conversion.speakers = audio->info.speakers; input.conversion.samples_per_sec = audio->info.samples_per_sec; } if (input.conversion.format == AUDIO_FORMAT_UNKNOWN) input.conversion.format = audio->info.format; if (input.conversion.speakers == SPEAKERS_UNKNOWN) input.conversion.speakers = audio->info.speakers; if (input.conversion.samples_per_sec == 0) input.conversion.samples_per_sec = audio->info.samples_per_sec; success = audio_input_init(&input, audio); if (success) da_push_back(audio->inputs, &input); } pthread_mutex_unlock(&audio->input_mutex); return success; }