diff --git a/UI/window-basic-main-outputs.cpp b/UI/window-basic-main-outputs.cpp index 989a19055..e8eb6f7c4 100644 --- a/UI/window-basic-main-outputs.cpp +++ b/UI/window-basic-main-outputs.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #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) diff --git a/UI/window-basic-main-outputs.hpp b/UI/window-basic-main-outputs.hpp index 2393d38d4..242b26434 100644 --- a/UI/window-basic-main-outputs.hpp +++ b/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; diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index 8c18e14b5..91ca3a481 100644 --- a/UI/window-basic-main.cpp +++ b/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);