Преглед на файлове

UI: Fix duplicated source names in audio settings

When you add an audio capture source and use the "use existing" feature
in the source selection dialog, and then recreate the same audio source
again in audio settings, it will result in two sources using identical
names, which although relatively harmless can cause issues when doing
things such as trying to find sources by their name.

Fixes obsproject/obs-studio#5621
Closes obsproject/obs-studio#5947
jp9000 преди 3 години
родител
ревизия
6dd65c8d13
променени са 1 файла, в които са добавени 22 реда и са изтрити 1 реда
  1. 22 1
      UI/window-basic-main.cpp

+ 22 - 1
UI/window-basic-main.cpp

@@ -4412,6 +4412,25 @@ bool OBSBasic::ResetAudio()
 	return obs_reset_audio(&ai);
 }
 
+extern std::string strprintf(const char *format, ...);
+
+static std::string GetDupName(const char *name)
+{
+	std::string newName = name;
+	int inc = 1;
+
+	for (;;) {
+		OBSSourceAutoRelease existing_source =
+			obs_get_source_by_name(newName.c_str());
+		if (!existing_source)
+			break;
+
+		newName = strprintf("%s (%d)", name, ++inc);
+	}
+
+	return newName;
+}
+
 void OBSBasic::ResetAudioDevice(const char *sourceId, const char *deviceId,
 				const char *deviceDesc, int channel)
 {
@@ -4435,9 +4454,11 @@ void OBSBasic::ResetAudioDevice(const char *sourceId, const char *deviceId,
 		}
 
 	} else if (!disable) {
+		std::string name = GetDupName(deviceDesc);
+
 		settings = obs_data_create();
 		obs_data_set_string(settings, "device_id", deviceId);
-		source = obs_source_create(sourceId, deviceDesc, settings,
+		source = obs_source_create(sourceId, name.c_str(), settings,
 					   nullptr);
 
 		obs_set_output_source(channel, source);