diff --git a/plugins/decklink/data/locale/en-US.ini b/plugins/decklink/data/locale/en-US.ini index a694a06f9..701a8d017 100644 --- a/plugins/decklink/data/locale/en-US.ini +++ b/plugins/decklink/data/locale/en-US.ini @@ -17,3 +17,4 @@ ChannelFormat.4_0ch="4ch" ChannelFormat.4_1ch="4.1ch" ChannelFormat.5_1ch="5.1ch" ChannelFormat.7_1ch="7.1ch" +DeactivateWhenNotShowing="Deactivate when not showing" diff --git a/plugins/decklink/decklink.cpp b/plugins/decklink/decklink.cpp index ea0ec9632..eeac2b65b 100644 --- a/plugins/decklink/decklink.cpp +++ b/plugins/decklink/decklink.cpp @@ -75,6 +75,7 @@ bool DeckLink::Activate(DeckLinkDevice *device, long long modeId) if (isActive) instance->StopCapture(); + isCapturing = false; if (!same) instance.Set(new DeckLinkDeviceInstance(this, device)); @@ -94,6 +95,8 @@ bool DeckLink::Activate(DeckLinkDevice *device, long long modeId) os_atomic_inc_long(&activateRefs); SaveSettings(); + id = modeId; + isCapturing = true; return true; } @@ -102,11 +105,17 @@ void DeckLink::Deactivate(void) std::lock_guard lock(deviceMutex); if (instance) instance->StopCapture(); + isCapturing = false; instance = nullptr; os_atomic_dec_long(&activateRefs); } +bool DeckLink::Capturing(void) +{ + return isCapturing; +} + void DeckLink::SaveSettings() { if (!instance) diff --git a/plugins/decklink/decklink.hpp b/plugins/decklink/decklink.hpp index 23f8b59b7..4227144e5 100644 --- a/plugins/decklink/decklink.hpp +++ b/plugins/decklink/decklink.hpp @@ -62,6 +62,10 @@ public: bool Activate(DeckLinkDevice *device, long long modeId); void Deactivate(); + bool Capturing(); bool buffering = false; + bool dwns = false; + std::string hash; + long long id; }; diff --git a/plugins/decklink/plugin-main.cpp b/plugins/decklink/plugin-main.cpp index 78c9b252d..46ab8551c 100644 --- a/plugins/decklink/plugin-main.cpp +++ b/plugins/decklink/plugin-main.cpp @@ -16,6 +16,7 @@ OBS_MODULE_USE_DEFAULT_LOCALE("decklink", "en-US") #define COLOR_SPACE "color_space" #define COLOR_RANGE "color_range" #define BUFFERING "buffering" +#define DEACTIVATE_WNS "deactivate_when_not_showing" #define TEXT_DEVICE obs_module_text("Device") #define TEXT_MODE obs_module_text("Mode") @@ -35,6 +36,7 @@ OBS_MODULE_USE_DEFAULT_LOCALE("decklink", "en-US") #define TEXT_CHANNEL_FORMAT_5_1CH obs_module_text("ChannelFormat.5_1ch") #define TEXT_CHANNEL_FORMAT_7_1CH obs_module_text("ChannelFormat.7_1ch") #define TEXT_BUFFERING obs_module_text("Buffering") +#define TEXT_DWNS obs_module_text("DeactivateWhenNotShowing") static DeckLinkDeviceDiscovery *deviceEnum = nullptr; @@ -45,6 +47,11 @@ static void decklink_enable_buffering(DeckLink *decklink, bool enabled) decklink->buffering = enabled; } +static void decklink_deactivate_when_not_showing(DeckLink *decklink, bool dwns) +{ + decklink->dwns = dwns; +} + static void *decklink_create(obs_data_t *settings, obs_source_t *source) { DeckLink *decklink = new DeckLink(source, deviceEnum); @@ -87,6 +94,9 @@ static void decklink_update(void *data, obs_data_t *settings) decklink_enable_buffering(decklink, obs_data_get_bool(settings, BUFFERING)); + decklink_deactivate_when_not_showing(decklink, + obs_data_get_bool(settings, DEACTIVATE_WNS)); + ComPtr device; device.Set(deviceEnum->FindByHash(hash)); @@ -95,6 +105,30 @@ static void decklink_update(void *data, obs_data_t *settings) decklink->SetColorRange(colorRange); decklink->SetChannelFormat(channelFormat); decklink->Activate(device, id); + decklink->hash = std::string(hash); +} + +static void decklink_show(void *data) +{ + DeckLink *decklink = (DeckLink *)data; + obs_source_t *source = decklink->GetSource(); + bool showing = obs_source_showing(source); + if (decklink->dwns && showing && !decklink->Capturing()) { + ComPtr device; + device.Set(deviceEnum->FindByHash(decklink->hash.c_str())); + + decklink->Activate(device, decklink->id); + } +} + +static void decklink_hide(void *data) +{ + DeckLink *decklink = (DeckLink *)data; + obs_source_t *source = decklink->GetSource(); + bool showing = obs_source_showing(source); + if (decklink->dwns && showing) + decklink->Deactivate(); + } static void decklink_get_defaults(obs_data_t *settings) @@ -279,6 +313,8 @@ static obs_properties_t *decklink_get_properties(void *data) obs_properties_add_bool(props, BUFFERING, TEXT_BUFFERING); + obs_properties_add_bool(props, DEACTIVATE_WNS, TEXT_DWNS); + UNUSED_PARAMETER(data); return props; } @@ -300,6 +336,8 @@ bool obs_module_load(void) info.get_name = decklink_get_name; info.get_properties = decklink_get_properties; info.update = decklink_update; + info.show = decklink_show; + info.hide = decklink_hide; obs_register_source(&info);