diff --git a/plugins/obs-transitions/CMakeLists.txt b/plugins/obs-transitions/CMakeLists.txt index 059ea1899..9ceac5e9d 100644 --- a/plugins/obs-transitions/CMakeLists.txt +++ b/plugins/obs-transitions/CMakeLists.txt @@ -3,6 +3,7 @@ project(obs-transitions) set(obs-transitions_SOURCES obs-transitions.c transition-fade.c + transition-cut.c ) add_library(obs-transitions MODULE diff --git a/plugins/obs-transitions/data/locale/en-US.ini b/plugins/obs-transitions/data/locale/en-US.ini index 42b4c6856..64dbed589 100644 --- a/plugins/obs-transitions/data/locale/en-US.ini +++ b/plugins/obs-transitions/data/locale/en-US.ini @@ -1 +1,2 @@ FadeTransition="Fade" +CutTransition="Cut" diff --git a/plugins/obs-transitions/obs-transitions.c b/plugins/obs-transitions/obs-transitions.c index a9ba6c0fb..7e15a13fd 100644 --- a/plugins/obs-transitions/obs-transitions.c +++ b/plugins/obs-transitions/obs-transitions.c @@ -4,10 +4,12 @@ OBS_DECLARE_MODULE() OBS_MODULE_USE_DEFAULT_LOCALE("obs-transitions", "en-US") +extern struct obs_source_info cut_transition; extern struct obs_source_info fade_transition; bool obs_module_load(void) { + obs_register_source(&cut_transition); obs_register_source(&fade_transition); return true; } diff --git a/plugins/obs-transitions/transition-cut.c b/plugins/obs-transitions/transition-cut.c new file mode 100644 index 000000000..1dcbf7d16 --- /dev/null +++ b/plugins/obs-transitions/transition-cut.c @@ -0,0 +1,67 @@ +#include + +struct cut_info { + obs_source_t *source; +}; + +static const char *cut_get_name(void *type_data) +{ + UNUSED_PARAMETER(type_data); + return obs_module_text("CutTransition"); +} + +void *cut_create(obs_data_t *settings, obs_source_t *source) +{ + struct cut_info *cut; + + cut = bmalloc(sizeof(*cut)); + cut->source = source; + + obs_transition_enable_fixed(source, true, 0); + UNUSED_PARAMETER(settings); + return cut; +} + +void cut_destroy(void *data) +{ + struct cut_info *cut = data; + bfree(cut); +} + +void cut_video_render(void *data, gs_effect_t *effect) +{ + struct cut_info *cut = data; + obs_transition_video_render(cut->source, NULL); + UNUSED_PARAMETER(effect); +} + +static float mix_a(void *data, float t) +{ + UNUSED_PARAMETER(data); + return 1.0f - t; +} + +static float mix_b(void *data, float t) +{ + UNUSED_PARAMETER(data); + return t; +} + +bool cut_audio_render(void *data, uint64_t *ts_out, + struct obs_source_audio_mix *audio, uint32_t mixers, + size_t channels, size_t sample_rate) +{ + struct cut_info *cut = data; + return obs_transition_audio_render(cut->source, ts_out, + audio, mixers, channels, sample_rate, mix_a, mix_b); +} + +struct obs_source_info cut_transition = { + .id = "cut_transition", + .type = OBS_SOURCE_TYPE_TRANSITION, + .get_name = cut_get_name, + .create = cut_create, + .destroy = cut_destroy, + .video_render = cut_video_render, + .audio_render = cut_audio_render, +};