Переглянути джерело

mac-avcapture: Allow fetching source properties without source

Per OBS API documentation, `get_properties` can be used to get the
properties of a source, but also of a source type. The latter would
pass a NULL pointer for a given source.

This adds the necessary change to avoid crashing OBS by passing such
a null pointer.
PatTheMav 3 роки тому
батько
коміт
8388cc22d2
1 змінених файлів з 27 додано та 23 видалено
  1. 27 23
      plugins/mac-avcapture/av-capture.mm

+ 27 - 23
plugins/mac-avcapture/av-capture.mm

@@ -2198,12 +2198,8 @@ static void add_manual_properties(obs_properties_t *props)
 
 
 static obs_properties_t *av_capture_properties(void *data)
 static obs_properties_t *av_capture_properties(void *data)
 {
 {
-	struct av_capture *capture = static_cast<av_capture *>(data);
-
 	obs_properties_t *props = obs_properties_create();
 	obs_properties_t *props = obs_properties_create();
 
 
-	add_properties_param(props, capture);
-
 	obs_property_t *dev_list = obs_properties_add_list(
 	obs_property_t *dev_list = obs_properties_add_list(
 		props, "device", TEXT_DEVICE, OBS_COMBO_TYPE_LIST,
 		props, "device", TEXT_DEVICE, OBS_COMBO_TYPE_LIST,
 		OBS_COMBO_FORMAT_STRING);
 		OBS_COMBO_FORMAT_STRING);
@@ -2253,25 +2249,33 @@ static obs_properties_t *av_capture_properties(void *data)
 	obs_properties_add_bool(props, "buffering",
 	obs_properties_add_bool(props, "buffering",
 				obs_module_text("Buffering"));
 				obs_module_text("Buffering"));
 
 
-	OBSDataAutoRelease current_settings =
-		obs_source_get_settings(capture->source);
-	if (!obs_data_get_bool(current_settings, "enable_audio")) {
-		auto cb = [](obs_properties_t *, obs_property_t *prop,
-			     void *data) {
-			struct av_capture *capture =
-				static_cast<av_capture *>(data);
-			OBSDataAutoRelease settings = obs_data_create();
-			obs_data_set_bool(settings, "enable_audio", true);
-			obs_source_update(capture->source, settings);
-
-			// Enable all audio tracks
-			obs_source_set_audio_mixers(capture->source, 0x3F);
-			obs_property_set_visible(prop, false);
-			return true;
-		};
-		obs_properties_add_button2(props, "enable_audio_button",
-					   obs_module_text("EnableAudio"), cb,
-					   capture);
+	if (data) {
+		struct av_capture *capture = static_cast<av_capture *>(data);
+
+		add_properties_param(props, capture);
+
+		OBSDataAutoRelease current_settings =
+			obs_source_get_settings(capture->source);
+		if (!obs_data_get_bool(current_settings, "enable_audio")) {
+			auto cb = [](obs_properties_t *, obs_property_t *prop,
+				     void *data) {
+				struct av_capture *capture =
+					static_cast<av_capture *>(data);
+				OBSDataAutoRelease settings = obs_data_create();
+				obs_data_set_bool(settings, "enable_audio",
+						  true);
+				obs_source_update(capture->source, settings);
+
+				// Enable all audio tracks
+				obs_source_set_audio_mixers(capture->source,
+							    0x3F);
+				obs_property_set_visible(prop, false);
+				return true;
+			};
+			obs_properties_add_button2(
+				props, "enable_audio_button",
+				obs_module_text("EnableAudio"), cb, capture);
+		}
 	}
 	}
 
 
 	return props;
 	return props;