Browse Source

Merge pull request #1392 from Andersama/decklink-deactivate-when-not-shown

decklink: Add deactivate when not showing option to decklink
Jim 7 năm trước cách đây
mục cha
commit
ef6a83666a

+ 1 - 0
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"

+ 9 - 0
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<std::recursive_mutex> 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)

+ 4 - 0
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;
 };

+ 38 - 0
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<DeckLinkDevice> 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<DeckLinkDevice> 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);