diff --git a/libobs/obs-encoder.c b/libobs/obs-encoder.c index 2cb815622..9b0cb38ca 100644 --- a/libobs/obs-encoder.c +++ b/libobs/obs-encoder.c @@ -37,12 +37,13 @@ const char *obs_encoder_get_display_name(const char *id) } static bool init_encoder(struct obs_encoder *encoder, const char *name, - obs_data_t *settings) + obs_data_t *settings, obs_data_t *hotkey_data) { pthread_mutex_init_value(&encoder->callbacks_mutex); pthread_mutex_init_value(&encoder->outputs_mutex); - if (!obs_context_data_init(&encoder->context, settings, name, NULL)) + if (!obs_context_data_init(&encoder->context, settings, name, + hotkey_data)) return false; if (pthread_mutex_init(&encoder->callbacks_mutex, NULL) != 0) return false; @@ -57,7 +58,7 @@ static bool init_encoder(struct obs_encoder *encoder, const char *name, static struct obs_encoder *create_encoder(const char *id, enum obs_encoder_type type, const char *name, - obs_data_t *settings, size_t mixer_idx) + obs_data_t *settings, size_t mixer_idx, obs_data_t *hotkey_data) { struct obs_encoder *encoder; struct obs_encoder_info *ei = find_encoder(id); @@ -70,7 +71,7 @@ static struct obs_encoder *create_encoder(const char *id, encoder->info = *ei; encoder->mixer_idx = mixer_idx; - success = init_encoder(encoder, name, settings); + success = init_encoder(encoder, name, settings, hotkey_data); if (!success) { obs_encoder_destroy(encoder); encoder = NULL; @@ -88,17 +89,19 @@ static struct obs_encoder *create_encoder(const char *id, } obs_encoder_t *obs_video_encoder_create(const char *id, const char *name, - obs_data_t *settings) + obs_data_t *settings, obs_data_t *hotkey_data) { if (!name || !id) return NULL; - return create_encoder(id, OBS_ENCODER_VIDEO, name, settings, 0); + return create_encoder(id, OBS_ENCODER_VIDEO, name, settings, 0, + hotkey_data); } obs_encoder_t *obs_audio_encoder_create(const char *id, const char *name, - obs_data_t *settings, size_t mixer_idx) + obs_data_t *settings, size_t mixer_idx, obs_data_t *hotkey_data) { if (!name || !id) return NULL; - return create_encoder(id, OBS_ENCODER_AUDIO, name, settings, mixer_idx); + return create_encoder(id, OBS_ENCODER_AUDIO, name, settings, mixer_idx, + hotkey_data); } static void receive_video(void *param, struct video_data *frame); diff --git a/libobs/obs-internal.h b/libobs/obs-internal.h index 4665b9bd4..a5dd80e6a 100644 --- a/libobs/obs-internal.h +++ b/libobs/obs-internal.h @@ -517,7 +517,8 @@ struct obs_source { extern const struct obs_source_info *find_source(struct darray *list, const char *id); extern bool obs_source_init_context(struct obs_source *source, - obs_data_t *settings, const char *name); + obs_data_t *settings, const char *name, + obs_data_t *hotkey_data); extern bool obs_source_init(struct obs_source *source, const struct obs_source_info *info); diff --git a/libobs/obs-output.c b/libobs/obs-output.c index 2994143f6..d484210a6 100644 --- a/libobs/obs-output.c +++ b/libobs/obs-output.c @@ -47,9 +47,10 @@ static const char *output_signals[] = { }; static bool init_output_handlers(struct obs_output *output, const char *name, - obs_data_t *settings) + obs_data_t *settings, obs_data_t *hotkey_data) { - if (!obs_context_data_init(&output->context, settings, name, NULL)) + if (!obs_context_data_init(&output->context, settings, name, + hotkey_data)) return false; signal_handler_add_array(output->context.signals, output_signals); @@ -57,7 +58,7 @@ static bool init_output_handlers(struct obs_output *output, const char *name, } obs_output_t *obs_output_create(const char *id, const char *name, - obs_data_t *settings) + obs_data_t *settings, obs_data_t *hotkey_data) { const struct obs_output_info *info = find_output(id); struct obs_output *output; @@ -73,7 +74,7 @@ obs_output_t *obs_output_create(const char *id, const char *name, if (pthread_mutex_init(&output->interleaved_mutex, NULL) != 0) goto fail; - if (!init_output_handlers(output, name, settings)) + if (!init_output_handlers(output, name, settings, hotkey_data)) goto fail; output->info = *info; diff --git a/libobs/obs-scene.c b/libobs/obs-scene.c index 6972f6270..0984e7aab 100644 --- a/libobs/obs-scene.c +++ b/libobs/obs-scene.c @@ -473,7 +473,8 @@ const struct obs_source_info scene_info = obs_scene_t *obs_scene_create(const char *name) { struct obs_source *source = - obs_source_create(OBS_SOURCE_TYPE_INPUT, "scene", name, NULL); + obs_source_create(OBS_SOURCE_TYPE_INPUT, "scene", name, NULL, + NULL); return source->context.data; } diff --git a/libobs/obs-service.c b/libobs/obs-service.c index 0b41e5335..289532886 100644 --- a/libobs/obs-service.c +++ b/libobs/obs-service.c @@ -34,7 +34,7 @@ const char *obs_service_get_display_name(const char *id) } obs_service_t *obs_service_create(const char *id, const char *name, - obs_data_t *settings) + obs_data_t *settings, obs_data_t *hotkey_data) { const struct obs_service_info *info = find_service(id); struct obs_service *service; @@ -46,7 +46,8 @@ obs_service_t *obs_service_create(const char *id, const char *name, service = bzalloc(sizeof(struct obs_service)); - if (!obs_context_data_init(&service->context, settings, name, NULL)) { + if (!obs_context_data_init(&service->context, settings, name, + hotkey_data)) { bfree(service); return NULL; } diff --git a/libobs/obs-source.c b/libobs/obs-source.c index 888328981..230285577 100644 --- a/libobs/obs-source.c +++ b/libobs/obs-source.c @@ -94,9 +94,10 @@ static const char *source_signals[] = { }; bool obs_source_init_context(struct obs_source *source, - obs_data_t *settings, const char *name) + obs_data_t *settings, const char *name, obs_data_t *hotkey_data) { - if (!obs_context_data_init(&source->context, settings, name, NULL)) + if (!obs_context_data_init(&source->context, settings, name, + hotkey_data)) return false; return signal_handler_add_array(source->context.signals, @@ -170,7 +171,7 @@ static inline void obs_source_dosignal(struct obs_source *source, } obs_source_t *obs_source_create(enum obs_source_type type, const char *id, - const char *name, obs_data_t *settings) + const char *name, obs_data_t *settings, obs_data_t *hotkey_data) { struct obs_source *source = bzalloc(sizeof(struct obs_source)); @@ -185,7 +186,7 @@ obs_source_t *obs_source_create(enum obs_source_type type, const char *id, source->info = *info; } - if (!obs_source_init_context(source, settings, name)) + if (!obs_source_init_context(source, settings, name, hotkey_data)) goto fail; if (info && info->get_defaults) diff --git a/libobs/obs.c b/libobs/obs.c index cd69ac848..235ac472c 100644 --- a/libobs/obs.c +++ b/libobs/obs.c @@ -1425,11 +1425,9 @@ static obs_source_t *obs_load_source_type(obs_data_t *source_data, uint32_t flags; uint32_t mixers; - source = obs_source_create(type, id, name, settings); + source = obs_source_create(type, id, name, settings, hotkeys); - obs_data_release(source->context.hotkey_data); - source->context.hotkey_data = hotkeys; - obs_hotkeys_load_source(source, hotkeys); + obs_data_release(hotkeys); obs_data_set_default_double(source_data, "volume", 1.0); volume = obs_data_get_double(source_data, "volume"); diff --git a/libobs/obs.h b/libobs/obs.h index 690b3aa06..e7fa32b5d 100644 --- a/libobs/obs.h +++ b/libobs/obs.h @@ -655,7 +655,8 @@ EXPORT const char *obs_source_get_display_name(enum obs_source_type type, * or modifying video/audio. Use obs_source_release to release it. */ EXPORT obs_source_t *obs_source_create(enum obs_source_type type, - const char *id, const char *name, obs_data_t *settings); + const char *id, const char *name, obs_data_t *settings, + obs_data_t *hotkey_data); /** * Adds/releases a reference to a source. When the last reference is @@ -1092,7 +1093,7 @@ EXPORT const char *obs_output_get_display_name(const char *id); * directshow, or other custom outputs. */ EXPORT obs_output_t *obs_output_create(const char *id, const char *name, - obs_data_t *settings); + obs_data_t *settings, obs_data_t *hotkey_data); /** * Adds/releases a reference to an output. When the last reference is @@ -1302,7 +1303,7 @@ EXPORT const char *obs_encoder_get_display_name(const char *id); * @return The video encoder context, or NULL if failed or not found. */ EXPORT obs_encoder_t *obs_video_encoder_create(const char *id, const char *name, - obs_data_t *settings); + obs_data_t *settings, obs_data_t *hotkey_data); /** * Creates an audio encoder context @@ -1314,7 +1315,8 @@ EXPORT obs_encoder_t *obs_video_encoder_create(const char *id, const char *name, * @return The video encoder context, or NULL if failed or not found. */ EXPORT obs_encoder_t *obs_audio_encoder_create(const char *id, const char *name, - obs_data_t *settings, size_t mixer_idx); + obs_data_t *settings, size_t mixer_idx, + obs_data_t *hotkey_data); /** * Adds/releases a reference to an encoder. When the last reference is @@ -1434,7 +1436,7 @@ EXPORT void obs_free_encoder_packet(struct encoder_packet *packet); EXPORT const char *obs_service_get_display_name(const char *id); EXPORT obs_service_t *obs_service_create(const char *id, const char *name, - obs_data_t *settings); + obs_data_t *settings, obs_data_t *hotkey_data); /** * Adds/releases a reference to a service. When the last reference is diff --git a/obs/window-basic-filters.cpp b/obs/window-basic-filters.cpp index 12a952681..c1b20d17b 100644 --- a/obs/window-basic-filters.cpp +++ b/obs/window-basic-filters.cpp @@ -367,7 +367,7 @@ void OBSBasicFilters::AddNewFilter(const char *id) } obs_source_t *filter = obs_source_create(OBS_SOURCE_TYPE_FILTER, - id, name.c_str(), nullptr); + id, name.c_str(), nullptr, nullptr); if (filter) { obs_source_filter_add(source, filter); obs_source_release(filter); diff --git a/obs/window-basic-main-outputs.cpp b/obs/window-basic-main-outputs.cpp index 5fc30e363..1bcbcc14c 100644 --- a/obs/window-basic-main-outputs.cpp +++ b/obs/window-basic-main-outputs.cpp @@ -65,26 +65,28 @@ struct SimpleOutput : BasicOutputHandler { SimpleOutput::SimpleOutput(OBSBasic *main_) : BasicOutputHandler(main_) { streamOutput = obs_output_create("rtmp_output", "simple_stream", - nullptr); + nullptr, nullptr); if (!streamOutput) throw "Failed to create stream output (simple output)"; obs_output_release(streamOutput); fileOutput = obs_output_create("flv_output", "simple_file_output", - nullptr); + nullptr, nullptr); if (!fileOutput) throw "Failed to create recording output (simple output)"; obs_output_release(fileOutput); - h264 = obs_video_encoder_create("obs_x264", "simple_h264", nullptr); + h264 = obs_video_encoder_create("obs_x264", "simple_h264", nullptr, + nullptr); if (!h264) throw "Failed to create h264 encoder (simple output)"; obs_encoder_release(h264); - aac = obs_audio_encoder_create("libfdk_aac", "simple_aac", nullptr, 0); + aac = obs_audio_encoder_create("libfdk_aac", "simple_aac", nullptr, 0, + nullptr); if (!aac) aac = obs_audio_encoder_create("ffmpeg_aac", "simple_aac", - nullptr, 0); + nullptr, 0, nullptr); if (!aac) throw "Failed to create audio encoder (simple output)"; obs_encoder_release(aac); @@ -322,21 +324,21 @@ AdvancedOutput::AdvancedOutput(OBSBasic *main_) : BasicOutputHandler(main_) "obs-studio/basic/recordEncoder.json"); streamOutput = obs_output_create("rtmp_output", "adv_stream", - nullptr); + nullptr, nullptr); if (!streamOutput) throw "Failed to create stream output (advanced output)"; obs_output_release(streamOutput); if (ffmpegRecording) { fileOutput = obs_output_create("ffmpeg_output", - "adv_ffmpeg_output", nullptr); + "adv_ffmpeg_output", nullptr, nullptr); if (!fileOutput) throw "Failed to create recording FFmpeg output " "(advanced output)"; obs_output_release(fileOutput); } else { fileOutput = obs_output_create("flv_output", "adv_file_output", - nullptr); + nullptr, nullptr); if (!fileOutput) throw "Failed to create recording output " "(advanced output)"; @@ -344,7 +346,8 @@ AdvancedOutput::AdvancedOutput(OBSBasic *main_) : BasicOutputHandler(main_) if (!useStreamEncoder) { h264Recording = obs_video_encoder_create(recordEncoder, - "recording_h264", recordEncSettings); + "recording_h264", recordEncSettings, + nullptr); if (!h264Recording) throw "Failed to create recording h264 " "encoder (advanced output)"; @@ -353,7 +356,7 @@ AdvancedOutput::AdvancedOutput(OBSBasic *main_) : BasicOutputHandler(main_) } h264Streaming = obs_video_encoder_create(streamEncoder, - "streaming_h264", streamEncSettings); + "streaming_h264", streamEncSettings, nullptr); if (!h264Streaming) throw "Failed to create streaming h264 encoder " "(advanced output)"; @@ -364,10 +367,10 @@ AdvancedOutput::AdvancedOutput(OBSBasic *main_) : BasicOutputHandler(main_) sprintf(name, "adv_aac%d", i); aacTrack[i] = obs_audio_encoder_create("libfdk_aac", - name, nullptr, i); + name, nullptr, i, nullptr); if (!aacTrack[i]) aacTrack[i] = obs_audio_encoder_create("ffmpeg_aac", - name, nullptr, i); + name, nullptr, i, nullptr); if (!aacTrack[i]) throw "Failed to create audio encoder " "(advanced output)"; diff --git a/obs/window-basic-main.cpp b/obs/window-basic-main.cpp index 7a6b789fd..a3cb2dd5d 100644 --- a/obs/window-basic-main.cpp +++ b/obs/window-basic-main.cpp @@ -292,7 +292,7 @@ void OBSBasic::CreateDefaultScene() #ifdef __APPLE__ source = obs_source_create(OBS_SOURCE_TYPE_INPUT, "display_capture", - Str("Basic.DisplayCapture"), NULL); + Str("Basic.DisplayCapture"), NULL, nullptr); if (source) { obs_scene_add(scene, source); @@ -407,7 +407,8 @@ bool OBSBasic::LoadService() obs_data_t *settings = obs_data_get_obj(data, "settings"); - service = obs_service_create(type, "default_service", settings); + service = obs_service_create(type, "default_service", settings, + nullptr); obs_service_release(service); obs_data_release(settings); @@ -421,7 +422,8 @@ bool OBSBasic::InitService() if (LoadService()) return true; - service = obs_service_create("rtmp_common", "default_service", nullptr); + service = obs_service_create("rtmp_common", "default_service", nullptr, + nullptr); if (!service) return false; obs_service_release(service); @@ -1449,7 +1451,8 @@ void OBSBasic::RenderMain(void *data, uint32_t cx, uint32_t cy) obs_service_t *OBSBasic::GetService() { if (!service) { - service = obs_service_create("rtmp_common", NULL, NULL); + service = obs_service_create("rtmp_common", NULL, NULL, + nullptr); obs_service_release(service); } return service; @@ -1635,7 +1638,7 @@ void OBSBasic::ResetAudioDevice(const char *sourceId, const char *deviceName, obs_data_t *settings = obs_data_create(); obs_data_set_string(settings, "device_id", deviceId); source = obs_source_create(OBS_SOURCE_TYPE_INPUT, - sourceId, deviceDesc, settings); + sourceId, deviceDesc, settings, nullptr); obs_data_release(settings); obs_set_output_source(channel, source); diff --git a/obs/window-basic-settings.cpp b/obs/window-basic-settings.cpp index f43959e71..e6665dad4 100644 --- a/obs/window-basic-settings.cpp +++ b/obs/window-basic-settings.cpp @@ -1318,7 +1318,8 @@ void OBSBasicSettings::SaveStream1Settings() QString streamType = GetComboData(ui->streamType); obs_service_t *newService = obs_service_create(QT_TO_UTF8(streamType), - "default_service", streamProperties->GetSettings()); + "default_service", streamProperties->GetSettings(), + nullptr); if (!newService) return; diff --git a/obs/window-basic-source-select.cpp b/obs/window-basic-source-select.cpp index 626258f95..c426ae9c4 100644 --- a/obs/window-basic-source-select.cpp +++ b/obs/window-basic-source-select.cpp @@ -111,7 +111,7 @@ bool AddNew(QWidget *parent, const char *id, const char *name) } else { source = obs_source_create(OBS_SOURCE_TYPE_INPUT, - id, name, NULL); + id, name, NULL, nullptr); if (source) { obs_add_source(source); diff --git a/test/osx/test.mm b/test/osx/test.mm index 4630368b7..c0a91833b 100644 --- a/test/osx/test.mm +++ b/test/osx/test.mm @@ -68,7 +68,7 @@ static SceneContext SetupScene() /* ------------------------------------------------------ */ /* create source */ SourceContext source{obs_source_create(OBS_SOURCE_TYPE_INPUT, - "random", "a test source", nullptr)}; + "random", "a test source", nullptr, nullptr)}; if (!source) throw "Couldn't create random test source"; diff --git a/test/win/test.cpp b/test/win/test.cpp index fe78c92e1..7621c53b5 100644 --- a/test/win/test.cpp +++ b/test/win/test.cpp @@ -158,14 +158,15 @@ int WINAPI WinMain(HINSTANCE instance, HINSTANCE prevInstance, LPSTR cmdLine, /* ------------------------------------------------------ */ /* create source */ SourceContext source = obs_source_create(OBS_SOURCE_TYPE_INPUT, - "random", "some randon source", NULL); + "random", "some randon source", NULL, nullptr); if (!source) throw "Couldn't create random test source"; /* ------------------------------------------------------ */ /* create filter */ SourceContext filter = obs_source_create(OBS_SOURCE_TYPE_FILTER, - "test_filter", "a nice green filter", NULL); + "test_filter", "a nice green filter", NULL, + nullptr); if (!filter) throw "Couldn't create test filter"; obs_source_filter_add(source, filter);