static inline void signal_stop(struct obs_output *output, int code) { struct calldata params = {0}; calldata_setint(¶ms, "code", code); calldata_setptr(¶ms, "output", output); signal_handler_signal(output->context.signals, "stop", ¶ms); calldata_free(¶ms); }
static inline void do_output_signal(struct obs_output *output, const char *signal) { struct calldata params = {0}; calldata_setptr(¶ms, "output", output); signal_handler_signal(output->context.signals, signal, ¶ms); calldata_free(¶ms); }
static inline void signal_reconnect(struct obs_output *output) { struct calldata params = {0}; calldata_set_int(¶ms, "timeout_sec", output->reconnect_retry_cur_sec); calldata_set_ptr(¶ms, "output", output); signal_handler_signal(output->context.signals, "reconnect", ¶ms); calldata_free(¶ms); }
static inline void obs_source_dosignal(struct obs_source *source, const char *signal) { struct calldata data; calldata_init(&data); calldata_setptr(&data, "source", source); signal_handler_signal(obs->signals, signal, &data); calldata_free(&data); }
static void hotkey_signal(const char *signal, obs_hotkey_t *hotkey) { calldata_t data; calldata_init(&data); calldata_set_ptr(&data, "key", hotkey); signal_handler_signal(obs->hotkeys.signals, signal, &data); calldata_free(&data); }
static inline void signal_item_remove(struct obs_scene_item *item) { struct calldata params = {0}; calldata_setptr(¶ms, "scene", item->parent); calldata_setptr(¶ms, "item", item); signal_handler_signal(item->parent->source->signals, "remove", ¶ms); calldata_free(¶ms); }
void obs_set_master_volume(float volume) { struct calldata data = {0}; if (!obs) return; calldata_set_float(&data, "volume", volume); signal_handler_signal(obs->signals, "master_volume", &data); volume = (float)calldata_float(&data, "volume"); calldata_free(&data); obs->audio.user_volume = volume; }
static void signal_volume_changed(signal_handler_t *sh, struct obs_fader *fader, const float db) { struct calldata data; calldata_init(&data); calldata_set_ptr (&data, "fader", fader); calldata_set_float(&data, "db", db); signal_handler_signal(sh, "volume_changed", &data); calldata_free(&data); }
static inline void obs_source_dosignal(struct obs_source *source, const char *signal_obs, const char *signal_source) { struct calldata data; calldata_init(&data); calldata_setptr(&data, "source", source); if (signal_obs) signal_handler_signal(obs->signals, signal_obs, &data); if (signal_source) signal_handler_signal(source->context.signals, signal_source, &data); calldata_free(&data); }
bool obs_add_source(obs_source_t source) { struct calldata params = {0}; pthread_mutex_lock(&obs->data.sources_mutex); da_push_back(obs->data.sources, &source); obs_source_addref(source); pthread_mutex_unlock(&obs->data.sources_mutex); calldata_setptr(¶ms, "source", source); signal_handler_signal(obs->signals, "source-add", ¶ms); calldata_free(¶ms); return true; }
void obs_source_setvolume(obs_source_t source, float volume) { if (source) { struct calldata data = {0}; calldata_setptr(&data, "source", source); calldata_setfloat(&data, "volume", volume); signal_handler_signal(source->context.signals, "volume", &data); signal_handler_signal(obs->signals, "source_volume", &data); volume = (float)calldata_float(&data, "volume"); calldata_free(&data); source->user_volume = volume; } }
static void stinger_transition_start(void *data) { struct stinger_info *s = data; if (s->media_source) { calldata_t cd = {0}; proc_handler_t *ph = obs_source_get_proc_handler(s->media_source); if (s->transitioning) { proc_handler_call(ph, "restart", &cd); return; } proc_handler_call(ph, "get_duration", &cd); proc_handler_call(ph, "get_nb_frames", &cd); s->duration_ns = (uint64_t)calldata_int(&cd, "duration"); s->duration_frames = (uint64_t)calldata_int(&cd, "num_frames"); if (s->transition_point_is_frame) s->transition_point = (float)( (long double)s->transition_point_frame / (long double)s->duration_frames); else s->transition_point = (float)( (long double)s->transition_point_ns / (long double)s->duration_ns); if (s->transition_point > 0.999f) s->transition_point = 0.999f; else if (s->transition_point < 0.001f) s->transition_point = 0.001f; s->transition_a_mul = (1.0f / s->transition_point); s->transition_b_mul = (1.0f / (1.0f - s->transition_point)); obs_transition_enable_fixed(s->source, true, (uint32_t)(s->duration_ns / 1000000)); calldata_free(&cd); obs_source_add_active_child(s->source, s->media_source); } s->transitioning = true; }
obs_sceneitem_t obs_scene_add(obs_scene_t scene, obs_source_t source) { struct obs_scene_item *last; struct obs_scene_item *item = bmalloc(sizeof(struct obs_scene_item)); struct calldata params = {0}; memset(item, 0, sizeof(struct obs_scene_item)); item->source = source; item->visible = true; item->parent = scene; item->ref = 1; vec2_set(&item->scale, 1.0f, 1.0f); if (source) obs_source_addref(source); pthread_mutex_lock(&scene->mutex); last = scene->first_item; if (!last) { scene->first_item = item; } else { while (last->next) last = last->next; last->next = item; item->prev = last; } pthread_mutex_unlock(&scene->mutex); calldata_setptr(¶ms, "scene", scene); calldata_setptr(¶ms, "item", item); signal_handler_signal(scene->source->signals, "add", ¶ms); calldata_free(¶ms); return item; }
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(¶ms, "channel", channel); calldata_set_ptr(¶ms, "prev_source", prev_source); calldata_set_ptr(¶ms, "source", source); signal_handler_signal(obs->signals, "channel_change", ¶ms); calldata_get_ptr(¶ms, "source", &source); calldata_free(¶ms); 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); } }
void obs_set_output_source(uint32_t channel, obs_source_t source) { struct obs_source *prev_source; struct calldata params = {0}; assert(channel < MAX_CHANNELS); prev_source = obs->data.channels[channel]; calldata_setuint32(¶ms, "channel", channel); calldata_setptr(¶ms, "prev_source", prev_source); calldata_setptr(¶ms, "source", source); signal_handler_signal(obs->signals, "channel-change", ¶ms); calldata_getptr(¶ms, "source", &source); calldata_free(¶ms); obs->data.channels[channel] = source; if (source != prev_source) { if (source) obs_source_addref(source); if (prev_source) obs_source_release(prev_source); } }
AutoConfig::AutoConfig(QWidget *parent) : QWizard(parent) { EnableThreadedMessageBoxes(true); calldata_t cd = {0}; calldata_set_int(&cd, "seconds", 5); proc_handler_t *ph = obs_get_proc_handler(); proc_handler_call(ph, "twitch_ingests_refresh", &cd); calldata_free(&cd); OBSBasic *main = reinterpret_cast<OBSBasic*>(parent); main->EnableOutputs(false); installEventFilter(CreateShortcutFilter()); std::string serviceType; GetServiceInfo(serviceType, serviceName, server, key); #ifdef _WIN32 setWizardStyle(QWizard::ModernStyle); #endif streamPage = new AutoConfigStreamPage(); setPage(StartPage, new AutoConfigStartPage()); setPage(VideoPage, new AutoConfigVideoPage()); setPage(StreamPage, streamPage); setPage(TestPage, new AutoConfigTestPage()); setWindowTitle(QTStr("Basic.AutoConfig")); setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); obs_video_info ovi; obs_get_video_info(&ovi); baseResolutionCX = ovi.base_width; baseResolutionCY = ovi.base_height; /* ----------------------------------------- */ /* check to see if Twitch's "auto" available */ OBSData twitchSettings = obs_data_create(); obs_data_release(twitchSettings); obs_data_set_string(twitchSettings, "service", "Twitch"); obs_properties_t *props = obs_get_service_properties("rtmp_common"); obs_properties_apply_settings(props, twitchSettings); obs_property_t *p = obs_properties_get(props, "server"); const char *first = obs_property_list_item_string(p, 0); twitchAuto = strcmp(first, "auto") == 0; obs_properties_destroy(props); /* ----------------------------------------- */ /* load service/servers */ customServer = serviceType == "rtmp_custom"; QComboBox *serviceList = streamPage->ui->service; if (!serviceName.empty()) { serviceList->blockSignals(true); int count = serviceList->count(); bool found = false; for (int i = 0; i < count; i++) { QString name = serviceList->itemText(i); if (name == serviceName.c_str()) { serviceList->setCurrentIndex(i); found = true; break; } } if (!found) { serviceList->insertItem(0, serviceName.c_str()); serviceList->setCurrentIndex(0); } serviceList->blockSignals(false); } streamPage->UpdateServerList(); streamPage->UpdateKeyLink(); streamPage->lastService.clear(); if (!customServer) { QComboBox *serverList = streamPage->ui->server; int idx = serverList->findData(QString(server.c_str())); if (idx == -1) idx = 0; serverList->setCurrentIndex(idx); } else { streamPage->ui->customServer->setText(server.c_str()); int idx = streamPage->ui->service->findData( QVariant((int)ListOpt::Custom)); streamPage->ui->service->setCurrentIndex(idx); } if (!key.empty()) streamPage->ui->key->setText(key.c_str()); int bitrate = config_get_int(main->Config(), "SimpleOutput", "VBitrate"); streamPage->ui->bitrate->setValue(bitrate); streamPage->ServiceChanged(); TestHardwareEncoding(); if (!hardwareEncodingAvailable) { delete streamPage->ui->preferHardware; streamPage->ui->preferHardware = nullptr; } else { /* Newer generations of NVENC have a high enough quality to * bitrate ratio that if NVENC is available, it makes sense to * just always prefer hardware encoding by default */ bool preferHardware = nvencAvailable || os_get_physical_cores() <= 4; streamPage->ui->preferHardware->setChecked(preferHardware); } setOptions(0); setButtonText(QWizard::FinishButton, QTStr("Basic.AutoConfig.ApplySettings")); setButtonText(QWizard::BackButton, QTStr("Back")); setButtonText(QWizard::NextButton, QTStr("Next")); setButtonText(QWizard::CancelButton, QTStr("Cancel")); }