浏览代码

aja: Fix crash in output settings when no card present

Colin Edwards 4 年之前
父节点
当前提交
0aa9603a88
共有 3 个文件被更改,包括 56 次插入4 次删除
  1. 17 0
      plugins/aja/aja-common.cpp
  2. 39 2
      plugins/aja/aja-output.cpp
  3. 0 2
      plugins/aja/aja-source.cpp

+ 17 - 0
plugins/aja/aja-common.cpp

@@ -226,6 +226,23 @@ bool aja_video_format_changed(obs_properties_t *props, obs_property_t *list,
 	auto vid_fmt = static_cast<NTV2VideoFormat>(
 		obs_data_get_int(settings, kUIPropVideoFormatSelect.id));
 
+	size_t itemCount = obs_property_list_item_count(list);
+	bool itemFound = false;
+
+	for (size_t i = 0; i < itemCount; i++) {
+		int itemFormat = obs_property_list_item_int(list, i);
+		if (itemFormat == vid_fmt) {
+			itemFound = true;
+			break;
+		}
+	}
+
+	if (!itemFound) {
+		obs_property_list_insert_int(list, 0, "", vid_fmt);
+		obs_property_list_item_disable(list, 0, true);
+		return true;
+	}
+
 	obs_property_t *sdi_4k_trx =
 		obs_properties_get(props, kUIPropSDI4KTransport.id);
 

+ 39 - 2
plugins/aja/aja-output.cpp

@@ -780,6 +780,24 @@ bool aja_output_device_changed(void *data, obs_properties_t *props,
 	populate_output_device_list(list);
 
 	const char *cardID = obs_data_get_string(settings, kUIPropDevice.id);
+
+	size_t itemCount = obs_property_list_item_count(list);
+	bool itemFound = false;
+
+	for (size_t i = 0; i < itemCount; i++) {
+		const char *itemCardID = obs_property_list_item_string(list, i);
+		if (strcmp(cardID, itemCardID) == 0) {
+			itemFound = true;
+			break;
+		}
+	}
+
+	if (!itemFound) {
+		obs_property_list_insert_string(list, 0, cardID, cardID);
+		obs_property_list_item_disable(list, 0, true);
+		return true;
+	}
+
 	if (!cardID) {
 		blog(LOG_ERROR, "aja_output_device_changed: Card ID is null!");
 		return false;
@@ -845,14 +863,33 @@ bool aja_output_dest_changed(obs_properties_t *props, obs_property_t *list,
 
 	blog(LOG_DEBUG, "AJA Output Dest Changed");
 
-	auto &cardManager = aja::CardManager::Instance();
-	cardManager.EnumerateCards();
+	int dest = obs_data_get_int(settings, kUIPropOutput.id);
+
+	size_t itemCount = obs_property_list_item_count(list);
+	bool itemFound = false;
+
+	for (size_t i = 0; i < itemCount; i++) {
+		int itemDest = obs_property_list_item_int(list, i);
+		if (dest == itemDest) {
+			itemFound = true;
+			break;
+		}
+	}
+
+	if (!itemFound) {
+		obs_property_list_insert_int(list, 0, "", dest);
+		obs_property_list_item_disable(list, 0, true);
+		return true;
+	}
+
 	const char *cardID = obs_data_get_string(settings, kUIPropDevice.id);
 	if (!cardID) {
 		blog(LOG_ERROR, "aja_output_dest_changed: Card ID is null!");
 		return false;
 	}
 
+	auto &cardManager = aja::CardManager::Instance();
+	cardManager.EnumerateCards();
 	auto cardEntry = cardManager.GetCardEntry(cardID);
 	if (!cardEntry) {
 		blog(LOG_ERROR,

+ 0 - 2
plugins/aja/aja-source.cpp

@@ -854,8 +854,6 @@ static void aja_source_deactivate(void *data)
 
 static void aja_source_update(void *data, obs_data_t *settings)
 {
-	blog(LOG_INFO, "aja_source_update: Begin callback...");
-
 	static bool initialized = false;
 
 	auto ajaSource = (AJASource *)data;