|
|
|
|
@ -88,20 +88,31 @@ static void meta_destroy(metafile_t *mf) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// mf is locked
|
|
|
|
|
static void meta_mix_output(metafile_t *mf) {
|
|
|
|
|
LOCK(&mf->mix_lock);
|
|
|
|
|
|
|
|
|
|
if (!output_enabled || !output_mixed || !mf->recording_on) {
|
|
|
|
|
mix_destroy(mf->mix);
|
|
|
|
|
mf->mix = NULL;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mf->mix)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
mf->mix_out = output_new_ext(mf, "mix", "mixed", "mix");
|
|
|
|
|
if (mix_method == MM_CHANNELS)
|
|
|
|
|
mf->mix_out->channel_mult = mix_num_inputs;
|
|
|
|
|
mf->mix = mix_new();
|
|
|
|
|
db_do_stream(mf, mf->mix_out, NULL, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// mf is locked
|
|
|
|
|
static void meta_stream_interface(metafile_t *mf, unsigned long snum, char *content) {
|
|
|
|
|
db_do_call(mf);
|
|
|
|
|
if (output_enabled && output_mixed && mf->recording_on) {
|
|
|
|
|
pthread_mutex_lock(&mf->mix_lock);
|
|
|
|
|
if (!mf->mix) {
|
|
|
|
|
mf->mix_out = output_new_ext(mf, "mix", "mixed", "mix");
|
|
|
|
|
if (mix_method == MM_CHANNELS)
|
|
|
|
|
mf->mix_out->channel_mult = mix_num_inputs;
|
|
|
|
|
mf->mix = mix_new();
|
|
|
|
|
db_do_stream(mf, mf->mix_out, NULL, 0);
|
|
|
|
|
}
|
|
|
|
|
pthread_mutex_unlock(&mf->mix_lock);
|
|
|
|
|
}
|
|
|
|
|
meta_mix_output(mf);
|
|
|
|
|
dbg("stream %lu interface %s%s%s", snum, FMT_M(content));
|
|
|
|
|
stream_open(mf, snum, content);
|
|
|
|
|
}
|
|
|
|
|
@ -260,6 +271,8 @@ static void meta_section(metafile_t *mf, char *section, char *content, unsigned
|
|
|
|
|
mf->output_pattern = g_string_chunk_insert(mf->gsc, content);
|
|
|
|
|
else if (!strcmp(section, "SKIP_DATABASE"))
|
|
|
|
|
mf->skip_db = 1;
|
|
|
|
|
|
|
|
|
|
meta_mix_output(mf);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|