Compare commits

...

1 Commits

Author SHA1 Message Date
WarmUpTill
21a00d47cc Add "Recording saved" option to Recording condition 2023-11-26 01:44:59 +01:00
3 changed files with 81 additions and 29 deletions

View File

@@ -295,6 +295,7 @@ AdvSceneSwitcher.condition.record="Recording"
AdvSceneSwitcher.condition.record.state.start="Recording running" AdvSceneSwitcher.condition.record.state.start="Recording running"
AdvSceneSwitcher.condition.record.state.pause="Recording paused" AdvSceneSwitcher.condition.record.state.pause="Recording paused"
AdvSceneSwitcher.condition.record.state.stop="Recording stopped" AdvSceneSwitcher.condition.record.state.stop="Recording stopped"
AdvSceneSwitcher.condition.record.state.saveDone="Recording saved"
AdvSceneSwitcher.condition.record.entry="{{recordState}}" AdvSceneSwitcher.condition.record.entry="{{recordState}}"
AdvSceneSwitcher.condition.process="Process" AdvSceneSwitcher.condition.process="Process"
AdvSceneSwitcher.condition.process.entry="{{processes}}is running{{focused}}and is focused" AdvSceneSwitcher.condition.process.entry="{{processes}}is running{{focused}}and is focused"

View File

@@ -1,4 +1,5 @@
#include "macro-condition-recording.hpp" #include "macro-condition-recording.hpp"
#include "macro.hpp"
#include "utility.hpp" #include "utility.hpp"
namespace advss { namespace advss {
@@ -10,45 +11,91 @@ bool MacroConditionRecord::_registered = MacroConditionFactory::Register(
{MacroConditionRecord::Create, MacroConditionRecordEdit::Create, {MacroConditionRecord::Create, MacroConditionRecordEdit::Create,
"AdvSceneSwitcher.condition.record"}); "AdvSceneSwitcher.condition.record"});
const static std::map<RecordState, std::string> recordStates = { const static std::map<MacroConditionRecord::Condition, std::string>
{RecordState::STOP, "AdvSceneSwitcher.condition.record.state.stop"}, recordStates = {
{RecordState::PAUSE, "AdvSceneSwitcher.condition.record.state.pause"}, {MacroConditionRecord::Condition::STOP,
{RecordState::START, "AdvSceneSwitcher.condition.record.state.start"}, "AdvSceneSwitcher.condition.record.state.stop"},
{MacroConditionRecord::Condition::PAUSE,
"AdvSceneSwitcher.condition.record.state.pause"},
{MacroConditionRecord::Condition::START,
"AdvSceneSwitcher.condition.record.state.start"},
{MacroConditionRecord::Condition::SAVE_DONE,
"AdvSceneSwitcher.condition.record.state.saveDone"},
}; };
MacroConditionRecord::MacroConditionRecord(Macro *m) : MacroCondition(m)
{
OBSOutputAutoRelease output = obs_frontend_get_recording_output();
if (!output) {
return;
}
auto sh = obs_output_get_signal_handler(output);
signal_handler_connect(sh, "stop", StopSignal, this);
}
MacroConditionRecord::~MacroConditionRecord()
{
OBSOutputAutoRelease output = obs_frontend_get_recording_output();
if (!output) {
return;
}
auto sh = obs_output_get_signal_handler(output);
signal_handler_disconnect(sh, "stop", StopSignal, this);
}
bool MacroConditionRecord::CheckCondition() bool MacroConditionRecord::CheckCondition()
{ {
bool stateMatch = false; switch (_condition) {
switch (_recordState) { case Condition::STOP:
case RecordState::STOP: return !obs_frontend_recording_active();
stateMatch = !obs_frontend_recording_active(); case Condition::PAUSE:
break; return obs_frontend_recording_paused();
case RecordState::PAUSE: case Condition::START:
stateMatch = obs_frontend_recording_paused(); return obs_frontend_recording_active();
break; case Condition::SAVE_DONE:
case RecordState::START: if (_recordingSaveDone) {
stateMatch = obs_frontend_recording_active(); _recordingSaveDone = false;
break; return true;
}
return false;
default: default:
break; break;
} }
return stateMatch; return false;
} }
bool MacroConditionRecord::Save(obs_data_t *obj) const bool MacroConditionRecord::Save(obs_data_t *obj) const
{ {
MacroCondition::Save(obj); MacroCondition::Save(obj);
obs_data_set_int(obj, "state", static_cast<int>(_recordState)); obs_data_set_int(obj, "state", static_cast<int>(_condition));
return true; return true;
} }
bool MacroConditionRecord::Load(obs_data_t *obj) bool MacroConditionRecord::Load(obs_data_t *obj)
{ {
MacroCondition::Load(obj); MacroCondition::Load(obj);
_recordState = static_cast<RecordState>(obs_data_get_int(obj, "state")); _condition = static_cast<Condition>(obs_data_get_int(obj, "state"));
return true; return true;
} }
void MacroConditionRecord::StopSignal(void *c, calldata_t *data)
{
auto condition = static_cast<MacroConditionRecord *>(c);
const auto macro = condition->GetMacro();
if (macro && macro->Paused()) {
return;
}
long long code = 0;
if (!calldata_get_int(data, "code", &code)) {
condition->_recordingSaveDone = false;
}
if (code == OBS_OUTPUT_SUCCESS) {
condition->_recordingSaveDone = true;
}
}
static inline void populateStateSelection(QComboBox *list) static inline void populateStateSelection(QComboBox *list)
{ {
for (auto entry : recordStates) { for (auto entry : recordStates) {
@@ -89,7 +136,8 @@ void MacroConditionRecordEdit::StateChanged(int value)
} }
auto lock = LockContext(); auto lock = LockContext();
_entryData->_recordState = static_cast<RecordState>(value); _entryData->_condition =
static_cast<MacroConditionRecord::Condition>(value);
} }
void MacroConditionRecordEdit::UpdateEntryData() void MacroConditionRecordEdit::UpdateEntryData()
@@ -98,8 +146,7 @@ void MacroConditionRecordEdit::UpdateEntryData()
return; return;
} }
_recordState->setCurrentIndex( _recordState->setCurrentIndex(static_cast<int>(_entryData->_condition));
static_cast<int>(_entryData->_recordState));
} }
} // namespace advss } // namespace advss

View File

@@ -6,15 +6,10 @@
namespace advss { namespace advss {
enum class RecordState {
STOP,
PAUSE,
START,
};
class MacroConditionRecord : public MacroCondition { class MacroConditionRecord : public MacroCondition {
public: public:
MacroConditionRecord(Macro *m) : MacroCondition(m) {} MacroConditionRecord(Macro *m);
~MacroConditionRecord();
bool CheckCondition(); bool CheckCondition();
bool Save(obs_data_t *obj) const; bool Save(obs_data_t *obj) const;
bool Load(obs_data_t *obj); bool Load(obs_data_t *obj);
@@ -24,9 +19,18 @@ public:
return std::make_shared<MacroConditionRecord>(m); return std::make_shared<MacroConditionRecord>(m);
} }
RecordState _recordState = RecordState::STOP; enum class Condition {
STOP,
PAUSE,
START,
SAVE_DONE,
};
Condition _condition = Condition::STOP;
private: private:
static void StopSignal(void *condition, calldata_t *);
bool _recordingSaveDone = false;
static bool _registered; static bool _registered;
static const std::string id; static const std::string id;
}; };