Browse Source

UI: Fix vod track not working with twitch soundtrack

The vod track in advanced output mode would be overwritten by twitch
soundtrack's vod track. Additionally, simple output mode would overwrite
twitch's soundtrack vod track even when vod track was turned off in
settings.

So instead, if vod track is off, don't clear the secondary encoder
unless it's explicitly our encoder. Additionally, make sure that
advanced output mode's vod track encoder behaves consistently with
simple output mode's vod track so it doesn't get overwritten.
jp9000 5 years ago
parent
commit
609ec9b556
1 changed files with 53 additions and 23 deletions
  1. 53 23
      UI/window-basic-main-outputs.cpp

+ 53 - 23
UI/window-basic-main-outputs.cpp

@@ -390,6 +390,8 @@ void SimpleOutput::LoadRecordingPreset()
 	}
 }
 
+#define SIMPLE_ARCHIVE_NAME "simple_archive_aac"
+
 SimpleOutput::SimpleOutput(OBSBasic *main_) : BasicOutputHandler(main_)
 {
 	const char *encoder = config_get_string(main->Config(), "SimpleOutput",
@@ -414,7 +416,7 @@ SimpleOutput::SimpleOutput(OBSBasic *main_) : BasicOutputHandler(main_)
 			      "simple_aac", 0))
 		throw "Failed to create aac streaming encoder (simple output)";
 	if (!CreateAACEncoder(aacArchive, aacArchiveEncID, GetAudioBitrate(),
-			      "archive_aac", 1))
+			      SIMPLE_ARCHIVE_NAME, 1))
 		throw "Failed to create aac arhive encoder (simple output)";
 
 	LoadRecordingPreset();
@@ -844,6 +846,23 @@ bool SimpleOutput::SetupStreaming(obs_service_t *service)
 
 static inline bool ServiceSupportsVodTrack(const char *service);
 
+static void clear_archive_encoder(obs_output_t *output,
+				  const char *expected_name)
+{
+	obs_encoder_t *last = obs_output_get_audio_encoder(output, 1);
+	bool clear = false;
+
+	/* ensures that we don't remove twitch's soundtrack encoder */
+	if (last) {
+		const char *name = obs_encoder_get_name(last);
+		clear = name && strcmp(name, expected_name) == 0;
+		obs_encoder_release(last);
+	}
+
+	if (clear)
+		obs_output_set_audio_encoder(output, nullptr, 1);
+}
+
 void SimpleOutput::SetupVodTrack(obs_service_t *service)
 {
 	bool advanced =
@@ -854,11 +873,10 @@ void SimpleOutput::SetupVodTrack(obs_service_t *service)
 	obs_data_t *settings = obs_service_get_settings(service);
 	const char *name = obs_data_get_string(settings, "service");
 
-	if (advanced && enable && ServiceSupportsVodTrack(name)) {
+	if (advanced && enable && ServiceSupportsVodTrack(name))
 		obs_output_set_audio_encoder(streamOutput, aacArchive, 1);
-	} else {
-		obs_output_set_audio_encoder(streamOutput, nullptr, 1);
-	}
+	else
+		clear_archive_encoder(streamOutput, SIMPLE_ARCHIVE_NAME);
 
 	obs_data_release(settings);
 }
@@ -1105,6 +1123,8 @@ struct AdvancedOutput : BasicOutputHandler {
 	inline void UpdateAudioSettings();
 	virtual void Update() override;
 
+	inline void SetupVodTrack(obs_service_t *service);
+
 	inline void SetupStreaming();
 	inline void SetupRecording();
 	inline void SetupFFmpeg();
@@ -1154,6 +1174,8 @@ static void ApplyEncoderDefaults(OBSData &settings,
 	settings = std::move(dataRet);
 }
 
+#define ADV_ARCHIVE_NAME "adv_archive_aac"
+
 AdvancedOutput::AdvancedOutput(OBSBasic *main_) : BasicOutputHandler(main_)
 {
 	const char *recType =
@@ -1266,7 +1288,7 @@ AdvancedOutput::AdvancedOutput(OBSBasic *main_) : BasicOutputHandler(main_)
 	int vodTrack =
 		config_get_int(main->Config(), "AdvOut", "VodTrackIndex") - 1;
 	if (!CreateAACEncoder(streamArchiveEnc, id, GetAudioBitrate(vodTrack),
-			      "avc_aac_archive", vodTrack))
+			      ADV_ARCHIVE_NAME, vodTrack))
 		throw "Failed to create archive audio encoder "
 		      "(advanced output)";
 
@@ -1599,7 +1621,7 @@ int AdvancedOutput::GetAudioBitrate(size_t i) const
 	return FindClosestAvailableAACBitrate(bitrate);
 }
 
-bool AdvancedOutput::SetupStreaming(obs_service_t *service)
+inline void AdvancedOutput::SetupVodTrack(obs_service_t *service)
 {
 	int streamTrack =
 		config_get_int(main->Config(), "AdvOut", "TrackIndex");
@@ -1608,6 +1630,28 @@ bool AdvancedOutput::SetupStreaming(obs_service_t *service)
 	int vodTrackIndex =
 		config_get_int(main->Config(), "AdvOut", "VodTrackIndex");
 
+	const char *id = obs_service_get_id(service);
+	if (strcmp(id, "rtmp_custom") == 0) {
+		vodTrackEnabled = false;
+	} else {
+		obs_data_t *settings = obs_service_get_settings(service);
+		const char *service = obs_data_get_string(settings, "service");
+		if (!ServiceSupportsVodTrack(service))
+			vodTrackEnabled = false;
+		obs_data_release(settings);
+	}
+
+	if (vodTrackEnabled && streamTrack != vodTrackIndex)
+		obs_output_set_audio_encoder(streamOutput, streamArchiveEnc, 1);
+	else
+		clear_archive_encoder(streamOutput, ADV_ARCHIVE_NAME);
+}
+
+bool AdvancedOutput::SetupStreaming(obs_service_t *service)
+{
+	int streamTrack =
+		config_get_int(main->Config(), "AdvOut", "TrackIndex");
+
 	if (!useStreamEncoder ||
 	    (!ffmpegOutput && !obs_output_active(fileOutput))) {
 		UpdateStreamSettings();
@@ -1706,22 +1750,6 @@ bool AdvancedOutput::SetupStreaming(obs_service_t *service)
 	obs_output_set_video_encoder(streamOutput, h264Streaming);
 	obs_output_set_audio_encoder(streamOutput, streamAudioEnc, 0);
 
-	const char *id = obs_service_get_id(service);
-	if (strcmp(id, "rtmp_custom") == 0) {
-		vodTrackEnabled = false;
-	} else {
-		obs_data_t *settings = obs_service_get_settings(service);
-		const char *service = obs_data_get_string(settings, "service");
-		if (!ServiceSupportsVodTrack(service))
-			vodTrackEnabled = false;
-		obs_data_release(settings);
-	}
-
-	if (vodTrackEnabled && streamTrack != vodTrackIndex)
-		obs_output_set_audio_encoder(streamOutput, streamArchiveEnc, 1);
-	else
-		obs_output_set_audio_encoder(streamOutput, nullptr, 1);
-
 	return true;
 }
 
@@ -1764,6 +1792,8 @@ bool AdvancedOutput::StartStreaming(obs_service_t *service)
 
 	obs_output_set_reconnect_settings(streamOutput, maxRetries, retryDelay);
 
+	SetupVodTrack(service);
+
 	if (obs_output_start(streamOutput)) {
 		return true;
 	}