Example #1
0
void obs_view_set_source(obs_view_t *view, uint32_t channel,
                         obs_source_t *source)
{
    struct obs_source *prev_source;

    assert(channel < MAX_CHANNELS);

    if (!view) return;
    if (channel >= MAX_CHANNELS) return;

    pthread_mutex_lock(&view->channels_mutex);

    obs_source_addref(source);

    prev_source = view->channels[channel];
    view->channels[channel] = source;

    pthread_mutex_unlock(&view->channels_mutex);

    if (source)
        obs_source_activate(source, AUX_VIEW);

    if (prev_source) {
        obs_source_deactivate(prev_source, AUX_VIEW);
        obs_source_release(prev_source);
    }
}
Example #2
0
void obs_source_add_child(obs_source_t parent, obs_source_t child)
{
	if (!parent || !child) return;

	for (int i = 0; i < parent->show_refs; i++) {
		enum view_type type;
		type = (i < parent->activate_refs) ? MAIN_VIEW : AUX_VIEW;
		obs_source_activate(child, type);
	}
}
Example #3
0
void obs_set_output_source(uint32_t channel, obs_source_t *source)
{
	assert(channel < MAX_CHANNELS);

	if (!obs) return;
	if (channel >= MAX_CHANNELS) return;

	struct obs_source *prev_source;
	struct obs_view *view = &obs->data.main_view;
	struct calldata params = {0};

	pthread_mutex_lock(&view->channels_mutex);

	obs_source_addref(source);

	prev_source = view->channels[channel];

	calldata_set_int(&params, "channel", channel);
	calldata_set_ptr(&params, "prev_source", prev_source);
	calldata_set_ptr(&params, "source", source);
	signal_handler_signal(obs->signals, "channel_change", &params);
	calldata_get_ptr(&params, "source", &source);
	calldata_free(&params);

	view->channels[channel] = source;

	pthread_mutex_unlock(&view->channels_mutex);

	if (source)
		obs_source_activate(source, MAIN_VIEW);

	if (prev_source) {
		obs_source_deactivate(prev_source, MAIN_VIEW);
		obs_source_release(prev_source);
	}
}