UI: Add checks for overwrite setting to replay buffer

This commit is contained in:
Mike 2021-03-11 10:05:00 +08:00 committed by Jim
parent 1883b774e8
commit 02f3495b72
3 changed files with 66 additions and 48 deletions

View File

@ -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)

View File

@ -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;

View File

@ -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);