瀏覽代碼

UI: Add checks for overwrite setting to replay buffer

Mike 4 年之前
父節點
當前提交
02f3495b72
共有 3 個文件被更改,包括 66 次插入48 次删除
  1. 63 48
      UI/window-basic-main-outputs.cpp
  2. 1 0
      UI/window-basic-main-outputs.hpp
  3. 2 0
      UI/window-basic-main.cpp

+ 63 - 48
UI/window-basic-main-outputs.cpp

@@ -1,5 +1,6 @@
 #include <string>
 #include <algorithm>
+#include <QFileInfo>
 #include <QMessageBox>
 #include "qt-wrappers.hpp"
 #include "audio-encoders.hpp"
@@ -294,6 +295,7 @@ struct SimpleOutput : BasicOutputHandler {
 	virtual bool StartStreaming(obs_service_t *service) override;
 	virtual bool StartRecording() override;
 	virtual bool StartReplayBuffer() override;
+	virtual void ConfigureReplayBuffer() override;
 	virtual void StopStreaming(bool force) override;
 	virtual void StopRecording(bool force) override;
 	virtual void StopReplayBuffer(bool force) override;
@@ -986,6 +988,13 @@ bool SimpleOutput::ConfigureRecording(bool updateReplayBuffer)
 		strPath = GetOutputFilename(path, ffmpegOutput ? "avi" : format,
 					    noSpace, overwriteIfExists,
 					    f.c_str());
+
+		QFileInfo fileInfo(QString::fromStdString(strPath));
+		QString fileName(fileInfo.completeBaseName());
+
+		if (!fileName.isEmpty())
+			f = fileName.toStdString();
+
 		obs_data_set_string(settings, "directory", path);
 		obs_data_set_string(settings, "format", f.c_str());
 		obs_data_set_string(settings, "extension", format);
@@ -1048,6 +1057,11 @@ bool SimpleOutput::StartReplayBuffer()
 	return true;
 }
 
+void SimpleOutput::ConfigureReplayBuffer()
+{
+	ConfigureRecording(true);
+}
+
 void SimpleOutput::StopStreaming(bool force)
 {
 	if (force)
@@ -1122,6 +1136,7 @@ struct AdvancedOutput : BasicOutputHandler {
 	virtual bool StartStreaming(obs_service_t *service) override;
 	virtual bool StartRecording() override;
 	virtual bool StartReplayBuffer() override;
+	virtual void ConfigureReplayBuffer() override;
 	virtual void StopStreaming(bool force) override;
 	virtual void StopRecording(bool force) override;
 	virtual void StopReplayBuffer(bool force) override;
@@ -1879,16 +1894,6 @@ bool AdvancedOutput::StartRecording()
 
 bool AdvancedOutput::StartReplayBuffer()
 {
-	const char *path;
-	const char *recFormat;
-	const char *filenameFormat;
-	bool noSpace = false;
-	bool overwriteIfExists = false;
-	const char *rbPrefix;
-	const char *rbSuffix;
-	int rbTime;
-	int rbSize;
-
 	if (!useStreamEncoder) {
 		if (!ffmpegOutput)
 			UpdateRecordingSettings();
@@ -1901,44 +1906,7 @@ bool AdvancedOutput::StartReplayBuffer()
 	if (!Active())
 		SetupOutputs();
 
-	if (!ffmpegOutput || ffmpegRecording) {
-		path = config_get_string(main->Config(), "AdvOut",
-					 ffmpegRecording ? "FFFilePath"
-							 : "RecFilePath");
-		recFormat = config_get_string(main->Config(), "AdvOut",
-					      ffmpegRecording ? "FFExtension"
-							      : "RecFormat");
-		filenameFormat = config_get_string(main->Config(), "Output",
-						   "FilenameFormatting");
-		overwriteIfExists = config_get_bool(main->Config(), "Output",
-						    "OverwriteIfExists");
-		noSpace = config_get_bool(main->Config(), "AdvOut",
-					  ffmpegRecording
-						  ? "FFFileNameWithoutSpace"
-						  : "RecFileNameWithoutSpace");
-		rbPrefix = config_get_string(main->Config(), "SimpleOutput",
-					     "RecRBPrefix");
-		rbSuffix = config_get_string(main->Config(), "SimpleOutput",
-					     "RecRBSuffix");
-		rbTime = config_get_int(main->Config(), "AdvOut", "RecRBTime");
-		rbSize = config_get_int(main->Config(), "AdvOut", "RecRBSize");
-
-		string f = GetFormatString(filenameFormat, rbPrefix, rbSuffix);
-		string strPath = GetOutputFilename(
-			path, recFormat, noSpace, overwriteIfExists, f.c_str());
-
-		OBSDataAutoRelease settings = obs_data_create();
-
-		obs_data_set_string(settings, "directory", path);
-		obs_data_set_string(settings, "format", f.c_str());
-		obs_data_set_string(settings, "extension", recFormat);
-		obs_data_set_bool(settings, "allow_spaces", !noSpace);
-		obs_data_set_int(settings, "max_time_sec", rbTime);
-		obs_data_set_int(settings, "max_size_mb",
-				 usesBitrate ? 0 : rbSize);
-
-		obs_output_update(replayBuffer, settings);
-	}
+	ConfigureReplayBuffer();
 
 	if (!obs_output_start(replayBuffer)) {
 		QString error_reason;
@@ -1956,6 +1924,53 @@ bool AdvancedOutput::StartReplayBuffer()
 	return true;
 }
 
+void AdvancedOutput::ConfigureReplayBuffer()
+{
+	if (ffmpegOutput && !ffmpegRecording)
+		return;
+
+	const char *path = config_get_string(main->Config(), "AdvOut",
+					     ffmpegRecording ? "FFFilePath"
+							     : "RecFilePath");
+	const char *recFormat = config_get_string(
+		main->Config(), "AdvOut",
+		ffmpegRecording ? "FFExtension" : "RecFormat");
+	const char *filenameFormat = config_get_string(main->Config(), "Output",
+						       "FilenameFormatting");
+	bool overwriteIfExists =
+		config_get_bool(main->Config(), "Output", "OverwriteIfExists");
+	bool noSpace = config_get_bool(main->Config(), "AdvOut",
+				       ffmpegRecording
+					       ? "FFFileNameWithoutSpace"
+					       : "RecFileNameWithoutSpace");
+	const char *rbPrefix = config_get_string(main->Config(), "SimpleOutput",
+						 "RecRBPrefix");
+	const char *rbSuffix = config_get_string(main->Config(), "SimpleOutput",
+						 "RecRBSuffix");
+	int rbTime = config_get_int(main->Config(), "AdvOut", "RecRBTime");
+	int rbSize = config_get_int(main->Config(), "AdvOut", "RecRBSize");
+
+	string f = GetFormatString(filenameFormat, rbPrefix, rbSuffix);
+	string strPath = GetOutputFilename(path, recFormat, noSpace,
+					   overwriteIfExists, f.c_str());
+	QFileInfo fileInfo(QString::fromStdString(strPath));
+	QString fileName(fileInfo.completeBaseName());
+
+	if (!fileName.isEmpty())
+		f = fileName.toStdString();
+
+	OBSDataAutoRelease settings = obs_data_create();
+
+	obs_data_set_string(settings, "directory", path);
+	obs_data_set_string(settings, "format", f.c_str());
+	obs_data_set_string(settings, "extension", recFormat);
+	obs_data_set_bool(settings, "allow_spaces", !noSpace);
+	obs_data_set_int(settings, "max_time_sec", rbTime);
+	obs_data_set_int(settings, "max_size_mb", usesBitrate ? 0 : rbSize);
+
+	obs_output_update(replayBuffer, settings);
+}
+
 void AdvancedOutput::StopStreaming(bool force)
 {
 	if (force)

+ 1 - 0
UI/window-basic-main-outputs.hpp

@@ -43,6 +43,7 @@ struct BasicOutputHandler {
 	virtual bool StartStreaming(obs_service_t *service) = 0;
 	virtual bool StartRecording() = 0;
 	virtual bool StartReplayBuffer() { return false; }
+	virtual void ConfigureReplayBuffer() = 0;
 	virtual bool StartVirtualCam();
 	virtual void StopStreaming(bool force = false) = 0;
 	virtual void StopRecording(bool force = false) = 0;

+ 2 - 0
UI/window-basic-main.cpp

@@ -7204,6 +7204,8 @@ void OBSBasic::ReplayBufferSave()
 	if (!outputHandler->ReplayBufferActive())
 		return;
 
+	outputHandler->ConfigureReplayBuffer();
+
 	calldata_t cd = {0};
 	proc_handler_t *ph =
 		obs_output_get_proc_handler(outputHandler->replayBuffer);