diff --git a/data/locale/de-DE.ini b/data/locale/de-DE.ini index 1ae36766..eff7b90d 100644 --- a/data/locale/de-DE.ini +++ b/data/locale/de-DE.ini @@ -427,7 +427,6 @@ AdvSceneSwitcher.action.replay.saveWarn="Warnung: Ein zu häufiges Speichern kan AdvSceneSwitcher.action.replay.type.stop="Replay Buffer stoppen" AdvSceneSwitcher.action.replay.type.start="Replay Buffer starten" AdvSceneSwitcher.action.replay.type.save="Replay Buffer speichern" -AdvSceneSwitcher.action.replay.entry="{{actions}}" AdvSceneSwitcher.action.streaming="Stream" AdvSceneSwitcher.action.streaming.type.stop="Stream stoppen" AdvSceneSwitcher.action.streaming.type.start="Stream starten" diff --git a/data/locale/en-US.ini b/data/locale/en-US.ini index 7381b0e0..edda5821 100644 --- a/data/locale/en-US.ini +++ b/data/locale/en-US.ini @@ -748,10 +748,12 @@ AdvSceneSwitcher.action.recording.split.hint="Make sure to enable automatic file AdvSceneSwitcher.action.recording.entry="{{actions}}{{recordFolder}}{{recordFileFormat}}{{pauseHint}}{{splitHint}}" AdvSceneSwitcher.action.replay="Replay buffer" AdvSceneSwitcher.action.replay.saveWarn="Warning: Saving too frequently might result in the replay buffer not actually being saved!" +AdvSceneSwitcher.action.replay.durationWarn="Warning: Changing the maximum replay time will only apply the next time the replay buffer is started!" AdvSceneSwitcher.action.replay.type.stop="Stop replay buffer" AdvSceneSwitcher.action.replay.type.start="Start replay buffer" AdvSceneSwitcher.action.replay.type.save="Save replay buffer" -AdvSceneSwitcher.action.replay.entry="{{actions}}" +AdvSceneSwitcher.action.replay.type.duration="Set maximum replay time" +AdvSceneSwitcher.action.replay.entry="{{actions}}{{duration}}" AdvSceneSwitcher.action.streaming="Streaming" AdvSceneSwitcher.action.streaming.type.stop="Stop streaming" AdvSceneSwitcher.action.streaming.type.start="Start streaming" diff --git a/data/locale/es-ES.ini b/data/locale/es-ES.ini index 37836170..c59eab01 100644 --- a/data/locale/es-ES.ini +++ b/data/locale/es-ES.ini @@ -348,7 +348,6 @@ AdvSceneSwitcher.action.replay.saveWarn="Advertencia: ¡Guardar con demasiada fr AdvSceneSwitcher.action.replay.type.stop="Detener el búfer de reproducción" AdvSceneSwitcher.action.replay.type.start="Iniciar búfer de reproducción" AdvSceneSwitcher.action.replay.type.save="Guardar búfer de reproducción" -AdvSceneSwitcher.action.replay.entry="{{actions}}" AdvSceneSwitcher.action.streaming="Transmisión" AdvSceneSwitcher.action.streaming.type.stop="Detener transmisión" AdvSceneSwitcher.action.streaming.type.start="Iniciar transmisión" diff --git a/data/locale/ru-RU.ini b/data/locale/ru-RU.ini index c7d2c109..603178f1 100644 --- a/data/locale/ru-RU.ini +++ b/data/locale/ru-RU.ini @@ -137,7 +137,6 @@ AdvSceneSwitcher.action.replay="Буфер воспроизведения" AdvSceneSwitcher.action.replay.type.stop="Остановить буфер воспроизведения" AdvSceneSwitcher.action.replay.type.start="Начать воспроизведение буфера" AdvSceneSwitcher.action.replay.type.save="Сохранить буфер воспроизведения" -AdvSceneSwitcher.action.replay.entry="{{actions}}" AdvSceneSwitcher.action.streaming="Потоковое вещание" AdvSceneSwitcher.action.streaming.type.stop="Остановить потоковое вещание" AdvSceneSwitcher.action.streaming.type.start="Начать потоковое вещание" diff --git a/data/locale/tr-TR.ini b/data/locale/tr-TR.ini index dd4b3ee3..ea902b95 100644 --- a/data/locale/tr-TR.ini +++ b/data/locale/tr-TR.ini @@ -279,7 +279,6 @@ AdvSceneSwitcher.action.replay="Tekrar arabelleği" AdvSceneSwitcher.action.replay.type.stop="Tekrar arabelleğini durdur" AdvSceneSwitcher.action.replay.type.start="Tekrar arabelleğini başlat" AdvSceneSwitcher.action.replay.type.save="Tekrar arabelleğini kaydet" -AdvSceneSwitcher.action.replay.entry="{{actions}}" AdvSceneSwitcher.action.streaming="Yayın" AdvSceneSwitcher.action.streaming.type.stop="Yayın durdur" AdvSceneSwitcher.action.streaming.type.start="Yayın başlat" diff --git a/data/locale/zh-CN.ini b/data/locale/zh-CN.ini index 0c770bbb..97b42bf4 100644 --- a/data/locale/zh-CN.ini +++ b/data/locale/zh-CN.ini @@ -481,7 +481,6 @@ AdvSceneSwitcher.action.replay.saveWarn="警告:保存过于频繁可能会导 AdvSceneSwitcher.action.replay.type.stop="停止回放缓存" AdvSceneSwitcher.action.replay.type.start="启动回放缓存" AdvSceneSwitcher.action.replay.type.save="保存回放缓存" -AdvSceneSwitcher.action.replay.entry="{{actions}}" AdvSceneSwitcher.action.streaming="推流" AdvSceneSwitcher.action.streaming.type.stop="停止推流" AdvSceneSwitcher.action.streaming.type.start="开始推流" diff --git a/plugins/base/macro-action-replay-buffer.cpp b/plugins/base/macro-action-replay-buffer.cpp index 6e35b142..0c640ed5 100644 --- a/plugins/base/macro-action-replay-buffer.cpp +++ b/plugins/base/macro-action-replay-buffer.cpp @@ -2,6 +2,7 @@ #include "layout-helpers.hpp" #include +#include namespace advss { @@ -12,31 +13,49 @@ bool MacroActionReplayBuffer::_registered = MacroActionFactory::Register( {MacroActionReplayBuffer::Create, MacroActionReplayBufferEdit::Create, "AdvSceneSwitcher.action.replay"}); -static const std::map actionTypes = { - {ReplayBufferAction::STOP, "AdvSceneSwitcher.action.replay.type.stop"}, - {ReplayBufferAction::START, - "AdvSceneSwitcher.action.replay.type.start"}, - {ReplayBufferAction::SAVE, "AdvSceneSwitcher.action.replay.type.save"}, +static const std::map + actionTypes = { + {MacroActionReplayBuffer::Action::STOP, + "AdvSceneSwitcher.action.replay.type.stop"}, + {MacroActionReplayBuffer::Action::START, + "AdvSceneSwitcher.action.replay.type.start"}, + {MacroActionReplayBuffer::Action::SAVE, + "AdvSceneSwitcher.action.replay.type.save"}, + {MacroActionReplayBuffer::Action::DURATION, + "AdvSceneSwitcher.action.replay.type.duration"}, }; bool MacroActionReplayBuffer::PerformAction() { switch (_action) { - case ReplayBufferAction::STOP: + case Action::STOP: if (obs_frontend_replay_buffer_active()) { obs_frontend_replay_buffer_stop(); } break; - case ReplayBufferAction::START: + case Action::START: if (!obs_frontend_replay_buffer_active()) { obs_frontend_replay_buffer_start(); } break; - case ReplayBufferAction::SAVE: + case Action::SAVE: if (obs_frontend_replay_buffer_active()) { obs_frontend_replay_buffer_save(); } break; + case Action::DURATION: { + auto conf = obs_frontend_get_profile_config(); + auto value = std::to_string(_duration.Seconds()); + config_set_string(conf, "SimpleOutput", "RecRBTime", + value.c_str()); + config_set_string(conf, "AdvOut", "RecRBTime", value.c_str()); + + if (config_save(conf) != CONFIG_SUCCESS) { + blog(LOG_WARNING, + "failed to set replay buffer duration"); + } + break; + } default: break; } @@ -58,14 +77,15 @@ bool MacroActionReplayBuffer::Save(obs_data_t *obj) const { MacroAction::Save(obj); obs_data_set_int(obj, "action", static_cast(_action)); + _duration.Save(obj); return true; } bool MacroActionReplayBuffer::Load(obs_data_t *obj) { MacroAction::Load(obj); - _action = static_cast( - obs_data_get_int(obj, "action")); + _action = static_cast(obs_data_get_int(obj, "action")); + _duration.Load(obj); return true; } @@ -90,23 +110,24 @@ MacroActionReplayBufferEdit::MacroActionReplayBufferEdit( QWidget *parent, std::shared_ptr entryData) : QWidget(parent), _actions(new QComboBox()), - _saveWarning(new QLabel( - obs_module_text("AdvSceneSwitcher.action.replay.saveWarn"))) + _warning(new QLabel( + obs_module_text("AdvSceneSwitcher.action.replay.saveWarn"))), + _duration(new DurationSelection(this, false, 5.)) { populateActionSelection(_actions); QWidget::connect(_actions, SIGNAL(currentIndexChanged(int)), this, SLOT(ActionChanged(int))); + QWidget::connect(_duration, SIGNAL(DurationChanged(const Duration &)), + this, SLOT(DurationChanged(const Duration &))); - QHBoxLayout *layout = new QHBoxLayout; - std::unordered_map widgetPlaceholders = { - {"{{actions}}", _actions}, - }; + auto layout = new QHBoxLayout; PlaceWidgets(obs_module_text("AdvSceneSwitcher.action.replay.entry"), - layout, widgetPlaceholders); + layout, + {{"{{actions}}", _actions}, {"{{duration}}", _duration}}); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(layout); - mainLayout->addWidget(_saveWarning); + mainLayout->addWidget(_warning); setLayout(mainLayout); _entryData = entryData; @@ -120,21 +141,41 @@ void MacroActionReplayBufferEdit::UpdateEntryData() return; } _actions->setCurrentIndex(static_cast(_entryData->_action)); - _saveWarning->setVisible(_entryData->_action == - ReplayBufferAction::SAVE); + _duration->SetDuration(_entryData->_duration); + SetWidgetVisiblity(); +} + +void MacroActionReplayBufferEdit::SetWidgetVisiblity() +{ + _warning->setVisible(_entryData->_action == + MacroActionReplayBuffer::Action::SAVE); + _duration->setVisible(_entryData->_action == + MacroActionReplayBuffer::Action::DURATION); + _warning->setText(obs_module_text( + (_entryData->_action == MacroActionReplayBuffer::Action::SAVE) + ? "AdvSceneSwitcher.action.replay.saveWarn" + : "AdvSceneSwitcher.action.replay.durationWarn")); + _warning->setVisible(_entryData->_action == + MacroActionReplayBuffer::Action::SAVE || + _entryData->_action == + MacroActionReplayBuffer::Action::DURATION); + adjustSize(); + updateGeometry(); } void MacroActionReplayBufferEdit::ActionChanged(int value) { - if (_loading || !_entryData) { - return; - } + GUARD_LOADING_AND_LOCK(); + _entryData->_action = + static_cast(value); - auto lock = LockContext(); - _entryData->_action = static_cast(value); - _saveWarning->setVisible(_entryData->_action == - ReplayBufferAction::SAVE); - adjustSize(); + SetWidgetVisiblity(); +} + +void MacroActionReplayBufferEdit::DurationChanged(const Duration &duration) +{ + GUARD_LOADING_AND_LOCK(); + _entryData->_duration = duration; } } // namespace advss diff --git a/plugins/base/macro-action-replay-buffer.hpp b/plugins/base/macro-action-replay-buffer.hpp index bf7bc2e1..aafb3fde 100644 --- a/plugins/base/macro-action-replay-buffer.hpp +++ b/plugins/base/macro-action-replay-buffer.hpp @@ -6,12 +6,6 @@ namespace advss { -enum class ReplayBufferAction { - STOP, - START, - SAVE, -}; - class MacroActionReplayBuffer : public MacroAction { public: MacroActionReplayBuffer(Macro *m) : MacroAction(m) {} @@ -23,7 +17,14 @@ public: static std::shared_ptr Create(Macro *m); std::shared_ptr Copy() const; - ReplayBufferAction _action = ReplayBufferAction::STOP; + enum class Action { + STOP, + START, + SAVE, + DURATION, + }; + Action _action = Action::STOP; + Duration _duration; private: static bool _registered; @@ -49,13 +50,16 @@ public: private slots: void ActionChanged(int value); - -protected: - QComboBox *_actions; - QLabel *_saveWarning; - std::shared_ptr _entryData; + void DurationChanged(const Duration &); private: + void SetWidgetVisiblity(); + + QComboBox *_actions; + QLabel *_warning; + DurationSelection *_duration; + + std::shared_ptr _entryData; bool _loading = true; };